From b1430f845f95b5c62998733c68ff8437af8f96c8 Mon Sep 17 00:00:00 2001 From: vyniciuspontes Date: Mon, 18 Dec 2023 19:44:18 -0300 Subject: [PATCH 1/2] fix: prevent ExchangeService to empty Source object when TRANSMIT_TID is false and supplyChainResolver can't resolve a schain for bidder --- .../org/prebid/server/auction/ExchangeService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 8f5e108cb8d..0d3c57427c8 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -1137,8 +1137,15 @@ private Source prepareSource(String bidder, BidRequest bidRequest, boolean trans final Source receivedSource = bidRequest.getSource(); final SupplyChain bidderSchain = supplyChainResolver.resolveForBidder(bidder, bidRequest); - if (bidderSchain == null && transmitTid) { - return receivedSource; + if (bidderSchain == null) { + + if (receivedSource == null) { + return null; + } + + return receivedSource.toBuilder() + .tid(transmitTid ? receivedSource.getTid() : null) + .build(); } return receivedSource == null From 83bf3af7d663ca452158df8e9d907dfbcd4a2b43 Mon Sep 17 00:00:00 2001 From: vyniciuspontes Date: Tue, 19 Dec 2023 11:25:32 -0300 Subject: [PATCH 2/2] fix: improve logic and add tests --- .../server/auction/ExchangeService.java | 17 +++---- .../server/auction/ExchangeServiceTest.java | 44 +++++++++++++++++++ 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 0d3c57427c8..51c488f93fd 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -1135,25 +1135,18 @@ private static Content prepareContent(Content content) { */ private Source prepareSource(String bidder, BidRequest bidRequest, boolean transmitTid) { final Source receivedSource = bidRequest.getSource(); - final SupplyChain bidderSchain = supplyChainResolver.resolveForBidder(bidder, bidRequest); - - if (bidderSchain == null) { - if (receivedSource == null) { - return null; - } + final SupplyChain bidderSchain = supplyChainResolver.resolveForBidder(bidder, bidRequest); - return receivedSource.toBuilder() - .tid(transmitTid ? receivedSource.getTid() : null) - .build(); + if (bidderSchain == null && transmitTid) { + return receivedSource; } return receivedSource == null ? Source.builder().schain(bidderSchain).build() : receivedSource.toBuilder() - .schain(bidderSchain) - .tid(transmitTid ? receivedSource.getTid() : null) - .build(); + .schain(bidderSchain != null ? bidderSchain : receivedSource.getSchain()) + .tid(transmitTid ? receivedSource.getTid() : null).build(); } /** diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index 50f1b56285d..ead94430e61 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -1039,6 +1039,50 @@ public void shouldPassTidsIfCreateTidsTrue() { .containsExactly(TextNode.valueOf("bidderTidValue")); } + @Test + public void shouldRemoveTidsIfCreateTidsFalseAndKeepReceivedSchain() { + // given + final String bidderName = "bidder"; + final Bidder bidder = mock(Bidder.class); + givenBidder(bidderName, bidder, givenEmptySeatBid()); + + final Imp imp = givenImp(Map.of(bidderName, 1), identity()); + imp.getExt().put("tid", "bidderTidValue"); + final BidRequest bidRequest = givenBidRequest( + singletonList(imp), + builder -> builder + .source(Source.builder().tid("sourceTidValue").schain(SupplyChain.of(1, + List.of(SupplyChainNode.of("freestar.com", "66", null, null, + null, 1, null)), "1.0", null)) + .build()) + .ext(ExtRequest.of( + ExtRequestPrebid.builder() + .createTids(false) + .build()))); + + // when + target.holdAuction(givenRequestContext(bidRequest)); + + // then + final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidderRequest.class); + verify(httpBidderRequester) + .requestBids(same(bidder), bidRequestCaptor.capture(), any(), any(), any(), any(), anyBoolean()); + + final BidRequest capturedBidRequest = bidRequestCaptor.getValue().getBidRequest(); + assertThat(capturedBidRequest) + .extracting(BidRequest::getSource) + .extracting(Source::getTid) + .isNull(); + assertThat(capturedBidRequest) + .extracting(BidRequest::getSource) + .extracting(Source::getSchain) + .isNotNull(); + assertThat(capturedBidRequest.getImp()) + .extracting(Imp::getExt) + .extracting(ext -> ext.get("tid")) + .containsOnlyNulls(); + } + @Test public void shouldRemoveTidsIfTransmitTidActivityDisallowed() { // given