From 80dbbc034f748b79b8a5370a56e178f9e1abb757 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz <alien11689@gmail.com> Date: Wed, 2 Sep 2015 22:59:50 +0200 Subject: [PATCH] Add xsd and docker Change-Id: Ifad2e3a8678a487e6f13114f910e19bce4d80964 --- Dockerfile | 7 + buildImage.sh | 6 + mockserver-api/pom.xml | 27 ++++ .../touk/mockserver/api/request/AddMock.java | 33 ----- .../touk/mockserver/api/request/Method.java | 15 -- .../api/request/MockServerRequest.java | 4 - .../touk/mockserver/api/request/PeekMock.java | 15 -- .../mockserver/api/request/RemoveMock.java | 17 --- .../mockserver/api/request/package-info.java | 4 - .../api/response/ExceptionOccured.java | 13 -- .../mockserver/api/response/MockAdded.java | 12 -- .../api/response/MockEventReport.java | 14 -- .../mockserver/api/response/MockListing.java | 16 --- .../mockserver/api/response/MockPeeked.java | 16 --- .../mockserver/api/response/MockRemoved.java | 16 --- .../mockserver/api/response/MockReport.java | 37 ----- .../api/response/MockRequestReport.java | 24 ---- .../api/response/MockResponseReport.java | 19 --- .../api/response/MockServerResponse.java | 4 - .../mockserver/api/response/Parameter.java | 15 -- .../mockserver/api/response/package-info.java | 4 - .../pl/touk/mockserver/api/request/jaxb.index | 4 - .../touk/mockserver/api/response/jaxb.index | 11 -- mockserver-api/src/main/xjb/binding.xjb | 10 ++ .../xsd/pl/touk/mockserver/api/common.xsd | 17 +++ .../xsd/pl/touk/mockserver/api/request.xsd | 51 +++++++ .../xsd/pl/touk/mockserver/api/response.xsd | 134 ++++++++++++++++++ .../mockserver/client/RemoteMockServer.groovy | 8 +- .../pl/touk/mockserver/client/Util.groovy | 2 +- .../tests/MockServerIntegrationTest.groovy | 73 +++++----- .../mockserver/server/ContextExecutor.groovy | 2 +- .../mockserver/server/HttpMockServer.groovy | 23 +-- .../pl/touk/mockserver/server/Mock.groovy | 8 +- 33 files changed, 313 insertions(+), 348 deletions(-) create mode 100644 Dockerfile create mode 100755 buildImage.sh delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java delete mode 100644 mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java delete mode 100644 mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index delete mode 100644 mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index create mode 100644 mockserver-api/src/main/xjb/binding.xjb create mode 100644 mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd create mode 100644 mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd create mode 100644 mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f76ca67 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM java:8 + +ADD mockserver/target/mockserver-1.1.1-SNAPSHOT-jar-with-dependencies.jar /mockserver.jar + +EXPOSE 9999 + +CMD java -jar /mockserver.jar diff --git a/buildImage.sh b/buildImage.sh new file mode 100755 index 0000000..ada5685 --- /dev/null +++ b/buildImage.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +mvn clean install +mvn -f mockserver/pom.xml package assembly:single + +docker build -t mockserver . diff --git a/mockserver-api/pom.xml b/mockserver-api/pom.xml index a7c59b9..c7cbf27 100644 --- a/mockserver-api/pom.xml +++ b/mockserver-api/pom.xml @@ -17,4 +17,31 @@ <artifactId>lombok</artifactId> </dependency> </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.3</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>jaxb2-maven-plugin</artifactId> + <executions> + <execution> + <id>xjc</id> + <phase>process-resources</phase> + <goals> + <goal>xjc</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> </project> \ No newline at end of file diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java deleted file mode 100644 index 80ad580..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/AddMock.java +++ /dev/null @@ -1,33 +0,0 @@ -package pl.touk.mockserver.api.request; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class AddMock extends MockServerRequest { - @XmlElement(required = true) - private String name; - - @XmlElement(required = true) - private String path; - - @XmlElement(required = true) - private int port; - - private String predicate; - - private String response; - - private Boolean soap; - - private Integer statusCode; - - private Method method; - - private String responseHeaders; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java deleted file mode 100644 index 9e471a1..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/Method.java +++ /dev/null @@ -1,15 +0,0 @@ -package pl.touk.mockserver.api.request; - -import javax.xml.bind.annotation.XmlEnum; - -@XmlEnum -public enum Method { - POST, - GET, - DELETE, - PUT, - TRACE, - HEAD, - OPTIONS, - PATCH; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java deleted file mode 100644 index 91c1ba9..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/MockServerRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package pl.touk.mockserver.api.request; - -public abstract class MockServerRequest { -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java deleted file mode 100644 index d4f14ca..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/PeekMock.java +++ /dev/null @@ -1,15 +0,0 @@ -package pl.touk.mockserver.api.request; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class PeekMock extends MockServerRequest{ - @XmlElement(required = true) - private String name; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java deleted file mode 100644 index 49c8b0b..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/RemoveMock.java +++ /dev/null @@ -1,17 +0,0 @@ -package pl.touk.mockserver.api.request; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class RemoveMock extends MockServerRequest { - @XmlElement(required = true) - private String name; - - private Boolean skipReport; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java deleted file mode 100644 index 6ccf1df..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/request/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@XmlAccessorType(XmlAccessType.FIELD) package pl.touk.mockserver.api.request; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; \ No newline at end of file diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java deleted file mode 100644 index a10382b..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/ExceptionOccured.java +++ /dev/null @@ -1,13 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlValue; - -@XmlRootElement -@Data -public class ExceptionOccured { - @XmlValue - private String message; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java deleted file mode 100644 index 8dc13a9..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockAdded.java +++ /dev/null @@ -1,12 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class MockAdded extends MockServerResponse { -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java deleted file mode 100644 index faa2497..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockEventReport.java +++ /dev/null @@ -1,14 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlElement; - -@Data -public class MockEventReport { - @XmlElement(required = true) - private MockRequestReport request; - - @XmlElement(required = true) - private MockResponseReport response; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java deleted file mode 100644 index 77f5e24..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockListing.java +++ /dev/null @@ -1,16 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement(name = "mocks") -@Data -@EqualsAndHashCode(callSuper = false) -public class MockListing extends MockServerResponse { - @XmlElement(name = "mock") - private List<MockReport> mocks; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java deleted file mode 100644 index a23daae..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockPeeked.java +++ /dev/null @@ -1,16 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class MockPeeked extends MockServerResponse { - @XmlElement(name = "mockEvent") - private List<MockEventReport> mockEvents; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java deleted file mode 100644 index 008d318..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRemoved.java +++ /dev/null @@ -1,16 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import java.util.List; - -@XmlRootElement -@Data -@EqualsAndHashCode(callSuper = false) -public class MockRemoved extends MockServerResponse { - @XmlElement(name = "mockEvent") - private List<MockEventReport> mockEvents; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java deleted file mode 100644 index aa7bd8f..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockReport.java +++ /dev/null @@ -1,37 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import pl.touk.mockserver.api.request.Method; - -import javax.xml.bind.annotation.XmlElement; - -@Data -public class MockReport { - @XmlElement(required = true) - private String name; - - @XmlElement(required = true) - private String path; - - @XmlElement(required = true) - private int port; - - @XmlElement(required = true) - private String predicate; - - @XmlElement(required = true) - private String response; - - @XmlElement(required = true) - private String responseHeaders; - - @XmlElement(required = true) - private boolean soap; - - @XmlElement(required = true) - private Method method; - - @XmlElement(required = true) - private int statusCode; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java deleted file mode 100644 index aecd48f..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockRequestReport.java +++ /dev/null @@ -1,24 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import java.util.List; - -@Data -public class MockRequestReport { - private String text; - - @XmlElementWrapper(name = "headers") - @XmlElement(name = "header") - private List<Parameter> headers; - - @XmlElementWrapper(name = "queryParams") - @XmlElement(name = "queryParam") - private List<Parameter> queryParams; - - @XmlElementWrapper(name = "path") - @XmlElement(name = "pathPart") - private List<String> paths; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java deleted file mode 100644 index 83d3da5..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockResponseReport.java +++ /dev/null @@ -1,19 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import java.util.List; - -@Data -public class MockResponseReport { - @XmlElement(required = true) - private int statusCode; - - private String text; - - @XmlElementWrapper(name = "headers") - @XmlElement(name = "header") - private List<Parameter> headers; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java deleted file mode 100644 index bf7e0ae..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/MockServerResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package pl.touk.mockserver.api.response; - -public abstract class MockServerResponse { -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java deleted file mode 100644 index 6a9c0c3..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/Parameter.java +++ /dev/null @@ -1,15 +0,0 @@ -package pl.touk.mockserver.api.response; - -import lombok.Data; - -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlValue; - -@Data -public class Parameter { - @XmlAttribute(required = true) - private String name; - - @XmlValue - private String value; -} diff --git a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java b/mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java deleted file mode 100644 index d317cb9..0000000 --- a/mockserver-api/src/main/java/pl/touk/mockserver/api/response/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -@XmlAccessorType(XmlAccessType.FIELD) package pl.touk.mockserver.api.response; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; \ No newline at end of file diff --git a/mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index b/mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index deleted file mode 100644 index 233becc..0000000 --- a/mockserver-api/src/main/resource/pl/touk/mockserver/api/request/jaxb.index +++ /dev/null @@ -1,4 +0,0 @@ -AddMock -Method -PeekMock -RemoveMock \ No newline at end of file diff --git a/mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index b/mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index deleted file mode 100644 index 86bdb57..0000000 --- a/mockserver-api/src/main/resource/pl/touk/mockserver/api/response/jaxb.index +++ /dev/null @@ -1,11 +0,0 @@ -ExceptionOccured -MockAdded -MockEventReport -MockListing -MockPeeked -MockRemoved -MockReport -MockRequestReport -MockResponseReport -MockServerResponse -Parameter \ No newline at end of file diff --git a/mockserver-api/src/main/xjb/binding.xjb b/mockserver-api/src/main/xjb/binding.xjb new file mode 100644 index 0000000..a735d24 --- /dev/null +++ b/mockserver-api/src/main/xjb/binding.xjb @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" + xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" + jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <jxb:bindings> + <jxb:globalBindings> + <xjc:simple/> + </jxb:globalBindings> + </jxb:bindings> +</jxb:bindings> \ No newline at end of file diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd new file mode 100644 index 0000000..a48f724 --- /dev/null +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/common.xsd @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<xs:schema version="1.0" targetNamespace="http://touk.pl/mockserver/api/common" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:simpleType name="method"> + <xs:restriction base="xs:string"> + <xs:enumeration value="POST"/> + <xs:enumeration value="GET"/> + <xs:enumeration value="DELETE"/> + <xs:enumeration value="PUT"/> + <xs:enumeration value="TRACE"/> + <xs:enumeration value="HEAD"/> + <xs:enumeration value="OPTIONS"/> + <xs:enumeration value="PATCH"/> + </xs:restriction> + </xs:simpleType> +</xs:schema> + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd new file mode 100644 index 0000000..fb4afca --- /dev/null +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/request.xsd @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://touk.pl/mockserver/api/request" xmlns:tns="http://touk.pl/mockserver/api/request" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:common="http://touk.pl/mockserver/api/common"> + + <xs:import namespace="http://touk.pl/mockserver/api/common" schemaLocation="common.xsd"/> + + <xs:element name="addMock" type="tns:AddMock"/> + + <xs:element name="peekMock" type="tns:PeekMock"/> + + <xs:element name="removeMock" type="tns:RemoveMock"/> + + <xs:complexType name="AddMock"> + <xs:complexContent> + <xs:extension base="tns:mockServerRequest"> + <xs:sequence> + <xs:element name="path" type="xs:string"/> + <xs:element name="port" type="xs:int"/> + <xs:element name="predicate" type="xs:string" minOccurs="0"/> + <xs:element name="response" type="xs:string" minOccurs="0"/> + <xs:element name="soap" type="xs:boolean" minOccurs="0"/> + <xs:element name="statusCode" type="xs:int" minOccurs="0"/> + <xs:element name="method" type="common:method" minOccurs="0"/> + <xs:element name="responseHeaders" type="xs:string" minOccurs="0"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="mockServerRequest" abstract="true"> + <xs:sequence> + <xs:element name="name" type="xs:string"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="PeekMock"> + <xs:complexContent> + <xs:extension base="tns:mockServerRequest"/> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="RemoveMock"> + <xs:complexContent> + <xs:extension base="tns:mockServerRequest"> + <xs:sequence> + <xs:element name="skipReport" type="xs:boolean" minOccurs="0"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> +</xs:schema> + diff --git a/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd new file mode 100644 index 0000000..21ffd9b --- /dev/null +++ b/mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://touk.pl/mockserver/api/response" xmlns:tns="http://touk.pl/mockserver/api/response" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:common="http://touk.pl/mockserver/api/common"> + + <xs:import namespace="http://touk.pl/mockserver/api/common" schemaLocation="common.xsd"/> + + <xs:element name="exceptionOccured" type="tns:exceptionOccured"/> + + <xs:element name="mockAdded" type="tns:mockAdded"/> + + <xs:element name="mockPeeked" type="tns:mockPeeked"/> + + <xs:element name="mockRemoved" type="tns:mockRemoved"/> + + <xs:element name="mocks" type="tns:mockListing"/> + + <xs:complexType name="exceptionOccured"> + <xs:simpleContent> + <xs:extension base="xs:string"/> + </xs:simpleContent> + </xs:complexType> + + <xs:complexType name="mockAdded"> + <xs:complexContent> + <xs:extension base="tns:mockServerResponse"> + <xs:sequence/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="mockServerResponse" abstract="true"> + <xs:sequence/> + </xs:complexType> + + <xs:complexType name="mockEventReport"> + <xs:sequence> + <xs:element name="request" type="tns:mockRequestReport"/> + <xs:element name="response" type="tns:mockResponseReport"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="mockRequestReport"> + <xs:sequence> + <xs:element name="text" type="xs:string" minOccurs="0"/> + <xs:element name="headers" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="header" type="tns:parameter" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="queryParams" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="queryParam" type="tns:parameter" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="path" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="pathPart" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="parameter"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:complexType name="mockResponseReport"> + <xs:sequence> + <xs:element name="statusCode" type="xs:int"/> + <xs:element name="text" type="xs:string" minOccurs="0"/> + <xs:element name="headers" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="header" type="tns:parameter" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="mockListing"> + <xs:complexContent> + <xs:extension base="tns:mockServerResponse"> + <xs:sequence> + <xs:element name="mock" type="tns:mockReport" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="mockReport"> + <xs:sequence> + <xs:element name="name" type="xs:string"/> + <xs:element name="path" type="xs:string"/> + <xs:element name="port" type="xs:int"/> + <xs:element name="predicate" type="xs:string"/> + <xs:element name="response" type="xs:string"/> + <xs:element name="responseHeaders" type="xs:string"/> + <xs:element name="soap" type="xs:boolean"/> + <xs:element name="method" type="common:method"/> + <xs:element name="statusCode" type="xs:int"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="mockPeeked"> + <xs:complexContent> + <xs:extension base="tns:mockServerResponse"> + <xs:sequence> + <xs:element name="mockEvent" type="tns:mockEventReport" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="mockRemoved"> + <xs:complexContent> + <xs:extension base="tns:mockServerResponse"> + <xs:sequence> + <xs:element name="mockEvent" type="tns:mockEventReport" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> +</xs:schema> + diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy index 14664e0..ffbc9a0 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy @@ -18,9 +18,7 @@ import javax.xml.bind.JAXBContext class RemoteMockServer { private final String address private final CloseableHttpClient client = HttpClients.createDefault() - private static final JAXBContext requestContext = JAXBContext.newInstance(AddMock.package.name, AddMock.classLoader) - private static - final JAXBContext responseContext = JAXBContext.newInstance(MockAdded.package.name, MockAdded.classLoader) + private static final JAXBContext requestContext = JAXBContext.newInstance(AddMock, PeekMock, RemoveMock) RemoteMockServer(String host, int port) { address = "http://$host:$port/serverControl" @@ -70,7 +68,7 @@ class RemoteMockServer { List<MockReport> listMocks() { HttpGet get = new HttpGet(address) CloseableHttpResponse response = client.execute(get) - MockListing mockListing = Util.extractResponse(response) as MockListing - return mockListing.mocks + Mocks mocks = Util.extractResponse(response) as Mocks + return mocks.mocks } } diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy index 446ebf0..966625f 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/Util.groovy @@ -35,7 +35,7 @@ class Util { return responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as MockServerResponse } ExceptionOccured exceptionOccured = responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as ExceptionOccured - String message = exceptionOccured.message + String message = exceptionOccured.value if (message == 'mock already registered') { throw new MockAlreadyExists() } diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy index 32c9623..018a28d 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy @@ -8,7 +8,7 @@ import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils import pl.touk.mockserver.api.request.AddMock -import pl.touk.mockserver.api.request.Method +import pl.touk.mockserver.api.common.Method import pl.touk.mockserver.api.response.MockEventReport import pl.touk.mockserver.api.response.MockReport import pl.touk.mockserver.api.response.Parameter @@ -637,14 +637,21 @@ class MockServerIntegrationTest extends Specification { port: 9999 )) remoteMockServer.removeMock('testRest5') - expect: - remoteMockServer.listMocks() == [ - new MockReport(name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), - new MockReport(name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '<response/>' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST), - new MockReport(name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), - new MockReport(name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT), - new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST) - ] + when: + List<MockReport> mockReport = remoteMockServer.listMocks() + then: + mockReport.size() == 5 + assertMockReport(mockReport[0], [name:'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + assertMockReport(mockReport[1], [name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '<response/>' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST]) + assertMockReport(mockReport[2], [name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + assertMockReport(mockReport[3], [name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT]) + assertMockReport(mockReport[4], [name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST]) + } + + private void assertMockReport( MockReport mockReport, Map<String, Object> props) { + props.each { + assert mockReport."${it.key}" == it.value + } } def "should add mock accepts path certain path params"() { @@ -718,18 +725,18 @@ class MockServerIntegrationTest extends Specification { then: mockEvents1.size() == 2 mockEvents1[0].request.text == '<request/>' - !mockEvents1[0].request.headers?.empty - mockEvents1[0].request.queryParams == [] - mockEvents1[0].request.paths == ['testEndpoint'] - !mockEvents1[0].response.headers?.empty + !mockEvents1[0].request.headers?.headers?.empty + mockEvents1[0].request.queryParams.queryParams == [] + mockEvents1[0].request.path.pathParts == ['testEndpoint'] + !mockEvents1[0].response.headers?.headers?.empty mockEvents1[0].response.text == '<goodResponseRest-request/>' mockEvents1[0].response.statusCode == 201 mockEvents1[1].request.text == '<request15/>' - !mockEvents1[1].request.headers?.empty - mockEvents1[1].request.queryParams == [] - mockEvents1[1].request.paths == ['testEndpoint', 'hello'] - !mockEvents1[1].response.headers?.empty + !mockEvents1[1].request.headers?.headers?.empty + mockEvents1[1].request.queryParams.queryParams == [] + mockEvents1[1].request.path.pathParts == ['testEndpoint', 'hello'] + !mockEvents1[1].response.headers?.headers?.empty mockEvents1[1].response.text == '<goodResponseRest-request15/>' mockEvents1[1].response.statusCode == 201 when: @@ -737,10 +744,10 @@ class MockServerIntegrationTest extends Specification { then: mockEvents2.size() == 1 mockEvents2[0].request.text == '<reqXYZ/>' - !mockEvents2[0].request.headers?.empty - mockEvents2[0].request.queryParams == [new Parameter(name: 'id', value: '123')] - mockEvents2[0].request.paths == ['testEndpoint'] - mockEvents2[0].response.headers.find { it.name == 'aaa' }?.value == '15' + !mockEvents2[0].request.headers?.headers?.empty + mockEvents2[0].request.queryParams.queryParams.find { it.name == 'id' }?.value == '123' + mockEvents2[0].request.path.pathParts == ['testEndpoint'] + mockEvents2[0].response.headers.headers.find { it.name == 'aaa' }?.value == '15' mockEvents2[0].response.text == '<goodResponseRest/>' mockEvents2[0].response.statusCode == 202 } @@ -793,18 +800,18 @@ class MockServerIntegrationTest extends Specification { then: mockEvents1.size() == 2 mockEvents1[0].request.text == '<request/>' - !mockEvents1[0].request.headers?.empty - mockEvents1[0].request.queryParams == [] - mockEvents1[0].request.paths == ['testEndpoint'] - !mockEvents1[0].response.headers?.empty + !mockEvents1[0].request.headers?.headers?.empty + mockEvents1[0].request.queryParams.queryParams == [] + mockEvents1[0].request.path.pathParts == ['testEndpoint'] + !mockEvents1[0].response.headers?.headers?.empty mockEvents1[0].response.text == '<goodResponseRest-request/>' mockEvents1[0].response.statusCode == 201 mockEvents1[1].request.text == '<request15/>' - !mockEvents1[1].request.headers?.empty - mockEvents1[1].request.queryParams == [] - mockEvents1[1].request.paths == ['testEndpoint', 'hello'] - !mockEvents1[1].response.headers?.empty + !mockEvents1[1].request.headers?.headers?.empty + mockEvents1[1].request.queryParams.queryParams == [] + mockEvents1[1].request.path.pathParts == ['testEndpoint', 'hello'] + !mockEvents1[1].response.headers?.headers?.empty mockEvents1[1].response.text == '<goodResponseRest-request15/>' mockEvents1[1].response.statusCode == 201 when: @@ -812,10 +819,10 @@ class MockServerIntegrationTest extends Specification { then: mockEvents2.size() == 1 mockEvents2[0].request.text == '<reqXYZ/>' - !mockEvents2[0].request.headers?.empty - mockEvents2[0].request.queryParams == [new Parameter(name: 'id', value: '123')] - mockEvents2[0].request.paths == ['testEndpoint'] - mockEvents2[0].response.headers.find {it.name == 'aaa'}?.value == '15' + !mockEvents2[0].request.headers?.headers?.empty + mockEvents2[0].request.queryParams.queryParams.find{it.name == 'id'}?.value == '123' + mockEvents2[0].request.path.pathParts == ['testEndpoint'] + mockEvents2[0].response.headers.headers.find {it.name == 'aaa'}?.value == '15' mockEvents2[0].response.text == '<goodResponseRest/>' mockEvents2[0].response.statusCode == 202 } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy index 545dfed..f450df4 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -3,7 +3,7 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.transform.PackageScope import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.request.Method +import pl.touk.mockserver.api.common.Method import java.util.concurrent.CopyOnWriteArrayList diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy index 1b8fc9a..0b601ff 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -2,7 +2,10 @@ package pl.touk.mockserver.server import com.sun.net.httpserver.HttpExchange import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.request.* +import pl.touk.mockserver.api.request.AddMock +import pl.touk.mockserver.api.request.MockServerRequest +import pl.touk.mockserver.api.request.PeekMock +import pl.touk.mockserver.api.request.RemoveMock import pl.touk.mockserver.api.response.* import javax.xml.bind.JAXBContext @@ -50,7 +53,7 @@ class HttpMockServer { } void listMocks(HttpExchange ex) { - MockListing mockListing = new MockListing( + Mocks mockListing = new Mocks( mocks: listMocks().collect { new MockReport( name: it.name, @@ -126,20 +129,20 @@ class HttpMockServer { new MockEventReport( request: new MockRequestReport( text: it.request.text, - headers: it.request.headers.collect { + headers: new MockRequestReport.Headers(headers: it.request.headers.collect { new Parameter(name: it.key, value: it.value) - }, - queryParams: it.request.query.collect { + }), + queryParams: new MockRequestReport.QueryParams(queryParams: it.request.query.collect { new Parameter(name: it.key, value: it.value) - }, - paths: it.request.path + }), + path: new MockRequestReport.Path(pathParts: it.request.path) ), response: new MockResponseReport( statusCode: it.response.statusCode, text: it.response.text, - headers: it.response.headers.collect { + headers: new MockResponseReport.Headers(headers: it.response.headers.collect { new Parameter(name: it.key, value: it.value) - } + }) ) ) } @@ -159,7 +162,7 @@ class HttpMockServer { } private static void createErrorResponse(HttpExchange ex, Exception e) { - createResponse(ex, new ExceptionOccured(message: e.message), 400) + createResponse(ex, new ExceptionOccured(value: e.message), 400) } void stop() { diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy index 5f3aa06..32bad68 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -3,7 +3,7 @@ package pl.touk.mockserver.server import groovy.transform.EqualsAndHashCode import groovy.transform.PackageScope import groovy.util.logging.Slf4j -import pl.touk.mockserver.api.request.Method +import pl.touk.mockserver.api.common.Method import java.util.concurrent.CopyOnWriteArrayList @@ -79,10 +79,8 @@ class Mock implements Comparable<Mock> { } } - void setSoap(String soap) { - if (soap) { - this.soap = Boolean.valueOf(soap) - } + void setSoap(Boolean soap) { + this.soap = soap ?: false } void setStatusCode(String statusCode) {