Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.prebid.server.functional.model.config

import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import groovy.transform.ToString
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ class Prebid {
List<String> profileNames
@JsonProperty("kvps")
Map<String, String> keyValuePairs
@JsonProperty("ortberrors")
Boolean ortbErrors

static class Channel {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.prebid.server.functional.model.response

import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import groovy.transform.ToString
Expand All @@ -8,7 +9,9 @@ import groovy.transform.ToString
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy)
class BidderError {

Integer code
BidderErrorCode code
String message
@JsonProperty("error")
String errorMessage
Set<String> impIds
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.prebid.server.functional.model.response

import com.fasterxml.jackson.annotation.JsonValue
import groovy.transform.ToString

@ToString(includeNames = true, ignoreNulls = true)
enum BidderErrorCode {

TIMEOUT(1),
BAD_INPUT(2),
BAD_SERVER_RESPONSE(3),
FAILED_TO_REQUEST_BIDS(4),
INVALID_BID(5),
REJECTED_IPF(6),
GENERIC(999)

@JsonValue
final Integer value

BidderErrorCode(Integer value) {
this.value = value
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ package org.prebid.server.functional.model.response.amp
import org.prebid.server.functional.model.response.BidderError
import org.prebid.server.functional.model.response.Debug
import org.prebid.server.functional.model.response.auction.ErrorType
import org.prebid.server.functional.model.response.auction.WarningEntry

class AmpResponseExt {

Debug debug
Map<ErrorType, List<BidderError>> errors
Map<ErrorType, List<BidderError>> warnings
Map<ErrorType, List<WarningEntry>> warnings
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ import groovy.transform.ToString
class RawAmpResponse {

String responseBody
Integer statusCode
Map<String, List<String>> headers
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ import org.prebid.server.functional.model.ResponseModel
class RawAuctionResponse implements ResponseModel {

String responseBody
Integer statusCode
Map<String, List<String>> headers
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ package org.prebid.server.functional.model.response.auction
import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import groovy.transform.ToString
import org.prebid.server.functional.model.response.BidderErrorCode

@ToString(includeNames = true, ignoreNulls = true)
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy)
class WarningEntry {

Integer code
BidderErrorCode code
String message
Set<String> impIds
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ import groovy.transform.ToString
class RawCookieSyncResponse {

String responseBody
Integer statusCode
Map<String, List<String>> headers
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ import java.time.format.DateTimeFormatter

import static io.restassured.RestAssured.given
import static java.time.ZoneOffset.UTC
import static org.apache.http.HttpStatus.SC_OK
import static org.prebid.server.functional.testcontainers.Dependencies.influxdbContainer


class PrebidServerService implements ObjectMapperWrapper {

static final String AUCTION_ENDPOINT = "/openrtb2/auction"
Expand Down Expand Up @@ -86,10 +86,14 @@ class PrebidServerService implements ObjectMapperWrapper {
prometheusRequestSpecification = buildAndGetRequestSpecification(pbsContainer.prometheusRootUri, authenticationScheme)
}

BidResponse sendAuctionRequest(BidRequest bidRequest, Map<String, ?> headers = [:]) {
BidResponse sendAuctionRequest(BidRequest bidRequest, Integer expectedStatusCode = SC_OK) {
sendAuctionRequest(bidRequest, [:], expectedStatusCode)
}

BidResponse sendAuctionRequest(BidRequest bidRequest, Map<String, ?> headers, int expectedStatusCode = SC_OK) {
def response = postAuction(bidRequest, headers)

checkResponseStatusCode(response)
checkResponseStatusCode(response, expectedStatusCode)
decode(response.body.asString(), BidResponse)
}

Expand All @@ -98,6 +102,7 @@ class PrebidServerService implements ObjectMapperWrapper {

new RawAuctionResponse().tap {
it.headers = getHeaders(response)
it.statusCode = response.statusCode()
it.responseBody = response.body.asString()
}
}
Expand All @@ -109,10 +114,14 @@ class PrebidServerService implements ObjectMapperWrapper {
decode(response.body.asString(), AmpResponse)
}

AmpResponse sendAmpRequest(AmpRequest ampRequest, Map<String, String> headers = [:]) {
AmpResponse sendAmpRequest(AmpRequest ampRequest, int expectedStatusCode = SC_OK) {
sendAmpRequest(ampRequest, [:], expectedStatusCode)
}

AmpResponse sendAmpRequest(AmpRequest ampRequest, Map<String, String> headers, int expectedStatusCode = SC_OK) {
def response = getAmp(ampRequest, headers)

checkResponseStatusCode(response)
checkResponseStatusCode(response, expectedStatusCode)
decode(response.body.asString(), AmpResponse)
}

Expand All @@ -121,6 +130,7 @@ class PrebidServerService implements ObjectMapperWrapper {

new RawAmpResponse().tap {
it.headers = getHeaders(response)
it.statusCode = response.statusCode()
it.responseBody = response.body.asString()
}
}
Expand Down Expand Up @@ -372,9 +382,9 @@ class PrebidServerService implements ObjectMapperWrapper {
.get(AMP_ENDPOINT)
}

private void checkResponseStatusCode(Response response, int statusCode = 200) {
private void checkResponseStatusCode(Response response, int expectedStatusCode = SC_OK) {
def responseStatusCode = response.statusCode
if (responseStatusCode != statusCode) {
if (responseStatusCode != expectedStatusCode) {
def responseBody = response.body.asString()
log.error(responseBody)
throw new PrebidServerException(responseStatusCode, responseBody, getHeaders(response))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.prebid.server.functional.testcontainers

import org.testcontainers.containers.InfluxDBContainer
import org.testcontainers.containers.MySQLContainer
import org.testcontainers.containers.PostgreSQLContainer

Expand Down Expand Up @@ -33,6 +32,7 @@ LIMIT 1
"logging.sampling-rate" : "1.0",
"auction.ad-server-currency" : DEFAULT_CURRENCY.value,
"auction.stored-requests-timeout-ms" : "1000",
"auction.ortb-error-response" : "true",
"metrics.prefix" : "prebid",
"status-response" : "ok",
"gdpr.default-value" : "0",
Expand Down Expand Up @@ -101,6 +101,7 @@ LIMIT 1
"settings.database.idle-connection-timeout": "300"
].asImmutable()
}

static Map<String, String> getPostgreSqlConfig(PostgreSQLContainer postgres = Dependencies.postgresqlContainer) {
["settings.database.type" : "postgres",
"settings.database.host" : postgres.getNetworkAliases().get(0),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@ import org.prebid.server.functional.model.db.StoredRequest
import org.prebid.server.functional.model.request.amp.AmpRequest
import org.prebid.server.functional.model.request.auction.BidRequest
import org.prebid.server.functional.model.request.auction.Site
import org.prebid.server.functional.service.PrebidServerException
import org.prebid.server.functional.util.PBSUtils

import static io.netty.handler.codec.http.HttpResponseStatus.UNAUTHORIZED
import static org.apache.http.HttpStatus.SC_UNAUTHORIZED
import static org.prebid.server.functional.model.response.BidderErrorCode.BAD_INPUT
import static org.prebid.server.functional.model.response.auction.ErrorType.PREBID
import static org.prebid.server.functional.model.response.auction.NoBidResponse.UNKNOWN_ERROR

class AccountSpec extends BaseSpec {

Expand All @@ -30,12 +32,14 @@ class AccountSpec extends BaseSpec {
}

when: "PBS processes auction request"
pbsService.sendAuctionRequest(bidRequest)
def response = pbsService.sendAuctionRequest(bidRequest, SC_UNAUTHORIZED)

then: "PBS should reject the entire auction"
def exception = thrown(PrebidServerException)
assert exception.statusCode == UNAUTHORIZED.code()
assert exception.responseBody == "Account $accountId is inactive"
assert response.noBidResponse == UNKNOWN_ERROR
verifyAll(response.ext.errors[PREBID]) {
it.code == [BAD_INPUT]
it.errorMessage == ["Account $accountId is inactive"]
}

where:
enforceValidAccount << [true, false]
Expand All @@ -56,12 +60,14 @@ class AccountSpec extends BaseSpec {
}

when: "PBS processes auction request"
pbsService.sendAuctionRequest(bidRequest)
def response = pbsService.sendAuctionRequest(bidRequest, SC_UNAUTHORIZED)

then: "Request should fail with an error"
def exception = thrown(PrebidServerException)
assert exception.statusCode == UNAUTHORIZED.code()
assert exception.responseBody == "Unauthorized account id: $accountId"
assert response.noBidResponse == UNKNOWN_ERROR
verifyAll(response.ext.errors[PREBID]) {
it.code == [BAD_INPUT]
it.errorMessage == ["Unauthorized account id: $accountId"]
}

where:
defaultAccountConfig << [null, AccountConfig.defaultAccountConfig]
Expand All @@ -79,12 +85,14 @@ class AccountSpec extends BaseSpec {
}

when: "PBS processes auction request"
pbsService.sendAuctionRequest(bidRequest)
def response = pbsService.sendAuctionRequest(bidRequest, SC_UNAUTHORIZED)

then: "Request should fail with an error"
def exception = thrown(PrebidServerException)
assert exception.statusCode == UNAUTHORIZED.code()
assert exception.responseBody == "Unauthorized account id: "
assert response.noBidResponse == UNKNOWN_ERROR
verifyAll(response.ext.errors[PREBID]) {
it.code == [BAD_INPUT]
it.errorMessage == ["Unauthorized account id: "]
}

where:
defaultAccountConfig << [null, AccountConfig.defaultAccountConfig]
Expand Down Expand Up @@ -137,13 +145,14 @@ class AccountSpec extends BaseSpec {
storedRequestDao.save(storedRequest)

when: "PBS processes amp request"
pbsService.sendAmpRequest(ampRequest)
def response = pbsService.sendAmpRequest(ampRequest, SC_UNAUTHORIZED)

then: "Request should fail with an error"
def exception = thrown(PrebidServerException)
def resolvedAccount = requestAccount ?: storedRequestAccount
assert exception.statusCode == UNAUTHORIZED.code()
assert exception.responseBody == "Unauthorized account id: $resolvedAccount"
verifyAll(response.ext.errors[PREBID]) {
it.code == [BAD_INPUT]
it.errorMessage == ["Unauthorized account id: $resolvedAccount"]
}

where:
defaultAccountConfig || requestAccount || storedRequestAccount
Expand Down Expand Up @@ -175,12 +184,13 @@ class AccountSpec extends BaseSpec {
storedRequestDao.save(storedRequest)

when: "PBS processes amp request"
pbsService.sendAmpRequest(ampRequest)
def response = pbsService.sendAmpRequest(ampRequest, SC_UNAUTHORIZED)

then: "Request should fail with an error"
def exception = thrown(PrebidServerException)
assert exception.statusCode == UNAUTHORIZED.code()
assert exception.responseBody == "Unauthorized account id: "
verifyAll(response.ext.errors[PREBID]) {
it.code == [BAD_INPUT]
it.errorMessage == ["Unauthorized account id: "]
}

where:
defaultAccountConfig << [null, AccountConfig.defaultAccountConfig]
Expand Down
Loading
Loading