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,6 @@
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 @@ -6,8 +6,8 @@ import groovy.transform.ToString

import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.AUDIO_BATTR
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BADV
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BAPP
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BANNER_BATTR
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BAPP
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BCAT
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BTYPE
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.VIDEO_BATTR
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import groovy.transform.ToString

import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.AUDIO_BATTR
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BADV
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BAPP
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BANNER_BATTR
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BAPP
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BCAT
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BTYPE
import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.VIDEO_BATTR
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import jakarta.persistence.Convert
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import org.prebid.server.functional.model.db.typeconverter.BidRequestConfigTypeConverter
import org.prebid.server.functional.model.db.typeconverter.ProfileMergePrecedenceConvert
import org.prebid.server.functional.model.db.typeconverter.ProfileTypeConvert
import org.prebid.server.functional.model.db.typeconverter.BidRequestConfigTypeConverter
import org.prebid.server.functional.model.request.auction.BidRequest
import org.prebid.server.functional.model.request.profile.ProfileMergePrecedence
import org.prebid.server.functional.model.request.profile.RequestProfile
import org.prebid.server.functional.model.request.profile.ProfileType
import org.prebid.server.functional.model.request.profile.RequestProfile

@Entity
@Table(name = "profiles")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.Id
import jakarta.persistence.Table
import org.prebid.server.functional.model.db.typeconverter.StoredAuctionResponseConfigTypeConverter
import org.prebid.server.functional.model.db.typeconverter.BidResponseConfigTypeConverter
import org.prebid.server.functional.model.db.typeconverter.StoredAuctionResponseConfigTypeConverter
import org.prebid.server.functional.model.response.auction.BidResponse
import org.prebid.server.functional.model.response.auction.SeatBid

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.prebid.server.functional.model.mock.services.vendorlist

import org.prebid.server.functional.util.PBSUtils

import java.time.Clock
import java.time.ZonedDateTime

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 {

BAD_INPUT(2),
BAD_SERVER_RESPONSE(3),
FAILED_TO_REQUEST_BIDS(4),
INVALID_BID(5),
REJECTED_IPF(6),
TIMEOUT(1),
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 @@ -3,9 +3,9 @@ package org.prebid.server.functional.repository
import org.hibernate.SessionFactory
import org.hibernate.cfg.Configuration
import org.prebid.server.functional.model.db.Account
import org.prebid.server.functional.model.db.StoredImp
import org.prebid.server.functional.model.db.StoredProfileImp
import org.prebid.server.functional.model.db.StoredProfileRequest
import org.prebid.server.functional.model.db.StoredImp
import org.prebid.server.functional.model.db.StoredRequest
import org.prebid.server.functional.model.db.StoredResponse
import org.prebid.server.functional.repository.dao.AccountDao
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import io.restassured.authentication.BasicAuthScheme
import io.restassured.builder.RequestSpecBuilder
import io.restassured.response.Response
import io.restassured.specification.RequestSpecification
import org.apache.http.HttpStatus
import org.prebid.server.functional.model.UidsCookie
import org.prebid.server.functional.model.bidder.BidderName
import org.prebid.server.functional.model.mock.services.prebidcache.response.PrebidCacheResponse
Expand Down Expand Up @@ -86,10 +87,14 @@ class PrebidServerService implements ObjectMapperWrapper {
prometheusRequestSpecification = buildAndGetRequestSpecification(pbsContainer.prometheusRootUri, authenticationScheme)
}

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

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

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

Expand All @@ -98,6 +103,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 +115,14 @@ class PrebidServerService implements ObjectMapperWrapper {
decode(response.body.asString(), AmpResponse)
}

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

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

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

Expand All @@ -121,6 +131,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,7 +383,7 @@ class PrebidServerService implements ObjectMapperWrapper {
.get(AMP_ENDPOINT)
}

private void checkResponseStatusCode(Response response, int statusCode = 200) {
private void checkResponseStatusCode(Response response, int statusCode = HttpStatus.SC_OK) {
def responseStatusCode = response.statusCode
if (responseStatusCode != statusCode) {
def responseBody = response.body.asString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import org.prebid.server.functional.util.SystemProperties
import org.testcontainers.containers.InfluxDBContainer
import org.testcontainers.containers.MySQLContainer
import org.testcontainers.containers.Network
import org.testcontainers.containers.localstack.LocalStackContainer
import org.testcontainers.containers.PostgreSQLContainer
import org.testcontainers.containers.localstack.LocalStackContainer
import org.testcontainers.lifecycle.Startables
import org.testcontainers.utility.DockerImageName

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
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 +33,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 +102,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