Some smal improvements
Change-Id: I3559572293359bf3fb1c4e4e6892e19d4373ba63
This commit is contained in:
parent
ed217704f4
commit
4e70d3b8bd
7 changed files with 45 additions and 33 deletions
|
@ -2,6 +2,7 @@ package pl.touk.mockserver.api.response;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import pl.touk.mockserver.api.request.Method;
|
||||||
|
|
||||||
import javax.xml.bind.annotation.XmlElement;
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
|
||||||
|
@ -24,4 +25,13 @@ public class MockReport {
|
||||||
|
|
||||||
@XmlElement(required = true)
|
@XmlElement(required = true)
|
||||||
private String responseHeaders;
|
private String responseHeaders;
|
||||||
|
|
||||||
|
@XmlElement(required = true)
|
||||||
|
private boolean soap;
|
||||||
|
|
||||||
|
@XmlElement(required = true)
|
||||||
|
private Method method;
|
||||||
|
|
||||||
|
@XmlElement(required = true)
|
||||||
|
private int statusCode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -611,7 +611,10 @@ class MockServerIntegrationTest extends Specification {
|
||||||
remoteMockServer.addMock(new AddMock(
|
remoteMockServer.addMock(new AddMock(
|
||||||
name: 'testRest4',
|
name: 'testRest4',
|
||||||
path: 'testEndpoint',
|
path: 'testEndpoint',
|
||||||
port: 9999
|
port: 9999,
|
||||||
|
soap: true,
|
||||||
|
statusCode: 204,
|
||||||
|
method: Method.PUT
|
||||||
))
|
))
|
||||||
remoteMockServer.addMock(new AddMock(
|
remoteMockServer.addMock(new AddMock(
|
||||||
name: 'testRest3',
|
name: 'testRest3',
|
||||||
|
@ -636,11 +639,11 @@ class MockServerIntegrationTest extends Specification {
|
||||||
remoteMockServer.removeMock('testRest5')
|
remoteMockServer.removeMock('testRest5')
|
||||||
expect:
|
expect:
|
||||||
remoteMockServer.listMocks() == [
|
remoteMockServer.listMocks() == [
|
||||||
new MockReport(name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }'),
|
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"] }'),
|
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: '{ _ -> [:] }'),
|
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: '{ _ -> [:] }'),
|
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: '{ _ -> [:] }')
|
new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package pl.touk.mockserver.server
|
||||||
import com.sun.net.httpserver.HttpExchange
|
import com.sun.net.httpserver.HttpExchange
|
||||||
import groovy.transform.PackageScope
|
import groovy.transform.PackageScope
|
||||||
import groovy.util.logging.Slf4j
|
import groovy.util.logging.Slf4j
|
||||||
|
import pl.touk.mockserver.api.request.Method
|
||||||
|
|
||||||
import java.util.concurrent.CopyOnWriteArrayList
|
import java.util.concurrent.CopyOnWriteArrayList
|
||||||
|
|
||||||
|
@ -24,7 +25,7 @@ class ContextExecutor {
|
||||||
log.debug("Request: ${request.text}")
|
log.debug("Request: ${request.text}")
|
||||||
for (Mock mock : mocks) {
|
for (Mock mock : mocks) {
|
||||||
try {
|
try {
|
||||||
if (mock.match(ex.requestMethod, request)) {
|
if (mock.match(Method.valueOf(ex.requestMethod), request)) {
|
||||||
log.debug("Mock ${mock.name} match request ${request.text}")
|
log.debug("Mock ${mock.name} match request ${request.text}")
|
||||||
MockResponse httpResponse = mock.apply(request)
|
MockResponse httpResponse = mock.apply(request)
|
||||||
fillExchange(ex, httpResponse)
|
fillExchange(ex, httpResponse)
|
||||||
|
|
|
@ -2,14 +2,11 @@ package pl.touk.mockserver.server
|
||||||
|
|
||||||
import com.sun.net.httpserver.HttpExchange
|
import com.sun.net.httpserver.HttpExchange
|
||||||
import groovy.util.logging.Slf4j
|
import groovy.util.logging.Slf4j
|
||||||
import pl.touk.mockserver.api.request.AddMock
|
import pl.touk.mockserver.api.request.*
|
||||||
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 pl.touk.mockserver.api.response.*
|
||||||
|
|
||||||
import javax.xml.bind.JAXBContext
|
import javax.xml.bind.JAXBContext
|
||||||
import java.util.concurrent.CopyOnWriteArrayList
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import java.util.concurrent.CopyOnWriteArraySet
|
import java.util.concurrent.CopyOnWriteArraySet
|
||||||
|
|
||||||
import static pl.touk.mockserver.server.Util.createResponse
|
import static pl.touk.mockserver.server.Util.createResponse
|
||||||
|
@ -18,7 +15,7 @@ import static pl.touk.mockserver.server.Util.createResponse
|
||||||
class HttpMockServer {
|
class HttpMockServer {
|
||||||
|
|
||||||
private final HttpServerWraper httpServerWraper
|
private final HttpServerWraper httpServerWraper
|
||||||
private final List<HttpServerWraper> childServers = new CopyOnWriteArrayList<>()
|
private final Map<Integer, HttpServerWraper> childServers = new ConcurrentHashMap<>()
|
||||||
private final Set<String> mockNames = new CopyOnWriteArraySet<>()
|
private final Set<String> mockNames = new CopyOnWriteArraySet<>()
|
||||||
|
|
||||||
private static
|
private static
|
||||||
|
@ -61,7 +58,10 @@ class HttpMockServer {
|
||||||
port: it.port,
|
port: it.port,
|
||||||
predicate: it.predicateClosureText,
|
predicate: it.predicateClosureText,
|
||||||
response: it.responseClosureText,
|
response: it.responseClosureText,
|
||||||
responseHeaders: it.responseHeadersClosureText
|
responseHeaders: it.responseHeadersClosureText,
|
||||||
|
soap: it.soap,
|
||||||
|
method: it.method,
|
||||||
|
statusCode: it.statusCode as int
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -69,7 +69,7 @@ class HttpMockServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<Mock> listMocks() {
|
Set<Mock> listMocks() {
|
||||||
return childServers.collect { it.mocks }.flatten() as TreeSet<Mock>
|
return childServers.values().collect { it.mocks }.flatten() as TreeSet<Mock>
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addMock(AddMock request, HttpExchange ex) {
|
private void addMock(AddMock request, HttpExchange ex) {
|
||||||
|
@ -85,10 +85,7 @@ class HttpMockServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Mock mockFromRequest(AddMock request) {
|
private static Mock mockFromRequest(AddMock request) {
|
||||||
String name = request.name
|
Mock mock = new Mock(request.name, request.path, request.port)
|
||||||
String mockPath = request.path
|
|
||||||
int mockPort = request.port
|
|
||||||
Mock mock = new Mock(name, mockPath, mockPort)
|
|
||||||
mock.predicate = request.predicate
|
mock.predicate = request.predicate
|
||||||
mock.response = request.response
|
mock.response = request.response
|
||||||
mock.soap = request.soap
|
mock.soap = request.soap
|
||||||
|
@ -99,10 +96,10 @@ class HttpMockServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private HttpServerWraper getOrCreateChildServer(int mockPort) {
|
private HttpServerWraper getOrCreateChildServer(int mockPort) {
|
||||||
HttpServerWraper child = childServers.find { it.port == mockPort }
|
HttpServerWraper child = childServers[mockPort]
|
||||||
if (!child) {
|
if (!child) {
|
||||||
child = new HttpServerWraper(mockPort)
|
child = new HttpServerWraper(mockPort)
|
||||||
childServers << child
|
childServers.put(mockPort, child)
|
||||||
}
|
}
|
||||||
return child
|
return child
|
||||||
}
|
}
|
||||||
|
@ -114,7 +111,7 @@ class HttpMockServer {
|
||||||
throw new RuntimeException('mock not registered')
|
throw new RuntimeException('mock not registered')
|
||||||
}
|
}
|
||||||
log.info("Removing mock $name")
|
log.info("Removing mock $name")
|
||||||
List<MockEvent> mockEvents = skipReport ? [] : childServers.collect {
|
List<MockEvent> mockEvents = skipReport ? [] : childServers.values().collect {
|
||||||
it.removeMock(name)
|
it.removeMock(name)
|
||||||
}.flatten() as List<MockEvent>
|
}.flatten() as List<MockEvent>
|
||||||
mockNames.remove(name)
|
mockNames.remove(name)
|
||||||
|
@ -154,7 +151,7 @@ class HttpMockServer {
|
||||||
throw new RuntimeException('mock not registered')
|
throw new RuntimeException('mock not registered')
|
||||||
}
|
}
|
||||||
log.trace("Peeking mock $name")
|
log.trace("Peeking mock $name")
|
||||||
List<MockEvent> mockEvents = childServers.collect { it.peekMock(name) }.flatten() as List<MockEvent>
|
List<MockEvent> mockEvents = childServers.values().collect { it.peekMock(name) }.flatten() as List<MockEvent>
|
||||||
MockPeeked mockPeeked = new MockPeeked(
|
MockPeeked mockPeeked = new MockPeeked(
|
||||||
mockEvents: createMockEventReports(mockEvents)
|
mockEvents: createMockEventReports(mockEvents)
|
||||||
)
|
)
|
||||||
|
@ -166,7 +163,7 @@ class HttpMockServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
void stop() {
|
void stop() {
|
||||||
childServers.each { it.stop() }
|
childServers.values().each { it.stop() }
|
||||||
httpServerWraper.stop()
|
httpServerWraper.stop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ class HttpServerWraper {
|
||||||
this.port = port
|
this.port = port
|
||||||
InetSocketAddress addr = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port)
|
InetSocketAddress addr = new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port)
|
||||||
httpServer = HttpServer.create(addr, 0)
|
httpServer = HttpServer.create(addr, 0)
|
||||||
httpServer.executor = Executors.newCachedThreadPool()
|
httpServer.executor = Executors.newWorkStealingPool()
|
||||||
log.info("Http server starting on port $port...")
|
log.info("Http server starting on port $port...")
|
||||||
httpServer.start()
|
httpServer.start()
|
||||||
log.info('Http server is started')
|
log.info('Http server is started')
|
||||||
|
@ -45,14 +45,14 @@ class HttpServerWraper {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MockEvent> removeMock(String name) {
|
List<MockEvent> removeMock(String name) {
|
||||||
return executors.collect { it.removeMock(name) }.flatten()
|
return executors.collect { it.removeMock(name) }.flatten() as List<MockEvent>
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MockEvent> peekMock(String name) {
|
List<MockEvent> peekMock(String name) {
|
||||||
return executors.collect { it.peekMock(name) }.flatten()
|
return executors.collect { it.peekMock(name) }.flatten() as List<MockEvent>
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Mock> getMocks() {
|
List<Mock> getMocks() {
|
||||||
return executors.collect { it.mocks }.flatten()
|
return executors.collect { it.mocks }.flatten() as List<Mock>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package pl.touk.mockserver.server
|
||||||
import groovy.transform.EqualsAndHashCode
|
import groovy.transform.EqualsAndHashCode
|
||||||
import groovy.transform.PackageScope
|
import groovy.transform.PackageScope
|
||||||
import groovy.util.logging.Slf4j
|
import groovy.util.logging.Slf4j
|
||||||
|
import pl.touk.mockserver.api.request.Method
|
||||||
|
|
||||||
import java.util.concurrent.CopyOnWriteArrayList
|
import java.util.concurrent.CopyOnWriteArrayList
|
||||||
|
|
||||||
|
@ -21,7 +22,7 @@ class Mock implements Comparable<Mock> {
|
||||||
Closure responseHeaders = toClosure(responseHeadersClosureText)
|
Closure responseHeaders = toClosure(responseHeadersClosureText)
|
||||||
boolean soap = false
|
boolean soap = false
|
||||||
int statusCode = 200
|
int statusCode = 200
|
||||||
String method = 'POST'
|
Method method = Method.POST
|
||||||
int counter = 0
|
int counter = 0
|
||||||
final List<MockEvent> history = new CopyOnWriteArrayList<>()
|
final List<MockEvent> history = new CopyOnWriteArrayList<>()
|
||||||
|
|
||||||
|
@ -34,7 +35,7 @@ class Mock implements Comparable<Mock> {
|
||||||
this.port = port
|
this.port = port
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean match(String method, MockRequest request) {
|
boolean match(Method method, MockRequest request) {
|
||||||
return this.method == method && predicate(request)
|
return this.method == method && predicate(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +91,7 @@ class Mock implements Comparable<Mock> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMethod(String method) {
|
void setMethod(Method method) {
|
||||||
if (method) {
|
if (method) {
|
||||||
this.method = method
|
this.method = method
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ class MockRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GPathResult getSoapBodyContent(GPathResult xml) {
|
private static GPathResult getSoapBodyContent(GPathResult xml) {
|
||||||
return xml.Body.'**'[1]
|
return xml.Body.'**'[1] as GPathResult
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Object inputToJson(String text) {
|
private static Object inputToJson(String text) {
|
||||||
|
@ -66,7 +66,7 @@ class MockRequest {
|
||||||
private static Map<String, String> headersToMap(Headers headers) {
|
private static Map<String, String> headersToMap(Headers headers) {
|
||||||
return headers.collectEntries {
|
return headers.collectEntries {
|
||||||
[it.key.toLowerCase(), it.value.join(',')]
|
[it.key.toLowerCase(), it.value.join(',')]
|
||||||
}
|
} as Map<String, String>
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue