diff --git a/docs/developers/functional-tests.md b/docs/developers/functional-tests.md index 523466fb0b0..abeb3ab38d4 100644 --- a/docs/developers/functional-tests.md +++ b/docs/developers/functional-tests.md @@ -2,8 +2,8 @@ Main language: Groovy. Project functional tests use [Spock](https://spockframework.org/) as a main testing framework. Also used [Docker](https://www.docker.com/) for running PBS and other services. -[Testcontainers](https://www.testcontainers.org/) is used as provider of lightweight, throwaway instances of PBS, MySQLContainer, MockServerContainer containers. -And [MockServer](https://www.mock-server.com/) for mocking external services. +[Testcontainers](https://www.testcontainers.org/) is used as provider of lightweight, throwaway instances of PBS, MySQLContainer, WireMock containers. +And [WireMock](https://wiremock.org/) for mocking external services. ## Getting Started @@ -64,12 +64,12 @@ Functional tests need to have name template **.\*Spec.groovy** - `/functional/testcontainers/PBSTestExtension` - allows to hook into a spec’s lifecycle to add ErrorListener using annotation `PBSTest`. - `/functional/testcontainers/TestcontainersExtension` - allow to hook into a spec’s lifecycle to start and stop support service containers using global extension. - `/functional/testcontainers/container` - responsible for creating and configuring containers. -- `/functional/testcontainers/scaffolding/NetworkScaffolding` - makes HTTP requests to a MockServer. +- `/functional/testcontainers/scaffolding/NetworkScaffolding` - makes HTTP requests to a WireMock. **Properties:** -`launchContainers` - responsible for starting the MockServer and the MySQLContainer container. Default value is false to not launch containers for unit tests. +`launchContainers` - responsible for starting containers. Default value is false to not launch containers for unit tests. `tests.max-container-count` - maximum number of simultaneously running PBS containers. Default value is 5. `skipFunctionalTests` - allow to skip funtional tests. Default value is false. `skipUnitTests` - allow to skip unit tests. Default value is false. diff --git a/extra/pom.xml b/extra/pom.xml index 836df8f4a38..39ce2649faa 100644 --- a/extra/pom.xml +++ b/extra/pom.xml @@ -62,8 +62,6 @@ 3.12.1 2.4-M6-groovy-4.0 - - 5.15.0 false @@ -262,21 +260,6 @@ json-logic-java ${json-logic.version} - - org.mock-server - mockserver-client-java - ${mockserver.version} - - - com.google.code.findbugs - jsr305 - - - commons-logging - commons-logging - - - diff --git a/pom.xml b/pom.xml index b9f4a2eff8b..8864e120eb2 100644 --- a/pom.xml +++ b/pom.xml @@ -325,11 +325,6 @@ testcontainers test - - org.testcontainers - mockserver - test - org.testcontainers mysql @@ -350,9 +345,11 @@ influxdb test + - org.mock-server - mockserver-client-java + org.wiremock + wiremock + 3.13.1 test @@ -623,7 +620,6 @@ maven-failsafe-plugin - ${mockserver.version} ${project.version} 5 false diff --git a/src/test/groovy/org/prebid/server/functional/model/HttpStatusCode.groovy b/src/test/groovy/org/prebid/server/functional/model/HttpStatusCode.groovy new file mode 100644 index 00000000000..e9e574b5d78 --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/HttpStatusCode.groovy @@ -0,0 +1,18 @@ +package org.prebid.server.functional.model + +enum HttpStatusCode { + + PROCESSING_102(102), + OK_200(200), + NO_CONTENT_204(204), + BAD_REQUEST_400(400), + NOT_FOUNT_404(404), + INTERNAL_SERVER_ERROR_500(500), + SERVICE_UNAVAILABLE_503(503) + + Integer code + + HttpStatusCode(Integer code){ + this.code = code + } +} diff --git a/src/test/groovy/org/prebid/server/functional/model/ResponseModel.groovy b/src/test/groovy/org/prebid/server/functional/model/ResponseModel.groovy index 91a7f1fe9d0..5fe89f8488a 100644 --- a/src/test/groovy/org/prebid/server/functional/model/ResponseModel.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/ResponseModel.groovy @@ -1,6 +1,6 @@ package org.prebid.server.functional.model /** - * This marker interface should limit the possible values used by the MockServerClientWrapper. + * This marker interface should limit the possible values used by the WireMockClientWrapper. */ interface ResponseModel {} diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/Dependencies.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/Dependencies.groovy index ab614e0ca5f..a04e5c99386 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/Dependencies.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/Dependencies.groovy @@ -10,7 +10,6 @@ import org.testcontainers.containers.PostgreSQLContainer import org.testcontainers.lifecycle.Startables import org.testcontainers.utility.DockerImageName -import static org.prebid.server.functional.util.SystemProperties.MOCKSERVER_VERSION import static org.testcontainers.containers.localstack.LocalStackContainer.Service.S3 class Dependencies { @@ -42,7 +41,7 @@ class Dependencies { .withDatabase("prebid") .withNetwork(network) - static final NetworkServiceContainer networkServiceContainer = new NetworkServiceContainer(MOCKSERVER_VERSION) + static final NetworkServiceContainer networkServiceContainer = new NetworkServiceContainer() .withNetwork(network) static LocalStackContainer localStackContainer @@ -52,13 +51,15 @@ class Dependencies { localStackContainer = new LocalStackContainer(DockerImageName.parse("localstack/localstack:s3-latest")) .withNetwork(network) .withServices(S3) - Startables.deepStart([networkServiceContainer, mysqlContainer, localStackContainer, influxdbContainer]).join() + Startables.deepStart([networkServiceContainer, mysqlContainer, localStackContainer, + influxdbContainer]).join() } } static void stop() { if (IS_LAUNCH_CONTAINERS) { - [networkServiceContainer, mysqlContainer, localStackContainer, influxdbContainer].parallelStream() + [networkServiceContainer, mysqlContainer, localStackContainer, + influxdbContainer].parallelStream() .forEach({ it.stop() }) } } diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/container/NetworkServiceContainer.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/container/NetworkServiceContainer.groovy index 8022f2e8dcc..3b732809bd5 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/container/NetworkServiceContainer.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/container/NetworkServiceContainer.groovy @@ -1,16 +1,18 @@ package org.prebid.server.functional.testcontainers.container -import org.testcontainers.containers.MockServerContainer +import org.testcontainers.containers.GenericContainer import org.testcontainers.containers.Network import org.testcontainers.utility.DockerImageName -class NetworkServiceContainer extends MockServerContainer { +class NetworkServiceContainer extends GenericContainer { - NetworkServiceContainer(String version) { - super(DockerImageName.parse("mockserver/mockserver:mockserver-$version")) + NetworkServiceContainer() { + super(DockerImageName.parse("wiremock/wiremock:3.3.1")) def aliasWithTopLevelDomain = "${getNetworkAliases().first()}.com".toString() withCreateContainerCmdModifier { it.withHostName(aliasWithTopLevelDomain) } setNetworkAliases([aliasWithTopLevelDomain]) + withCommand("--disable-gzip") + withExposedPorts(8080) } String getHostAndPort() { diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/Bidder.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/Bidder.groovy index 05d6fcfa3d7..4848619ad1e 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/Bidder.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/Bidder.groovy @@ -1,50 +1,77 @@ package org.prebid.server.functional.testcontainers.scaffolding -import org.mockserver.matchers.TimeToLive -import org.mockserver.matchers.Times -import org.mockserver.model.HttpRequest -import org.mockserver.model.HttpResponse +import com.github.tomakehurst.wiremock.matching.RequestPattern +import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder import org.prebid.server.functional.model.bidderspecific.BidderRequest -import org.prebid.server.functional.model.request.auction.Banner -import org.prebid.server.functional.model.request.auction.BidRequest -import org.prebid.server.functional.model.request.auction.Format -import org.prebid.server.functional.model.request.auction.Imp -import org.prebid.server.functional.model.response.auction.BidResponse -import org.testcontainers.containers.MockServerContainer +import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer -import static org.mockserver.model.HttpRequest.request -import static org.mockserver.model.HttpResponse.response -import static org.mockserver.model.HttpStatusCode.OK_200 -import static org.mockserver.model.JsonPathBody.jsonPath +import static com.github.tomakehurst.wiremock.client.WireMock.post +import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo +import static com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse +import static org.prebid.server.functional.model.HttpStatusCode.OK_200 class Bidder extends NetworkScaffolding { - Bidder(MockServerContainer mockServerContainer, String endpoint = "/auction") { - super(mockServerContainer, endpoint) + private static final String DEFAULT_BODY_RESPONSE = + ''' + { + "id": "{{jsonPath request.body '$.id'}}", + "seatbid": [ + { + "bid": [ + {{#each (jsonPath request.body '$.imp')}} + { + "id": "bid-{{randomInt}}", + "impid": "{{this.id}}", + "price": 10.0, + {{#if this.banner}} + "w": {{this.banner.format.[0].w}}, + "h": {{this.banner.format.[0].h}}, + {{/if}} + "crid": "creative-{{@index}}" + }{{#unless @last}},{{/unless}} + {{/each}} + ], + "seat": "generic" + } + ] + } + ''' + + Bidder(NetworkServiceContainer wireMockContainer, String endpoint = "/auction") { + super(wireMockContainer, endpoint) } - @Override - protected HttpRequest getRequest(String bidRequestId) { - request().withPath(endpoint) - .withBody(jsonPath("\$[?(@.id == '$bidRequestId')]")) + protected RequestPattern getRequest() { + postRequestedFor(urlEqualTo(endpoint)) + .build() } @Override - protected HttpRequest getRequest() { - request().withPath(endpoint) + protected RequestPatternBuilder getRequest(String bidRequestId) { + postRequestedFor(urlMatching("^$endpoint(\\?.*)?\$")) + .withRequestBody(matchingJsonPath("\$.id", equalTo(bidRequestId))) } - HttpRequest getRequest(String bidRequestId, String requestMatchPath) { - request().withPath(endpoint) - .withBody(jsonPath("\$[?(@.$requestMatchPath == '$bidRequestId')]")) + RequestPattern getRequest(String bidRequestId, String requestMatchPath) { + postRequestedFor(urlMatching("^$endpoint(\\?.*)?\$")) + .withRequestBody(matchingJsonPath("\$[?(@." + requestMatchPath + " == '" + bidRequestId + "')]")) + .build() } @Override void setResponse() { - mockServerClient.when(request().withPath(endpoint), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond {request -> request.withPath(endpoint) - ? response().withStatusCode(OK_200.code()).withBody(getBodyByRequest(request)) - : HttpResponse.notFoundResponse()} + wireMockClient.register(post(urlPathEqualTo(endpoint)) + .atPriority(Integer.MAX_VALUE) + .willReturn(aResponse() + .withTransformers("response-template") + .withStatus(OK_200.code) + .withBody(DEFAULT_BODY_RESPONSE))) } List getBidderRequests(String bidRequestId) { @@ -65,20 +92,4 @@ class Bidder extends NetworkScaffolding { Map> getLastRecordedBidderRequestHeaders(String bidRequestId) { return getLastRecordedRequestHeaders(bidRequestId) } - - private String getBodyByRequest(HttpRequest request) { - def requestString = request.bodyAsString - def jsonNode = toJsonNode(requestString) - def id = jsonNode.get("id").asText() - def impNode = jsonNode.get("imp") - def imps = impNode.collect { - def formatNode = it.get("banner") != null ? it.get("banner").get("format") : null - new Imp(id: it.get("id").asText(), - banner: formatNode != null - ? new Banner(format: [new Format(width: formatNode.first().get("w").asInt(), height: formatNode.first().get("h").asInt())]) - : null)} - def bidRequest = new BidRequest(id: id, imp: imps) - def response = BidResponse.getDefaultBidResponse(bidRequest) - encode(response) - } } diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/CurrencyConversion.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/CurrencyConversion.groovy index 6246f8c9f4d..16dde6c58da 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/CurrencyConversion.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/CurrencyConversion.groovy @@ -1,12 +1,12 @@ package org.prebid.server.functional.testcontainers.scaffolding -import org.mockserver.model.HttpRequest +import com.github.tomakehurst.wiremock.matching.RequestPattern +import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder import org.prebid.server.functional.model.mock.services.currencyconversion.CurrencyConversionRatesResponse -import org.testcontainers.containers.MockServerContainer +import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer -import static org.mockserver.model.HttpRequest.request -import static org.mockserver.model.HttpResponse.response -import static org.mockserver.model.HttpStatusCode.OK_200 +import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo import static org.prebid.server.functional.util.CurrencyUtil.DEFAULT_CURRENCY_RATES class CurrencyConversion extends NetworkScaffolding { @@ -14,29 +14,24 @@ class CurrencyConversion extends NetworkScaffolding { static final String CURRENCY_ENDPOINT_PATH = "/currency" private static final CurrencyConversionRatesResponse DEFAULT_RATES_RESPONSE = CurrencyConversionRatesResponse.getDefaultCurrencyConversionRatesResponse(DEFAULT_CURRENCY_RATES) - CurrencyConversion(MockServerContainer mockServerContainer) { - super(mockServerContainer, CURRENCY_ENDPOINT_PATH) + CurrencyConversion(NetworkServiceContainer wireMockContainer) { + super(wireMockContainer, CURRENCY_ENDPOINT_PATH) } void setCurrencyConversionRatesResponse(CurrencyConversionRatesResponse conversionRatesResponse = DEFAULT_RATES_RESPONSE) { - setResponse(request, conversionRatesResponse) + setResponse(getRequest(), conversionRatesResponse) } @Override - void setResponse() { - mockServerClient.when(request().withPath(endpoint)) - .respond(response().withStatusCode(OK_200.code())) - } + void setResponse() {} @Override - protected HttpRequest getRequest(String ignored) { - request().withMethod("GET") - .withPath(CURRENCY_ENDPOINT_PATH) + protected RequestPattern getRequest() { + getRequestedFor(urlEqualTo(CURRENCY_ENDPOINT_PATH)).build() } @Override - protected HttpRequest getRequest() { - request().withMethod("GET") - .withPath(CURRENCY_ENDPOINT_PATH) + protected RequestPatternBuilder getRequest(String value) { + return null } } diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/FloorsProvider.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/FloorsProvider.groovy index 77c18b09088..684acf229f2 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/FloorsProvider.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/FloorsProvider.groovy @@ -1,43 +1,42 @@ package org.prebid.server.functional.testcontainers.scaffolding -import org.mockserver.matchers.TimeToLive -import org.mockserver.matchers.Times -import org.mockserver.model.HttpRequest -import org.mockserver.model.HttpResponse +import com.github.tomakehurst.wiremock.matching.RequestPattern +import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder import org.prebid.server.functional.model.pricefloors.PriceFloorData -import org.testcontainers.containers.MockServerContainer +import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer -import static org.mockserver.model.HttpRequest.request -import static org.mockserver.model.HttpResponse.response -import static org.mockserver.model.HttpStatusCode.OK_200 +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse +import static com.github.tomakehurst.wiremock.client.WireMock.any +import static com.github.tomakehurst.wiremock.client.WireMock.anyRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo +import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching +import static org.prebid.server.functional.model.HttpStatusCode.OK_200 class FloorsProvider extends NetworkScaffolding { public static final String FLOORS_ENDPOINT = "/floors-provider/" - FloorsProvider(MockServerContainer mockServerContainer) { - super(mockServerContainer, FLOORS_ENDPOINT) + FloorsProvider(NetworkServiceContainer wireMockContainer) { + super(wireMockContainer, FLOORS_ENDPOINT) } - @Override - protected HttpRequest getRequest(String accountId) { - request().withPath(FLOORS_ENDPOINT + accountId) + protected RequestPattern getRequest() { + anyRequestedFor(urlEqualTo(FLOORS_ENDPOINT)) + .build() } @Override - protected HttpRequest getRequest() { - request().withPath(FLOORS_ENDPOINT) + protected RequestPatternBuilder getRequest(String accountId) { + getRequestedFor(urlEqualTo(FLOORS_ENDPOINT + accountId)) } @Override void setResponse() { - mockServerClient.when(request().withPath("^.*$endpoint.*\$"), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond{request -> request.withPath(endpoint) - ? response().withStatusCode(OK_200.code()).withBody(defaultResponse) - : HttpResponse.notFoundResponse()} - } - - private String getDefaultResponse() { - encode(PriceFloorData.priceFloorData) + wireMockClient.register(any(urlMatching("^.*$endpoint.*\$")) + .atPriority(Integer.MAX_VALUE) + .willReturn(aResponse() + .withStatus(OK_200.code) + .withBody(encode(PriceFloorData.priceFloorData)))) } } diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/HttpSettings.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/HttpSettings.groovy index 5af648b2bc0..025abada7a8 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/HttpSettings.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/HttpSettings.groovy @@ -1,16 +1,18 @@ package org.prebid.server.functional.testcontainers.scaffolding -import org.mockserver.matchers.Times -import org.mockserver.model.Header -import org.mockserver.model.HttpRequest -import org.mockserver.model.HttpStatusCode +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.matching.RequestPattern +import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder +import com.github.tomakehurst.wiremock.stubbing.StubMapping +import org.prebid.server.functional.model.HttpStatusCode import org.prebid.server.functional.model.ResponseModel -import org.testcontainers.containers.MockServerContainer +import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer -import static org.mockserver.model.HttpRequest.request -import static org.mockserver.model.HttpResponse.response -import static org.mockserver.model.HttpStatusCode.OK_200 -import static org.mockserver.model.MediaType.APPLICATION_JSON +import static com.github.tomakehurst.wiremock.client.WireMock.anyRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo +import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo +import static org.prebid.server.functional.model.HttpStatusCode.OK_200 class HttpSettings extends NetworkScaffolding { @@ -18,64 +20,47 @@ class HttpSettings extends NetworkScaffolding { private static final String RFC_ENDPOINT = "/stored-requests-rfc" private static final String AMP_ENDPOINT = "/amp-stored-requests" - HttpSettings(MockServerContainer mockServerContainer) { - super(mockServerContainer, ENDPOINT) + HttpSettings(NetworkServiceContainer wireMockContainer, String endpoint = ENDPOINT) { + super(wireMockContainer, endpoint) } - @Override - protected HttpRequest getRequest(String accountId) { - request().withPath(ENDPOINT) - .withQueryStringParameter("account-ids", "[\"$accountId\"]") + protected RequestPattern getRequest() { + anyRequestedFor(urlPathEqualTo(endpoint)).build() } @Override - protected HttpRequest getRequest() { - request().withPath(ENDPOINT) + protected RequestPatternBuilder getRequest(String accountId) { + getRequestedFor(urlPathEqualTo(endpoint)) + .withQueryParam("account-ids", equalTo("[\"" + accountId + "\"]")) } @Override void setResponse() { } - protected HttpRequest getRfcRequest(String accountId) { - request().withPath(RFC_ENDPOINT) - .withQueryStringParameter("account-id", accountId) + protected RequestPatternBuilder getRfcRequestPattern(String accountId) { + anyRequestedFor(urlPathEqualTo(endpoint)) + .withQueryParam("account-id", equalTo(accountId)) } - void setRfcResponse(String value, - ResponseModel responseModel, - HttpStatusCode statusCode = OK_200, - Map headers = [:]) { - def responseHeaders = headers.collect { new Header(it.key, it.value) } - def mockResponse = encode(responseModel) - mockServerClient.when(getRfcRequest(value), Times.unlimited()) - .respond(response().withStatusCode(statusCode.code()) - .withBody(mockResponse, APPLICATION_JSON) - .withHeaders(responseHeaders)) - } - - int getRfcRequestCount(String value) { - mockServerClient.retrieveRecordedRequests(getRfcRequest(value)) - .size() - } + ResponseModel responseModel, + HttpStatusCode statusCode = OK_200, + Map headers = [:]) { - @Override - void reset() { - super.reset(ENDPOINT) - super.reset(RFC_ENDPOINT) - super.reset(AMP_ENDPOINT) - } + def responseBuilder = ResponseDefinitionBuilder.responseDefinition() + .withStatus(statusCode.code) + .withHeader("Content-Type", "application/json") + .withBody(encode(responseModel)) - static String getEndpoint() { - return ENDPOINT - } + headers.each { k, v -> + responseBuilder.withHeader(k, v) + } - static String getAmpEndpoint() { - return AMP_ENDPOINT + wireMockClient.register(new StubMapping(getRfcRequestPattern(value).build(), responseBuilder.build())) } - static String getRfcEndpoint() { - return RFC_ENDPOINT + int getRfcRequestCount(String value) { + return wireMockClient.find(getRfcRequestPattern(value)).size() } } diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/NetworkScaffolding.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/NetworkScaffolding.groovy index 8ac5ad41483..498b09eaee9 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/NetworkScaffolding.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/NetworkScaffolding.groovy @@ -1,63 +1,51 @@ package org.prebid.server.functional.testcontainers.scaffolding -import org.mockserver.client.MockServerClient -import org.mockserver.matchers.Times -import org.mockserver.model.ClearType -import org.mockserver.model.Header -import org.mockserver.model.HttpRequest -import org.mockserver.model.HttpStatusCode +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder +import com.github.tomakehurst.wiremock.client.WireMock +import com.github.tomakehurst.wiremock.matching.RequestPattern +import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder +import com.github.tomakehurst.wiremock.stubbing.StubMapping +import org.prebid.server.functional.model.HttpStatusCode import org.prebid.server.functional.model.ResponseModel +import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer import org.prebid.server.functional.util.ObjectMapperWrapper -import org.testcontainers.containers.MockServerContainer -import java.util.concurrent.TimeUnit - -import static java.util.concurrent.TimeUnit.SECONDS -import static org.mockserver.model.ClearType.ALL -import static org.mockserver.model.HttpRequest.request -import static org.mockserver.model.HttpResponse.response -import static org.mockserver.model.HttpStatusCode.OK_200 -import static org.mockserver.model.MediaType.APPLICATION_JSON +import static org.prebid.server.functional.model.HttpStatusCode.OK_200 abstract class NetworkScaffolding implements ObjectMapperWrapper { - protected MockServerClient mockServerClient + protected WireMock wireMockClient protected String endpoint - NetworkScaffolding(MockServerContainer mockServerContainer, String endpoint) { - this.mockServerClient = new MockServerClient(mockServerContainer.host, mockServerContainer.serverPort) + NetworkScaffolding(NetworkServiceContainer wireMockContainer, String endpoint) { + this.wireMockClient = new WireMock(wireMockContainer.host, wireMockContainer.firstMappedPort) this.endpoint = endpoint } - abstract protected HttpRequest getRequest(String value) + abstract protected RequestPattern getRequest() - abstract protected HttpRequest getRequest() + abstract protected RequestPatternBuilder getRequest(String value) abstract void setResponse() - int getRequestCount(HttpRequest httpRequest) { - mockServerClient.retrieveRecordedRequests(httpRequest) - .size() + int getRequestCount(RequestPatternBuilder requestPatternBuilder) { + return wireMockClient.find(requestPatternBuilder).size() } int getRequestCount(String value) { - mockServerClient.retrieveRecordedRequests(getRequest(value)) - .size() - } - - int getRequestCount() { - mockServerClient.retrieveRecordedRequests(request) - .size() + return wireMockClient.find(getRequest(value)).size() } - void setResponse(HttpRequest httpRequest, + void setResponse(RequestPattern requestPattern, ResponseModel responseModel, - HttpStatusCode statusCode = OK_200, - Times times = Times.exactly(1)) { - def mockResponse = encode(responseModel) - mockServerClient.when(httpRequest, times) - .respond(response().withStatusCode(statusCode.code()) - .withBody(mockResponse, APPLICATION_JSON)) + HttpStatusCode statusCode = OK_200) { + + def responseBuilder = ResponseDefinitionBuilder.responseDefinition() + .withStatus(statusCode.code) + .withHeader("Content-Type", "application/json") + .withBody(encode(responseModel)) + + wireMockClient.register(new StubMapping(requestPattern, responseBuilder.build())) } void setResponse(String value, @@ -70,87 +58,97 @@ abstract class NetworkScaffolding implements ObjectMapperWrapper { ResponseModel responseModel, HttpStatusCode statusCode = OK_200, Map headers = [:]) { - def responseHeaders = headers.collect { new Header(it.key, it.value) } - def mockResponse = encode(responseModel) - mockServerClient.when(getRequest(value), Times.unlimited()) - .respond(response().withStatusCode(statusCode.code()) - .withBody(mockResponse, APPLICATION_JSON) - .withHeaders(responseHeaders)) + + def responseBuilder = ResponseDefinitionBuilder.responseDefinition() + .withStatus(statusCode.code) + .withHeader("Content-Type", "application/json") + .withBody(encode(responseModel)) + + headers.each { k, v -> + responseBuilder.withHeader(k, v) + } + + wireMockClient.register(new StubMapping(getRequest(value).build(), responseBuilder.build())) } void setResponse(String value, ResponseModel responseModel, int responseDelay, - HttpStatusCode statusCode = OK_200, - Map headers = [:]) { - def responseHeaders = headers.collect { new Header(it.key, it.value) } - def mockResponse = encode(responseModel) - mockServerClient.when(getRequest(value), Times.unlimited()) - .respond(response().withStatusCode(statusCode.code()) - .withBody(mockResponse, APPLICATION_JSON) - .withHeaders(responseHeaders) - .withDelay(TimeUnit.MILLISECONDS, responseDelay)) + HttpStatusCode statusCode = OK_200) { + def responseBuilder = ResponseDefinitionBuilder.responseDefinition() + .withStatus(statusCode.code) + .withHeader("Content-Type", "application/json") + .withBody(encode(responseModel)) + .withFixedDelay(responseDelay) + + wireMockClient.register(new StubMapping(getRequest(value).build(), responseBuilder.build())) } void setResponse(String value, String mockResponse) { - mockServerClient.when(getRequest(value), Times.exactly(1)) - .respond(response().withStatusCode(OK_200.code()) - .withBody(mockResponse, APPLICATION_JSON)) + def responseBuilder = ResponseDefinitionBuilder.responseDefinition() + .withStatus(OK_200.code) + .withBody(mockResponse) + + wireMockClient.register(new StubMapping(getRequest(value).build(), responseBuilder.build())) } void setResponse(ResponseModel responseModel) { - def mockResponse = encode(responseModel) - mockServerClient.when(request().withPath(endpoint)) - .respond(response().withStatusCode(OK_200.code()) - .withBody(mockResponse, APPLICATION_JSON)) + def responseBuilder = ResponseDefinitionBuilder.responseDefinition() + .withStatus(OK_200.code) + .withHeader("Content-Type", "application/json") + .withBody(encode(responseModel)) + + wireMockClient.register(new StubMapping(getRequest(), responseBuilder.build())) } void setResponse(String value, HttpStatusCode httpStatusCode) { - mockServerClient.when(getRequest(value), Times.exactly(1)) - .respond(response().withStatusCode(httpStatusCode.code())) - } + def responseBuilder = ResponseDefinitionBuilder.responseDefinition() + .withStatus(httpStatusCode.code) - void setResponse(String value, HttpStatusCode httpStatusCode, String errorText) { - mockServerClient.when(getRequest(value), Times.exactly(1)) - .respond(response().withStatusCode(httpStatusCode.code()) - .withBody(errorText, APPLICATION_JSON)) + wireMockClient.register(new StubMapping(getRequest(value).build(), responseBuilder.build())) } void setResponseWithTimeout(String value, int timeoutSec = 5) { - mockServerClient.when(getRequest(value), Times.exactly(1)) - .respond(response().withDelay(SECONDS, timeoutSec)) - } + def responseBuilder = ResponseDefinitionBuilder.responseDefinition() + .withFixedDelay(timeoutSec * 1000) - protected def getRequestAndResponse() { - mockServerClient.retrieveRecordedRequestsAndResponses(request()) + wireMockClient.register(new StubMapping(getRequest(value).build(), responseBuilder.build())) } - List getRecordedRequestsBody(HttpRequest httpRequest) { - mockServerClient.retrieveRecordedRequests(httpRequest) - .collect { it.body.toString() } + List getRecordedRequestsBody(RequestPatternBuilder requestPatternBuilder) { + wireMockClient.find(requestPatternBuilder).bodyAsString } - String getRecordedRequestsQueryParameters(HttpRequest httpRequest) { - mockServerClient.retrieveRecordedRequests(httpRequest) - .collect { it -> it.queryStringParameters.multimap.toString()} + String getRecordedRequestsQueryParameters(RequestPatternBuilder requestPatternBuilder) { + wireMockClient.find(requestPatternBuilder) + .collect { + it.queryParams.collectEntries { k, v -> + [(k): v.values()] + }.toString() + } } List getRecordedRequestsBody(String value) { - mockServerClient.retrieveRecordedRequests(getRequest(value)) - .collect { it.body.toString() } + wireMockClient.find(getRequest(value)).bodyAsString } - List getRecordedRequestsBody() { - mockServerClient.retrieveRecordedRequests(request) - .collect { it.body.toString() } + Map> getLastRecordedRequestHeaders(RequestPatternBuilder requestPatternBuilder) { + getRecordedRequestsHeaders(requestPatternBuilder).last() } - Map> getLastRecordedRequestHeaders(HttpRequest httpRequest) { - getRecordedRequestsHeaders(httpRequest).last() - } + List>> getRecordedRequestsHeaders(RequestPatternBuilder requestPatternBuilder) { + def requests = wireMockClient.find(requestPatternBuilder) - List>> getRecordedRequestsHeaders(HttpRequest httpRequest) { - getRequestsHeaders(mockServerClient.retrieveRecordedRequests(httpRequest) as List) + List>> result = [] + requests.each { req -> + Map> headersMap = [:] + req.headers.all().each { header -> + headersMap[header.key() as String] = header.values()*.toString() + } + result << headersMap + } + + result } Map> getLastRecordedRequestHeaders(String value) { @@ -158,17 +156,12 @@ abstract class NetworkScaffolding implements ObjectMapperWrapper { } List>> getRecordedRequestsHeaders(String value) { - getRequestsHeaders(mockServerClient.retrieveRecordedRequests(getRequest(value)) as List) + getRecordedRequestsHeaders(getRequest(value)) } - // should be used instead of mockServerClient.reset due to memory leak on library - void reset(String resetEndpoint = endpoint, ClearType clearType = ALL) { - mockServerClient.clear(request().withPath(resetEndpoint), clearType) - } - - private static List>> getRequestsHeaders(List httpRequests) { - httpRequests*.headerList*.collectEntries { header -> - [header.name as String, header.values.collect { it as String }] - } + void reset() { + wireMockClient.resetMappings() + wireMockClient.resetScenarios() + wireMockClient.resetRequests() } } diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/PrebidCache.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/PrebidCache.groovy index 66ce54a9531..64fc6455be8 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/PrebidCache.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/PrebidCache.groovy @@ -1,39 +1,49 @@ package org.prebid.server.functional.testcontainers.scaffolding -import org.mockserver.matchers.TimeToLive -import org.mockserver.matchers.Times -import org.mockserver.model.HttpRequest -import org.mockserver.model.HttpResponse -import org.prebid.server.functional.model.mock.services.prebidcache.response.CacheObject -import org.prebid.server.functional.model.mock.services.prebidcache.response.PrebidCacheResponse +import com.github.tomakehurst.wiremock.matching.RequestPattern +import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder import org.prebid.server.functional.model.request.cache.BidCacheRequest import org.prebid.server.functional.model.response.vtrack.TransferValue +import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer import org.prebid.server.functional.util.PBSUtils -import org.testcontainers.containers.MockServerContainer -import java.util.stream.Stream - -import static org.mockserver.model.HttpRequest.request -import static org.mockserver.model.HttpResponse.response -import static org.mockserver.model.HttpStatusCode.INTERNAL_SERVER_ERROR_500 -import static org.mockserver.model.HttpStatusCode.OK_200 -import static org.mockserver.model.JsonPathBody.jsonPath +import static java.lang.Integer.MAX_VALUE +import static com.github.tomakehurst.wiremock.client.WireMock.post +import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo +import static com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse +import static com.github.tomakehurst.wiremock.client.WireMock.get +import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor +import static org.prebid.server.functional.model.HttpStatusCode.INTERNAL_SERVER_ERROR_500 +import static org.prebid.server.functional.model.HttpStatusCode.OK_200 class PrebidCache extends NetworkScaffolding { private static final String CACHE_ENDPOINT = "/cache" + private static final String RESPONSE_BODY = + ''' + { + "responses" : [ + {{#each (jsonPath request.body '$.puts')}} + { + "uuid" : "{{randomValue type='UUID'}}" + }{{#unless @last}},{{/unless}} + {{/each}} + ] + } + ''' - PrebidCache(MockServerContainer mockServerContainer) { - super(mockServerContainer, CACHE_ENDPOINT) - } - String getVTracGetRequestParams() { - getRecordedRequestsQueryParameters(request().withMethod("GET") - .withPath(CACHE_ENDPOINT)) + PrebidCache(NetworkServiceContainer wireMockContainer) { + super(wireMockContainer, CACHE_ENDPOINT) } - void setXmlCacheResponse(String payload, PrebidCacheResponse prebidCacheResponse) { - setResponse(getXmlCacheRequest(payload), prebidCacheResponse) + String getVTracGetRequestParams() { + getRecordedRequestsQueryParameters(getRequestedFor(urlMatching("^/cache(\\?.*)?\$"))) } int getXmlRequestCount(String payload) { @@ -44,84 +54,63 @@ class PrebidCache extends NetworkScaffolding { getRecordedRequestsBody(getXmlCacheRequest(payload)) } - Map getXmlRecordedRequestHeaders(String payload) { - getLastRecordedRequestHeaders(getXmlCacheRequest(payload)) + protected RequestPattern getRequest() { + postRequestedFor(urlEqualTo(endpoint)) + .build() } @Override - protected HttpRequest getRequest(String impId) { - request().withMethod("POST") - .withPath(CACHE_ENDPOINT) - .withBody(jsonPath("\$.puts[?(@.value.impid == '$impId')]")) + protected RequestPatternBuilder getRequest(String impId) { + postRequestedFor(urlEqualTo(CACHE_ENDPOINT)) + .withRequestBody(matchingJsonPath("\$.puts[?(@.value.impid == '" + impId + "')]")) } + List getRecordedRequests(String impId) { - mockServerClient.retrieveRecordedRequests(getRequest(impId)) - .collect { decode(it.body.toString(), BidCacheRequest) } + wireMockClient.find(getRequest(impId)).bodyAsString + .collect { decode(it, BidCacheRequest) } } Map> getRequestHeaders(String impId) { getLastRecordedRequestHeaders(getRequest(impId)) } - @Override - HttpRequest getRequest() { - request().withMethod("POST") - .withPath(CACHE_ENDPOINT) - } - @Override void setResponse() { - mockServerClient.when(request() - .withMethod("POST") - .withPath(endpoint), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond { request -> - request.withPath(endpoint) - ? response().withStatusCode(OK_200.code()).withBody(getBodyByRequest(request)) - : HttpResponse.notFoundResponse() - } + wireMockClient.register(post(urlPathEqualTo(endpoint)) + .atPriority(MAX_VALUE) + .willReturn(aResponse() + .withTransformers("response-template") + .withStatus(OK_200.code) + .withBody(RESPONSE_BODY))) } void setGetResponse(TransferValue vTrackResponse) { - mockServerClient.when(request() - .withMethod("GET") - .withPath(endpoint), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond { request -> - request.withPath(endpoint) - ? response().withStatusCode(OK_200.code()).withBody(encode(vTrackResponse)) - : HttpResponse.notFoundResponse() - } + wireMockClient.register(get(urlPathEqualTo(endpoint)) + .atPriority(MAX_VALUE) + .willReturn(aResponse() + .withStatus(OK_200.code) + .withBody(encode(vTrackResponse)))) } void setInvalidPostResponse() { - mockServerClient.when(request() - .withMethod("POST") - .withPath(endpoint), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond { response().withStatusCode(INTERNAL_SERVER_ERROR_500.code()) } + wireMockClient.register(post(urlPathEqualTo(endpoint)) + .atPriority(MAX_VALUE) + .willReturn(aResponse() + .withStatus(INTERNAL_SERVER_ERROR_500.code))) } void setInvalidGetResponse(String uuid, String errorMessage = PBSUtils.randomString) { - mockServerClient.when(request() - .withMethod("GET") - .withPath(endpoint) - .withQueryStringParameter("uuid", uuid), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond { response().withBody(errorMessage).withStatusCode(INTERNAL_SERVER_ERROR_500.code()) } - - } - - private static HttpRequest getXmlCacheRequest(String payload) { - request().withMethod("POST") - .withPath(CACHE_ENDPOINT) - .withBody(jsonPath("\$.puts[?(@.value =~/^.*$payload.*\$/)]")) + wireMockClient.register(get(urlPathEqualTo(endpoint)) + .withQueryParam("uuid", equalTo(uuid)) + .atPriority(MAX_VALUE) + .willReturn(aResponse() + .withStatus(INTERNAL_SERVER_ERROR_500.code) + .withBody(errorMessage))) } - private String getBodyByRequest(HttpRequest request) { - def requestString = request.bodyAsString - def jsonNode = toJsonNode(requestString) - def putsSize = jsonNode.get("puts").size() - def cacheObjects = Stream.generate(CacheObject::getDefaultCacheObject) - .limit(putsSize) - .toList() - encode(new PrebidCacheResponse(responses: cacheObjects)) + private static RequestPatternBuilder getXmlCacheRequest(String payload) { + postRequestedFor(urlEqualTo(CACHE_ENDPOINT)) + .withRequestBody(matchingJsonPath("\$.puts[?(@.value =~ /.*" + payload + ".*/)]")) } } diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/PubStackAnalytics.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/PubStackAnalytics.groovy index a3bd0e9ddfb..d4dc19ad88f 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/PubStackAnalytics.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/PubStackAnalytics.groovy @@ -1,37 +1,32 @@ package org.prebid.server.functional.testcontainers.scaffolding -import org.mockserver.model.HttpRequest -import org.testcontainers.containers.MockServerContainer +import com.github.tomakehurst.wiremock.matching.RequestPattern +import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder +import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer -import static org.mockserver.model.HttpRequest.request +import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo class PubStackAnalytics extends NetworkScaffolding { private static final String CONFIG_ENDPOINT = "/bootstrap" private static final String ANALYTICS_ENDPOINT = "/intake/auction" - PubStackAnalytics(MockServerContainer mockServerContainer) { - super(mockServerContainer, CONFIG_ENDPOINT) + PubStackAnalytics(NetworkServiceContainer wireMockContainer) { + super(wireMockContainer, CONFIG_ENDPOINT) } @Override - protected HttpRequest getRequest() { - request().withPath(ANALYTICS_ENDPOINT) + protected RequestPattern getRequest() { + postRequestedFor(urlEqualTo(ANALYTICS_ENDPOINT)) + .build() } @Override - void setResponse() { - + protected RequestPatternBuilder getRequest(String value) { + return null } @Override - protected HttpRequest getRequest(String value) { - request().withPath(ANALYTICS_ENDPOINT) - } - - @Override - void reset() { - super.reset(CONFIG_ENDPOINT) - super.reset(ANALYTICS_ENDPOINT) - } + void setResponse() {} } diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/StoredCache.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/StoredCache.groovy index c8ad7caa924..6deb9a67fb4 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/StoredCache.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/StoredCache.groovy @@ -1,9 +1,8 @@ package org.prebid.server.functional.testcontainers.scaffolding -import org.mockserver.matchers.TimeToLive -import org.mockserver.matchers.Times -import org.mockserver.model.HttpRequest -import org.mockserver.model.HttpStatusCode +import com.github.tomakehurst.wiremock.matching.RequestPattern +import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder +import org.prebid.server.functional.model.HttpStatusCode import org.prebid.server.functional.model.config.Audience import org.prebid.server.functional.model.config.AudienceId import org.prebid.server.functional.model.config.IdentifierType @@ -12,31 +11,36 @@ import org.prebid.server.functional.model.config.TargetingOrtb import org.prebid.server.functional.model.config.TargetingResult import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.User +import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer import org.prebid.server.functional.util.PBSUtils -import org.testcontainers.containers.MockServerContainer import java.nio.charset.StandardCharsets -import static org.mockserver.model.HttpRequest.request -import static org.mockserver.model.HttpResponse.response -import static org.mockserver.model.HttpStatusCode.NO_CONTENT_204 -import static org.mockserver.model.HttpStatusCode.OK_200 +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse +import static com.github.tomakehurst.wiremock.client.WireMock.get +import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.post +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo +import static org.prebid.server.functional.model.HttpStatusCode.NO_CONTENT_204 +import static org.prebid.server.functional.model.HttpStatusCode.OK_200 class StoredCache extends NetworkScaffolding { private static final String CACHE_ENDPOINT = "/stored-cache" - StoredCache(MockServerContainer mockServerContainer) { - super(mockServerContainer, CACHE_ENDPOINT) + StoredCache(NetworkServiceContainer wireMockContainer) { + super(wireMockContainer, CACHE_ENDPOINT) } - @Override - protected HttpRequest getRequest(String impId) {} + protected RequestPattern getRequest() { + getRequestedFor(urlEqualTo(endpoint)) + .build() + } @Override - HttpRequest getRequest() { - request().withMethod("GET") - .withPath(endpoint) + protected RequestPatternBuilder getRequest(String bidRequestId) { + return null } @Override @@ -44,27 +48,29 @@ class StoredCache extends NetworkScaffolding { TargetingResult setTargetingResponse(BidRequest bidRequest, OptableTargetingConfig config) { def targetingResult = getBodyByRequest(bidRequest) - mockServerClient.when(request() - .withMethod("GET") - .withPath("$endpoint${QueryBuilder.buildQuery(bidRequest, config)}"), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond { response().withStatusCode(OK_200.code()).withBody(encode(targetingResult)) } + wireMockClient.register(get(urlPathEqualTo("$endpoint${QueryBuilder.buildQuery(bidRequest, config)}")) + .atPriority(Integer.MAX_VALUE) + .willReturn(aResponse() + .withStatus(OK_200.code) + .withBody(encode(targetingResult)))) targetingResult } TargetingResult setCachedTargetingResponse(BidRequest bidRequest) { def targetingResult = getBodyByRequest(bidRequest) - mockServerClient.when(request() - .withMethod("GET") - .withPath(endpoint), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond { response().withStatusCode(OK_200.code()).withBody(encode(targetingResult)) } + wireMockClient.register(get(urlPathEqualTo(endpoint)) + .atPriority(Integer.MAX_VALUE) + .willReturn(aResponse() + .withStatus(OK_200.code) + .withBody(encode(targetingResult)))) targetingResult } void setCachingResponse(HttpStatusCode statusCode = NO_CONTENT_204) { - mockServerClient.when(request() - .withMethod("POST") - .withPath(endpoint), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond { response().withStatusCode(statusCode.code()) } + wireMockClient.register(post(urlPathEqualTo(endpoint)) + .atPriority(Integer.MAX_VALUE) + .willReturn(aResponse() + .withStatus(statusCode.code))) } private static TargetingResult getBodyByRequest(BidRequest bidRequest) { diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/VendorList.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/VendorList.groovy index 343a118f53a..cb837ddd595 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/VendorList.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/scaffolding/VendorList.groovy @@ -1,15 +1,15 @@ package org.prebid.server.functional.testcontainers.scaffolding -import org.mockserver.matchers.TimeToLive -import org.mockserver.matchers.Times -import org.mockserver.model.Delay -import org.mockserver.model.HttpRequest -import org.mockserver.model.HttpResponse -import org.testcontainers.containers.MockServerContainer - -import static org.mockserver.model.HttpRequest.request -import static org.mockserver.model.HttpResponse.response -import static org.mockserver.model.HttpStatusCode.OK_200 +import com.github.tomakehurst.wiremock.matching.RequestPattern +import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder +import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse +import static com.github.tomakehurst.wiremock.client.WireMock.any +import static com.github.tomakehurst.wiremock.client.WireMock.anyRequestedFor +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo +import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching +import static org.prebid.server.functional.model.HttpStatusCode.OK_200 import static org.prebid.server.functional.model.mock.services.vendorlist.GvlSpecificationVersion.V2 import static org.prebid.server.functional.model.mock.services.vendorlist.GvlSpecificationVersion.V3 import static org.prebid.server.functional.model.mock.services.vendorlist.VendorListResponse.Vendor @@ -22,27 +22,23 @@ class VendorList extends NetworkScaffolding { private static final String VENDOR_LIST_ENDPOINT = "/v{TCF_POLICY}/vendor-list.json" - VendorList(MockServerContainer mockServerContainer) { - super(mockServerContainer, VENDOR_LIST_ENDPOINT) + VendorList(NetworkServiceContainer wireMockContainer) { + super(wireMockContainer, VENDOR_LIST_ENDPOINT) } @Override - protected HttpRequest getRequest(String value) { - return null + protected RequestPattern getRequest() { + anyRequestedFor(urlEqualTo(VENDOR_LIST_ENDPOINT)) + .build() } @Override - protected HttpRequest getRequest() { - request().withPath(VENDOR_LIST_ENDPOINT) - } - - @Override - void reset() { - TcfPolicyVersion.values().each { version -> super.reset("/v${version.vendorListVersion}/vendor-list.json") } + protected RequestPatternBuilder getRequest(String value) { + return null } void setResponse(TcfPolicyVersion tcfPolicyVersion = TCF_POLICY_V2, - Delay delay = null, + Integer second = 0, Map vendors = [(GENERIC_VENDOR_ID): Vendor.getDefaultVendor(GENERIC_VENDOR_ID)]) { def prepareEndpoint = endpoint.replace("{TCF_POLICY}", tcfPolicyVersion.vendorListVersion.toString()) def prepareEncodeResponseBody = encode(defaultVendorListResponse.tap { @@ -51,11 +47,11 @@ class VendorList extends NetworkScaffolding { it.gvlSpecificationVersion = tcfPolicyVersion >= TcfPolicyVersion.TCF_POLICY_V4 ? V3 : V2 }) - mockServerClient.when(request().withPath(prepareEndpoint), Times.unlimited(), TimeToLive.unlimited(), -10) - .respond { request -> - request.withPath(endpoint) - ? response().withStatusCode(OK_200.code()).withDelay(delay).withBody(prepareEncodeResponseBody) - : HttpResponse.notFoundResponse() - } + wireMockClient.register(any(urlMatching(prepareEndpoint)) + .atPriority(Integer.MAX_VALUE) + .willReturn(aResponse() + .withStatus(OK_200.code) + .withFixedDelay(second * 1000) + .withBody(prepareEncodeResponseBody))) } } diff --git a/src/test/groovy/org/prebid/server/functional/tests/BaseSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/BaseSpec.groovy index 13479030d1d..769a20ff57b 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BaseSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BaseSpec.groovy @@ -60,7 +60,6 @@ abstract class BaseSpec extends Specification implements ObjectMapperWrapper { def cleanupSpec() { bidder.reset() - prebidCache.reset() repository.removeAllDatabaseData() vendorList.reset() } diff --git a/src/test/groovy/org/prebid/server/functional/tests/CacheVtrackSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/CacheVtrackSpec.groovy index e5637fe80e2..a58517a7637 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/CacheVtrackSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/CacheVtrackSpec.groovy @@ -359,7 +359,7 @@ class CacheVtrackSpec extends BaseSpec { and: "Verify parameters that came to external cache services" def requestParams = prebidCache.getVTracGetRequestParams() - assert requestParams == "[{ch=[$cacheHost], uuid=[$uuid]}]" + assert requestParams == "[[uuid:[$uuid], ch:[$cacheHost]]]" } def "PBS should return 200 status code when internal cache and get vtrack request contain uuid"() { @@ -388,7 +388,7 @@ class CacheVtrackSpec extends BaseSpec { and: "Verify parameters that came to external cache services" def requestParams = prebidCache.getVTracGetRequestParams() - assert requestParams == "[{uuid=[$uuid]}]" + assert requestParams == "[[uuid:[$uuid]]]" } def "PBS should return status code that came from pbc when internal cache and get vtrack request and response from pbc invalid"() { @@ -416,7 +416,7 @@ class CacheVtrackSpec extends BaseSpec { and: "Verify parameters that came to external cache services" def requestParams = prebidCache.getVTracGetRequestParams() - assert requestParams == "[{uuid=[$uuid]}]" + assert requestParams == "[[uuid:[$uuid]]]" } def "PBS should return 400 status code when internal cache and get vtrack request without uuid"() { diff --git a/src/test/groovy/org/prebid/server/functional/tests/HttpSettingsSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/HttpSettingsSpec.groovy index 4a0229122b6..b3ac512393b 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/HttpSettingsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/HttpSettingsSpec.groovy @@ -25,21 +25,16 @@ class HttpSettingsSpec extends BaseSpec { static PrebidServerService prebidServerService static PrebidServerService prebidServerServiceWithRfc + private static final String rfcEndpoint= "/stored-requests-rfc" private static final HttpSettings httpSettings = new HttpSettings(networkServiceContainer) + private static final HttpSettings httpSettingsWithRFC = new HttpSettings(networkServiceContainer, rfcEndpoint) private static final Map PBS_CONFIG_WITH_RFC = new HashMap<>(PbsConfig.httpSettingsConfig) + - ['settings.http.endpoint': "${networkServiceContainer.rootUri}${HttpSettings.rfcEndpoint}".toString(), - 'settings.http.rfc3986-compatible': 'true'] + ['settings.http.endpoint' : "${networkServiceContainer.rootUri}${rfcEndpoint}".toString(), + 'settings.http.rfc3986-compatible': 'true'] def setupSpec() { prebidServerService = pbsServiceFactory.getService(PbsConfig.httpSettingsConfig) prebidServerServiceWithRfc = pbsServiceFactory.getService(PBS_CONFIG_WITH_RFC) - bidder.setResponse() - vendorList.setResponse() - } - - def cleanupSpec() { - prebidServerService = pbsServiceFactory.removeContainer(PbsConfig.httpSettingsConfig) - prebidServerService = pbsServiceFactory.removeContainer(PBS_CONFIG_WITH_RFC) } def "PBS should take account information from http data source on auction request"() { @@ -74,7 +69,7 @@ class HttpSettingsSpec extends BaseSpec { and: "Prepare default account response with gdpr = 0" def httpSettingsResponse = HttpAccountsResponse.getDefaultHttpAccountsResponse(bidRequest.accountId) - httpSettings.setRfcResponse(bidRequest.accountId, httpSettingsResponse) + httpSettingsWithRFC.setRfcResponse(bidRequest.accountId, httpSettingsResponse) when: "PBS processes auction request" def response = prebidServerServiceWithRfc.sendAuctionRequest(bidRequest) @@ -89,7 +84,7 @@ class HttpSettingsSpec extends BaseSpec { assert bidder.getRequestCount(bidRequest.id) == 1 and: "There should be only one account request" - assert httpSettings.getRfcRequestCount(bidRequest.accountId) == 1 + assert httpSettingsWithRFC.getRfcRequestCount(bidRequest.accountId) == 1 } def "PBS should take account information from http data source on AMP request"() { @@ -137,7 +132,7 @@ class HttpSettingsSpec extends BaseSpec { and: "Prepare default account response with gdpr = 0" def httpSettingsResponse = HttpAccountsResponse.getDefaultHttpAccountsResponse(ampRequest.account.toString()) - httpSettings.setRfcResponse(ampRequest.account.toString(), httpSettingsResponse) + httpSettingsWithRFC.setRfcResponse(ampRequest.account.toString(), httpSettingsResponse) when: "PBS processes amp request" def response = prebidServerServiceWithRfc.sendAmpRequest(ampRequest) @@ -146,7 +141,7 @@ class HttpSettingsSpec extends BaseSpec { assert !response.ext?.debug?.httpcalls?.isEmpty() and: "There should be only one account request" - assert httpSettings.getRfcRequestCount(ampRequest.account.toString()) == 1 + assert httpSettingsWithRFC.getRfcRequestCount(ampRequest.account.toString()) == 1 then: "Response should contain targeting" assert !response.ext?.debug?.httpcalls?.isEmpty() @@ -177,7 +172,7 @@ class HttpSettingsSpec extends BaseSpec { and: "Prepare default account response" def httpSettingsResponse = HttpAccountsResponse.getDefaultHttpAccountsResponse(eventRequest.accountId.toString()) - httpSettings.setRfcResponse(eventRequest.accountId.toString(), httpSettingsResponse) + httpSettingsWithRFC.setRfcResponse(eventRequest.accountId.toString(), httpSettingsResponse) when: "PBS processes event request" def responseBody = prebidServerServiceWithRfc.sendEventRequest(eventRequest) @@ -187,7 +182,7 @@ class HttpSettingsSpec extends BaseSpec { ResourceUtil.readByteArrayFromClassPath("org/prebid/server/functional/tracking-pixel.png") and: "There should be only one account request" - assert httpSettings.getRfcRequestCount(eventRequest.accountId.toString()) == 1 + assert httpSettingsWithRFC.getRfcRequestCount(eventRequest.accountId.toString()) == 1 } def "PBS should take account information from http data source on setuid request"() { @@ -227,8 +222,8 @@ class HttpSettingsSpec extends BaseSpec { def "PBS should take account information from http data source on setuid request when rfc3986 enabled"() { given: "Pbs config with adapters.generic.usersync.redirect.*" def pbsConfig = new HashMap<>(PbsConfig.httpSettingsConfig) + - ['settings.http.endpoint': "${networkServiceContainer.rootUri}${HttpSettings.rfcEndpoint}".toString(), - 'settings.http.rfc3986-compatible': 'true', + ['settings.http.endpoint' : "${networkServiceContainer.rootUri}${rfcEndpoint}".toString(), + 'settings.http.rfc3986-compatible' : 'true', 'adapters.generic.usersync.redirect.url' : "$networkServiceContainer.rootUri/generic-usersync&redir={{redirect_url}}".toString(), 'adapters.generic.usersync.redirect.support-cors' : 'false', 'adapters.generic.usersync.redirect.format-override': 'blank'] @@ -242,7 +237,7 @@ class HttpSettingsSpec extends BaseSpec { and: "Prepare default account response" def httpSettingsResponse = HttpAccountsResponse.getDefaultHttpAccountsResponse(request.account) - httpSettings.setRfcResponse(request.account, httpSettingsResponse) + httpSettingsWithRFC.setRfcResponse(request.account, httpSettingsResponse) when: "PBS processes setuid request" def response = prebidServerService.sendSetUidRequest(request, uidsCookie) @@ -254,7 +249,7 @@ class HttpSettingsSpec extends BaseSpec { ResourceUtil.readByteArrayFromClassPath("org/prebid/server/functional/tracking-pixel.png") and: "There should be only one account request" - assert httpSettings.getRfcRequestCount(request.account) == 1 + assert httpSettingsWithRFC.getRfcRequestCount(request.account) == 1 cleanup: "Stop and remove pbs container" pbsServiceFactory.removeContainer(pbsConfig) @@ -293,7 +288,7 @@ class HttpSettingsSpec extends BaseSpec { and: "Prepare default account response" def httpSettingsResponse = HttpAccountsResponse.getDefaultHttpAccountsResponse(accountId) - httpSettings.setRfcResponse(accountId, httpSettingsResponse) + httpSettingsWithRFC.setRfcResponse(accountId, httpSettingsResponse) when: "PBS processes vtrack request" def response = prebidServerServiceWithRfc.sendPostVtrackRequest(request, accountId) @@ -302,7 +297,7 @@ class HttpSettingsSpec extends BaseSpec { assert response.responses[0]?.uuid and: "There should be only one account request and pbc request" - assert httpSettings.getRfcRequestCount(accountId.toString()) == 1 + assert httpSettingsWithRFC.getRfcRequestCount(accountId) == 1 assert prebidCache.getXmlRequestCount(payload) == 1 and: "VastXml that was send to PrebidCache must contain event url" diff --git a/src/test/groovy/org/prebid/server/functional/tests/SeatNonBidSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/SeatNonBidSpec.groovy index 02adb2ab5e5..b6f6a60195b 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/SeatNonBidSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/SeatNonBidSpec.groovy @@ -1,6 +1,6 @@ package org.prebid.server.functional.tests -import org.mockserver.model.HttpStatusCode +import org.prebid.server.functional.model.HttpStatusCode import org.prebid.server.functional.model.bidder.BidderName import org.prebid.server.functional.model.config.AccountAuctionConfig import org.prebid.server.functional.model.config.AccountBidValidationConfig @@ -16,14 +16,13 @@ import org.prebid.server.functional.model.response.auction.BidResponse import org.prebid.server.functional.model.response.auction.SeatBid import org.prebid.server.functional.util.PBSUtils -import static org.mockserver.model.HttpStatusCode.BAD_REQUEST_400 -import static org.mockserver.model.HttpStatusCode.INTERNAL_SERVER_ERROR_500 -import static org.mockserver.model.HttpStatusCode.NO_CONTENT_204 -import static org.mockserver.model.HttpStatusCode.OK_200 -import static org.mockserver.model.HttpStatusCode.PROCESSING_102 -import static org.mockserver.model.HttpStatusCode.SERVICE_UNAVAILABLE_503 import static org.prebid.server.functional.model.AccountStatus.ACTIVE - +import static org.prebid.server.functional.model.HttpStatusCode.OK_200 +import static org.prebid.server.functional.model.HttpStatusCode.BAD_REQUEST_400 +import static org.prebid.server.functional.model.HttpStatusCode.NO_CONTENT_204 +import static org.prebid.server.functional.model.HttpStatusCode.PROCESSING_102 +import static org.prebid.server.functional.model.HttpStatusCode.SERVICE_UNAVAILABLE_503 +import static org.prebid.server.functional.model.HttpStatusCode.INTERNAL_SERVER_ERROR_500 import static org.prebid.server.functional.model.config.BidValidationEnforcement.ENFORCE import static org.prebid.server.functional.model.request.auction.DebugCondition.DISABLED import static org.prebid.server.functional.model.request.auction.DebugCondition.ENABLED diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/optabletargeting/CacheStorageSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/optabletargeting/CacheStorageSpec.groovy index 9a71d42ba7f..3f1d8704b9b 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/optabletargeting/CacheStorageSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/optabletargeting/CacheStorageSpec.groovy @@ -20,7 +20,7 @@ import org.prebid.server.functional.tests.module.ModuleBaseSpec import org.prebid.server.functional.util.PBSUtils import static org.apache.commons.codec.binary.Base64.encodeBase64 -import static org.mockserver.model.HttpStatusCode.NOT_FOUND_404 +import static org.prebid.server.functional.model.HttpStatusCode.NOT_FOUNT_404 import static org.prebid.server.functional.model.ModuleName.OPTABLE_TARGETING import static org.prebid.server.functional.testcontainers.Dependencies.getNetworkServiceContainer @@ -93,7 +93,7 @@ class CacheStorageSpec extends ModuleBaseSpec { and: "Mocked external request" storedCache.setTargetingResponse(bidRequest, targetingConfig) - storedCache.setCachingResponse(NOT_FOUND_404) + storedCache.setCachingResponse(NOT_FOUNT_404) and: "Flash metrics" flushMetrics(prebidServerStoredCacheService) diff --git a/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsFetchingSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsFetchingSpec.groovy index b40f6e8cac2..d77aeb65f36 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsFetchingSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsFetchingSpec.groovy @@ -14,9 +14,9 @@ import org.prebid.server.functional.util.PBSUtils import java.time.Instant -import static org.mockserver.model.HttpStatusCode.BAD_REQUEST_400 import static org.prebid.server.functional.model.Currency.EUR import static org.prebid.server.functional.model.Currency.JPY +import static org.prebid.server.functional.model.HttpStatusCode.BAD_REQUEST_400 import static org.prebid.server.functional.model.bidder.BidderName.GENERIC import static org.prebid.server.functional.model.pricefloors.Country.MULTIPLE import static org.prebid.server.functional.model.pricefloors.MediaType.BANNER diff --git a/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsSignalingSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsSignalingSpec.groovy index b06c2530242..aa25da817c2 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsSignalingSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsSignalingSpec.groovy @@ -1,5 +1,6 @@ package org.prebid.server.functional.tests.pricefloors +import org.prebid.server.functional.model.HttpStatusCode import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.pricefloors.Country import org.prebid.server.functional.model.pricefloors.FloorModelGroup @@ -21,8 +22,8 @@ import org.prebid.server.functional.util.PBSUtils import java.math.RoundingMode import java.time.Instant -import static org.mockserver.model.HttpStatusCode.BAD_REQUEST_400 import static org.prebid.server.functional.model.Currency.USD +import static org.prebid.server.functional.model.HttpStatusCode.BAD_REQUEST_400 import static org.prebid.server.functional.model.bidder.BidderName.GENERIC import static org.prebid.server.functional.model.pricefloors.MediaType.BANNER import static org.prebid.server.functional.model.pricefloors.MediaType.MULTIPLE diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAmpSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAmpSpec.groovy index 717c9f32d5b..327d97ba625 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAmpSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAmpSpec.groovy @@ -1,6 +1,5 @@ package org.prebid.server.functional.tests.privacy -import org.mockserver.model.Delay import org.prebid.server.functional.model.ChannelType import org.prebid.server.functional.model.config.AccountConfig import org.prebid.server.functional.model.config.AccountGdprConfig @@ -434,7 +433,7 @@ class GdprAmpSpec extends PrivacyBaseSpec { vendorListResponse.reset() and: "Set vendor list response with delay" - vendorListResponse.setResponse(tcfPolicyVersion, Delay.seconds(EXPONENTIAL_BACKOFF_MAX_DELAY + 3)) + vendorListResponse.setResponse(tcfPolicyVersion, EXPONENTIAL_BACKOFF_MAX_DELAY + 3) when: "PBS processes amp request" defaultPrivacyPbsService.sendAmpRequest(ampRequest) diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy index 299d911a398..8d1838ff3e7 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy @@ -1,6 +1,5 @@ package org.prebid.server.functional.tests.privacy -import org.mockserver.model.Delay import org.prebid.server.functional.model.ChannelType import org.prebid.server.functional.model.config.AccountGdprConfig import org.prebid.server.functional.model.config.AccountMetricsConfig @@ -378,7 +377,7 @@ class GdprAuctionSpec extends PrivacyBaseSpec { vendorListResponse.reset() and: "Set vendor list response with delay" - vendorListResponse.setResponse(tcfPolicyVersion, Delay.seconds(EXPONENTIAL_BACKOFF_MAX_DELAY + 3)) + vendorListResponse.setResponse(tcfPolicyVersion, EXPONENTIAL_BACKOFF_MAX_DELAY + 3) when: "PBS processes auction request" defaultPrivacyPbsService.sendAuctionRequest(bidRequest) diff --git a/src/test/groovy/org/prebid/server/functional/util/SystemProperties.groovy b/src/test/groovy/org/prebid/server/functional/util/SystemProperties.groovy index 91379b3bbc1..410f9736991 100644 --- a/src/test/groovy/org/prebid/server/functional/util/SystemProperties.groovy +++ b/src/test/groovy/org/prebid/server/functional/util/SystemProperties.groovy @@ -3,7 +3,6 @@ package org.prebid.server.functional.util class SystemProperties { public static final String PBS_VERSION = System.getProperty("pbs.version")?.split("-")?.first() - public static final String MOCKSERVER_VERSION = System.getProperty("mockserver.version") public static final boolean USE_FIXED_CONTAINER_PORTS = getPropertyOrDefault("tests.fixed-container-ports", false) public static final int DEFAULT_TIMEOUT = 5000