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() + } +}