From b7c29494d4db7983906ef4356ad706cea36ac517 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Wed, 8 Jan 2025 12:08:19 +0100 Subject: [PATCH 1/3] Silvermob: Use mtype and add global host #3936 --- .../bidder/silvermob/SilvermobBidder.java | 32 ++++++++------- .../bidder/silvermob/SilvermobBidderTest.java | 39 ++++++++++++++----- 2 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/silvermob/SilvermobBidder.java b/src/main/java/org/prebid/server/bidder/silvermob/SilvermobBidder.java index 5bbe37d2b77..2ab8323d075 100644 --- a/src/main/java/org/prebid/server/bidder/silvermob/SilvermobBidder.java +++ b/src/main/java/org/prebid/server/bidder/silvermob/SilvermobBidder.java @@ -4,6 +4,7 @@ import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Device; import com.iab.openrtb.request.Imp; +import com.iab.openrtb.response.Bid; import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; import io.vertx.core.MultiMap; @@ -98,7 +99,7 @@ private ExtImpSilvermob parseImpExt(Imp imp) { } private static Boolean isInvalidHost(String host) { - return !StringUtils.equalsAny(host, "eu", "us", "apac"); + return !StringUtils.equalsAny(host, "eu", "us", "apac", "global"); } private String resolveEndpoint(ExtImpSilvermob extImp) { @@ -142,30 +143,31 @@ private List extractBids(BidderCall httpCall) { if (CollectionUtils.isEmpty(bidResponse.getSeatbid())) { throw new PreBidException("Empty SeatBid array"); } - return bidsFromResponse(bidResponse, httpCall.getRequest().getPayload()); + return bidsFromResponse(bidResponse); } - private static List bidsFromResponse(BidResponse bidResponse, BidRequest bidRequest) { + private static List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) .map(SeatBid::getBid) .filter(Objects::nonNull) .flatMap(Collection::stream) - .map(bid -> BidderBid.of(bid, getBidType(bid.getImpid(), bidRequest.getImp()), bidResponse.getCur())) + .map(bid -> BidderBid.of(bid, getBidType(bid), bidResponse.getCur())) .toList(); } - private static BidType getBidType(String impId, List imps) { - for (Imp imp : imps) { - if (imp.getId().equals(impId)) { - if (imp.getVideo() != null) { - return BidType.video; - } - if (imp.getXNative() != null) { - return BidType.xNative; - } - } + private static BidType getBidType(Bid bid) { + final Integer markupType = bid.getMtype(); + if (markupType == null) { + throw new PreBidException("Missing MType for bid: " + bid.getId()); } - return BidType.banner; + + return switch (markupType) { + case 1 -> BidType.banner; + case 2 -> BidType.video; + case 4 -> BidType.xNative; + default -> throw new PreBidException("Unable to fetch mediaType in multi-format: %s" + .formatted(bid.getImpid())); + }; } } diff --git a/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java b/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java index 272a5ef91ce..1019f79a079 100644 --- a/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java @@ -192,14 +192,14 @@ public void makeBidsShouldReturnErrorIfBidResponseSeatBidIsNullOrEmpty() throws } @Test - public void makeBidsShouldReturnBannerBidIfBannerIsPresentInRequestImp() throws JsonProcessingException { + public void makeBidsShouldReturnBannerBidIfMTypeIsBanner() throws JsonProcessingException { // given final BidderCall httpCall = givenHttpCall( BidRequest.builder() .imp(singletonList(Imp.builder().id("123").banner(Banner.builder().build()).build())) .build(), mapper.writeValueAsString( - givenBidResponse(bidBuilder -> bidBuilder.impid("123")))); + givenBidResponse(bidBuilder -> bidBuilder.impid("123").mtype(1)))); // when final Result> result = target.makeBids(httpCall, null); @@ -207,17 +207,17 @@ public void makeBidsShouldReturnBannerBidIfBannerIsPresentInRequestImp() throws // then assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()) - .containsOnly(BidderBid.of(Bid.builder().impid("123").build(), banner, "USD")); + .containsOnly(BidderBid.of(Bid.builder().impid("123").mtype(1).build(), banner, "USD")); } @Test - public void makeBidsShouldReturnVideoBidIfVideoIsPresentInRequestImp() throws JsonProcessingException { + public void makeBidsShouldReturnVideoBidIfMTypeIsVideo() throws JsonProcessingException { // given final BidderCall httpCall = givenHttpCall(BidRequest.builder() .imp(singletonList(Imp.builder().id("123").video(Video.builder().build()).build())) .build(), mapper.writeValueAsString( - givenBidResponse(bidBuilder -> bidBuilder.impid("123")))); + givenBidResponse(bidBuilder -> bidBuilder.impid("123").mtype(2)))); // when final Result> result = target.makeBids(httpCall, null); @@ -225,7 +225,28 @@ public void makeBidsShouldReturnVideoBidIfVideoIsPresentInRequestImp() throws Js // then assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()) - .containsOnly(BidderBid.of(Bid.builder().impid("123").build(), video, "USD")); + .containsOnly(BidderBid.of(Bid.builder().impid("123").mtype(2).build(), video, "USD")); + } + + @Test + public void makeBidsShouldThrowErrorWhenMediaTypeIsMissing() throws JsonProcessingException { + // given + final BidderCall httpCall = givenHttpCall(BidRequest.builder() + .imp(singletonList(Imp.builder().id("123").build())) + .build(), + mapper.writeValueAsString( + givenBidResponse(bidBuilder -> bidBuilder.impid("123")))); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + assertThat(result.getValue()).isEmpty(); + assertThat(result.getErrors()).hasSize(1) + .allSatisfy(error -> { + assertThat(error.getMessage()).startsWith("Missing MType for bid: null"); + assertThat(error.getType()).isEqualTo(BidderError.Type.bad_server_response); + }); } @Test @@ -254,14 +275,14 @@ public void makeHttpRequestsShouldSetAdditionalHeadersIfDeviceFieldsAreNotEmpty( } @Test - public void makeBidsShouldReturnNativeBidIfNativeIsPresentInRequestImp() throws JsonProcessingException { + public void makeBidsShouldReturnNativeBidIfMTypeIsNative() throws JsonProcessingException { // given final BidderCall httpCall = givenHttpCall( BidRequest.builder() .imp(singletonList(Imp.builder().id("123").xNative(Native.builder().build()).build())) .build(), mapper.writeValueAsString( - givenBidResponse(bidBuilder -> bidBuilder.impid("123")))); + givenBidResponse(bidBuilder -> bidBuilder.impid("123").mtype(4)))); // when final Result> result = target.makeBids(httpCall, null); @@ -269,7 +290,7 @@ public void makeBidsShouldReturnNativeBidIfNativeIsPresentInRequestImp() throws // then assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()) - .containsOnly(BidderBid.of(Bid.builder().impid("123").build(), xNative, "USD")); + .containsOnly(BidderBid.of(Bid.builder().impid("123").mtype(4).build(), xNative, "USD")); } private static BidRequest givenBidRequest( From 826a103f9d511de54d1c5005b553133a279b66e3 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Wed, 8 Jan 2025 12:39:35 +0100 Subject: [PATCH 2/3] update --- .../bidder/silvermob/SilvermobBidderTest.java | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java b/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java index 1019f79a079..cab25425b60 100644 --- a/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java @@ -228,27 +228,6 @@ public void makeBidsShouldReturnVideoBidIfMTypeIsVideo() throws JsonProcessingEx .containsOnly(BidderBid.of(Bid.builder().impid("123").mtype(2).build(), video, "USD")); } - @Test - public void makeBidsShouldThrowErrorWhenMediaTypeIsMissing() throws JsonProcessingException { - // given - final BidderCall httpCall = givenHttpCall(BidRequest.builder() - .imp(singletonList(Imp.builder().id("123").build())) - .build(), - mapper.writeValueAsString( - givenBidResponse(bidBuilder -> bidBuilder.impid("123")))); - - // when - final Result> result = target.makeBids(httpCall, null); - - // then - assertThat(result.getValue()).isEmpty(); - assertThat(result.getErrors()).hasSize(1) - .allSatisfy(error -> { - assertThat(error.getMessage()).startsWith("Missing MType for bid: null"); - assertThat(error.getType()).isEqualTo(BidderError.Type.bad_server_response); - }); - } - @Test public void makeHttpRequestsShouldSetAdditionalHeadersIfDeviceFieldsAreNotEmpty() { // given From c6fe5f2d3591b3ecf6b8ab3c3ea5b4569ad8d7c5 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Wed, 8 Jan 2025 13:32:31 +0100 Subject: [PATCH 3/3] update tests --- .../bidder/silvermob/SilvermobBidderTest.java | 21 +++++++++++++++++++ .../test-auction-silvermob-request.json | 3 ++- .../test-auction-silvermob-response.json | 6 ++++-- .../silvermob/test-silvermob-bid-request.json | 3 ++- .../test-silvermob-bid-response.json | 8 ++++--- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java b/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java index cab25425b60..091836d9f7d 100644 --- a/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/silvermob/SilvermobBidderTest.java @@ -272,6 +272,27 @@ public void makeBidsShouldReturnNativeBidIfMTypeIsNative() throws JsonProcessing .containsOnly(BidderBid.of(Bid.builder().impid("123").mtype(4).build(), xNative, "USD")); } + @Test + public void makeBidsShouldThrowErrorWhenMediaTypeIsMissing() throws JsonProcessingException { + // given + final BidderCall httpCall = givenHttpCall(BidRequest.builder() + .imp(singletonList(Imp.builder().id("123").build())) + .build(), + mapper.writeValueAsString( + givenBidResponse(bidBuilder -> bidBuilder.impid("123")))); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + assertThat(result.getValue()).isEmpty(); + assertThat(result.getErrors()).hasSize(1) + .allSatisfy(error -> { + assertThat(error.getMessage()).startsWith("Missing MType for bid: null"); + assertThat(error.getType()).isEqualTo(BidderError.Type.bad_server_response); + }); + } + private static BidRequest givenBidRequest( UnaryOperator bidRequestCustomizer, UnaryOperator impCustomizer) { diff --git a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-request.json b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-request.json index 66e7a6fc347..c2bfe3995ae 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-request.json @@ -11,7 +11,8 @@ "silvermob": { "zoneid": "testZoneId", "host": "eu" - } + }, + "mtype": 1 }, "tagid": "tag_id" } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-response.json b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-response.json index 4a7bc8e5210..b5bbb53f45a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-response.json @@ -15,8 +15,10 @@ "prebid": { "type": "banner" }, - "origbidcpm": 0.01 - } + "origbidcpm": 0.01, + "origbidcur": "USD" + }, + "mtype": 1 } ], "seat": "silvermob", diff --git a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-silvermob-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-silvermob-bid-request.json index c8b3fe89460..9a3a7a6139b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-silvermob-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-silvermob-bid-request.json @@ -14,7 +14,8 @@ "bidder": { "zoneid": "testZoneId", "host": "eu" - } + }, + "mtype": 1 } } ], diff --git a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-silvermob-bid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-silvermob-bid-response.json index 96ad624d30d..b6a2ea346e7 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-silvermob-bid-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-silvermob-bid-response.json @@ -9,10 +9,12 @@ "price": 0.01, "id": "bid_id", "impid": "imp_id", - "cid": "cid" + "cid": "cid", + "mtype": 1 } ], - "type": "banner" + "seat": "silvermob" } - ] + ], + "cur": "USD" }