Skip to content

Commit 4bf3c4d

Browse files
author
ilya
committed
DATA-43462: Limiting LI ids to bidders
1 parent e32018f commit 4bf3c4d

File tree

2 files changed

+112
-6
lines changed

2 files changed

+112
-6
lines changed

extra/modules/live-intent-omni-channel-identity/src/main/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/hooks/LiveIntentOmniChannelIdentityProcessedAuctionRequestHook.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -218,14 +218,17 @@ private BidRequest updateAllowedBidders(BidRequest bidRequest, List<Eid> resolve
218218
final Stream<String> missingSources = resolvedSources.stream()
219219
.filter(src -> eidPermissions.stream().noneMatch(e -> e.getSource().equals(src)));
220220

221-
final List<ExtRequestPrebidDataEidPermissions> updatedPermissions = CollectionUtils.union(
222-
missingSources.map(src -> ExtRequestPrebidDataEidPermissions.of(src, this.targetBidders))
223-
.toList(),
221+
final Stream<ExtRequestPrebidDataEidPermissions> additionalPermissions = eidPermissions.stream()
222+
.filter(e -> !resolvedSources.contains(e.getSource()));
223+
224+
final List<ExtRequestPrebidDataEidPermissions> updatedPermissions = Stream.of(
225+
additionalPermissions,
226+
missingSources.map(src -> ExtRequestPrebidDataEidPermissions.of(src, this.targetBidders)),
224227
existingPermissions.map(p -> ExtRequestPrebidDataEidPermissions.of(
225228
p.getSource(),
226-
CollectionUtils.union(p.getBidders(), this.targetBidders)
227-
.stream().distinct().toList())).toList())
228-
.stream().toList();
229+
Stream.concat(p.getBidders().stream(), this.targetBidders.stream())
230+
.distinct().toList())))
231+
.flatMap(s -> s).toList();
229232

230233
final List<String> bidders = prebidData == null ? this.targetBidders : CollectionUtils.union(this.targetBidders,
231234
CollectionUtils.emptyIfNull(prebidData.getBidders())).stream().distinct().toList();

extra/modules/live-intent-omni-channel-identity/src/test/java/org/prebid/server/hooks/modules/liveintent/omni/channel/identity/v1/LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest.java

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
import org.prebid.server.hooks.v1.auction.AuctionRequestPayload;
2929
import org.prebid.server.json.JacksonMapper;
3030
import org.prebid.server.json.ObjectMapperProvider;
31+
import org.prebid.server.proto.openrtb.ext.request.ExtRequest;
32+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid;
33+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidData;
34+
import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions;
3135
import org.prebid.server.vertx.httpclient.HttpClient;
3236
import org.prebid.server.vertx.httpclient.model.HttpClientResponse;
3337

