Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,19 @@ public GreenbidsInvocationResult createGreenbidsInvocationResult(
final String greenbidsId = UUID.randomUUID().toString();
final boolean isExploration = isExploration(greenbidsConfig, greenbidsId);

final BidRequest updatedBidRequest = isExploration
boolean allImpsRejected = impsBiddersFilterMap.values().stream()
.allMatch(biddersMapp -> biddersMapp.values().stream().noneMatch(isKept -> isKept));

BidRequest updatedBidRequest = (isExploration || allImpsRejected)
? bidRequest
: bidRequest.toBuilder()
.imp(updateImps(bidRequest, impsBiddersFilterMap))
.build();
final InvocationAction invocationAction = isExploration
InvocationAction invocationAction = isExploration
? InvocationAction.no_action
: InvocationAction.update;
invocationAction = allImpsRejected ? InvocationAction.reject : invocationAction;

final Map<String, Ortb2ImpExtResult> ort2ImpExtResultMap = createOrtb2ImpExtForImps(
bidRequest, impsBiddersFilterMap, greenbidsId, isExploration);
final AnalyticsResult analyticsResult = AnalyticsResult.of(
Expand All @@ -58,10 +63,16 @@ private Boolean isExploration(GreenbidsConfig greenbidsConfig, String greenbidsI

private List<Imp> updateImps(BidRequest bidRequest, Map<String, Map<String, Boolean>> impsBiddersFilterMap) {
return bidRequest.getImp().stream()
.filter(imp -> isImpKept(imp, impsBiddersFilterMap))
.map(imp -> updateImp(imp, impsBiddersFilterMap.get(imp.getId())))
.toList();
}

private boolean isImpKept(Imp imp, Map<String, Map<String, Boolean>> impsBiddersFilterMap) {
Map<String, Boolean> biddersMap = impsBiddersFilterMap.get(imp.getId());
return biddersMap != null && biddersMap.values().stream().anyMatch(isKept -> isKept);
}

private Imp updateImp(Imp imp, Map<String, Boolean> bidderFilterMap) {
return imp.toBuilder()
.ext(updateImpExt(imp.getExt(), bidderFilterMap))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenBidRequest;
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenDevice;
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenImpExt;
import static org.prebid.server.hooks.modules.greenbids.real.time.data.util.TestBidRequestProvider.givenImpExtToFilterAllBidders;

@ExtendWith(MockitoExtension.class)
public class GreenbidsInvocationServiceTest {
Expand Down Expand Up @@ -69,7 +70,6 @@ public void createGreenbidsInvocationResultShouldReturnUpdateBidRequestWhenNotEx
assertThat(keptInAuction.get("rubicon")).isTrue();
assertThat(keptInAuction.get("appnexus")).isFalse();
assertThat(keptInAuction.get("pubmatic")).isFalse();

}

@Test
Expand Down Expand Up @@ -108,6 +108,85 @@ public void createGreenbidsInvocationResultShouldReturnNoActionWhenExploration()
assertThat(keptInAuction.get("pubmatic")).isFalse();
}

@Test
public void createGreenbidsInvocationResultShouldReturnRejectWhenAllImpsFiltered() {
// given
final Banner banner = givenBanner();
final Imp imp = Imp.builder()
.id("adunitcodevalue")
.ext(givenImpExt())
.banner(banner)
.build();
final Device device = givenDevice(identity());
final BidRequest bidRequest = givenBidRequest(request -> request, List.of(imp), device);
final Map<String, Map<String, Boolean>> impsBiddersFilterMap = givenFilterMapWithAllFilteredImps();
final GreenbidsConfig greenbidsConfig = givenPartner(1.0);

// when
final GreenbidsInvocationResult result = target.createGreenbidsInvocationResult(
greenbidsConfig, bidRequest, impsBiddersFilterMap);

// then
final JsonNode updatedBidRequestExtPrebidBidders = result.getUpdatedBidRequest().getImp().getFirst().getExt()
.get("prebid").get("bidder");
final Ortb2ImpExtResult ortb2ImpExtResult = result.getAnalyticsResult().getValues().get("adunitcodevalue");
final Map<String, Boolean> keptInAuction = ortb2ImpExtResult.getGreenbids().getKeptInAuction();

assertThat(result.getInvocationAction()).isEqualTo(InvocationAction.reject);
assertThat(updatedBidRequestExtPrebidBidders.has("rubicon")).isTrue();
assertThat(updatedBidRequestExtPrebidBidders.has("appnexus")).isTrue();
assertThat(updatedBidRequestExtPrebidBidders.has("pubmatic")).isTrue();
assertThat(ortb2ImpExtResult).isNotNull();
assertThat(ortb2ImpExtResult.getGreenbids().getIsExploration()).isTrue();
assertThat(ortb2ImpExtResult.getGreenbids().getFingerprint()).isNotNull();
assertThat(keptInAuction.get("rubicon")).isFalse();
assertThat(keptInAuction.get("appnexus")).isFalse();
assertThat(keptInAuction.get("pubmatic")).isFalse();
}

@Test
public void createGreenbidsInvocationResultShouldRemoveImpFromUpdateBidRequestWhenAllBiddersFiltered() {
// given
final Banner banner = givenBanner();
final Imp imp1 = Imp.builder()
.id("adunitcodevalue1")
.ext(givenImpExt())
.banner(banner)
.build();
final Imp imp2 = Imp.builder()
.id("adunitcodevalue2")
.ext(givenImpExtToFilterAllBidders())
.banner(banner)
.build();
final Device device = givenDevice(identity());
final BidRequest bidRequest = givenBidRequest(request -> request, List.of(imp1, imp2), device);
final Map<String, Map<String, Boolean>> impsBiddersFilterMap = givenFilterMapWithAllFilteredBiddersInImp();
final GreenbidsConfig greenbidsConfig = givenPartner(0.0);

// when
final GreenbidsInvocationResult result = target.createGreenbidsInvocationResult(
greenbidsConfig, bidRequest, impsBiddersFilterMap);

// then
final JsonNode updatedBidRequestExtPrebidBidders = result.getUpdatedBidRequest().getImp().getFirst().getExt()
.get("prebid").get("bidder");
final Ortb2ImpExtResult ortb2ImpExtResult = result.getAnalyticsResult().getValues().get("adunitcodevalue1");
final Map<String, Boolean> keptInAuction = ortb2ImpExtResult.getGreenbids().getKeptInAuction();

assertThat(result.getInvocationAction()).isEqualTo(InvocationAction.update);
assertThat(result.getUpdatedBidRequest().getImp()).hasSize(1);
assertThat(updatedBidRequestExtPrebidBidders.has("rubicon")).isTrue();
assertThat(updatedBidRequestExtPrebidBidders.has("appnexus")).isFalse();
assertThat(updatedBidRequestExtPrebidBidders.has("pubmatic")).isFalse();
assertThat(ortb2ImpExtResult).isNotNull();
assertThat(ortb2ImpExtResult.getGreenbids().getIsExploration()).isFalse();
assertThat(ortb2ImpExtResult.getGreenbids().getFingerprint()).isNotNull();
assertThat(keptInAuction.get("rubicon")).isTrue();
assertThat(keptInAuction.get("appnexus")).isFalse();
assertThat(keptInAuction.get("pubmatic")).isFalse();

}

private Map<String, Map<String, Boolean>> givenImpsBiddersFilterMap() {
final Map<String, Boolean> biddersFitlerMap = new HashMap<>();
biddersFitlerMap.put("rubicon", true);
Expand All @@ -120,6 +199,34 @@ private Map<String, Map<String, Boolean>> givenImpsBiddersFilterMap() {
return impsBiddersFilterMap;
}

private Map<String, Map<String, Boolean>> givenFilterMapWithAllFilteredImps() {
final Map<String, Boolean> biddersFitlerMap = new HashMap<>();
biddersFitlerMap.put("rubicon", false);
biddersFitlerMap.put("appnexus", false);
biddersFitlerMap.put("pubmatic", false);

final Map<String, Map<String, Boolean>> impsBiddersFilterMap = new HashMap<>();
impsBiddersFilterMap.put("adunitcodevalue", biddersFitlerMap);

return impsBiddersFilterMap;
}

private Map<String, Map<String, Boolean>> givenFilterMapWithAllFilteredBiddersInImp() {
final Map<String, Boolean> biddersFitlerMapForKeptImp = new HashMap<>();
biddersFitlerMapForKeptImp.put("rubicon", true);
biddersFitlerMapForKeptImp.put("appnexus", false);
biddersFitlerMapForKeptImp.put("pubmatic", false);

final Map<String, Boolean> biddersFitlerMapForRemovedImp = new HashMap<>();
biddersFitlerMapForRemovedImp.put("appnexus", false);

final Map<String, Map<String, Boolean>> impsBiddersFilterMap = new HashMap<>();
impsBiddersFilterMap.put("adunitcodevalue1", biddersFitlerMapForKeptImp);
impsBiddersFilterMap.put("adunitcodevalue2", biddersFitlerMapForRemovedImp);

return impsBiddersFilterMap;
}

private GreenbidsConfig givenPartner(Double explorationRate) {
return GreenbidsConfig.of("test-pbuid", 0.60, explorationRate);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,23 @@ public static ObjectNode givenImpExt() {
return extNode;
}

public static ObjectNode givenImpExtToFilterAllBidders() {
final ObjectNode bidderNode = MAPPER.createObjectNode();

final ObjectNode appnexusNode = MAPPER.createObjectNode();
appnexusNode.put("placementId", 789);
bidderNode.set("appnexus", appnexusNode);

final ObjectNode prebidNode = MAPPER.createObjectNode();
prebidNode.set("bidder", bidderNode);

final ObjectNode extNode = MAPPER.createObjectNode();
extNode.set("prebid", prebidNode);
extNode.set("tid", TextNode.valueOf("af65045c-2774-44c2-a949-4f42d5c9e179"));

return extNode;
}

public static Device givenDevice(UnaryOperator<Device.DeviceBuilder> deviceCustomizer, String countryAlpha3) {
final String userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36"
+ " (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ public void callShouldFilterBiddersWhenPartnerActivatedInBidRequest()

final BidRequest expectedBidRequest = expectedUpdatedBidRequest(
request -> request, device, true);
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false);
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, true);

// when
final Future<InvocationResult<AuctionRequestPayload>> future = target
Expand Down Expand Up @@ -236,7 +236,7 @@ public void callShouldFilterBiddersAndReturnAnalyticsTagWhenExploration() throws
when(thresholdsCacheWithExpiration.getIfPresent("throttlingThresholds_test-pbuid"))
.thenReturn(givenThrottlingThresholds());

final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(true, false);
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(true, true);

// when
final Future<InvocationResult<AuctionRequestPayload>> future = target
Expand Down Expand Up @@ -292,7 +292,7 @@ public void callShouldFilterBiddersBasedOnModelWhenAnyFeatureNotAvailable() thro

final BidRequest expectedBidRequest = expectedUpdatedBidRequest(
request -> request, device, false);
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false);
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, true);

// when
final Future<InvocationResult<AuctionRequestPayload>> future = target
Expand Down Expand Up @@ -353,7 +353,7 @@ public void callShouldFilterBiddersBasedOnModelResults() throws OrtException, IO

final BidRequest expectedBidRequest = expectedUpdatedBidRequest(
request -> request, device, false);
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, false);
final AnalyticsResult expectedAnalyticsResult = expectedAnalyticsResult(false, true);

// when
final Future<InvocationResult<AuctionRequestPayload>> future = target
Expand Down Expand Up @@ -413,7 +413,7 @@ private ObjectNode givenAccountConfig(Double explorationRate) {
final ObjectNode greenbidsNode = TestBidRequestProvider.MAPPER.createObjectNode();
greenbidsNode.put("enabled", true);
greenbidsNode.put("pbuid", "test-pbuid");
greenbidsNode.put("target-tpr", 0.60);
greenbidsNode.put("target-tpr", 0.99);
greenbidsNode.put("exploration-rate", explorationRate);
return greenbidsNode;
}
Expand All @@ -440,6 +440,22 @@ private BidRequest expectedUpdatedBidRequest(
final Banner banner = givenBanner();

final ObjectNode bidderNode = TestBidRequestProvider.MAPPER.createObjectNode();

final ObjectNode rubiconNode = TestBidRequestProvider.MAPPER.createObjectNode();
rubiconNode.put("accountId", 1001);
rubiconNode.put("siteId", 267318);
rubiconNode.put("zoneId", 1861698);
bidderNode.set("rubicon", rubiconNode);

final ObjectNode appnexusNode = TestBidRequestProvider.MAPPER.createObjectNode();
appnexusNode.put("placementId", 123456);
bidderNode.set("appnexus", appnexusNode);

final ObjectNode pubmaticNode = TestBidRequestProvider.MAPPER.createObjectNode();
pubmaticNode.put("publisherId", "156209");
pubmaticNode.put("adSlot", "slot1@300x250");
bidderNode.set("pubmatic", pubmaticNode);

final ObjectNode prebidNode = TestBidRequestProvider.MAPPER.createObjectNode();
prebidNode.set("bidder", bidderNode);

Expand Down Expand Up @@ -504,7 +520,6 @@ private Result toResult(AnalyticsResult analyticsResult) {
toObjectNode(analyticsResult.getValues()),
AppliedToImpl.builder()
.impIds(Collections.singletonList("adunitcodevalue"))
.bidders(List.of("appnexus", "pubmatic", "rubicon"))
.build());
}

Expand Down
Loading