From 1d24d387d03320c81542697fbc46a7236614629b Mon Sep 17 00:00:00 2001 From: Alex Maltsev Date: Thu, 30 Jan 2025 17:14:06 +0200 Subject: [PATCH 1/3] Fixed ae type. --- .../org/prebid/server/auction/ImpAdjuster.java | 16 ++++++---------- .../prebid/server/auction/ImpAdjusterTest.java | 8 ++++---- .../it/openrtb2/ix/test-ix-bid-request.json | 8 +++----- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ImpAdjuster.java b/src/main/java/org/prebid/server/auction/ImpAdjuster.java index 26cbee95358..52c4ebd447d 100644 --- a/src/main/java/org/prebid/server/auction/ImpAdjuster.java +++ b/src/main/java/org/prebid/server/auction/ImpAdjuster.java @@ -1,13 +1,11 @@ package org.prebid.server.auction; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.IntNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Imp; import org.prebid.server.json.JacksonMapper; import org.prebid.server.json.JsonMerger; -import org.prebid.server.util.StreamUtil; import org.prebid.server.validation.ImpValidator; import java.util.Iterator; @@ -81,16 +79,14 @@ private void setAeParams(ObjectNode ext) { final boolean extIgsAePresent = Optional.ofNullable(ext) .map(extNode -> extNode.get(EXT_IGS)) - .filter(JsonNode::isArray) - .stream() - .flatMap(extNode -> StreamUtil.asStream(extNode.spliterator())) - .filter(Objects::nonNull) - .anyMatch(igsElementNode -> igsElementNode.has(EXT_AE)); + .map(igsNode -> igsNode.get(EXT_AE)) + .isPresent(); if (!extIgsAePresent && (extAe == 0 || extAe == 1)) { - final ArrayNode extIgs = jacksonMapper.mapper().createArrayNode(); - extIgs.add(jacksonMapper.mapper().createObjectNode().set(EXT_AE, IntNode.valueOf(extAe))); - ext.set(EXT_IGS, extIgs); + final ObjectNode igsNode = jacksonMapper.mapper().createObjectNode() + .set(EXT_AE, IntNode.valueOf(extAe)); + + ext.set(EXT_IGS, igsNode); } } diff --git a/src/test/java/org/prebid/server/auction/ImpAdjusterTest.java b/src/test/java/org/prebid/server/auction/ImpAdjusterTest.java index 30148ed35b9..06be50d94a6 100644 --- a/src/test/java/org/prebid/server/auction/ImpAdjusterTest.java +++ b/src/test/java/org/prebid/server/auction/ImpAdjusterTest.java @@ -92,7 +92,7 @@ public void adjustShouldSetImpExtIgsAeWhenImpExtAeIsZero() { final Imp result = target.adjust(givenImp, "someBidder", bidderAliases, debugMessages); // then - assertThat(result.getExt().get("igs").get(0).get("ae")).isEqualTo(IntNode.valueOf(0)); + assertThat(result.getExt().get("igs").get("ae")).isEqualTo(IntNode.valueOf(0)); assertThat(debugMessages).isEmpty(); } @@ -110,7 +110,7 @@ public void adjustShouldSetImpExtIgsAeWhenImpExtAeIsOne() { final Imp result = target.adjust(givenImp, "someBidder", bidderAliases, debugMessages); // then - assertThat(result.getExt().get("igs").get(0).get("ae")).isEqualTo(IntNode.valueOf(1)); + assertThat(result.getExt().get("igs").get("ae")).isEqualTo(IntNode.valueOf(1)); assertThat(debugMessages).isEmpty(); } @@ -137,7 +137,7 @@ public void adjustShouldNotModifyImpExtIgsAeWhenImpExtIgsAePresent() { // given final ObjectNode ext = mapper.createObjectNode(); ext.set("ae", IntNode.valueOf(0)); - ext.set("igs", mapper.createArrayNode().add(mapper.createObjectNode().set("ae", IntNode.valueOf(123)))); + ext.set("igs", mapper.createObjectNode().set("ae", IntNode.valueOf(123))); final Imp givenImp = Imp.builder().ext(ext).build(); @@ -147,7 +147,7 @@ public void adjustShouldNotModifyImpExtIgsAeWhenImpExtIgsAePresent() { final Imp result = target.adjust(givenImp, "someBidder", bidderAliases, debugMessages); // then - assertThat(result.getExt().get("igs").get(0).get("ae")).isEqualTo(IntNode.valueOf(123)); + assertThat(result.getExt().get("igs").get("ae")).isEqualTo(IntNode.valueOf(123)); assertThat(debugMessages).isEmpty(); } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/ix/test-ix-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/ix/test-ix-bid-request.json index 5478c38a82b..d27e2ec709c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/ix/test-ix-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/ix/test-ix-bid-request.json @@ -16,11 +16,9 @@ }, "ext": { "ae": 1, - "igs": [ - { - "ae": 1 - } - ], + "igs": { + "ae": 1 + }, "tid": "${json-unit.any-string}", "bidder": { "siteId": "10002" From ff686a963f32d0cb26bf52b41523d5da7cc958aa Mon Sep 17 00:00:00 2001 From: Markiyan Mykush <95693607+marki1an@users.noreply.github.com> Date: Thu, 30 Jan 2025 18:41:01 +0200 Subject: [PATCH 2/3] Test: Change the type of `igs` to not be an arrays (#3716) * Change the type of `igs` to not be an arrays --- .../model/request/auction/ImpExt.groovy | 2 +- .../functional/tests/BidderParamsSpec.groovy | 30 +++++++-------- .../tests/bidder/openx/OpenxSpec.groovy | 38 +++++++++++++++++++ 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExt.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExt.groovy index 55c626d7bd6..a9d72718e9a 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExt.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExt.groovy @@ -29,7 +29,7 @@ class ImpExt { String skadn String general @JsonProperty("igs") - List interestGroupAuctionSupports + InterestGroupAuctionSupport interestGroupAuctionSupports AnyUnsupportedBidder anyUnsupportedBidder static ImpExt getDefaultImpExt() { 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 de5d742c6f4..6f69bdda378 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy @@ -872,7 +872,7 @@ class BidderParamsSpec extends BaseSpec { prebid.bidder.generic = null prebid.adUnitCode = PBSUtils.randomString generic = new Generic() - auctionEnvironment = PBSUtils.getRandomEnum(AuctionEnvironment) + auctionEnvironment = PBSUtils.getRandomEnum(AuctionEnvironment, [AuctionEnvironment.SERVER_ORCHESTRATED, AuctionEnvironment.UNKNOWN]) all = PBSUtils.randomNumber context = new ImpExtContext(data: new ImpExtContextData()) data = new ImpExtContextData(pbAdSlot: PBSUtils.randomString) @@ -1025,8 +1025,8 @@ class BidderParamsSpec extends BaseSpec { def "PBS should send request to bidder when adapters.bidder.aliases.bidder.meta-info.currency-accepted not specified"() { given: "PBS with adapter configuration" - def pbsConfig = ["adapters.generic.aliases.alias.enabled": "true", - "adapters.generic.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString(), + def pbsConfig = ["adapters.generic.aliases.alias.enabled" : "true", + "adapters.generic.aliases.alias.endpoint" : "$networkServiceContainer.rootUri/auction".toString(), "adapters.generic.aliases.alias.meta-info.currency-accepted": ""] def pbsService = pbsServiceFactory.getService(pbsConfig) @@ -1144,8 +1144,8 @@ class BidderParamsSpec extends BaseSpec { def "PBS should send request to bidder when adapters.bidder.aliases.bidder.meta-info.currency-accepted intersect with requested currency"() { given: "PBS with adapter configuration" - def pbsConfig = ["adapters.generic.aliases.alias.enabled": "true", - "adapters.generic.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString(), + def pbsConfig = ["adapters.generic.aliases.alias.enabled" : "true", + "adapters.generic.aliases.alias.endpoint" : "$networkServiceContainer.rootUri/auction".toString(), "adapters.generic.aliases.alias.meta-info.currency-accepted": "${USD},${EUR}".toString()] def pbsService = pbsServiceFactory.getService(pbsConfig) @@ -1188,8 +1188,8 @@ class BidderParamsSpec extends BaseSpec { def "PBS shouldn't send request to bidder and emit warning when adapters.bidder.aliases.bidder.meta-info.currency-accepted not intersect with requested currency"() { given: "PBS with adapter configuration" - def pbsConfig = ["adapters.generic.aliases.alias.enabled": "true", - "adapters.generic.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString(), + def pbsConfig = ["adapters.generic.aliases.alias.enabled" : "true", + "adapters.generic.aliases.alias.endpoint" : "$networkServiceContainer.rootUri/auction".toString(), "adapters.generic.aliases.alias.meta-info.currency-accepted": "${JPY},${CHF}".toString()] def pbsService = pbsServiceFactory.getService(pbsConfig) @@ -1242,7 +1242,7 @@ class BidderParamsSpec extends BaseSpec { def bidRequest = BidRequest.defaultBidRequest.tap { imp[0].ext.tap { auctionEnvironment = requestedAuctionEnvironment - interestGroupAuctionSupports = [new InterestGroupAuctionSupport(auctionEnvironment: null)] + interestGroupAuctionSupports = new InterestGroupAuctionSupport(auctionEnvironment: null) } } @@ -1252,7 +1252,7 @@ class BidderParamsSpec extends BaseSpec { then: "Bidder request should imp[].{ae/ext.igs.ae} same value as requested" def bidderRequest = bidder.getBidderRequest(bidRequest.id) assert bidderRequest.imp[0].ext.auctionEnvironment == requestedAuctionEnvironment - assert bidderRequest.imp[0].ext.interestGroupAuctionSupports[0].auctionEnvironment == requestedAuctionEnvironment + assert bidderRequest.imp[0].ext.interestGroupAuctionSupports.auctionEnvironment == requestedAuctionEnvironment where: requestedAuctionEnvironment << [NOT_SUPPORTED, DEVICE_ORCHESTRATED] @@ -1263,7 +1263,7 @@ class BidderParamsSpec extends BaseSpec { def bidRequest = BidRequest.defaultBidRequest.tap { imp[0].ext.tap { auctionEnvironment = requestedAuctionEnvironment - interestGroupAuctionSupports = [new InterestGroupAuctionSupport(auctionEnvironment: null)] + interestGroupAuctionSupports = new InterestGroupAuctionSupport(auctionEnvironment: null) } } @@ -1273,7 +1273,7 @@ class BidderParamsSpec extends BaseSpec { then: "Bidder request should imp[].ae same value as requested" def bidderRequest = bidder.getBidderRequest(bidRequest.id) assert bidderRequest.imp[0].ext.auctionEnvironment == requestedAuctionEnvironment - assert !bidderRequest.imp[0].ext.interestGroupAuctionSupports[0].auctionEnvironment + assert !bidderRequest.imp[0].ext.interestGroupAuctionSupports.auctionEnvironment where: requestedAuctionEnvironment << [SERVER_ORCHESTRATED, UNKNOWN] @@ -1281,12 +1281,12 @@ class BidderParamsSpec extends BaseSpec { def "PBS shouldn't change auction environment in imp.ext.igs when it is present in both imp.ext and imp.ext.igs"() { given: "Default bid request with populated imp.ext" - def extAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment) - def extIgsAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment) + def extAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment, [SERVER_ORCHESTRATED, UNKNOWN]) + def extIgsAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment, [SERVER_ORCHESTRATED, UNKNOWN]) def bidRequest = BidRequest.defaultBidRequest.tap { imp[0].ext.tap { auctionEnvironment = extAuctionEnv - interestGroupAuctionSupports = [new InterestGroupAuctionSupport(auctionEnvironment: extIgsAuctionEnv)] + interestGroupAuctionSupports = new InterestGroupAuctionSupport(auctionEnvironment: extIgsAuctionEnv) } } @@ -1296,6 +1296,6 @@ class BidderParamsSpec extends BaseSpec { then: "Bidder request should imp[].{ae/ext.igs.ae} same value as requested" def bidderRequest = bidder.getBidderRequest(bidRequest.id) assert bidderRequest.imp[0].ext.auctionEnvironment == extAuctionEnv - assert bidderRequest.imp[0].ext.interestGroupAuctionSupports[0].auctionEnvironment == extIgsAuctionEnv + assert bidderRequest.imp[0].ext.interestGroupAuctionSupports.auctionEnvironment == extIgsAuctionEnv } } diff --git a/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy index 1adf84c32fd..8c9ea35568f 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy @@ -5,7 +5,9 @@ import org.prebid.server.functional.model.bidder.Openx import org.prebid.server.functional.model.config.AccountAuctionConfig import org.prebid.server.functional.model.config.AccountConfig import org.prebid.server.functional.model.db.Account +import org.prebid.server.functional.model.request.auction.AuctionEnvironment import org.prebid.server.functional.model.request.auction.BidRequest +import org.prebid.server.functional.model.request.auction.InterestGroupAuctionSupport import org.prebid.server.functional.model.request.auction.PaaFormat import org.prebid.server.functional.model.response.auction.InterestGroupAuctionBuyer import org.prebid.server.functional.model.response.auction.InterestGroupAuctionBuyerExt @@ -24,6 +26,7 @@ import java.time.Instant import static org.prebid.server.functional.model.bidder.BidderName.OPENX import static org.prebid.server.functional.model.bidder.BidderName.OPENX_ALIAS import static org.prebid.server.functional.model.bidder.BidderName.WILDCARD +import static org.prebid.server.functional.model.request.auction.AuctionEnvironment.* import static org.prebid.server.functional.model.request.auction.AuctionEnvironment.DEVICE_ORCHESTRATED import static org.prebid.server.functional.model.request.auction.AuctionEnvironment.NOT_SUPPORTED import static org.prebid.server.functional.model.request.auction.PaaFormat.IAB @@ -41,6 +44,13 @@ class OpenxSpec extends BaseSpec { @Shared PrebidServerService pbsService = pbsServiceFactory.getService(OPENX_CONFIG) + @Override + def cleanupSpec() { + pbsServiceFactory.removeContainer(OPENX_CONFIG) + pbsServiceFactory.removeContainer(OPENX_CONFIG + OPENX_ALIAS_CONFIG) + pbsServiceFactory.removeContainer(OPENX_ALIAS_CONFIG) + } + def "PBS should populate fledge config by default when bid response with fledge"() { given: "Default basic BidRequest with ae and openx bidder" def bidRequest = BidRequest.defaultBidRequest.tap { @@ -534,4 +544,32 @@ class OpenxSpec extends BaseSpec { IAB | [new InterestGroupAuctionSeller()] | [new InterestGroupAuctionBuyer()] ORIGINAL | [] | [] } + + def "PBS shouldn't change auction environment in imp.ext.igs and not emit a warning when it is present in both imp.ext and imp.ext.igs"() { + given: "Default bid request with populated imp.ext" + def extAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment, [SERVER_ORCHESTRATED, UNKNOWN]) + def extIgsAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment, [SERVER_ORCHESTRATED, UNKNOWN]) + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.openx = Openx.defaultOpenx + imp[0].ext.prebid.bidder.generic = null + imp[0].ext.tap { + auctionEnvironment = extAuctionEnv + interestGroupAuctionSupports = new InterestGroupAuctionSupport(auctionEnvironment: extIgsAuctionEnv) + } + } + + when: "PBS processes auction request" + def bidResponse = pbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should imp[].{ae/ext.igs.ae} same value as requested" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.imp[0].ext.auctionEnvironment == extAuctionEnv + assert bidderRequest.imp[0].ext.interestGroupAuctionSupports.auctionEnvironment == extIgsAuctionEnv + + and: "Response shouldn't contain errors" + assert !bidResponse.ext.errors + + and: "Response shouldn't contain warnings" + assert !bidResponse.ext.warnings + } } From d45a38b58684f8e767cff760bef909f2ce1f730e Mon Sep 17 00:00:00 2001 From: osulzhenko Date: Thu, 30 Jan 2025 18:44:10 +0200 Subject: [PATCH 3/3] fix cleanup --- .../prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy index 8c9ea35568f..20be3434042 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy @@ -48,7 +48,6 @@ class OpenxSpec extends BaseSpec { def cleanupSpec() { pbsServiceFactory.removeContainer(OPENX_CONFIG) pbsServiceFactory.removeContainer(OPENX_CONFIG + OPENX_ALIAS_CONFIG) - pbsServiceFactory.removeContainer(OPENX_ALIAS_CONFIG) } def "PBS should populate fledge config by default when bid response with fledge"() {