diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml
new file mode 100644
index 0000000..2987f78
--- /dev/null
+++ b/performance-tests/pom.xml
@@ -0,0 +1,67 @@
+
+
+
+ http-mock-server
+ pl.touk.mockserver
+ 2.1.2-SNAPSHOT
+
+ 4.0.0
+
+ mockserver-performance-tests
+
+
+
+ pl.touk.mockserver
+ mockserver
+ ${project.version}
+
+
+ pl.touk.mockserver
+ mockserver-client
+ ${project.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ 1.11.2
+ test
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.11.2
+ test
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ run-benchmarks
+ integration-test
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java
new file mode 100644
index 0000000..44e6910
--- /dev/null
+++ b/performance-tests/src/test/java/pl/touk/mockserver/client/MockserverTest.java
@@ -0,0 +1,80 @@
+package pl.touk.mockserver.client;
+
+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 org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.infra.BenchmarkParams;
+import org.openjdk.jmh.infra.ThreadParams;
+import pl.touk.mockserver.api.request.AddMock;
+import pl.touk.mockserver.server.HttpMockServer;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+@State(Scope.Benchmark)
+@OutputTimeUnit(TimeUnit.SECONDS)
+public class MockserverTest {
+ HttpMockServer httpMockServer;
+
+ @Setup
+ public void prepareMockServer(BenchmarkParams params) {
+ try {
+ httpMockServer = new HttpMockServer(9999);
+ } catch (Exception e) {
+ //OK
+ }
+ }
+
+ @TearDown
+ public void stopMockServer() {
+ try {
+ httpMockServer.stop();
+ } catch (Exception e) {
+ }
+ }
+
+ @State(Scope.Thread)
+ public static class TestState {
+ RemoteMockServer remoteMockServer;
+ HttpClient httpClient;
+ int current;
+
+ @Setup
+ public void prepareMockServer(ThreadParams params) {
+ remoteMockServer = new RemoteMockServer("localhost", 9999);
+ httpClient = HttpClients.createDefault();
+ current = params.getThreadIndex();
+ }
+ }
+
+
+ @Benchmark
+ @Measurement(iterations = 60)
+ @Fork(warmups = 1, value = 1)
+ @BenchmarkMode({Mode.AverageTime, Mode.Throughput})
+ @Warmup(iterations = 10)
+ @Threads(4)
+ public void shouldHandleManyRequestsSimultaneously(TestState testState) throws IOException {
+ int current = testState.current;
+ int endpointNumber = current % 10;
+ int port = 9000 + (current % 7);
+ AddMock addMock = new AddMock();
+ addMock.setName("testRest" + current);
+ addMock.setPath("testEndpoint" + endpointNumber);
+ addMock.setPort(port);
+ addMock.setPredicate("{req -> req.xml.name() == 'request" + current + "' }");
+ addMock.setResponse("{req -> ''}");
+ testState.remoteMockServer.addMock(addMock);
+ HttpPost restPost = new HttpPost("http://localhost:" + port + "/testEndpoint" + endpointNumber);
+ restPost.setEntity(new StringEntity("", ContentType.create("text/xml", "UTF-8")));
+ CloseableHttpResponse response = (CloseableHttpResponse) testState.httpClient.execute(restPost);
+ String stringResponse = Util.extractStringResponse(response);
+ testState.remoteMockServer.removeMock("testRest" + current, true);
+ assert stringResponse.equals("");
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 8f06801..fdceb5f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,7 @@
mockserver
mockserver-tests
mockserver-api
+ performance-tests