Skip to content

Commit

Permalink
Tests: Relax timeouts (prebid#1848)
Browse files Browse the repository at this point in the history
  • Loading branch information
Net-burst authored May 5, 2022
1 parent 8ecf100 commit fe53ff8
Show file tree
Hide file tree
Showing 27 changed files with 83 additions and 83 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/pr-functional-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,4 @@ jobs:
${{ runner.os }}-maven-
- name: Build with Maven
run: mvn -B verify -DskipUnitTests=true -Dmax.containers.count=5 --file extra/pom.xml
run: mvn -B verify -DskipUnitTests=true -Dtests.max-container-count=5 --file extra/pom.xml
2 changes: 1 addition & 1 deletion docs/developers/functional-tests.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Functional tests need to have name template **.\*Spec.groovy**
**Properties:**

`launchContainers` - responsible for starting the MockServer and the MySQLContainer container. Default value is false to not launch containers for unit tests.
`max.containers.count` - maximum number of simultaneously running PBS containers. Default value is 2.
`tests.max-container-count` - maximum number of simultaneously running PBS containers. Default value is 2.
`skipFunctionalTests` - allow to skip funtional tests. Default value is false.
`skipUnitTests` - allow to skip unit tests. Default value is false.

Expand Down
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@
<jetty.version>9.4.44.v20210927</jetty.version>
<restassured.version>4.4.0</restassured.version>
<h2.version>2.1.210</h2.version>
<spock.version>2.0-groovy-3.0</spock.version>
<testcontainers.version>1.16.3</testcontainers.version>
<spock.version>2.1-groovy-3.0</spock.version>
<testcontainers.version>1.17.1</testcontainers.version>
<mockserver-client.version>5.11.2</mockserver-client.version>
<allure.version>2.17.2</allure.version>
<aspectj.version>1.9.7</aspectj.version>
Expand Down Expand Up @@ -756,7 +756,7 @@
<allure.results.directory>target/allure-results</allure.results.directory>
<mockserver.version>${mockserver-client.version}</mockserver.version>
<pbs.version>${project.version}</pbs.version>
<max.containers.count>2</max.containers.count>
<tests.max-container-count>2</tests.max-container-count>
</systemPropertyVariables>
</configuration>
<executions>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package org.prebid.server.functional.model.response.auction

import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString
import org.prebid.server.functional.model.bidder.BidderName
import org.prebid.server.functional.model.request.auction.BidRequest

import static org.prebid.server.functional.model.bidder.BidderName.GENERIC

@EqualsAndHashCode
@ToString(includeNames = true, ignoreNulls = true)
class SeatBid {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ import org.prebid.server.functional.util.SystemProperties
class PbsServiceFactory {

private static final Map<Map<String, String>, PrebidServerContainer> containers = [:]
private static final int MAX_CONTAINERS_COUNT = Integer.parseInt(
SystemProperties.getPropertyOrDefault("max.containers.count", "2"))
private static final int MAX_CONTAINER_COUNT = SystemProperties.getPropertyOrDefault("tests.max-container-count", 2)

private final ObjectMapperWrapper mapper
private final NetworkServiceContainer networkServiceContainer
Expand All @@ -25,7 +24,7 @@ class PbsServiceFactory {
if (containers.containsKey(config)) {
return new PrebidServerService(containers.get(config), mapper)
} else {
if (containers.size() >= MAX_CONTAINERS_COUNT) {
if (containers.size() >= MAX_CONTAINER_COUNT) {
def container = containers.find { !it.key.isEmpty() }
remove([(container.key): container.value])
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class Bidder extends NetworkScaffolding {
@Override
void setResponse() {
mockServerClient.when(request().withPath(endpoint), Times.unlimited(), TimeToLive.unlimited(), -10)
.respond{request -> request.withPath(endpoint)
.respond {request -> request.withPath(endpoint)
? response().withStatusCode(OK_200.code()).withBody(getBodyByRequest(request))
: HttpResponse.notFoundResponse()}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,10 @@ class HttpSettings extends NetworkScaffolding {
void setResponse() {

}

@Override
void reset() {
super.reset(ENDPOINT)
super.reset(AMP_ENDPOINT)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import org.prebid.server.functional.util.ObjectMapperWrapper
import org.testcontainers.containers.MockServerContainer

import static java.util.concurrent.TimeUnit.SECONDS
import static org.mockserver.model.ClearType.EXPECTATIONS
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
Expand Down Expand Up @@ -117,28 +117,28 @@ abstract class NetworkScaffolding {
.collect { it.body.toString() }
}

Map<String, String> getLastRecordedRequestHeaders(HttpRequest httpRequest) {
Map<String, List<String>> getLastRecordedRequestHeaders(HttpRequest httpRequest) {
getRecordedRequestsHeaders(httpRequest).last()
}

List<Map<String, String>> getRecordedRequestsHeaders(HttpRequest httpRequest) {
List<Map<String, List<String>>> getRecordedRequestsHeaders(HttpRequest httpRequest) {
getRequestsHeaders(mockServerClient.retrieveRecordedRequests(httpRequest) as List<HttpRequest>)
}

Map<String, String> getLastRecordedRequestHeaders(String value) {
Map<String, List<String>> getLastRecordedRequestHeaders(String value) {
getRecordedRequestsHeaders(value).last()
}

List<Map<String, String>> getRecordedRequestsHeaders(String value) {
List<Map<String, List<String>>> getRecordedRequestsHeaders(String value) {
getRequestsHeaders(mockServerClient.retrieveRecordedRequests(getRequest(value)) as List<HttpRequest>)
}

void reset(String resetEndpoint = endpoint, ClearType clearType = EXPECTATIONS) {
void reset(String resetEndpoint = endpoint, ClearType clearType = ALL) {
mockServerClient.clear(request().withPath(resetEndpoint), clearType)
}

private static List<Map<String, String>> getRequestsHeaders(List<HttpRequest> httpRequests) {
httpRequests*.headers*.entries*.collectEntries { header ->
private static List<Map<String, List<String>>> getRequestsHeaders(List<HttpRequest> httpRequests) {
httpRequests*.headerList*.collectEntries { header ->
[header.name as String, header.values.collect { it as String }]
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,10 @@ class PubStackAnalytics extends NetworkScaffolding {
protected HttpRequest getRequest(String value) {
request().withPath(ANALYTICS_ENDPOINT)
}

@Override
void reset() {
super.reset(CONFIG_ENDPOINT)
super.reset(ANALYTICS_ENDPOINT)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class Alert extends NetworkScaffolding {
mapper.decode(body, new TypeReference<List<AlertEvent>>() {})[0]
}

Map<String, String> getLastRecordedAlertRequestHeaders() {
Map<String, List<String>> getLastRecordedAlertRequestHeaders() {
getLastRecordedRequestHeaders(request)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class DeliveryStatistics extends NetworkScaffolding {
super(mockServerContainer, REPORT_DELIVERY_ENDPOINT_PATH, mapper)
}

Map<String, String> getLastRecordedDeliveryRequestHeaders() {
Map<String, List<String>> getLastRecordedDeliveryRequestHeaders() {
getLastRecordedRequestHeaders(request)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,20 @@ class GeneralPlanner extends NetworkScaffolding {
.respond(response().withStatusCode(statusCode.code()))
}

Map<String, String> getLastRecordedRegisterRequestHeaders() {
Map<String, List<String>> getLastRecordedRegisterRequestHeaders() {
getLastRecordedRequestHeaders(request)
}

Map<String, String> getLastRecordedPlansRequestHeaders() {
Map<String, List<String>> getLastRecordedPlansRequestHeaders() {
getLastRecordedRequestHeaders(plansRequest)
}

@Override
void reset() {
super.reset(PLANS_ENDPOINT_PATH)
super.reset(REGISTER_ENDPOINT_PATH)
}

private void setPlansResponse(PlansResponse plansResponse,
HttpStatusCode statusCode,
Times times = Times.exactly(1)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ class UserData extends NetworkScaffolding {
reset(USER_DETAILS_ENDPOINT_PATH)
}

@Override
void reset() {
super.reset(USER_DETAILS_ENDPOINT_PATH)
super.reset(WIN_EVENT_ENDPOINT_PATH)
}

@Override
void setResponse() {
mockServerClient.when(request().withPath(endpoint))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import org.prebid.server.functional.util.PBSUtils
import spock.lang.Specification

import static java.math.RoundingMode.DOWN
import static org.prebid.server.functional.util.SystemProperties.DEFAULT_TIMEOUT

@PBSTest
abstract class BaseSpec extends Specification {
Expand All @@ -34,8 +35,8 @@ abstract class BaseSpec extends Specification {
protected static final StoredRequestDao storedRequestDao = repository.storedRequestDao
protected static final StoredResponseDao storedResponseDao = repository.storedResponseDao

protected static final int MAX_TIMEOUT = 6000
private static final int MIN_TIMEOUT = 5000
protected static final int MAX_TIMEOUT = MIN_TIMEOUT + 1000
private static final int MIN_TIMEOUT = DEFAULT_TIMEOUT
private static final int DEFAULT_TARGETING_PRECISION = 1

def setupSpec() {
Expand All @@ -47,7 +48,6 @@ abstract class BaseSpec extends Specification {
bidder.reset()
prebidCache.reset()
repository.removeAllDatabaseData()
pbsServiceFactory.stopContainers()
}

protected static int getRandomTimeout() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import org.prebid.server.functional.model.mock.services.generalplanner.PlansResp
import org.prebid.server.functional.model.request.dealsupdate.ForceDealsUpdateRequest
import org.prebid.server.functional.util.HttpUtil
import org.prebid.server.functional.util.PBSUtils
import spock.lang.Unroll

import java.time.ZoneId
import java.time.ZonedDateTime
Expand Down Expand Up @@ -102,7 +101,6 @@ class AlertSpec extends BasePgSpec {
generalPlanner.initRegisterResponse()
}

@Unroll
def "PBS should send an alert when fetching line items response status wasn't OK ('#httpStatusCode')"() {
given: "Changed Planner line items endpoint response to return bad status code"
// PBS will make 2 requests to the planner: 1 normal, 2 - recovery request
Expand Down Expand Up @@ -145,7 +143,6 @@ class AlertSpec extends BasePgSpec {
httpStatusCode << [NO_CONTENT_204, NOT_FOUND_404, INTERNAL_SERVER_ERROR_500]
}
@Unroll
def "PBS should send an alert when register PBS instance response status wasn't OK ('#httpStatusCode')"() {
given: "Changed Planner register endpoint response to return bad status code"
generalPlanner.initRegisterResponse(httpStatusCode)
Expand Down Expand Up @@ -187,7 +184,6 @@ class AlertSpec extends BasePgSpec {
httpStatusCode << [NOT_FOUND_404, INTERNAL_SERVER_ERROR_500]
}
@Unroll
def "PBS should send an alert when send delivery statistics report response status wasn't OK ('#httpStatusCode')"() {
given: "Changed Delivery Statistics endpoint response to return bad status code"
deliveryStatistics.reset()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,10 @@ abstract class BasePgSpec extends Specification {
protected final PrebidServerService pgPbsService = pbsServiceFactory.getService(pgConfig.properties)

def setupSpec() {
bidder.setResponse()
generalPlanner.setResponse()

deliveryStatistics.setResponse()

alert.setResponse()

userData.setResponse()
userData.setUserDataResponse(UserDetailsResponse.defaultUserResponse)
}
Expand All @@ -50,6 +48,11 @@ abstract class BasePgSpec extends Specification {
pgPbsService.sendForceDealsUpdateRequest(ForceDealsUpdateRequest.invalidateLineItemsRequest)
pgPbsService.sendForceDealsUpdateRequest(ForceDealsUpdateRequest.createReportRequest)
pgPbsService.sendForceDealsUpdateRequest(ForceDealsUpdateRequest.sendReportRequest)
generalPlanner.reset()
deliveryStatistics.reset()
alert.reset()
userData.reset()
bidder.reset()
}

protected void updateLineItemsAndWait() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import org.prebid.server.functional.model.request.dealsupdate.ForceDealsUpdateRe
import org.prebid.server.functional.model.response.auction.BidResponse
import org.prebid.server.functional.util.HttpUtil
import org.prebid.server.functional.util.PBSUtils
import spock.lang.Unroll

import java.time.ZoneId
import java.time.ZonedDateTime
Expand Down Expand Up @@ -90,7 +89,6 @@ class PgAuctionSpec extends BasePgSpec {
}
}

@Unroll
def "PBS shouldn't process line item with #reason"() {
given: "Bid request"
def bidRequest = BidRequest.defaultBidRequest
Expand Down Expand Up @@ -189,7 +187,6 @@ class PgAuctionSpec extends BasePgSpec {
assert !auctionResponse.ext?.debug?.pgmetrics
}

@Unroll
def "PBS shouldn't allow line item with #reason delivery plan take part in auction"() {
given: "Bid request"
def bidRequest = BidRequest.defaultBidRequest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ class PgDealsOnlySpec extends BasePgSpec {
def auctionWarnings = auctionResponse.ext?.warnings?.get(PREBID)
assert auctionWarnings.size() == 1
assert auctionWarnings[0].code == 999
assert auctionWarnings[0].message == "Not calling $GENERIC.value bidders for impression ${bidRequest.imp[0].id}" +
assert auctionWarnings[0].message ==
"Not calling $GENERIC.value bidders for impression ${bidRequest.imp[0].id}" +
" due to pgdealsonly flag and no available PG line items."
}

Expand Down Expand Up @@ -66,7 +67,8 @@ class PgDealsOnlySpec extends BasePgSpec {
def auctionWarnings = auctionResponse.ext?.warnings?.get(PREBID)
assert auctionWarnings.size() == 1
assert auctionWarnings[0].code == 999
assert auctionWarnings[0].message == "Not calling $GENERIC.value bidders for impression ${bidRequest.imp[0].id}" +
assert auctionWarnings[0].message ==
"Not calling $GENERIC.value bidders for impression ${bidRequest.imp[0].id}" +
" due to pgdealsonly flag and no available PG line items."
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,25 @@ import static org.prebid.server.functional.util.HttpUtil.UUID_REGEX
class PlansSpec extends BasePgSpec {

def "PBS should be able to send a request to General Planner"() {
given: "Initial request count"
def initialRequestCount = generalPlanner.recordedPlansRequestCount

and: "General Planner response is set"
given: "General Planner response is set"
generalPlanner.initPlansResponse(PlansResponse.getDefaultPlansResponse(PBSUtils.randomString), OK_200)

when: "PBS sends request to General Planner"
pgPbsService.sendForceDealsUpdateRequest(ForceDealsUpdateRequest.updateLineItemsRequest)

then: "Request is sent"
PBSUtils.waitUntil { generalPlanner.recordedPlansRequestCount == initialRequestCount + 1 }
PBSUtils.waitUntil { generalPlanner.recordedPlansRequestCount == 1 }
}

def "PBS should retry request to General Planner when first request fails"() {
given: "Initial request count"
def initialRequestCount = generalPlanner.recordedPlansRequestCount

and: "Bad General Planner response is set"
given: "Bad General Planner response"
generalPlanner.initPlansResponse(PlansResponse.getDefaultPlansResponse(PBSUtils.randomString), INTERNAL_SERVER_ERROR_500)

when: "PBS sends request to General Planner"
pgPbsService.sendForceDealsUpdateRequest(ForceDealsUpdateRequest.updateLineItemsRequest)

then: "Request is sent two times"
PBSUtils.waitUntil { generalPlanner.recordedPlansRequestCount == initialRequestCount + 2 }
PBSUtils.waitUntil { generalPlanner.recordedPlansRequestCount == 2 }
}

def "PBS should send appropriate headers when requests plans from General Planner"() {
Expand Down
Loading

0 comments on commit fe53ff8

Please sign in to comment.