Skip to content

Commit 7411595

Browse files
AntoxaAntoxicsergseven
authored andcommitted
Bids Rejection Refactoring (prebid#3597)
1 parent d2c9e3d commit 7411595

File tree

23 files changed

+491
-272
lines changed

23 files changed

+491
-272
lines changed

extra/modules/ortb2-blocking/src/main/java/org/prebid/server/hooks/modules/ortb2/blocking/core/BidsBlocker.java

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ public ExecutionResult<BlockedBids> block() {
105105
final List<String> warnings = MergeUtils.mergeMessages(blockedBidResults);
106106

107107
if (blockedBids != null) {
108-
rejectBlockedBids(blockedBidResults);
108+
blockedBidIndexes.forEach(index ->
109+
rejectBlockedBid(blockedBidResults.get(index).getValue(), bids.get(index)));
109110
}
110111

111112
return ExecutionResult.<BlockedBids>builder()
@@ -287,26 +288,19 @@ private String debugEntryFor(int index, BlockingResult blockingResult) {
287288
blockingResult.getFailedChecks());
288289
}
289290

290-
private void rejectBlockedBids(List<Result<BlockingResult>> blockedBidResults) {
291-
blockedBidResults.stream()
292-
.map(Result::getValue)
293-
.filter(BlockingResult::isBlocked)
294-
.forEach(this::rejectBlockedBid);
295-
}
296-
297-
private void rejectBlockedBid(BlockingResult blockingResult) {
291+
private void rejectBlockedBid(BlockingResult blockingResult, BidderBid blockedBid) {
298292
if (blockingResult.getBattrCheckResult().isFailed()
299293
|| blockingResult.getBappCheckResult().isFailed()
300294
|| blockingResult.getBcatCheckResult().isFailed()) {
301295

302-
bidRejectionTracker.reject(
303-
blockingResult.getImpId(),
296+
bidRejectionTracker.rejectBid(
297+
blockedBid,
304298
BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
305299
}
306300

307301
if (blockingResult.getBadvCheckResult().isFailed()) {
308-
bidRejectionTracker.reject(
309-
blockingResult.getImpId(),
302+
bidRejectionTracker.rejectBid(
303+
blockedBid,
310304
BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
311305
}
312306
}

extra/modules/ortb2-blocking/src/test/java/org/prebid/server/hooks/modules/ortb2/blocking/core/BidsBlockerTest.java

Lines changed: 64 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,13 @@ public void shouldReturnResultWithBidWhenBidWithBlockedAdomainAndEnforceBlocksTr
197197
.build()));
198198

199199
// when
200-
final List<BidderBid> bids = singletonList(bid(bid -> bid.adomain(singletonList("domain1.com"))));
200+
final BidderBid bid = bid(bidBuilder -> bidBuilder.adomain(singletonList("domain1.com")));
201201
final BlockedAttributes blockedAttributes = attributesWithBadv(singletonList("domain1.com"));
202-
final BidsBlocker blocker = BidsBlocker.create(bids, "bidder1", ORTB_VERSION, accountConfig, blockedAttributes, bidRejectionTracker, false);
202+
final BidsBlocker blocker = BidsBlocker.create(singletonList(bid), "bidder1", ORTB_VERSION, accountConfig, blockedAttributes, bidRejectionTracker, false);
203203

204204
// when and then
205205
assertThat(blocker.block()).satisfies(result -> hasValue(result, 0));
206-
verify(bidRejectionTracker).reject("impId1", BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
206+
verify(bidRejectionTracker).rejectBid(bid, BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
207207
}
208208

209209
@Test
@@ -304,9 +304,9 @@ public void shouldReturnEmptyResultWhenBidWithBlockedAdomainAndInDealsExceptions
304304
.build()));
305305

306306
// when
307-
final List<BidderBid> bids = singletonList(bid(bid -> bid.adomain(singletonList("domain1.com"))));
307+
final BidderBid bid = bid(bidBuilder -> bidBuilder.adomain(singletonList("domain1.com")));
308308
final BlockedAttributes blockedAttributes = attributesWithBadv(singletonList("domain1.com"));
309-
final BidsBlocker blocker = BidsBlocker.create(bids, "bidder1", ORTB_VERSION, accountConfig, blockedAttributes, bidRejectionTracker, true);
309+
final BidsBlocker blocker = BidsBlocker.create(singletonList(bid), "bidder1", ORTB_VERSION, accountConfig, blockedAttributes, bidRejectionTracker, true);
310310

311311
// when and then
312312
assertThat(blocker.block()).satisfies(BidsBlockerTest::isEmpty);
@@ -324,13 +324,13 @@ public void shouldReturnResultWithBidWhenBidWithBlockedAdomainAndNotInDealsExcep
324324
.build()));
325325

326326
// when
327-
final List<BidderBid> bids = singletonList(bid(bid -> bid.adomain(singletonList("domain1.com"))));
327+
final BidderBid bid = bid(bidBuilder -> bidBuilder.adomain(singletonList("domain1.com")));
328328
final BlockedAttributes blockedAttributes = attributesWithBadv(singletonList("domain1.com"));
329-
final BidsBlocker blocker = BidsBlocker.create(bids, "bidder1", ORTB_VERSION, accountConfig, blockedAttributes, bidRejectionTracker, false);
329+
final BidsBlocker blocker = BidsBlocker.create(singletonList(bid), "bidder1", ORTB_VERSION, accountConfig, blockedAttributes, bidRejectionTracker, false);
330330

331331
// when and then
332332
assertThat(blocker.block()).satisfies(result -> hasValue(result, 0));
333-
verify(bidRejectionTracker).reject("impId1", BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
333+
verify(bidRejectionTracker).rejectBid(bid, BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
334334
}
335335

336336
@Test
@@ -344,16 +344,16 @@ public void shouldReturnResultWithBidAndDebugMessageWhenBidIsBlocked() {
344344
.build()));
345345

346346
// when
347-
final List<BidderBid> bids = singletonList(bid());
348-
final BidsBlocker blocker = BidsBlocker.create(bids, "bidder1", ORTB_VERSION, accountConfig, null, bidRejectionTracker, true);
347+
final BidderBid bid = bid();
348+
final BidsBlocker blocker = BidsBlocker.create(singletonList(bid), "bidder1", ORTB_VERSION, accountConfig, null, bidRejectionTracker, true);
349349

350350
// when and then
351351
assertThat(blocker.block()).satisfies(result -> {
352352
assertThat(result.getValue()).isEqualTo(BlockedBids.of(singleton(0)));
353353
assertThat(result.getDebugMessages()).containsOnly(
354354
"Bid 0 from bidder bidder1 has been rejected, failed checks: [bcat]");
355355
});
356-
verify(bidRejectionTracker).reject("impId1", BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
356+
verify(bidRejectionTracker).rejectBid(bid, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
357357
}
358358

359359
@Test
@@ -367,12 +367,12 @@ public void shouldReturnResultWithBidWithoutDebugMessageWhenBidIsBlockedAndDebug
367367
.build()));
368368

