diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Adrino.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Adrino.groovy new file mode 100644 index 00000000000..2d1675194e9 --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Adrino.groovy @@ -0,0 +1,6 @@ +package org.prebid.server.functional.model.request.auction + +class Adrino { + + Integer hash +} diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Bidder.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Bidder.groovy index 05a43bbb528..125faa37c4b 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/Bidder.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Bidder.groovy @@ -24,6 +24,8 @@ class Bidder { Ix ix @JsonProperty("openxalias") Openx openxAlias + Adrino adrino + Generic nativo static Bidder getDefaultBidder() { new Bidder().tap { diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/PbsConfig.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/PbsConfig.groovy index aa10ebaf7a4..91ec927b1c2 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/PbsConfig.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/PbsConfig.groovy @@ -89,25 +89,25 @@ LIMIT 1 } static Map getMySqlConfig(MySQLContainer mysql = Dependencies.mysqlContainer) { - ["settings.database.type" : "mysql", - "settings.database.host" : mysql.getNetworkAliases().get(0), - "settings.database.port" : mysql.exposedPorts.get(0) as String, - "settings.database.dbname" : mysql.databaseName, - "settings.database.user" : mysql.username, - "settings.database.password" : mysql.password, - "settings.database.pool-size" : "2", // setting 2 here to leave some slack for the PBS + ["settings.database.type" : "mysql", + "settings.database.host" : mysql.getNetworkAliases().get(0), + "settings.database.port" : mysql.exposedPorts.get(0) as String, + "settings.database.dbname" : mysql.databaseName, + "settings.database.user" : mysql.username, + "settings.database.password" : mysql.password, + "settings.database.pool-size" : "2", // setting 2 here to leave some slack for the PBS "settings.database.idle-connection-timeout": "300" ].asImmutable() } static Map getPostgreSqlConfig(PostgreSQLContainer postgres = Dependencies.postgresqlContainer) { - ["settings.database.type" : "postgres", - "settings.database.host" : postgres.getNetworkAliases().get(0), - "settings.database.port" : postgres.exposedPorts.get(0) as String, - "settings.database.dbname" : postgres.databaseName, - "settings.database.user" : postgres.username, - "settings.database.password" : postgres.password, - "settings.database.pool-size" : "2", // setting 2 here to leave some slack for the PBS + ["settings.database.type" : "postgres", + "settings.database.host" : postgres.getNetworkAliases().get(0), + "settings.database.port" : postgres.exposedPorts.get(0) as String, + "settings.database.dbname" : postgres.databaseName, + "settings.database.user" : postgres.username, + "settings.database.password" : postgres.password, + "settings.database.pool-size" : "2", // setting 2 here to leave some slack for the PBS "settings.database.idle-connection-timeout": "300" ].asImmutable() } @@ -119,6 +119,7 @@ LIMIT 1 // due to a config validation we'll need to circumvent all future aliases this way static Map getBidderAliasConfig() { ["adapters.generic.aliases.cwire.meta-info.site-media-types" : "", + "adapters.generic.aliases.cwire.meta-info.app-media-types" : "", "adapters.generic.aliases.blue.meta-info.app-media-types" : "", "adapters.generic.aliases.blue.meta-info.site-media-types" : "", "adapters.generic.aliases.adsinteractive.meta-info.app-media-types" : "", diff --git a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy index 6f69bdda378..e8151762026 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy @@ -6,6 +6,7 @@ import org.prebid.server.functional.model.db.Account import org.prebid.server.functional.model.db.StoredImp 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.Adrino import org.prebid.server.functional.model.request.auction.AuctionEnvironment import org.prebid.server.functional.model.request.auction.Banner import org.prebid.server.functional.model.request.auction.BidRequest @@ -1298,4 +1299,66 @@ class BidderParamsSpec extends BaseSpec { assert bidderRequest.imp[0].ext.auctionEnvironment == extAuctionEnv assert bidderRequest.imp[0].ext.interestGroupAuctionSupports.auctionEnvironment == extIgsAuctionEnv } + + def "PBS should reject alias bidders when bidder params from request doesn't satisfy own json-schema"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.tap { + it.generic.exampleProperty = PBSUtils.randomNumber + //Adrino hard coded bidder alias in generic.yaml + it.adrino = new Adrino(hash: PBSUtils.randomNumber) + } + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder should be dropped" + assert response.ext?.warnings[PREBID]*.code == [999, 999, 999] + assert response.ext?.warnings[PREBID]*.message == + ["WARNING: request.imp[0].ext.prebid.bidder.generic was dropped with a reason: " + + "request.imp[0].ext.prebid.bidder.generic failed validation.\n" + + "\$.exampleProperty: integer found, string expected", + "WARNING: request.imp[0].ext.prebid.bidder.adrino was dropped with a reason: " + + "request.imp[0].ext.prebid.bidder.adrino failed validation.\n" + + "\$.hash: integer found, string expected", + "WARNING: request.imp[0].ext must contain at least one valid bidder"] + + and: "PBS should not call bidder" + assert bidder.getRequestCount(bidRequest.id) == 0 + + and: "targeting should be empty" + assert response.seatbid.isEmpty() + } + + def "PBS should reject alias bidders when bidder params from request doesn't satisfy aliased json-schema"() { + given: "Default basic generic BidRequest" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.tap { + it.generic.exampleProperty = PBSUtils.randomNumber + //Nativo hard coded bidder alias in generic.yaml + it.nativo = new Generic(exampleProperty: PBSUtils.randomNumber) + } + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder should be dropped" + assert response.ext?.warnings[PREBID]*.code == [999, 999, 999] + assert response.ext?.warnings[PREBID]*.message == + ["WARNING: request.imp[0].ext.prebid.bidder.generic was dropped with a reason: " + + "request.imp[0].ext.prebid.bidder.generic failed validation.\n" + + "\$.exampleProperty: integer found, string expected", + "WARNING: request.imp[0].ext.prebid.bidder.nativo was dropped with a reason: " + + "request.imp[0].ext.prebid.bidder.nativo failed validation.\n" + + "\$.exampleProperty: integer found, string expected", + "WARNING: request.imp[0].ext must contain at least one valid bidder"] + + and: "PBS should not call bidder" + assert bidder.getRequestCount(bidRequest.id) == 0 + + and: "targeting should be empty" + assert response.seatbid.isEmpty() + } }