From 74fda2fefd55f481f4c91f8703d3aa8e1fbac79c Mon Sep 17 00:00:00 2001 From: Irakli Gotsiridze Date: Tue, 1 Oct 2024 23:53:39 +0400 Subject: [PATCH 1/2] accept both string and number --- .../server/bidder/sovrn/SovrnBidder.java | 23 +++++++-- .../ext/request/sovrn/ExtImpSovrn.java | 5 +- .../resources/static/bidder-params/sovrn.json | 12 ++++- .../server/bidder/sovrn/SovrnBidderTest.java | 48 ++++++++++++++++++- 4 files changed, 78 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/sovrn/SovrnBidder.java b/src/main/java/org/prebid/server/bidder/sovrn/SovrnBidder.java index ac5e2268500..012dd04a035 100644 --- a/src/main/java/org/prebid/server/bidder/sovrn/SovrnBidder.java +++ b/src/main/java/org/prebid/server/bidder/sovrn/SovrnBidder.java @@ -1,6 +1,7 @@ package org.prebid.server.bidder.sovrn; 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.Device; @@ -103,10 +104,24 @@ private ExtImpSovrn parseExtImpSovrn(ObjectNode ext) { } } - private static BigDecimal resolveBidFloor(BigDecimal impBidFloor, BigDecimal extBidFloor) { - return !BidderUtil.isValidPrice(impBidFloor) && BidderUtil.isValidPrice(extBidFloor) - ? extBidFloor - : impBidFloor; + private static BigDecimal resolveBidFloor(BigDecimal impBidFloor, JsonNode extBidFloor) { + final BigDecimal fromExt = parseBidFloor(extBidFloor); + return !BidderUtil.isValidPrice(impBidFloor) && BidderUtil.isValidPrice(fromExt) ? fromExt : impBidFloor; + } + + private static BigDecimal parseBidFloor(JsonNode extBidFloor) { + if (extBidFloor != null) { + if (extBidFloor.isNumber()) { + return extBidFloor.decimalValue(); + } else if (extBidFloor.isTextual()) { + try { + return new BigDecimal(extBidFloor.textValue()); + } catch (NumberFormatException e) { + return BigDecimal.ZERO; + } + } + } + return BigDecimal.ZERO; } private String resolveTagId(ExtImpSovrn sovrnExt) { diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/sovrn/ExtImpSovrn.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/sovrn/ExtImpSovrn.java index f9370eb9e74..ed666c44bb9 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/sovrn/ExtImpSovrn.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/sovrn/ExtImpSovrn.java @@ -1,11 +1,10 @@ package org.prebid.server.proto.openrtb.ext.request.sovrn; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; import lombok.AllArgsConstructor; import lombok.Value; -import java.math.BigDecimal; - @Value @AllArgsConstructor(staticName = "of") public class ExtImpSovrn { @@ -16,7 +15,7 @@ public class ExtImpSovrn { @JsonProperty("tagId") String legacyTagId; - BigDecimal bidfloor; + JsonNode bidfloor; String adunitcode; } diff --git a/src/main/resources/static/bidder-params/sovrn.json b/src/main/resources/static/bidder-params/sovrn.json index 803a8e127a1..4f779a9f1f6 100644 --- a/src/main/resources/static/bidder-params/sovrn.json +++ b/src/main/resources/static/bidder-params/sovrn.json @@ -13,8 +13,16 @@ "description": "An ID which identifies the sovrn ad tag (DEPRECATED, use \"tagid\" instead)" }, "bidfloor": { - "type": "number", - "description": "The minimum acceptable bid, in CPM, using US Dollars" + "anyOf": [ + { + "type": "number", + "description": "The minimum acceptable bid, in CPM, using US Dollars" + }, + { + "type": "string", + "description": "The minimum acceptable bid, in CPM, using US Dollars (as a string)" + } + ] }, "adunitcode": { "type": "string", diff --git a/src/test/java/org/prebid/server/bidder/sovrn/SovrnBidderTest.java b/src/test/java/org/prebid/server/bidder/sovrn/SovrnBidderTest.java index a788d9c3283..7b405b23c98 100644 --- a/src/test/java/org/prebid/server/bidder/sovrn/SovrnBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/sovrn/SovrnBidderTest.java @@ -259,6 +259,52 @@ public void makeHttpRequestsShouldSetBidFloorFromExtIfImpBidFloorIsMissed() { .containsExactly(BigDecimal.TEN); } + @Test + public void makeHttpRequestsShouldSetBidFloorFromExtOfStringIfImpBidFloorIsMissed() { + // given + final BidRequest bidRequest = givenBidRequest(impBuilder -> impBuilder + .banner(Banner.builder().format(singletonList(Format.builder().w(200).h(300).build())) + .w(200) + .h(300) + .build()) + .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpSovrn.of("tagid", + "legacyTagId", mapper.valueToTree("10.2"), "sovrn_auc"))))); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getBody) + .extracting(SovrnBidderTest::mappedToBidRequest) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getBidfloor) + .containsExactly(BigDecimal.valueOf(10.2)); + } + + @Test + public void makeHttpRequestsShouldNotSetBidFloorFromErroneousExtOfStringIfImpBidFloorIsMissed() { + // given + final BidRequest bidRequest = givenBidRequest(impBuilder -> impBuilder + .banner(Banner.builder().format(singletonList(Format.builder().w(200).h(300).build())) + .w(200) + .h(300) + .build()) + .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpSovrn.of("tagid", + "legacyTagId", mapper.valueToTree("error"), "sovrn_auc"))))); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getValue()).hasSize(1) + .extracting(HttpRequest::getBody) + .extracting(SovrnBidderTest::mappedToBidRequest) + .flatExtracting(BidRequest::getImp) + .extracting(Imp::getBidfloor) + .containsOnlyNulls(); + } + @Test public void makeHttpRequestsShouldNotSetBidFloorFromExtIfImpBidFloorIsValid() { // given @@ -545,7 +591,7 @@ private static Imp givenImp(UnaryOperator impCustomizer) { .protocols(singletonList(1)) .build()) .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpSovrn.of("tagid", - "legacyTagId", BigDecimal.TEN, "sovrn_auc"))))) + "legacyTagId", mapper.valueToTree(10), "sovrn_auc"))))) .build(); } From a7b006b6ea666bbdba228a458404b005c70fd970 Mon Sep 17 00:00:00 2001 From: Irakli Gotsiridze Date: Fri, 11 Oct 2024 17:40:44 +0400 Subject: [PATCH 2/2] revert some changes --- .../server/bidder/sovrn/SovrnBidder.java | 23 ++------- .../ext/request/sovrn/ExtImpSovrn.java | 5 +- .../server/bidder/sovrn/SovrnBidderTest.java | 48 +------------------ 3 files changed, 8 insertions(+), 68 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/sovrn/SovrnBidder.java b/src/main/java/org/prebid/server/bidder/sovrn/SovrnBidder.java index 012dd04a035..ac5e2268500 100644 --- a/src/main/java/org/prebid/server/bidder/sovrn/SovrnBidder.java +++ b/src/main/java/org/prebid/server/bidder/sovrn/SovrnBidder.java @@ -1,7 +1,6 @@ package org.prebid.server.bidder.sovrn; 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.Device; @@ -104,24 +103,10 @@ private ExtImpSovrn parseExtImpSovrn(ObjectNode ext) { } } - private static BigDecimal resolveBidFloor(BigDecimal impBidFloor, JsonNode extBidFloor) { - final BigDecimal fromExt = parseBidFloor(extBidFloor); - return !BidderUtil.isValidPrice(impBidFloor) && BidderUtil.isValidPrice(fromExt) ? fromExt : impBidFloor; - } - - private static BigDecimal parseBidFloor(JsonNode extBidFloor) { - if (extBidFloor != null) { - if (extBidFloor.isNumber()) { - return extBidFloor.decimalValue(); - } else if (extBidFloor.isTextual()) { - try { - return new BigDecimal(extBidFloor.textValue()); - } catch (NumberFormatException e) { - return BigDecimal.ZERO; - } - } - } - return BigDecimal.ZERO; + private static BigDecimal resolveBidFloor(BigDecimal impBidFloor, BigDecimal extBidFloor) { + return !BidderUtil.isValidPrice(impBidFloor) && BidderUtil.isValidPrice(extBidFloor) + ? extBidFloor + : impBidFloor; } private String resolveTagId(ExtImpSovrn sovrnExt) { diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/sovrn/ExtImpSovrn.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/sovrn/ExtImpSovrn.java index ed666c44bb9..f9370eb9e74 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/sovrn/ExtImpSovrn.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/sovrn/ExtImpSovrn.java @@ -1,10 +1,11 @@ package org.prebid.server.proto.openrtb.ext.request.sovrn; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; import lombok.AllArgsConstructor; import lombok.Value; +import java.math.BigDecimal; + @Value @AllArgsConstructor(staticName = "of") public class ExtImpSovrn { @@ -15,7 +16,7 @@ public class ExtImpSovrn { @JsonProperty("tagId") String legacyTagId; - JsonNode bidfloor; + BigDecimal bidfloor; String adunitcode; } diff --git a/src/test/java/org/prebid/server/bidder/sovrn/SovrnBidderTest.java b/src/test/java/org/prebid/server/bidder/sovrn/SovrnBidderTest.java index 7b405b23c98..a788d9c3283 100644 --- a/src/test/java/org/prebid/server/bidder/sovrn/SovrnBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/sovrn/SovrnBidderTest.java @@ -259,52 +259,6 @@ public void makeHttpRequestsShouldSetBidFloorFromExtIfImpBidFloorIsMissed() { .containsExactly(BigDecimal.TEN); } - @Test - public void makeHttpRequestsShouldSetBidFloorFromExtOfStringIfImpBidFloorIsMissed() { - // given - final BidRequest bidRequest = givenBidRequest(impBuilder -> impBuilder - .banner(Banner.builder().format(singletonList(Format.builder().w(200).h(300).build())) - .w(200) - .h(300) - .build()) - .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpSovrn.of("tagid", - "legacyTagId", mapper.valueToTree("10.2"), "sovrn_auc"))))); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getValue()).hasSize(1) - .extracting(HttpRequest::getBody) - .extracting(SovrnBidderTest::mappedToBidRequest) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getBidfloor) - .containsExactly(BigDecimal.valueOf(10.2)); - } - - @Test - public void makeHttpRequestsShouldNotSetBidFloorFromErroneousExtOfStringIfImpBidFloorIsMissed() { - // given - final BidRequest bidRequest = givenBidRequest(impBuilder -> impBuilder - .banner(Banner.builder().format(singletonList(Format.builder().w(200).h(300).build())) - .w(200) - .h(300) - .build()) - .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpSovrn.of("tagid", - "legacyTagId", mapper.valueToTree("error"), "sovrn_auc"))))); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getValue()).hasSize(1) - .extracting(HttpRequest::getBody) - .extracting(SovrnBidderTest::mappedToBidRequest) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getBidfloor) - .containsOnlyNulls(); - } - @Test public void makeHttpRequestsShouldNotSetBidFloorFromExtIfImpBidFloorIsValid() { // given @@ -591,7 +545,7 @@ private static Imp givenImp(UnaryOperator impCustomizer) { .protocols(singletonList(1)) .build()) .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpSovrn.of("tagid", - "legacyTagId", mapper.valueToTree(10), "sovrn_auc"))))) + "legacyTagId", BigDecimal.TEN, "sovrn_auc"))))) .build(); }