@@ -70,12 +74,16 @@ public class LiveIntentOmniChannelIdentityProcessedAuctionRequestHookTest {
7074

7175
private LiveIntentOmniChannelIdentityProcessedAuctionRequestHook target;
7276

77+
private List<String> configuredBidders;
78+
7379
@BeforeEach
7480
public void setUp() {
81+
configuredBidders = List.of("bidder1", "bidder2");
7582
given(properties.getRequestTimeoutMs()).willReturn(5L);
7683
given(properties.getIdentityResolutionEndpoint()).willReturn("https://test.com/idres");
7784
given(properties.getAuthToken()).willReturn("auth_token");
7885
given(properties.getTreatmentRate()).willReturn(1.0f);
86+
given(properties.getTargetBidders()).willReturn(configuredBidders);
7987

8088
target = new LiveIntentOmniChannelIdentityProcessedAuctionRequestHook(
8189
properties, userFpdActivityMask, MAPPER, httpClient, 0.01d);
@@ -365,4 +373,99 @@ public void callShouldReturnFailureWhenRequestingEidsIsFailed() {
365373
.isInstanceOf(TimeoutException.class)
366374
.hasMessage("Timeout exceeded");
367375
}
376+
377+
@Test
378+
public void biddersConfiguredRestrictionShouldBeRespected() {
379+
final Uid givenUid = Uid.builder().id("id1").atype(2).build();
380+
final Eid givenEid = Eid.builder().source("some.source.com").uids(singletonList(givenUid)).build();
381+
final User givenUser = User.builder().eids(singletonList(givenEid)).build();
382+
final BidRequest givenBidRequest = BidRequest.builder().id("request").user(givenUser).build();
383+
384+
final ExtRequestPrebidData expectedData = ExtRequestPrebidData.of(configuredBidders, List.of(
385+
ExtRequestPrebidDataEidPermissions.of("liveintent.com", configuredBidders)));
386+
387+
final Eid expectedEid = Eid.builder().source("liveintent.com").build();
388+
389+
final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid)));
390+
given(httpClient.post(any(), any(), any(), anyLong()))
391+
.willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody)));
392+
393+
given(auctionInvocationContext.auctionContext()).willReturn(auctionContext);
394+
given(auctionContext.getActivityInfrastructure()).willReturn(activityInfrastructure);
395+
given(activityInfrastructure.isAllowed(any(), any())).willReturn(true);
396+
given(userFpdActivityMask.maskUser(any(), eq(false), eq(false)))
397+
.willAnswer(invocation -> invocation.getArgument(0));
398+
given(userFpdActivityMask.maskDevice(any(), eq(false), eq(false)))
399+
.willAnswer(invocation -> invocation.getArgument(0));
400+
401+
// when
402+
final InvocationResult<AuctionRequestPayload> result =
403+
target.call(AuctionRequestPayloadImpl.of(givenBidRequest), auctionInvocationContext).result();
404+
// then
405+
assertThat(result.status()).isEqualTo(InvocationStatus.success);
406+
assertThat(result.payloadUpdate().apply(AuctionRequestPayloadImpl.of(givenBidRequest)))
407+
.extracting(AuctionRequestPayload::bidRequest)
408+
.extracting(BidRequest::getExt)
409+
.extracting(ExtRequest::getPrebid)
410+
.extracting(ExtRequestPrebid::getData)
411+
.isEqualTo(expectedData);
412+
413+
verify(httpClient).post(
414+
eq("https://test.com/idres"),
415+
argThat(headers -> headers.contains("Authorization", "Bearer auth_token", true)),
416+
eq(MAPPER.encodeToString(givenBidRequest)),
417+
eq(5L));
418+
}
419+
420+
@Test
421+
public void biddersConfiguredRestrictionShouldBeMergedWithProvided() {
422+
// given
423+
final Uid givenUid = Uid.builder().id("id1").atype(2).build();
424+
final Eid givenEid = Eid.builder().source("some.source.com").uids(singletonList(givenUid)).build();
425+
final User givenUser = User.builder().eids(singletonList(givenEid)).build();
426+
final BidRequest givenBidRequest = BidRequest.builder().id("request").user(givenUser).ext(ExtRequest.of(
427+
ExtRequestPrebid.builder().data(ExtRequestPrebidData.of(List.of("bidder3"), List.of(
428+
ExtRequestPrebidDataEidPermissions.of("some.other-source.com", List.of("bidder3")),
429+
ExtRequestPrebidDataEidPermissions.of("some.source.com", List.of("bidder3"))))
430+
).build())).build();
431+
432+
final List<String> expectedBidders = List.of("bidder3", "bidder2", "bidder1");
433+
434+
final ExtRequestPrebidData expectedData = ExtRequestPrebidData.of(expectedBidders, List.of(
435+
ExtRequestPrebidDataEidPermissions.of("some.other-source.com", List.of("bidder3")),
436+
ExtRequestPrebidDataEidPermissions.of("some.source.com", List.of("bidder3")),
437+
ExtRequestPrebidDataEidPermissions.of("liveintent.com", configuredBidders)));
438+
439+
final Eid expectedEid = Eid.builder().source("liveintent.com").build();
440+
441+
final String responseBody = MAPPER.encodeToString(IdResResponse.of(List.of(expectedEid)));
442+
given(httpClient.post(any(), any(), any(), anyLong()))
443+
.willReturn(Future.succeededFuture(HttpClientResponse.of(200, null, responseBody)));
444+
445+
given(auctionInvocationContext.auctionContext()).willReturn(auctionContext);
446+
given(auctionContext.getActivityInfrastructure()).willReturn(activityInfrastructure);
447+
given(activityInfrastructure.isAllowed(any(), any())).willReturn(true);
448+
given(userFpdActivityMask.maskUser(any(), eq(false), eq(false)))
449+
.willAnswer(invocation -> invocation.getArgument(0));
450+
given(userFpdActivityMask.maskDevice(any(), eq(false), eq(false)))
451+
.willAnswer(invocation -> invocation.getArgument(0));
452+
453+
// when
454+
final InvocationResult<AuctionRequestPayload> result =
455+
target.call(AuctionRequestPayloadImpl.of(givenBidRequest), auctionInvocationContext).result();
456+
// then
457+
assertThat(result.status()).isEqualTo(InvocationStatus.success);
458+
assertThat(result.payloadUpdate().apply(AuctionRequestPayloadImpl.of(givenBidRequest)))
459+
.extracting(AuctionRequestPayload::bidRequest)
460+
.extracting(BidRequest::getExt)
461+
.extracting(ExtRequest::getPrebid)
462+
.extracting(ExtRequestPrebid::getData)
463+
.isEqualTo(expectedData);
464+
465+
verify(httpClient).post(
466+
eq("https://test.com/idres"),
467+
argThat(headers -> headers.contains("Authorization", "Bearer auth_token", true)),
468+
eq(MAPPER.encodeToString(givenBidRequest)),
469+
eq(5L));
470+
}
368471
}

0 commit comments

Comments
 (0)