From 2451f726e5c007d335160416dc820eac09defd7e Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Sat, 4 Oct 2025 12:53:18 +0200 Subject: [PATCH 1/3] CpmStar: Adapter Update bidder implementation to allow imp.ext passthrough with the correct custom parameters. --- .../prebid/server/bidder/cpmstar/CpmStarBidder.java | 11 ++++++++++- .../cpmstar/test-auction-cpmstar-request.json | 2 +- .../it/openrtb2/cpmstar/test-cpmstar-bid-request.json | 7 ++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java b/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java index b3dc01cee97..746a007fb5c 100644 --- a/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java +++ b/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java @@ -1,6 +1,7 @@ package org.prebid.server.bidder.cpmstar; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; import com.iab.openrtb.response.Bid; @@ -26,6 +27,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Objects; public class CpmStarBidder implements Bidder { @@ -79,7 +81,14 @@ private Imp createImp(ExtImpCpmStar extImpCpmStar, Imp imp) { if (extImpCpmStar == null) { throw new PreBidException("imp id=%s: bidder.ext is null".formatted(imp.getId())); } - return imp.toBuilder().ext(mapper.mapper().valueToTree(extImpCpmStar)).build(); + final Map extMap = mapper.mapper().convertValue(imp.getExt(), new TypeReference<>() { + }); + final Map bidderMap = (Map) extMap.remove("bidder"); + if (bidderMap != null) { + extMap.putAll(bidderMap); + } + final ObjectNode newExt = mapper.mapper().valueToTree(extMap); + return imp.toBuilder().ext(newExt).build(); } @Override diff --git a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-request.json b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-request.json index 9afb14a3c23..793cea67d5b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-request.json @@ -21,4 +21,4 @@ "gdpr": 0 } } -} \ No newline at end of file +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json index 99f805d86bc..8c4c95b5b5c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json @@ -9,14 +9,12 @@ "h": 250 }, "ext": { + "tid" : "${json-unit.any-string}", "placementId": 1234, "subpoolId": 1234 } } ], - "source": { - "tid": "${json-unit.any-string}" - }, "site": { "domain": "www.example.com", "page": "http://www.example.com", @@ -36,6 +34,8 @@ "cur": [ "USD" ], + "source" : + {"tid" : "${json-unit.any-string}"}, "regs": { "ext": { "gdpr": 0 @@ -52,3 +52,4 @@ } } } + From fb7365782cd7c304bb77e7148ca5b923cc8d580a Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Tue, 14 Oct 2025 16:23:45 +0200 Subject: [PATCH 2/3] fix test --- .../server/bidder/cpmstar/CpmStarBidder.java | 19 ++++++----- .../bidder/cpmstar/CpmStarBidderTest.java | 34 +++++++++++++++++++ .../cpmstar/test-cpmstar-bid-request.json | 7 ++-- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java b/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java index 746a007fb5c..a5b5687c1b4 100644 --- a/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java +++ b/src/main/java/org/prebid/server/bidder/cpmstar/CpmStarBidder.java @@ -1,6 +1,7 @@ package org.prebid.server.bidder.cpmstar; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; @@ -27,7 +28,6 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Objects; public class CpmStarBidder implements Bidder { @@ -81,14 +81,17 @@ private Imp createImp(ExtImpCpmStar extImpCpmStar, Imp imp) { if (extImpCpmStar == null) { throw new PreBidException("imp id=%s: bidder.ext is null".formatted(imp.getId())); } - final Map extMap = mapper.mapper().convertValue(imp.getExt(), new TypeReference<>() { - }); - final Map bidderMap = (Map) extMap.remove("bidder"); - if (bidderMap != null) { - extMap.putAll(bidderMap); + + final ObjectNode impExt = imp.getExt() != null + ? imp.getExt().deepCopy() + : mapper.mapper().createObjectNode(); + + final JsonNode bidderNode = impExt.remove("bidder"); + if (bidderNode != null && bidderNode.isObject()) { + bidderNode.fields().forEachRemaining(entry -> impExt.set(entry.getKey(), entry.getValue())); } - final ObjectNode newExt = mapper.mapper().valueToTree(extMap); - return imp.toBuilder().ext(newExt).build(); + + return imp.toBuilder().ext(impExt).build(); } @Override diff --git a/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java b/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java index a5f77bc0394..d14b87ab0ed 100644 --- a/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java @@ -1,6 +1,7 @@ package org.prebid.server.bidder.cpmstar; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Audio; import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; @@ -87,6 +88,39 @@ public void makeHttpRequestsShouldSkipInvalidImpressionAndAddError() { assertThat(result.getValue()).isEmpty(); } + @Test + public void makeHttpRequestsShouldPreserveExistingExtFieldsWhenFlatteningBidder() throws JsonProcessingException { + // given: + final ObjectNode ext = mapper.createObjectNode(); + ext.set("bidder", mapper.valueToTree(ExtImpCpmStar.of(12, 123))); + ext.put("gpid", "abc-123"); + + final Imp imp = Imp.builder() + .id("123") + .banner(Banner.builder().w(300).h(250).build()) + .ext(ext) + .build(); + + final BidRequest bidRequest = BidRequest.builder() + .imp(singletonList(imp)) + .build(); + + final CpmStarBidder target = new CpmStarBidder("https://test.endpoint.com", jacksonMapper); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + + final BidRequest outgoing = result.getValue().getFirst().getPayload(); + final ObjectNode outgoingExt = (ObjectNode) outgoing.getImp().getFirst().getExt(); + + assertThat(outgoingExt.has("gpid")).isTrue(); + assertThat(outgoingExt.get("gpid").asText()).isEqualTo("abc-123"); + assertThat(outgoingExt.has("bidder")).isFalse(); + } + @Test public void makeBidsShouldReturnErrorIfResponseBodyCouldNotBeParsed() { // given diff --git a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json index 8c4c95b5b5c..b1f5b42ff89 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-cpmstar-bid-request.json @@ -9,7 +9,7 @@ "h": 250 }, "ext": { - "tid" : "${json-unit.any-string}", + "tid": "${json-unit.any-string}", "placementId": 1234, "subpoolId": 1234 } @@ -34,8 +34,9 @@ "cur": [ "USD" ], - "source" : - {"tid" : "${json-unit.any-string}"}, + "source": { + "tid": "${json-unit.any-string}" + }, "regs": { "ext": { "gdpr": 0 From 9e6abb4a29ddcf441f246639dfcdfaf0a022558e Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Fri, 17 Oct 2025 15:50:50 +0200 Subject: [PATCH 3/3] fix comments --- .../org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java b/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java index d14b87ab0ed..80ee546bfe3 100644 --- a/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/cpmstar/CpmStarBidderTest.java @@ -114,11 +114,13 @@ public void makeHttpRequestsShouldPreserveExistingExtFieldsWhenFlatteningBidder( assertThat(result.getErrors()).isEmpty(); final BidRequest outgoing = result.getValue().getFirst().getPayload(); - final ObjectNode outgoingExt = (ObjectNode) outgoing.getImp().getFirst().getExt(); + final ObjectNode outgoingExt = outgoing.getImp().getFirst().getExt(); assertThat(outgoingExt.has("gpid")).isTrue(); assertThat(outgoingExt.get("gpid").asText()).isEqualTo("abc-123"); assertThat(outgoingExt.has("bidder")).isFalse(); + assertThat(outgoingExt.get("placementId").asInt()).isEqualTo(12); + assertThat(outgoingExt.get("subpoolId").asInt()).isEqualTo(123); } @Test