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