package pl.touk.mockserver.tests 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.RemoteMockServer import pl.touk.mockserver.client.Util import pl.touk.mockserver.server.HttpMockServer import spock.lang.Specification class ServerMockPT extends Specification { def "should handle many request simultaneously"() { given: HttpMockServer httpMockServer = new HttpMockServer() RemoteMockServer controlServerClient = new RemoteMockServer("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: """{req -> req.xml.name() == 'request$current'}""", response: """{req -> ""}""" )) 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").size() == 1 }) } when: threads*.start() Thread.sleep(60000) then: responses.eachWithIndex { res, i -> assert res.name() == "goodResponse$i" } cleanup: httpMockServer.stop() } }