369369
// when
370-
final List<BidderBid> bids = singletonList(bid());
371-
final BidsBlocker blocker = BidsBlocker.create(bids, "bidder1", ORTB_VERSION, accountConfig, null, bidRejectionTracker, false);
370+
final BidderBid bid = bid();
371+
final BidsBlocker blocker = BidsBlocker.create(singletonList(bid), "bidder1", ORTB_VERSION, accountConfig, null, bidRejectionTracker, false);
372372

373373
// when and then
374374
assertThat(blocker.block()).satisfies(result -> hasValue(result, 0));
375-
verify(bidRejectionTracker).reject("impId1", BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
375+
verify(bidRejectionTracker).rejectBid(bid, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
376376
}
377377

378378
@Test
@@ -393,22 +393,23 @@ public void shouldReturnResultWithAnalyticsResults() {
393393
.build())
394394
.build()));
395395

396+
final BidderBid bid1 = bid(bid -> bid
397+
.impid("impId1")
398+
.adomain(asList("domain2.com", "domain3.com", "domain4.com"))
399+
.bundle("app2"));
400+
final BidderBid bid2 = bid(bid -> bid
401+
.impid("impId2")
402+
.cat(asList("cat2", "cat3", "cat4"))
403+
.attr(asList(2, 3, 4)));
404+
final BidderBid bid3 = bid(bid -> bid
405+
.impid("impId1")
406+
.adomain(singletonList("domain5.com"))
407+
.cat(singletonList("cat5"))
408+
.bundle("app5")
409+
.attr(singletonList(5)));
410+
396411
// when
397-
final List<BidderBid> bids = asList(
398-
bid(bid -> bid
399-
.impid("impId1")
400-
.adomain(asList("domain2.com", "domain3.com", "domain4.com"))
401-
.bundle("app2")),
402-
bid(bid -> bid
403-
.impid("impId2")
404-
.cat(asList("cat2", "cat3", "cat4"))
405-
.attr(asList(2, 3, 4))),
406-
bid(bid -> bid
407-
.impid("impId1")
408-
.adomain(singletonList("domain5.com"))
409-
.cat(singletonList("cat5"))
410-
.bundle("app5")
411-
.attr(singletonList(5))));
412+
final List<BidderBid> bids = asList(bid1, bid2, bid3);
412413
final BlockedAttributes blockedAttributes = BlockedAttributes.builder()
413414
.badv(asList("domain1.com", "domain2.com", "domain3.com"))
414415
.bcat(asList("cat1", "cat2", "cat3"))
@@ -436,9 +437,9 @@ public void shouldReturnResultWithAnalyticsResults() {
436437
AnalyticsResult.of("success-allow", null, "bidder1", "impId1"));
437438
});
438439

