diff --git a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy
index 6dea468..a061e5d 100644
--- a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy
+++ b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy
@@ -14,17 +14,17 @@ class ContextExecutor {
this.httpServerWraper = httpServerWraper
this.path = path
this.mocks = new CopyOnWriteArrayList<>([initialMock])
- httpServerWraper.createContext(path,{
+ httpServerWraper.createContext(path, {
HttpExchange ex ->
String input = ex.requestBody.text
println "Mock received input"
- for (Mock mock : mocks){
+ for (Mock mock : mocks) {
try {
GPathResult xml = input ? new XmlSlurper().parseText(input) : null
if (mock.soap) {
- if(xml.name() == 'Envelope' && xml.Body.size() > 0){
+ if (xml.name() == 'Envelope' && xml.Body.size() > 0) {
xml = getSoapBodyContent(xml)
- }else{
+ } else {
continue
}
}
@@ -32,13 +32,17 @@ class ContextExecutor {
println "Mock ${mock.name} invoked"
++mock.counter
String response = mock.responseOk(xml)
- mock.responseHeaders(xml).each { ex.responseHeaders.add(it.key as String, it.value as String)}
- ex.sendResponseHeaders(mock.statusCode, 0)
- ex.responseBody << (mock.soap ? wrapSoap(response) : response)
- ex.responseBody.close()
+ mock.responseHeaders(xml).each {
+ ex.responseHeaders.add(it.key as String, it.value as String)
+ }
+ ex.sendResponseHeaders(mock.statusCode, response ? 0 : -1)
+ if (response) {
+ ex.responseBody << (mock.soap ? wrapSoap(response) : response)
+ ex.responseBody.close()
+ }
return
}
- }catch (Exception e){
+ } catch (Exception e) {
e.printStackTrace()
}
}
@@ -53,14 +57,15 @@ class ContextExecutor {
}
int removeMock(String name) {
- Mock mock = mocks.find {it.name == name}
- if(mock){
+ Mock mock = mocks.find { it.name == name }
+ if (mock) {
mocks.remove(mock)
+ return mock.counter
}
- return mock.counter
+ return 0
}
- void addMock(Mock mock){
+ void addMock(Mock mock) {
mocks << mock
}
diff --git a/src/test/groovy/pl/touk/mockserver/server/ServerMockPT.groovy b/src/test/groovy/pl/touk/mockserver/server/ServerMockPT.groovy
new file mode 100644
index 0000000..8690672
--- /dev/null
+++ b/src/test/groovy/pl/touk/mockserver/server/ServerMockPT.groovy
@@ -0,0 +1,52 @@
+package pl.touk.mockserver.server
+
+import groovy.util.slurpersupport.GPathResult
+import org.apache.http.client.HttpClient
+import org.apache.http.client.methods.CloseableHttpResponse
+import org.apache.http.client.methods.HttpPost
+import org.apache.http.entity.ContentType
+import org.apache.http.entity.StringEntity
+import org.apache.http.impl.client.HttpClients
+import pl.touk.mockserver.client.AddMockRequestData
+import pl.touk.mockserver.client.ControlServerClient
+import pl.touk.mockserver.client.Util
+import spock.lang.Specification
+
+class ServerMockPT extends Specification {
+
+ def "should handle many request simultaneously"() {
+ given:
+ HttpMockServer httpMockServer = new HttpMockServer()
+ ControlServerClient controlServerClient = new ControlServerClient("localhost", 9999)
+ HttpClient client = HttpClients.createDefault()
+ int requestAmount = 1000
+ GPathResult[] responses = new GPathResult[requestAmount]
+ Thread[] threads = new Thread[requestAmount]
+ for (int i = 0; i < requestAmount; ++i) {
+ int current = i
+ threads[i] = new Thread({
+ int endpointNumber = current % 10
+ int port = 9000 + (current % 7)
+ controlServerClient.addMock(new AddMockRequestData(
+ name: "testRest$current",
+ path: "/testEndpoint$endpointNumber",
+ port: port,
+ predicate: """{xml -> xml.name() == 'request$current'}""",
+ response: """{xml -> ""}"""
+ ))
+ HttpPost restPost = new HttpPost("http://localhost:$port/testEndpoint$endpointNumber")
+ restPost.entity = new StringEntity("", ContentType.create("text/xml", "UTF-8"))
+ CloseableHttpResponse response = client.execute(restPost)
+ responses[current] = Util.extractXmlResponse(response)
+ assert controlServerClient.removeMock("testRest$current") == 1
+ })
+ }
+ when:
+ threads*.start()
+ Thread.sleep(60000)
+ then:
+ responses.eachWithIndex { res, i -> println "Checking $i"; assert res.name() == "goodResponse$i" }
+ cleanup:
+ httpMockServer.stop()
+ }
+}