From fe4e5c8c7b2f0b4a04942721b7859e9622d85c32 Mon Sep 17 00:00:00 2001 From: Danylo Date: Tue, 23 Jul 2024 13:37:54 +0200 Subject: [PATCH 1/4] Redefine logic regarding `imp.ext.`. --- .../Ortb2ImplicitParametersResolver.java | 76 +++++++++++----- .../spring/config/ServiceConfiguration.java | 6 +- .../Ortb2ImplicitParametersResolverTest.java | 90 ++++++++++++++++--- 3 files changed, 131 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolver.java b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolver.java index b11f92592ef..8b377c08bf9 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolver.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolver.java @@ -24,6 +24,7 @@ import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.prebid.server.auction.BidderAliases; import org.prebid.server.auction.ImplicitParametersExtractor; import org.prebid.server.auction.IpAddressHelper; import org.prebid.server.auction.PriceGranularity; @@ -33,6 +34,7 @@ import org.prebid.server.auction.model.Endpoint; import org.prebid.server.auction.model.IpAddress; import org.prebid.server.auction.model.SecBrowsingTopic; +import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.exception.BlocklistedAppException; import org.prebid.server.exception.InvalidRequestException; import org.prebid.server.exception.PreBidException; @@ -93,6 +95,7 @@ public class Ortb2ImplicitParametersResolver { private final String adServerCurrency; private final List blocklistedApps; private final ExtRequestPrebidServer serverInfo; + private final BidderCatalog bidderCatalog; private final ImplicitParametersExtractor paramsExtractor; private final TimeoutResolver timeoutResolver; private final IpAddressHelper ipAddressHelper; @@ -108,6 +111,7 @@ public Ortb2ImplicitParametersResolver(boolean shouldCacheOnlyWinningBids, String externalUrl, Integer hostVendorId, String datacenterRegion, + BidderCatalog bidderCatalog, ImplicitParametersExtractor paramsExtractor, TimeoutResolver timeoutResolver, IpAddressHelper ipAddressHelper, @@ -121,6 +125,7 @@ public Ortb2ImplicitParametersResolver(boolean shouldCacheOnlyWinningBids, this.adServerCurrency = validateCurrency(Objects.requireNonNull(adServerCurrency)); this.blocklistedApps = Objects.requireNonNull(blocklistedApps); this.serverInfo = ExtRequestPrebidServer.of(externalUrl, hostVendorId, datacenterRegion, null); + this.bidderCatalog = Objects.requireNonNull(bidderCatalog); this.paramsExtractor = Objects.requireNonNull(paramsExtractor); this.timeoutResolver = Objects.requireNonNull(timeoutResolver); this.ipAddressHelper = Objects.requireNonNull(ipAddressHelper); @@ -638,6 +643,8 @@ private List populateImps(BidRequest bidRequest, return null; } + final BidderAliases aliases = aliases(bidRequest); + final ObjectNode globalBidderParams = extractGlobalBidderParams(bidRequest); final boolean isUniqueIds = isUniqueIds(imps); @@ -645,6 +652,7 @@ private List populateImps(BidRequest bidRequest, .range(0, imps.size()) .mapToObj(index -> new ImpPopulationContext( imps.get(index), + aliases, globalBidderParams, generateBidRequestId, hasStoredBidRequest, @@ -666,6 +674,14 @@ private List populateImps(BidRequest bidRequest, .toList(); } + private BidderAliases aliases(BidRequest bidRequest) { + final ExtRequest extRequest = bidRequest.getExt(); + final ExtRequestPrebid prebid = extRequest != null ? extRequest.getPrebid() : null; + final Map aliases = prebid != null ? prebid.getAliases() : null; + final Map aliasgvlids = prebid != null ? prebid.getAliasgvlids() : null; + return BidderAliases.of(aliases, aliasgvlids, bidderCatalog); + } + private static ObjectNode extractGlobalBidderParams(BidRequest bidRequest) { final ExtRequest extRequest = bidRequest.getExt(); final ExtRequestPrebid extBidPrebid = extRequest != null ? extRequest.getPrebid() : null; @@ -925,7 +941,7 @@ private Long resolveTmax(Long requestTimeout) { } @Value - private static class ImpPopulationContext { + private class ImpPopulationContext { private static final String DEALS_ONLY = "dealsonly"; private static final String PG_DEALS_ONLY = "pgdealsonly"; @@ -936,6 +952,7 @@ private static class ImpPopulationContext { Imp populatedImp; ImpPopulationContext(Imp imp, + BidderAliases aliases, ObjectNode globalBidderParams, boolean generateBidRequestId, boolean hasStoredBidRequest, @@ -947,6 +964,7 @@ private static class ImpPopulationContext { this.imp = imp; populatedImp = populateImp( imp, + aliases, globalBidderParams, generateBidRequestId, hasStoredBidRequest, @@ -960,14 +978,15 @@ public Imp getPopulationResult() { return populatedImp != null ? populatedImp : imp; } - private static Imp populateImp(Imp imp, - ObjectNode globalBidderParams, - boolean generateBidRequestId, - boolean hasStoredBidRequest, - String impIdOverride, - JacksonMapper mapper, - IdGenerator tidGenerator, - JsonMerger jsonMerger) { + private Imp populateImp(Imp imp, + BidderAliases aliases, + ObjectNode globalBidderParams, + boolean generateBidRequestId, + boolean hasStoredBidRequest, + String impIdOverride, + JacksonMapper mapper, + IdGenerator tidGenerator, + JsonMerger jsonMerger) { final String impId = imp.getId(); final String populatedImpId = populateImpId(impId, impIdOverride); @@ -978,6 +997,7 @@ private static Imp populateImp(Imp imp, final ObjectNode impExt = imp.getExt(); final ObjectNode populatedImpExt = populateImpExt( impExt, + aliases, globalBidderParams, generateBidRequestId, hasStoredBidRequest, @@ -1011,16 +1031,17 @@ private static Integer populateImpSecure(Integer impSecure) { return impSecure == null ? 1 : null; } - private static ObjectNode populateImpExt(ObjectNode impExt, - ObjectNode globalBidderParams, - boolean generateBidRequestId, - boolean hasStoredBidRequest, - JacksonMapper mapper, - IdGenerator tidGenerator, - JsonMerger jsonMerger) { + private ObjectNode populateImpExt(ObjectNode impExt, + BidderAliases aliases, + ObjectNode globalBidderParams, + boolean generateBidRequestId, + boolean hasStoredBidRequest, + JacksonMapper mapper, + IdGenerator tidGenerator, + JsonMerger jsonMerger) { final ObjectNode modifiedImpExt = prepareValidImpExtCopy(impExt, mapper); - final boolean isMoved = moveBidderParamsToPrebid(modifiedImpExt); + final boolean isMoved = moveBidderParamsToPrebid(modifiedImpExt, aliases); final boolean isMerged = mergeGlobalBidderParamsToImpExt(modifiedImpExt, globalBidderParams, jsonMerger); final boolean isDealsOnlyModified = modifyDealsOnly(modifiedImpExt); final boolean isNonBidderFieldsModified = modifyNonBidderFields( @@ -1048,8 +1069,11 @@ private static ObjectNode getOrCreateChildObjectNode(ObjectNode parentNode, Stri return isObjectNode(childNode) ? (ObjectNode) childNode : parentNode.putObject(fieldName); } - private static boolean moveBidderParamsToPrebid(ObjectNode impExt) { + private boolean moveBidderParamsToPrebid(ObjectNode impExt, BidderAliases aliases) { final ObjectNode extPrebidBidder = bidderParamsFromImpExt(impExt); + if (!extPrebidBidder.isEmpty()) { + return false; + } final Set bidders = StreamUtil.asStream(impExt.fieldNames()) .filter(Ortb2ImplicitParametersResolver::isImpExtBidder) @@ -1059,16 +1083,22 @@ private static boolean moveBidderParamsToPrebid(ObjectNode impExt) { return false; } + boolean modified = false; for (String bidder : bidders) { - final ObjectNode bidderNode = getOrCreateChildObjectNode(extPrebidBidder, bidder); + final JsonNode impExtBidderNode = impExt.get(bidder); + if (!isObjectNode(impExtBidderNode)) { + continue; + } - final JsonNode impExtBidderNode = impExt.remove(bidder); - if (isObjectNode(impExtBidderNode)) { - bidderNode.setAll((ObjectNode) impExtBidderNode); + final ObjectNode bidderNode = getOrCreateChildObjectNode(extPrebidBidder, bidder); + bidderNode.setAll((ObjectNode) impExtBidderNode); + if (bidderCatalog.isValidName(aliases.resolveBidder(bidder))) { + impExt.remove(bidder); } + modified = true; } - return true; + return modified; } private static ObjectNode bidderParamsFromImpExt(ObjectNode ext) { diff --git a/src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java b/src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java index 7f86633b582..e6b6b25aa7f 100644 --- a/src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java @@ -96,9 +96,7 @@ import org.prebid.server.log.CriteriaLogManager; import org.prebid.server.log.CriteriaManager; import org.prebid.server.log.HttpInteractionLogger; -import org.prebid.server.log.Logger; import org.prebid.server.log.LoggerControlKnob; -import org.prebid.server.log.LoggerFactory; import org.prebid.server.metric.Metrics; import org.prebid.server.optout.GoogleRecaptchaVerifier; import org.prebid.server.privacy.HostVendorTcfDefinerService; @@ -148,8 +146,6 @@ @Configuration public class ServiceConfiguration { - private static final Logger logger = LoggerFactory.getLogger(ServiceConfiguration.class); - @Value("${logging.sampling-rate:0.01}") private double logSamplingRate; @@ -292,6 +288,7 @@ Ortb2ImplicitParametersResolver ortb2ImplicitParametersResolver( @Value("${external-url}") String externalUrl, @Value("${gdpr.host-vendor-id:#{null}}") Integer hostVendorId, @Value("${datacenter-region}") String datacenterRegion, + BidderCatalog bidderCatalog, ImplicitParametersExtractor implicitParametersExtractor, TimeoutResolver timeoutResolver, IpAddressHelper ipAddressHelper, @@ -308,6 +305,7 @@ Ortb2ImplicitParametersResolver ortb2ImplicitParametersResolver( externalUrl, hostVendorId, datacenterRegion, + bidderCatalog, implicitParametersExtractor, timeoutResolver, ipAddressHelper, diff --git a/src/test/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolverTest.java b/src/test/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolverTest.java index 01695c30d48..81680a5ac7e 100644 --- a/src/test/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolverTest.java +++ b/src/test/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolverTest.java @@ -33,6 +33,7 @@ import org.prebid.server.auction.model.IpAddress; import org.prebid.server.auction.model.SecBrowsingTopic; import org.prebid.server.auction.model.debug.DebugContext; +import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.exception.BlocklistedAppException; import org.prebid.server.exception.InvalidRequestException; import org.prebid.server.exception.PreBidException; @@ -91,6 +92,8 @@ public class Ortb2ImplicitParametersResolverTest extends VertxTest { private static final String ENDPOINT = Endpoint.openrtb2_amp.value(); + @Mock(strictness = LENIENT) + private BidderCatalog bidderCatalog; @Mock(strictness = LENIENT) private ImplicitParametersExtractor paramsExtractor; @Mock(strictness = LENIENT) @@ -118,6 +121,7 @@ public Ortb2ImplicitParametersResolver target(boolean shouldCacheOnlyWinningsBid "https://external.url/", 0, "datacenter-region", + bidderCatalog, paramsExtractor, timeoutResolver, ipAddressHelper, @@ -135,6 +139,7 @@ public void setUp() { .headers(CaseInsensitiveMultiMap.empty()) .build()); + given(bidderCatalog.isValidName(anyString())).willReturn(true); given(idGenerator.generateId()).willReturn(null); given(topicsResolver.resolve(any(), anyBoolean(), anyList())).willReturn(emptyList()); given(timeoutResolver.limitToMax(any())).willReturn(2000L); @@ -1044,7 +1049,7 @@ public void shouldGenerateImpIdIfImpIdIsNotUnique() { } @Test - public void shouldMoveBidderParametersToImpExtPrebidBidderAndMergeWithExisting() { + public void shouldNotMoveBidderParametersToImpExtPrebidBidderWhenAlreadyPresent() { // given final List imps = singletonList( Imp.builder() @@ -1080,6 +1085,8 @@ public void shouldMoveBidderParametersToImpExtPrebidBidderAndMergeWithExisting() .id("someImpId") .secure(1) .ext(mapper.createObjectNode() + .set("bidder1", mapper.createObjectNode().put("param1", "value1")) + .set("bidder2", mapper.createObjectNode().put("param2", "value2")) .set("context", mapper.createObjectNode().put("data", "datavalue")) .set("all", mapper.createObjectNode().put("all-data", "all-value")) .set("general", mapper.createObjectNode() @@ -1094,12 +1101,67 @@ public void shouldMoveBidderParametersToImpExtPrebidBidderAndMergeWithExisting() .put("tid-data", "tid-value")) .set("prebid", mapper.createObjectNode() .set("bidder", mapper.createObjectNode() - .set( - "bidder1", mapper.createObjectNode().put("param1", "value1")) - .set( - "bidder2", mapper.createObjectNode() - .put("param2", "value2") - .put("param22", "value22"))) + .set("bidder2", mapper.createObjectNode().put("param22", "value22"))) + .set("storedresult", mapper.createObjectNode().put("id", "storedreq1")))) + .build(); + + assertThat(result.getImp()).isEqualTo(singletonList(expectedImp)); + } + + @Test + public void shouldMoveBidderParametersToImpExtPrebidBidderWhenNotPresent() { + // given + given(bidderCatalog.isValidName(eq("notBidder"))).willReturn(false); + + final List imps = singletonList( + Imp.builder() + .id("someImpId") + .ext(mapper.createObjectNode() + .set("notBidder", mapper.createObjectNode().put("param1", "value1")) + .set("bidder", mapper.createObjectNode().put("param2", "value2")) + .set("context", mapper.createObjectNode().put("data", "datavalue")) + .set("all", mapper.createObjectNode().put("all-data", "all-value")) + .set("general", mapper.createObjectNode() + .put("general-data", "general-value")) + .set("skadn", mapper.createObjectNode() + .put("skadn-data", "skadn-value")) + .set("data", mapper.createObjectNode() + .put("data-data", "data-value")) + .set("gpid", mapper.createObjectNode() + .put("gpid-data", "gpid-value")) + .set("tid", mapper.createObjectNode() + .put("tid-data", "tid-value")) + .set("prebid", mapper.createObjectNode() + .set("storedresult", mapper.createObjectNode().put("id", "storedreq1")))) + .build()); + + final BidRequest bidRequest = BidRequest.builder().imp(imps).build(); + + // when + final BidRequest result = target.resolve(bidRequest, auctionContext, ENDPOINT, false); + + // then + final Imp expectedImp = Imp.builder() + .id("someImpId") + .secure(1) + .ext(mapper.createObjectNode() + .set("notBidder", mapper.createObjectNode().put("param1", "value1")) + .set("context", mapper.createObjectNode().put("data", "datavalue")) + .set("all", mapper.createObjectNode().put("all-data", "all-value")) + .set("general", mapper.createObjectNode() + .put("general-data", "general-value")) + .set("skadn", mapper.createObjectNode() + .put("skadn-data", "skadn-value")) + .set("data", mapper.createObjectNode() + .put("data-data", "data-value")) + .set("gpid", mapper.createObjectNode() + .put("gpid-data", "gpid-value")) + .set("tid", mapper.createObjectNode() + .put("tid-data", "tid-value")) + .set("prebid", mapper.createObjectNode() + .set("bidder", mapper.createObjectNode() + .set("notBidder", mapper.createObjectNode().put("param1", "value1")) + .set("bidder", mapper.createObjectNode().put("param2", "value2"))) .set("storedresult", mapper.createObjectNode().put("id", "storedreq1")))) .build(); @@ -2343,13 +2405,6 @@ public void resolveShouldSetAppRequestPrebidChannelWhenEndpointIsNotAmpAndAppDoo .containsOnly(ExtRequestPrebidChannel.of("app")); } - private static BidRequest givenBidRequest(UnaryOperator bidRequestCustomizer) { - return bidRequestCustomizer.apply(BidRequest.builder() - .imp(singletonList(Imp.builder().ext(mapper.createObjectNode()).build())) - .ext(ExtRequest.of(ExtRequestPrebid.builder().build()))) - .build(); - } - @Test public void shouldNotSetRequestPrebidChannelWhenMissingInRequestAndNotSiteOrAppOrAmp() { // given @@ -2777,6 +2832,13 @@ public void shouldNotDropDuplicatedAndNotFilledUserData() { Data.builder().build()); } + private static BidRequest givenBidRequest(UnaryOperator bidRequestCustomizer) { + return bidRequestCustomizer.apply(BidRequest.builder() + .imp(singletonList(Imp.builder().ext(mapper.createObjectNode()).build())) + .ext(ExtRequest.of(ExtRequestPrebid.builder().build()))) + .build(); + } + private static AuctionContext givenAuctionContext(HttpRequestContext httpRequestContext) { return AuctionContext.builder() .httpRequest(httpRequestContext) From 8303ebc754fde502cc60df208e0c79c002c26944 Mon Sep 17 00:00:00 2001 From: Markiyan Mykush <95693607+marki1an@users.noreply.github.com> Date: Tue, 30 Jul 2024 16:17:39 +0300 Subject: [PATCH 2/4] Test: `imp.ext` (#3337) * Add functional tests for imp.ext * Update after review * Remove unused import --- .../functional/model/bidder/Generic.groovy | 2 + .../model/bidderspecific/BidderImp.groovy | 2 + .../model/request/auction/ImpExt.groovy | 6 ++ .../request/auction/ImpExtContext.groovy | 2 + .../request/auction/ImpExtContextData.groovy | 2 + .../model/request/auction/RegsDsa.groovy | 0 .../functional/tests/BidderParamsSpec.groovy | 82 ++++++++++++++++++- 7 files changed, 95 insertions(+), 1 deletion(-) delete mode 100644 src/test/groovy/org/prebid/server/functional/model/request/auction/RegsDsa.groovy diff --git a/src/test/groovy/org/prebid/server/functional/model/bidder/Generic.groovy b/src/test/groovy/org/prebid/server/functional/model/bidder/Generic.groovy index 3d67f9ae687..f792bdf00c8 100644 --- a/src/test/groovy/org/prebid/server/functional/model/bidder/Generic.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/bidder/Generic.groovy @@ -1,7 +1,9 @@ package org.prebid.server.functional.model.bidder import com.fasterxml.jackson.annotation.JsonProperty +import groovy.transform.EqualsAndHashCode +@EqualsAndHashCode class Generic implements BidderAdapter { Object exampleProperty diff --git a/src/test/groovy/org/prebid/server/functional/model/bidderspecific/BidderImp.groovy b/src/test/groovy/org/prebid/server/functional/model/bidderspecific/BidderImp.groovy index 62799412692..58017ce1490 100644 --- a/src/test/groovy/org/prebid/server/functional/model/bidderspecific/BidderImp.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/bidderspecific/BidderImp.groovy @@ -1,9 +1,11 @@ package org.prebid.server.functional.model.bidderspecific +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import org.prebid.server.functional.model.request.auction.Imp @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class BidderImp extends Imp { BidderImpExt ext 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 774131f0d24..34ecd2508a1 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 @@ -1,12 +1,14 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.annotation.JsonProperty +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString import org.prebid.server.functional.model.bidder.AppNexus import org.prebid.server.functional.model.bidder.Generic import org.prebid.server.functional.model.bidder.Rubicon @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class ImpExt { ImpExtPrebid prebid @@ -21,6 +23,10 @@ class ImpExt { String tid String gpid Integer ae + String all + String skadn + String general + String foo static ImpExt getDefaultImpExt() { new ImpExt().tap { diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContext.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContext.groovy index bff08aa290b..ffe64b5bcc3 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContext.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContext.groovy @@ -1,8 +1,10 @@ package org.prebid.server.functional.model.request.auction +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class ImpExtContext { ImpExtContextData data diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContextData.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContextData.groovy index 34de1ad6575..f171ab15df0 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContextData.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/ImpExtContextData.groovy @@ -2,10 +2,12 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode import groovy.transform.ToString @JsonNaming(PropertyNamingStrategies.LowerCaseStrategy) @ToString(includeNames = true, ignoreNulls = true) +@EqualsAndHashCode class ImpExtContextData { String language diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/RegsDsa.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/RegsDsa.groovy deleted file mode 100644 index e69de29bb2d..00000000000 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 404cf1b5b15..ceb3be1a9cb 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy @@ -10,6 +10,9 @@ import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Device import org.prebid.server.functional.model.request.auction.Geo import org.prebid.server.functional.model.request.auction.Imp +import org.prebid.server.functional.model.request.auction.ImpExt +import org.prebid.server.functional.model.request.auction.ImpExtContext +import org.prebid.server.functional.model.request.auction.ImpExtContextData import org.prebid.server.functional.model.request.auction.Native import org.prebid.server.functional.model.request.auction.PrebidStoredRequest import org.prebid.server.functional.model.request.auction.RegsExt @@ -560,7 +563,7 @@ class BidderParamsSpec extends BaseSpec { then: "Bid response should contain proper warning" assert response.ext?.warnings[ErrorType.GENERIC]?.message == - ["Imp ${bidRequest.imp[1].id} does not have a supported media type and has been removed from the request for this bidder." ] + ["Imp ${bidRequest.imp[1].id} does not have a supported media type and has been removed from the request for this bidder."] and: "Bid response should contain seatbid" assert response.seatbid @@ -721,4 +724,81 @@ class BidderParamsSpec extends BaseSpec { 1 | 1 0 | 0 } + + def "PBS shouldn't emit warning and proceed auction when imp.ext.foo and imp.ext.prebid.bidder.generic in the request"() { + given: "Default bid request" + def randomString = PBSUtils.randomString + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.foo = randomString + imp[0].ext.prebid.bidder.generic = new Generic() + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain imp.ext.foo" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.imp[0].ext.foo == randomString + + and: "Response shouldn't contain warning" + assert !response?.ext?.warnings + } + + def "PBS should emit warning and proceed auction when imp.ext.foo and imp.ext.generic in the request"() { + given: "Default bid request" + def randomString = PBSUtils.randomString + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.generic = new Generic() + imp[0].ext.foo = randomString + imp[0].ext.prebid.bidder.generic = null + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain imp.ext.foo" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest.imp[0].ext.foo == randomString + + and: "PBS should emit an warning" + assert response?.ext?.warnings[PREBID]*.code == [999] + assert response?.ext?.warnings[PREBID]*.message == + ["WARNING: request.imp[0].ext.foo unknown bidder."] + } + + def "PBS shouldn't emit warning and proceed auction when imp.ext.foo and imp.ext.generic in the request"() { + given: "Default bid request with populated imp.ext" + def impExt = ImpExt.getDefaultImpExt().tap { + prebid.bidder.generic = null + generic = new Generic() + ae = PBSUtils.randomNumber + all = PBSUtils.randomNumber + context = new ImpExtContext(data: new ImpExtContextData()) + data = new ImpExtContextData(pbAdSlot: PBSUtils.randomString) + general = PBSUtils.randomString + gpid = PBSUtils.randomString + skadn = PBSUtils.randomString + tid = PBSUtils.randomString + } + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext = impExt + } + + when: "PBS processes auction request" + defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request should contain same field as requested" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + verifyAll(bidderRequest.imp[0].ext){ + bidder == impExt.generic + ae == impExt.ae + all == impExt.all + context == impExt.context + data == impExt.data + general == impExt.general + gpid == impExt.gpid + skadn == impExt.skadn + tid == impExt.tid + } + } } From 81d5a1a15b8a83ea75ec07b194051912d3402cc5 Mon Sep 17 00:00:00 2001 From: markiian Date: Wed, 31 Jul 2024 12:57:36 +0300 Subject: [PATCH 3/4] Update after review --- .../model/request/auction/Foo.groovy | 9 +++++++++ .../model/request/auction/ImpExt.groovy | 2 +- .../functional/tests/BidderParamsSpec.groovy | 20 ++++++++++--------- 3 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 src/test/groovy/org/prebid/server/functional/model/request/auction/Foo.groovy diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Foo.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Foo.groovy new file mode 100644 index 00000000000..64457df8b2d --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Foo.groovy @@ -0,0 +1,9 @@ +package org.prebid.server.functional.model.request.auction + +import groovy.transform.EqualsAndHashCode + +@EqualsAndHashCode +class Foo { + + String anyProperty +} 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 34ecd2508a1..8100ce9b048 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 @@ -26,7 +26,7 @@ class ImpExt { String all String skadn String general - String foo + Foo foo static ImpExt getDefaultImpExt() { new ImpExt().tap { 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 ceb3be1a9cb..7b84d3ee6d2 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy @@ -8,6 +8,7 @@ import org.prebid.server.functional.model.request.amp.AmpRequest import org.prebid.server.functional.model.request.auction.Banner import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Device +import org.prebid.server.functional.model.request.auction.Foo import org.prebid.server.functional.model.request.auction.Geo import org.prebid.server.functional.model.request.auction.Imp import org.prebid.server.functional.model.request.auction.ImpExt @@ -727,9 +728,9 @@ class BidderParamsSpec extends BaseSpec { def "PBS shouldn't emit warning and proceed auction when imp.ext.foo and imp.ext.prebid.bidder.generic in the request"() { given: "Default bid request" - def randomString = PBSUtils.randomString + def foo = new Foo(anyProperty: PBSUtils.randomString) def bidRequest = BidRequest.defaultBidRequest.tap { - imp[0].ext.foo = randomString + imp[0].ext.foo = foo imp[0].ext.prebid.bidder.generic = new Generic() } @@ -738,7 +739,7 @@ class BidderParamsSpec extends BaseSpec { then: "Bidder request should contain imp.ext.foo" def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest.imp[0].ext.foo == randomString + assert bidderRequest.imp[0].ext.foo == foo and: "Response shouldn't contain warning" assert !response?.ext?.warnings @@ -746,11 +747,11 @@ class BidderParamsSpec extends BaseSpec { def "PBS should emit warning and proceed auction when imp.ext.foo and imp.ext.generic in the request"() { given: "Default bid request" - def randomString = PBSUtils.randomString + def foo = new Foo(anyProperty: PBSUtils.randomString) def bidRequest = BidRequest.defaultBidRequest.tap { imp[0].ext.generic = new Generic() - imp[0].ext.foo = randomString - imp[0].ext.prebid.bidder.generic = null + imp[0].ext.foo = foo + imp[0].ext.prebid.bidder = null } when: "PBS processes auction request" @@ -758,12 +759,13 @@ class BidderParamsSpec extends BaseSpec { then: "Bidder request should contain imp.ext.foo" def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest.imp[0].ext.foo == randomString + assert bidderRequest.imp[0].ext.foo == foo and: "PBS should emit an warning" assert response?.ext?.warnings[PREBID]*.code == [999] assert response?.ext?.warnings[PREBID]*.message == - ["WARNING: request.imp[0].ext.foo unknown bidder."] + ["WARNING: request.imp[0].ext.prebid.bidder.foo was dropped with a reason: " + + "request.imp[0].ext.prebid.bidder contains unknown bidder: foo"] } def "PBS shouldn't emit warning and proceed auction when imp.ext.foo and imp.ext.generic in the request"() { @@ -789,7 +791,7 @@ class BidderParamsSpec extends BaseSpec { then: "Bidder request should contain same field as requested" def bidderRequest = bidder.getBidderRequest(bidRequest.id) - verifyAll(bidderRequest.imp[0].ext){ + verifyAll(bidderRequest.imp[0].ext) { bidder == impExt.generic ae == impExt.ae all == impExt.all From fdf3ba71358b2eb89c2c31042e0fad67ed2fa4e9 Mon Sep 17 00:00:00 2001 From: markiian Date: Fri, 2 Aug 2024 11:45:57 +0300 Subject: [PATCH 4/4] Update after review --- ...Foo.groovy => AnyUnsupportedBidder.groovy} | 4 +-- .../model/request/auction/ImpExt.groovy | 2 +- .../functional/tests/BidderParamsSpec.groovy | 28 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) rename src/test/groovy/org/prebid/server/functional/model/request/auction/{Foo.groovy => AnyUnsupportedBidder.groovy} (67%) diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Foo.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/AnyUnsupportedBidder.groovy similarity index 67% rename from src/test/groovy/org/prebid/server/functional/model/request/auction/Foo.groovy rename to src/test/groovy/org/prebid/server/functional/model/request/auction/AnyUnsupportedBidder.groovy index 64457df8b2d..53858b3bdd0 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/Foo.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/AnyUnsupportedBidder.groovy @@ -3,7 +3,7 @@ package org.prebid.server.functional.model.request.auction import groovy.transform.EqualsAndHashCode @EqualsAndHashCode -class Foo { +class AnyUnsupportedBidder { - String anyProperty + String anyUnsupportedField } 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 8100ce9b048..fe8cd0f089c 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 @@ -26,7 +26,7 @@ class ImpExt { String all String skadn String general - Foo foo + AnyUnsupportedBidder anyUnsupportedBidder static ImpExt getDefaultImpExt() { new ImpExt().tap { 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 7b84d3ee6d2..c31570e26ed 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy @@ -8,7 +8,7 @@ import org.prebid.server.functional.model.request.amp.AmpRequest import org.prebid.server.functional.model.request.auction.Banner import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Device -import org.prebid.server.functional.model.request.auction.Foo +import org.prebid.server.functional.model.request.auction.AnyUnsupportedBidder import org.prebid.server.functional.model.request.auction.Geo import org.prebid.server.functional.model.request.auction.Imp import org.prebid.server.functional.model.request.auction.ImpExt @@ -726,49 +726,49 @@ class BidderParamsSpec extends BaseSpec { 0 | 0 } - def "PBS shouldn't emit warning and proceed auction when imp.ext.foo and imp.ext.prebid.bidder.generic in the request"() { + def "PBS shouldn't emit warning and proceed auction when imp.ext.anyUnsupportedBidder and imp.ext.prebid.bidder.generic in the request"() { given: "Default bid request" - def foo = new Foo(anyProperty: PBSUtils.randomString) + def unsupportedBidder = new AnyUnsupportedBidder(anyUnsupportedField: PBSUtils.randomString) def bidRequest = BidRequest.defaultBidRequest.tap { - imp[0].ext.foo = foo + imp[0].ext.anyUnsupportedBidder = unsupportedBidder imp[0].ext.prebid.bidder.generic = new Generic() } when: "PBS processes auction request" def response = defaultPbsService.sendAuctionRequest(bidRequest) - then: "Bidder request should contain imp.ext.foo" + then: "Bidder request should contain imp.ext.anyUnsupportedBidder" def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest.imp[0].ext.foo == foo + assert bidderRequest.imp[0].ext.anyUnsupportedBidder == unsupportedBidder and: "Response shouldn't contain warning" assert !response?.ext?.warnings } - def "PBS should emit warning and proceed auction when imp.ext.foo and imp.ext.generic in the request"() { + def "PBS should emit warning and proceed auction when imp.ext.anyUnsupportedBidder and imp.ext.generic in the request"() { given: "Default bid request" - def foo = new Foo(anyProperty: PBSUtils.randomString) + def unsupportedBidder = new AnyUnsupportedBidder(anyUnsupportedField: PBSUtils.randomString) def bidRequest = BidRequest.defaultBidRequest.tap { imp[0].ext.generic = new Generic() - imp[0].ext.foo = foo + imp[0].ext.anyUnsupportedBidder = unsupportedBidder imp[0].ext.prebid.bidder = null } when: "PBS processes auction request" def response = defaultPbsService.sendAuctionRequest(bidRequest) - then: "Bidder request should contain imp.ext.foo" + then: "Bidder request should contain imp.ext.anyUnsupportedBidder" def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest.imp[0].ext.foo == foo + assert bidderRequest.imp[0].ext.anyUnsupportedBidder == unsupportedBidder and: "PBS should emit an warning" assert response?.ext?.warnings[PREBID]*.code == [999] assert response?.ext?.warnings[PREBID]*.message == - ["WARNING: request.imp[0].ext.prebid.bidder.foo was dropped with a reason: " + - "request.imp[0].ext.prebid.bidder contains unknown bidder: foo"] + ["WARNING: request.imp[0].ext.prebid.bidder.anyUnsupportedBidder was dropped with a reason: " + + "request.imp[0].ext.prebid.bidder contains unknown bidder: anyUnsupportedBidder"] } - def "PBS shouldn't emit warning and proceed auction when imp.ext.foo and imp.ext.generic in the request"() { + def "PBS shouldn't emit warning and proceed auction when all imp.ext fields known for PBS"() { given: "Default bid request with populated imp.ext" def impExt = ImpExt.getDefaultImpExt().tap { prebid.bidder.generic = null