439-
verify(bidRejectionTracker).reject("impId1", BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
440-
verify(bidRejectionTracker).reject("impId2", BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
441-
verify(bidRejectionTracker).reject("impId1", BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
440+
verify(bidRejectionTracker).rejectBid(bid1, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
441+
verify(bidRejectionTracker).rejectBid(bid2, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
442+
verify(bidRejectionTracker).rejectBid(bid1, BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
442443
verifyNoMoreInteractions(bidRejectionTracker);
443444
}
444445

@@ -467,23 +468,30 @@ public void shouldReturnResultWithoutSomeBidsWhenAllAttributesInConfig() {
467468
.build()));
468469

469470
// when
470-
final List<BidderBid> bids = asList(
471-
bid(bid -> bid.adomain(singletonList("domain1.com"))),
472-
bid(bid -> bid.adomain(singletonList("domain2.com")).cat(singletonList("cat1"))),
473-
bid(bid -> bid.adomain(singletonList("domain2.com")).cat(singletonList("cat2"))),
474-
bid(bid -> bid.adomain(singletonList("domain2.com")).cat(singletonList("cat2")).bundle("app1")),
475-
bid(bid -> bid.adomain(singletonList("domain2.com")).cat(singletonList("cat2")).bundle("app2")),
476-
bid(bid -> bid
477-
.adomain(singletonList("domain2.com"))
478-
.cat(singletonList("cat2"))
479-
.bundle("app2")
480-
.attr(singletonList(1))),
481-
bid(bid -> bid
482-
.adomain(singletonList("domain2.com"))
483-
.cat(singletonList("cat2"))
484-
.bundle("app2")
485-
.attr(singletonList(2))),
486-
bid());
471+
final BidderBid bid1 = bid(bid -> bid.adomain(singletonList("domain1.com")));
472+
final BidderBid bid2 = bid(bid -> bid.adomain(singletonList("domain2.com")).cat(singletonList("cat1")));
473+
final BidderBid bid3 = bid(bid -> bid.adomain(singletonList("domain2.com")).cat(singletonList("cat2")));
474+
final BidderBid bid4 = bid(bid -> bid
475+
.adomain(singletonList("domain2.com"))
476+
.cat(singletonList("cat2"))
477+
.bundle("app1"));
478+
final BidderBid bid5 = bid(bid -> bid
479+
.adomain(singletonList("domain2.com"))
480+
.cat(singletonList("cat2"))
481+
.bundle("app2"));
482+
final BidderBid bid6 = bid(bid -> bid
483+
.adomain(singletonList("domain2.com"))
484+
.cat(singletonList("cat2"))
485+
.bundle("app2")
486+
.attr(singletonList(1)));
487+
final BidderBid bid7 = bid(bid -> bid
488+
.adomain(singletonList("domain2.com"))
489+
.cat(singletonList("cat2"))
490+
.bundle("app2")
491+
.attr(singletonList(2)));
492+
final BidderBid bid8 = bid();
493+
494+
final List<BidderBid> bids = asList(bid1, bid2, bid3, bid4, bid5, bid6, bid7, bid8);
487495
final BlockedAttributes blockedAttributes = BlockedAttributes.builder()
488496
.badv(asList("domain1.com", "domain2.com"))
489497
.bcat(asList("cat1", "cat2"))
@@ -503,8 +511,13 @@ public void shouldReturnResultWithoutSomeBidsWhenAllAttributesInConfig() {
503511
"Bid 7 from bidder bidder1 has been rejected, failed checks: [badv, bcat]");
504512
});
505513

506-
verify(bidRejectionTracker, times(5)).reject("impId1", BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
507-
verify(bidRejectionTracker, times(2)).reject("impId1", BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
514+
verify(bidRejectionTracker).rejectBid(bid1, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
515+
verify(bidRejectionTracker).rejectBid(bid1, BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
516+
verify(bidRejectionTracker).rejectBid(bid2, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
517+
verify(bidRejectionTracker).rejectBid(bid4, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
518+
verify(bidRejectionTracker).rejectBid(bid6, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
519+
verify(bidRejectionTracker).rejectBid(bid8, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
520+
verify(bidRejectionTracker).rejectBid(bid8, BidRejectionReason.RESPONSE_REJECTED_ADVERTISER_BLOCKED);
508521
verifyNoMoreInteractions(bidRejectionTracker);
509522
}
510523

extra/modules/pb-richmedia-filter/src/main/java/org/prebid/server/hooks/modules/pb/richmedia/filter/core/BidResponsesMraidFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public MraidFilterResult filterByPattern(String mraidScriptPattern,
5757
analyticsResults.add(analyticsResult);
5858

5959
bidRejectionTrackers.get(bidder)
60-
.reject(rejectedImps, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
60+
.rejectBids(invalidBids, BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
6161

6262
final List<BidderError> errors = new ArrayList<>(seatBid.getErrors());
6363
errors.add(BidderError.of("Invalid bid", BidderError.Type.invalid_bid, new HashSet<>(rejectedImps)));

extra/modules/pb-richmedia-filter/src/test/java/org/prebid/server/hooks/modules/pb/richmedia/filter/core/BidResponsesMraidFilterTest.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,14 @@ public void filterShouldReturnOriginalBidsWhenNoBidsHaveMraidScriptInAdm() {
5050
@Test
5151
public void filterShouldReturnFilteredBidsWhenBidsWithMraidScriptIsFilteredOut() {
5252
// given
53-
final BidderResponse responseA = givenBidderResponse("bidderA", List.of(
54-
givenBid("imp_id1", "adm1"),
55-
givenBid("imp_id2", "adm2")));
56-
final BidderResponse responseB = givenBidderResponse("bidderB", List.of(
57-
givenBid("imp_id1", "adm1"),
58-
givenBid("imp_id2", "adm2_mraid.js")));
59-
final BidderResponse responseC = givenBidderResponse("bidderC", List.of(
60-
givenBid("imp_id1", "adm1_mraid.js"),
61-
givenBid("imp_id2", "adm2_mraid.js")));
53+
final BidderBid givenBid1 = givenBid("imp_id1", "adm1");
54+
final BidderBid givenBid2 = givenBid("imp_id2", "adm2");
55+
final BidderBid givenInvalidBid1 = givenBid("imp_id1", "adm1_mraid.js");
56+
final BidderBid givenInvalidBid2 = givenBid("imp_id2", "adm2_mraid.js");
57+
58+
final BidderResponse responseA = givenBidderResponse("bidderA", List.of(givenBid1, givenBid2));
59+
final BidderResponse responseB = givenBidderResponse("bidderB", List.of(givenBid1, givenInvalidBid2));
60+
final BidderResponse responseC = givenBidderResponse("bidderC", List.of(givenInvalidBid1, givenInvalidBid2));
6261

6362
final BidRejectionTracker bidRejectionTrackerA = mock(BidRejectionTracker.class);
6463
final BidRejectionTracker bidRejectionTrackerB = mock(BidRejectionTracker.class);
@@ -77,10 +76,10 @@ public void filterShouldReturnFilteredBidsWhenBidsWithMraidScriptIsFilteredOut()
7776
// then
7877
final BidderResponse expectedResponseA = givenBidderResponse(
7978
"bidderA",
80-
List.of(givenBid("imp_id1", "adm1"), givenBid("imp_id2", "adm2")));
79+
List.of(givenBid1, givenBid2));
8180
final BidderResponse expectedResponseB = givenBidderResponse(
8281
"bidderB",
83-
List.of(givenBid("imp_id1", "adm1")),
82+
List.of(givenBid1),
8483
List.of(givenError("imp_id2")));
8584
final BidderResponse expectedResponseC = givenBidderResponse(
8685
"bidderC",
@@ -106,9 +105,9 @@ public void filterShouldReturnFilteredBidsWhenBidsWithMraidScriptIsFilteredOut()
106105

107106
verifyNoInteractions(bidRejectionTrackerA);
108107
verify(bidRejectionTrackerB)
109-
.reject(List.of("imp_id2"), BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
108+
.rejectBids(List.of(givenInvalidBid2), BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
110109
verify(bidRejectionTrackerC)
111-
.reject(List.of("imp_id1", "imp_id2"), BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
110+
.rejectBids(List.of(givenInvalidBid1, givenInvalidBid2), BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE);
112111
verifyNoMoreInteractions(bidRejectionTrackerB, bidRejectionTrackerC);
113112
}
114113

src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ private static Map<String, NonBid> getSeatsWithNonBids(AuctionContext auctionCon
362362
}
363363

364364
private static SeatNonBid toSeatNonBid(String bidder, BidRejectionTracker bidRejectionTracker) {
365-
final List<NonBid> nonBids = bidRejectionTracker.getRejectionReasons().entrySet().stream()
365+
final List<NonBid> nonBids = bidRejectionTracker.getRejectedImps().entrySet().stream()
366366
.map(entry -> NonBid.of(entry.getKey(), entry.getValue()))
367367
.toList();
368368

src/main/java/org/prebid/server/auction/BidResponseCreator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1758,7 +1758,7 @@ private static BidResponse populateSeatNonBid(AuctionContext auctionContext, Bid
17581758
}
17591759

17601760
private static SeatNonBid toSeatNonBid(String bidder, BidRejectionTracker bidRejectionTracker) {
1761-
final List<NonBid> nonBid = bidRejectionTracker.getRejectionReasons().entrySet().stream()
1761+
final List<NonBid> nonBid = bidRejectionTracker.getRejectedImps().entrySet().stream()
17621762
.map(entry -> NonBid.of(entry.getKey(), entry.getValue()))
17631763
.toList();
17641764

src/main/java/org/prebid/server/auction/DsaEnforcer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public AuctionParticipation enforce(BidRequest bidRequest,
7272
}
7373
} catch (PreBidException e) {
7474
warnings.add(BidderError.invalidBid("Bid \"%s\": %s".formatted(bid.getId(), e.getMessage())));
75-
rejectionTracker.reject(bid.getImpid(), BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY);
75+
rejectionTracker.rejectBid(bidderBid, BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY);
7676
updatedBidderBids.remove(bidderBid);
7777
}
7878
}

src/main/java/org/prebid/server/auction/ExchangeService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ private AuctionParticipation createAuctionParticipation(
701701
if (blockedRequestByTcf) {
702702
context.getBidRejectionTrackers()
703703
.get(bidder)
704-
.rejectAll(BidRejectionReason.REQUEST_BLOCKED_PRIVACY);
704+
.rejectAllImps(BidRejectionReason.REQUEST_BLOCKED_PRIVACY);
705705

706706
return AuctionParticipation.builder()
707707
.bidder(bidder)
@@ -1154,7 +1154,7 @@ private static Future<BidderResponse> processReject(AuctionContext auctionContex
11541154

11551155
auctionContext.getBidRejectionTrackers()
11561156
.get(bidderName)
1157-
.rejectAll(bidRejectionReason);
1157+
.rejectAllImps(bidRejectionReason);
11581158
final BidderSeatBid bidderSeatBid = BidderSeatBid.builder()
11591159
.warnings(warnings)
11601160
.build();
@@ -1193,7 +1193,7 @@ private Future<BidderResponse> requestBidsOrRejectBidder(
11931193
if (hookStageResult.isShouldReject()) {
11941194
auctionContext.getBidRejectionTrackers()
11951195
.get(bidderRequest.getBidder())
1196-
.rejectAll(BidRejectionReason.REQUEST_BLOCKED_GENERAL);
1196+
.rejectAllImps(BidRejectionReason.REQUEST_BLOCKED_GENERAL);
11971197

11981198
return Future.succeededFuture(BidderResponse.of(bidderRequest.getBidder(), BidderSeatBid.empty(), 0));
11991199
}

0 commit comments

Comments
 (0)