diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 1e35cd36411..1dc2e56cf03 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -27,6 +27,7 @@ import org.apache.commons.lang3.StringUtils; import org.prebid.server.auction.model.BidderRequest; import org.prebid.server.auction.model.BidderResponse; +import org.prebid.server.auction.model.RequestContext; import org.prebid.server.auction.model.Tuple2; import org.prebid.server.bidder.Bidder; import org.prebid.server.bidder.BidderCatalog; @@ -150,8 +151,13 @@ public ExchangeService(BidderCatalog bidderCatalog, HttpBidderRequester httpBidd * Runs an auction: delegates request to applicable bidders, gathers responses from them and constructs final * response containing returned bids and additional information in extensions. */ - public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCookie, Timeout timeout, - MetricsContext metricsContext, RoutingContext context) { + public Future holdAuction(RequestContext context) { + final RoutingContext routingContext = context.getRoutingContext(); + final UidsCookie uidsCookie = context.getUidsCookie(); + final BidRequest bidRequest = context.getBidRequest(); + final Timeout timeout = context.getTimeout(); + final MetricsContext metricsContext = context.getMetricsContext(); + final ExtBidRequest requestExt; try { requestExt = requestExt(bidRequest); @@ -188,7 +194,7 @@ public Future holdAuction(BidRequest bidRequest, UidsCookie uidsCoo toBidResponse(result.getLeft(), bidRequest, keywordsCreator, keywordsCreatorByBidType, cacheInfo, publisherId, timeout, result.getRight(), debugEnabled)) .compose(bidResponse -> - bidResponsePostProcessor.postProcess(context, uidsCookie, bidRequest, bidResponse)); + bidResponsePostProcessor.postProcess(routingContext, uidsCookie, bidRequest, bidResponse)); } /** diff --git a/src/main/java/org/prebid/server/auction/model/RequestContext.java b/src/main/java/org/prebid/server/auction/model/RequestContext.java new file mode 100644 index 00000000000..1304fcecbf8 --- /dev/null +++ b/src/main/java/org/prebid/server/auction/model/RequestContext.java @@ -0,0 +1,27 @@ +package org.prebid.server.auction.model; + +import com.iab.openrtb.request.BidRequest; +import io.vertx.ext.web.RoutingContext; +import lombok.Builder; +import lombok.Value; +import org.prebid.server.cookie.UidsCookie; +import org.prebid.server.execution.Timeout; +import org.prebid.server.metric.model.MetricsContext; +import org.prebid.server.settings.model.Account; + +@Builder +@Value +public class RequestContext { + + RoutingContext routingContext; + + UidsCookie uidsCookie; + + BidRequest bidRequest; + + Timeout timeout; + + MetricsContext metricsContext; + + Account account; +} diff --git a/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java b/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java index 7f83582dc57..c075e0e5480 100644 --- a/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java +++ b/src/main/java/org/prebid/server/handler/openrtb2/AmpHandler.java @@ -27,6 +27,7 @@ import org.prebid.server.auction.AmpResponsePostProcessor; import org.prebid.server.auction.ExchangeService; import org.prebid.server.auction.TimeoutResolver; +import org.prebid.server.auction.model.RequestContext; import org.prebid.server.auction.model.Tuple2; import org.prebid.server.auction.model.Tuple3; import org.prebid.server.bidder.BidderCatalog; @@ -103,37 +104,46 @@ public AmpHandler(AmpRequestFactory ampRequestFactory, ExchangeService exchangeS } @Override - public void handle(RoutingContext context) { + public void handle(RoutingContext routingContext) { // Prebid Server interprets request.tmax to be the maximum amount of time that a caller is willing to wait // for bids. However, tmax may be defined in the Stored Request data. // If so, then the trip to the backend might use a significant amount of this time. We can respect timeouts // more accurately if we note the real start time, and use it to compute the auction timeout. final long startTime = clock.millis(); - final boolean isSafari = HttpUtil.isSafari(context.request().headers().get(HttpUtil.USER_AGENT_HEADER)); + final boolean isSafari = HttpUtil.isSafari(routingContext.request().headers().get(HttpUtil.USER_AGENT_HEADER)); metrics.updateSafariRequestsMetric(isSafari); - final UidsCookie uidsCookie = uidsCookieService.parseFromRequest(context); + final UidsCookie uidsCookie = uidsCookieService.parseFromRequest(routingContext); final AmpEvent.AmpEventBuilder ampEventBuilder = AmpEvent.builder() - .httpContext(HttpContext.from(context)); + .httpContext(HttpContext.from(routingContext)); - ampRequestFactory.fromRequest(context) + ampRequestFactory.fromRequest(routingContext) .map(bidRequest -> addToEvent(bidRequest, ampEventBuilder::bidRequest, bidRequest)) .map(bidRequest -> updateAppAndNoCookieAndImpsRequestedMetrics(bidRequest, uidsCookie, isSafari)) - .compose(bidRequest -> - exchangeService.holdAuction(bidRequest, uidsCookie, timeout(bidRequest, startTime), - METRICS_CONTEXT, context) - .map(bidResponse -> Tuple2.of(bidRequest, bidResponse))) - .map((Tuple2 result) -> - addToEvent(result.getRight(), ampEventBuilder::bidResponse, result)) - .map((Tuple2 result) -> Tuple3.of(result.getLeft(), result.getRight(), - toAmpResponse(result.getLeft(), result.getRight()))) - .compose((Tuple3 result) -> - ampResponsePostProcessor.postProcess(result.getLeft(), result.getMiddle(), result.getRight(), - context)) + + .map(bidRequest -> RequestContext.builder() + .routingContext(routingContext) + .uidsCookie(uidsCookie) + .bidRequest(bidRequest) + .timeout(timeout(bidRequest, startTime)) + .metricsContext(METRICS_CONTEXT) + .build()) + + .compose(context -> + exchangeService.holdAuction(context) + .map(bidResponse -> Tuple2.of(bidResponse, context))) + + .map(result -> addToEvent(result.getLeft(), ampEventBuilder::bidResponse, result)) + .map(result -> Tuple3.of(result.getLeft(), result.getRight(), + toAmpResponse(result.getRight().getBidRequest(), result.getLeft()))) + .compose(result -> + ampResponsePostProcessor.postProcess(result.getMiddle().getBidRequest(), result.getLeft(), + result.getRight(), routingContext)) + .map(ampResponse -> addToEvent(ampResponse.getTargeting(), ampEventBuilder::targeting, ampResponse)) - .setHandler(responseResult -> handleResult(responseResult, ampEventBuilder, context, startTime)); + .setHandler(responseResult -> handleResult(responseResult, ampEventBuilder, routingContext, startTime)); } private static R addToEvent(T field, Consumer consumer, R result) { diff --git a/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java b/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java index 883cf6a87b6..f42d2f48ad6 100644 --- a/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java +++ b/src/main/java/org/prebid/server/handler/openrtb2/AuctionHandler.java @@ -16,6 +16,7 @@ import org.prebid.server.auction.AuctionRequestFactory; import org.prebid.server.auction.ExchangeService; import org.prebid.server.auction.TimeoutResolver; +import org.prebid.server.auction.model.RequestContext; import org.prebid.server.auction.model.Tuple2; import org.prebid.server.cookie.UidsCookie; import org.prebid.server.cookie.UidsCookieService; @@ -61,32 +62,38 @@ public AuctionHandler(ExchangeService exchangeService, AuctionRequestFactory auc } @Override - public void handle(RoutingContext context) { + public void handle(RoutingContext routingContext) { // Prebid Server interprets request.tmax to be the maximum amount of time that a caller is willing to wait // for bids. However, tmax may be defined in the Stored Request data. // If so, then the trip to the backend might use a significant amount of this time. We can respect timeouts // more accurately if we note the real start time, and use it to compute the auction timeout. final long startTime = clock.millis(); - final boolean isSafari = HttpUtil.isSafari(context.request().headers().get(HttpUtil.USER_AGENT_HEADER)); + final boolean isSafari = HttpUtil.isSafari(routingContext.request().headers().get(HttpUtil.USER_AGENT_HEADER)); metrics.updateSafariRequestsMetric(isSafari); - final UidsCookie uidsCookie = uidsCookieService.parseFromRequest(context); + final UidsCookie uidsCookie = uidsCookieService.parseFromRequest(routingContext); final AuctionEvent.AuctionEventBuilder auctionEventBuilder = AuctionEvent.builder() - .httpContext(HttpContext.from(context)); + .httpContext(HttpContext.from(routingContext)); - auctionRequestFactory.fromRequest(context) + auctionRequestFactory.fromRequest(routingContext) .map(bidRequest -> addToEvent(bidRequest, auctionEventBuilder::bidRequest, bidRequest)) .map(bidRequest -> updateAppAndNoCookieAndImpsRequestedMetrics(bidRequest, uidsCookie, isSafari)) - .map(bidRequest -> Tuple2.of(bidRequest, toMetricsContext(bidRequest))) - .compose((Tuple2 result) -> - exchangeService.holdAuction(result.getLeft(), uidsCookie, timeout(result.getLeft(), startTime), - result.getRight(), context) - .map(bidResponse -> Tuple2.of(bidResponse, result.getRight()))) - .map((Tuple2 result) -> - addToEvent(result.getLeft(), auctionEventBuilder::bidResponse, result)) - .setHandler(responseResult -> handleResult(responseResult, auctionEventBuilder, context, startTime)); + + .map(bidRequest -> RequestContext.builder() + .routingContext(routingContext) + .uidsCookie(uidsCookie) + .bidRequest(bidRequest) + .timeout(timeout(bidRequest, startTime)) + .metricsContext(toMetricsContext(bidRequest)) + .build()) + + .compose(context -> exchangeService.holdAuction(context) + .map(bidResponse -> Tuple2.of(bidResponse, context))) + + .map(result -> addToEvent(result.getLeft(), auctionEventBuilder::bidResponse, result)) + .setHandler(result -> handleResult(result, auctionEventBuilder, routingContext, startTime)); } private static R addToEvent(T field, Consumer consumer, R result) { @@ -110,13 +117,13 @@ private Timeout timeout(BidRequest bidRequest, long startTime) { return timeoutFactory.create(startTime, timeout); } - private void handleResult(AsyncResult> responseResult, + private void handleResult(AsyncResult> responseResult, AuctionEvent.AuctionEventBuilder auctionEventBuilder, RoutingContext context, long startTime) { final boolean responseSucceeded = responseResult.succeeded(); final MetricName requestType = responseSucceeded - ? responseResult.result().getRight().getRequestType() + ? responseResult.result().getRight().getMetricsContext().getRequestType() : MetricName.openrtb2web; // don't send the response if client has gone diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index fd3d28a8f4f..87512c18490 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -31,6 +31,7 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.prebid.server.VertxTest; +import org.prebid.server.auction.model.RequestContext; import org.prebid.server.bidder.Bidder; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.bidder.HttpBidderRequester; @@ -202,8 +203,7 @@ public void shouldTolerateImpWithoutExtension() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(null)); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then verifyZeroInteractions(bidderCatalog); @@ -219,8 +219,7 @@ public void shouldTolerateImpWithUnknownBidderInExtension() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("invalid", 0))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then verify(bidderCatalog).isValidName(eq("invalid")); @@ -242,8 +241,7 @@ public void shouldProcessRequestAndAddErrorAboutDeprecatedBidder() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap(invalidBidderName, 0))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getExt()).isEqualTo(mapper.valueToTree(ExtBidResponse.of(null, @@ -261,7 +259,7 @@ public void shouldTolerateMissingPrebidImpExtension() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final BidRequest capturedBidRequest = captureBidRequest(); @@ -283,7 +281,7 @@ public void shouldExtractRequestWithBidderSpecificExtension() { builder -> builder.id("requestId").tmax(500L)); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final BidRequest capturedBidRequest = captureBidRequest(); @@ -314,7 +312,7 @@ public void shouldExtractMultipleRequests() { givenImp(singletonMap("bidder1", 3), identity()))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequest1Captor = ArgumentCaptor.forClass(BidRequest.class); @@ -348,7 +346,7 @@ public void shouldNotChangeRequestIfEnforcedForBidderIsTrueAndGdprServiceRespond .regs(Regs.of(null, mapper.valueToTree(ExtRegs.of(1))))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -369,7 +367,7 @@ public void shouldAskGdprServiceWithNullGdprIfAbsentInRequest() { .regs(Regs.of(null, null))); // no ext // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor captor = ArgumentCaptor.forClass(String.class); @@ -409,7 +407,7 @@ public void shouldNotChangeRequestIfEnforcedForBidderIsFalseAndGdprEqualsToOne() .regs(Regs.of(null, mapper.valueToTree(ExtRegs.of(1))))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -445,7 +443,7 @@ public void shouldSupportBidderAliasConversionInGdprLookup() { .aliases(singletonMap("bidderAlias", "someBidder")).build())))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -487,7 +485,7 @@ public void shouldMaskUserAndDevicePropertiesIfGdprIsEnforcedForBidderAndGdprSer .build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -537,7 +535,7 @@ public void shouldApplyGdprMaskingRulesForBiddersWithDifferentPbsEnforcesGdprAnd .regs(Regs.of(null, mapper.valueToTree(ExtRegs.of(1))))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -565,7 +563,7 @@ public void shouldPassGdprConsentIfMaskingApplied() { .regs(Regs.of(null, mapper.valueToTree(ExtRegs.of(1))))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -593,7 +591,7 @@ public void shouldPassGdprConsentIfMaskingIsNotApplied() { .regs(Regs.of(null, mapper.valueToTree(ExtRegs.of(1))))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -618,7 +616,7 @@ public void shouldApplyGdprMaskingIfDeviceLmtIsEnabled() { .user(User.builder().buyeruid("to_be_masked").build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -643,7 +641,7 @@ public void shouldNotApplyGdprMaskingIfDeviceLmtIsZero() { .user(User.builder().buyeruid("should_not_be_masked").build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -690,7 +688,7 @@ public void shouldApplyMaskingForUserAndDeviceIfCoppaPassedInRequest() { .regs(Regs.of(1, mapper.valueToTree(ExtRegs.of(0))))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -722,7 +720,7 @@ public void shouldReturnFailedFutureWithPrebidExceptionAsCauseIfGdprServiceFails .regs(Regs.of(null, mapper.valueToTree(ExtRegs.of(1))))); // when - final Future result = exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + final Future result = exchangeService.holdAuction(givenRequestContext(bidRequest)); // then assertThat(result.failed()).isTrue(); @@ -740,7 +738,7 @@ public void shouldThrowPrebidExceptionIfExtRegsCannotBeParsed() { .regs(Regs.of(null, mapper.createObjectNode().put("gdpr", "invalid")))); // when and then - assertThatThrownBy(() -> exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null)) + assertThatThrownBy(() -> exchangeService.holdAuction(givenRequestContext(bidRequest))) .isExactlyInstanceOf(PreBidException.class) .hasMessageStartingWith("Error decoding bidRequest.regs.ext:"); } @@ -757,7 +755,7 @@ public void shouldExtractRequestByAliasForCorrectBidder() { .aliases(singletonMap("bidderAlias", "bidder")).build())))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -779,7 +777,7 @@ public void shouldExtractMultipleRequestsForTheSameBidderIfAliasesWasUsed() { .aliases(singletonMap("bidderAlias", "bidder")).build())))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -798,8 +796,7 @@ public void shouldSpecifyNbrInResponseIfNoValidBidders() { final BidRequest bidRequest = givenBidRequest(emptyList()); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse).returns(2, BidResponse::getNbr); @@ -813,8 +810,7 @@ public void shouldTolerateBidderResultWithoutBids() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).isEmpty(); @@ -833,8 +829,7 @@ public void shouldReturnPopulatedSeatBid() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1).element(0).isEqualTo(SeatBid.builder() @@ -858,8 +853,7 @@ public void shouldTolerateMissingExtInSeatBidAndBid() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1).element(0).isEqualTo(SeatBid.builder() @@ -886,8 +880,7 @@ public void shouldReturnMultipleSeatBids() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(doubleMap("bidder1", 1, "bidder2", 2))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(2) @@ -917,8 +910,7 @@ public void shouldReturnSeparateSeatBidsForTheSameBidderIfBiddersAliasAndBidderW .aliases(singletonMap("bidderAlias", "bidder")).build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then verify(httpBidderRequester, times(2)).requestBids(any(), any(), any(), anyBoolean()); @@ -941,8 +933,7 @@ public void shouldPopulateBidResponseExtension() throws JsonProcessingException final BidRequest bidRequest = givenBidRequest(givenSingleImp(doubleMap("bidder1", 1, "bidder2", 2))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -989,8 +980,7 @@ public void shouldPopulateBidResponseDebugExtensionIfTestFlagIsTrue() throws Jso builder -> builder.test(1)); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -1053,8 +1043,7 @@ public void shouldPopulateBidResponseDebugExtensionIfExtPrebidDebugIsOn() throws mapper.valueToTree(ExtBidRequest.of(ExtRequestPrebid.builder().debug(1).build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -1098,8 +1087,7 @@ public void shouldNotPopulateBidResponseDebugExtensionIfTestFlagIsFalse() throws final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("bidder1", 1))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -1137,8 +1125,7 @@ public void shouldPopulateBidResponseDebugExtensionWithCacheRequestAndResponse() .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -1191,8 +1178,7 @@ public void shouldPopulateBidResponseDebugExtensionWithCacheRequest() throws Jso .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -1221,8 +1207,7 @@ public void shouldReturnErrorIfRequestExtCouldNotBeParsed() { builder -> builder.ext(mapper.valueToTree(singletonMap("prebid", 1)))); // when - final Future result = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + final Future result = exchangeService.holdAuction(givenRequestContext(bidRequest)); // then assertThat(result.failed()).isTrue(); @@ -1240,8 +1225,7 @@ public void shouldTolerateNullRequestExtPrebid() { builder -> builder.ext(mapper.valueToTree(singletonMap("someField", 1)))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1259,8 +1243,7 @@ public void shouldTolerateNullRequestExtPrebidTargeting() { builder -> builder.ext(mapper.valueToTree(singletonMap("prebid", singletonMap("someField", 1))))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1285,8 +1268,7 @@ public void shouldTolerateResponseBidValidationErrors() throws JsonProcessingExc .willReturn(ValidationResult.error("bid validation error")); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -1314,8 +1296,7 @@ public void shouldPopulateTargetingKeywords() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1358,8 +1339,7 @@ public void shouldPopulateTargetingKeywordsFromMediaTypePriceGranularities() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1394,8 +1374,7 @@ public void shouldPopulateCacheIdTargetingKeywords() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1432,8 +1411,7 @@ public void shouldReturnCreativeForBannerAndNotReturnForVideo() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1463,8 +1441,7 @@ public void shouldPopulateUuidTargetingKeywords() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1503,8 +1480,7 @@ public void shouldPopulateCacheHostAndCachePathTargetingKeywords() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1535,8 +1511,7 @@ public void shouldNotPopulateCacheIdTargetingKeywordsIfCacheServiceReturnEmptyRe .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1571,8 +1546,7 @@ public void shouldNotPopulateCacheIdTargetingKeywordsIfBidCpmIsZero() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1604,8 +1578,7 @@ public void shouldPopulateTargetingKeywordsForWinningBidsAndWinningBidsByBidder( .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1635,8 +1608,7 @@ public void shouldNotPopulateWinningBidTargetingIfIncludeWinnersFlagIsFalse() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1664,8 +1636,7 @@ public void shouldNotPopulateBidderKeysTargetingIfIncludeBidderKeysFlagIsFalse() .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) @@ -1690,7 +1661,7 @@ public void shouldNotModifyUserFromRequestIfNoBuyeridInCookie() { builder -> builder.user(user)); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final BidRequest capturedBidRequest = captureBidRequest(); @@ -1713,7 +1684,7 @@ public void shouldHonorBuyeridFromRequestAndClearBuyerIdsFromUserExtPrebidIfCont .build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final User capturedBidRequestUser = captureBidRequest().getUser(); @@ -1738,7 +1709,7 @@ public void shouldSetUserBuyerIdsFromUserExtPrebidAndClearPrebidBuyerIdsAfterwar .build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final User capturedBidRequestUser = captureBidRequest().getUser(); @@ -1758,7 +1729,7 @@ public void shouldCleanRequestExtPrebidDataBidders() { .build())))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ObjectNode capturedBidRequestExt = captureBidRequest().getExt(); @@ -1788,7 +1759,7 @@ public void shouldPassUserExtDataOnlyForAllowedBidder() { .build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -1818,7 +1789,7 @@ public void shouldPassSiteExtDataOnlyForAllowedBidder() { .site(Site.builder().ext(mapper.valueToTree(ExtSite.of(0, dataNode))).build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -1848,7 +1819,7 @@ public void shouldPassAppExtDataOnlyForAllowedBidder() { .app(App.builder().ext(mapper.valueToTree(ExtApp.of(null, dataNode))).build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final ArgumentCaptor bidRequestCaptor = ArgumentCaptor.forClass(BidRequest.class); @@ -1872,7 +1843,7 @@ public void shouldAddBuyeridToUserFromRequest() { builder -> builder.user(User.builder().id("userId").build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final User capturedUser = captureBidRequest().getUser(); @@ -1889,7 +1860,7 @@ public void shouldCreateUserIfMissingInRequestAndBuyeridPresentInCookie() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then final User capturedUser = captureBidRequest().getUser(); @@ -1904,7 +1875,7 @@ public void shouldPassGlobalTimeoutToConnectorUnchangedIfCachingIsNotRequested() final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then verify(httpBidderRequester).requestBids(any(), any(), same(timeout), anyBoolean()); @@ -1931,7 +1902,7 @@ public void shouldPassReducedGlobalTimeoutToConnectorAndOriginalToCacheServiceIf .build())))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ArgumentCaptor timeoutCaptor = ArgumentCaptor.forClass(Timeout.class); @@ -1958,7 +1929,7 @@ public void shouldRequestCacheServiceWithExpectedArguments() { .build())))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then verify(cacheService).cacheBidsOpenrtb( @@ -1982,7 +1953,7 @@ public void shouldCallCacheServiceEvenRoundedCpmIsZero() { .build())))); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then verify(cacheService).cacheBidsOpenrtb(argThat(bids -> bids.contains(bid1)), eq(singletonList(imp1)), @@ -2002,8 +1973,7 @@ public void shouldReturnBidsWithUpdatedPriceCurrencyConversion() { given(currencyService.convertCurrency(any(), any(), any(), any())).willReturn(BigDecimal.valueOf(5.0)); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2026,8 +1996,7 @@ public void shouldReturnSameBidPriceIfNoChangesAppliedToBidPrice() { .willAnswer(invocationOnMock -> invocationOnMock.getArgument(0)); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2049,8 +2018,7 @@ public void shouldDropBidIfPrebidExceptionWasThrownDuringCurrencyConversion() th .willThrow(new PreBidException("no currency conversion available")); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid).isEmpty(); @@ -2076,8 +2044,7 @@ public void shouldUpdateBidPriceWithCurrencyConversionAndPriceAdjustmentFactor() given(currencyService.convertCurrency(any(), any(), any(), any())).willReturn(BigDecimal.valueOf(10.0)); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2101,8 +2068,7 @@ public void shouldUpdatePriceForOneBidAndDropAnotherIfPrebidExceptionHappensForS .willThrow(new PreBidException("no currency conversion available")); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2130,8 +2096,7 @@ public void shouldRespondWithErrorWhenBidsWithUnsupportedCurrency() .willAnswer(invocationOnMock -> invocationOnMock.getArgument(0)); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).isEmpty(); @@ -2155,9 +2120,7 @@ public void shouldRespondWithErrorWhenBidsWithDifferentCurrencies() throws JsonP builder -> builder.site(Site.builder().build())); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); - + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).isEmpty(); @@ -2188,8 +2151,7 @@ public void shouldAddExtPrebidEventsFromSitePublisher() { .publisher(Publisher.builder().id("1001").build()).build())); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1).element(0).isEqualTo(SeatBid.builder() @@ -2228,8 +2190,7 @@ public void shouldAddExtPrebidEventsFromAppPublisher() { .publisher(Publisher.builder().id("1001").build()).build())); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1).element(0).isEqualTo(SeatBid.builder() @@ -2261,8 +2222,7 @@ public void shouldNotAddExtPrebidEventsWhenEventsServiceReturnsEmptyEventsServic .publisher(Publisher.builder().id("1001").build()).build())); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1).element(0).isEqualTo(SeatBid.builder() @@ -2289,7 +2249,7 @@ public void shouldIncrementCommonMetrics() { builder -> builder.site(Site.builder().publisher(Publisher.builder().id("accountId").build()).build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then verify(metrics).updateAccountRequestMetrics(eq("accountId"), eq(MetricName.openrtb2web)); @@ -2309,7 +2269,7 @@ public void shouldCallUpdateCookieMetricsWithExpectedValue() { builder -> builder.app(App.builder().build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then verify(metrics).updateAdapterRequestTypeAndNoCookieMetrics( @@ -2327,7 +2287,7 @@ public void shouldUseEmptyStringIfPublisherIdIsNull() { builder -> builder.site(Site.builder().publisher(Publisher.builder().build()).build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then verify(metrics).updateAccountRequestMetrics(eq(""), eq(MetricName.openrtb2web)); @@ -2343,7 +2303,7 @@ public void shouldIncrementNoBidRequestsMetric() { builder -> builder.app(App.builder().publisher(Publisher.builder().id("accountId").build()).build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then verify(metrics).updateAdapterRequestNobidMetrics(eq("somebidder"), eq("accountId")); @@ -2369,7 +2329,7 @@ public void shouldIncrementGotBidsAndErrorMetricsIfBidderReturnsBidAndDifferentE builder -> builder.site(Site.builder().publisher(Publisher.builder().id("accountId").build()).build())); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then verify(metrics).updateAdapterRequestGotbidsMetrics(eq("somebidder"), eq("accountId")); @@ -2386,7 +2346,7 @@ public void shouldPassResponseToPostProcessor() { final BidRequest bidRequest = givenBidRequest(emptyList()); // when - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null); + exchangeService.holdAuction(givenRequestContext(bidRequest)); // then verify(bidResponsePostProcessor).postProcess(any(), same(uidsCookie), same(bidRequest), any()); @@ -2406,8 +2366,7 @@ public void shouldReturnBidsWithAdjustedPricesWhenAdjustmentFactorPresent() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2430,8 +2389,7 @@ public void shouldReturnBidsWithoutAdjustingPricesWhenAdjustmentFactorNotPresent .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2458,8 +2416,7 @@ public void shouldReturnCacheEntityInExt() { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2489,8 +2446,7 @@ public void shouldReturnCacheError() throws JsonProcessingException { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -2510,8 +2466,7 @@ public void shouldNotContainErrorsIfBidderErrorsAreEmpty() throws JsonProcessing givenImp(singletonMap("bidder", 1), builder -> builder.id("impId")))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -2530,8 +2485,7 @@ public void shouldContainBidRequestTmax() throws JsonProcessingException { builder -> builder.tmax(5000L)); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); @@ -2557,14 +2511,22 @@ public void shouldContainCacheResponseTime() throws JsonProcessingException { .build())))); // when - final BidResponse bidResponse = - exchangeService.holdAuction(bidRequest, uidsCookie, timeout, metricsContext, null).result(); + final BidResponse bidResponse = exchangeService.holdAuction(givenRequestContext(bidRequest)).result(); // then final ExtBidResponse ext = mapper.treeToValue(bidResponse.getExt(), ExtBidResponse.class); assertThat(ext.getResponsetimemillis()).containsKeys("cache"); } + private RequestContext givenRequestContext(BidRequest bidRequest) { + return RequestContext.builder() + .uidsCookie(uidsCookie) + .bidRequest(bidRequest) + .metricsContext(metricsContext) + .timeout(timeout) + .build(); + } + private static CacheServiceResult givenCacheServiceResult(Bid bid, String cacheId, String videoCacheId) { return CacheServiceResult.of(null, null, singletonMap(bid, CacheIdInfo.of(cacheId, videoCacheId))); } diff --git a/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java b/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java index 67dab7b8740..418da1ff3ce 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java @@ -157,7 +157,7 @@ public void shouldRespondWithInternalServerErrorIfAuctionFails() { given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willThrow(new RuntimeException("Unexpected exception")); // when @@ -178,7 +178,7 @@ public void shouldRespondWithInternalServerErrorIfCannotExtractBidTargeting() { final ObjectNode ext = mapper.createObjectNode(); ext.set("prebid", new TextNode("non-ExtBidRequest")); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())).willReturn(givenBidResponse(ext)); + given(exchangeService.holdAuction(any())).willReturn(givenBidResponse(ext)); // when ampHandler.handle(routingContext); @@ -214,7 +214,7 @@ public void shouldRespondWithExpectedResponse() { final Map targeting = new HashMap<>(); targeting.put("key1", "value1"); targeting.put("hb_cache_id_bidder1", "value2"); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponse( mapper.valueToTree(ExtPrebid.of(ExtBidPrebid.of(null, targeting, null, null), null)))); @@ -237,7 +237,7 @@ public void shouldRespondWithCustomTargetingIncluded() { final Map targeting = new HashMap<>(); targeting.put("key1", "value1"); targeting.put("hb_cache_id_bidder1", "value2"); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder() .seatbid(singletonList(SeatBid.builder() .seat("bidder1") @@ -274,7 +274,7 @@ public void shouldRespondWithDebugInfoIncludedIfTestFlagIsTrue() { final BidRequest bidRequest = givenBidRequest(builder -> builder.id("reqId1").test(1)); given(ampRequestFactory.fromRequest(any())).willReturn(Future.succeededFuture(bidRequest)); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponseWithExt(mapper.valueToTree( ExtBidResponse.of(ExtResponseDebug.of(null, bidRequest), null, null, null, null)))); @@ -294,7 +294,7 @@ public void shouldRespondWithDebugInfoIncludedIfExtPrebidDebugIsOn() { .ext(mapper.valueToTree(ExtBidRequest.of(ExtRequestPrebid.builder().debug(1).build())))); given(ampRequestFactory.fromRequest(any())).willReturn(Future.succeededFuture(bidRequest)); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponseWithExt(mapper.valueToTree( ExtBidResponse.of(ExtResponseDebug.of(null, bidRequest), null, null, null, null)))); @@ -313,7 +313,7 @@ public void shouldIncrementOkAmpRequestMetrics() { given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponse(mapper.valueToTree( ExtPrebid.of(ExtBidPrebid.of(null, null, null, null), null)))); @@ -330,7 +330,7 @@ public void shouldIncrementAppRequestMetrics() { given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(builder -> builder.app(App.builder().build())))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponse(mapper.valueToTree( ExtPrebid.of(ExtBidPrebid.of(null, null, null, null), null)))); @@ -347,7 +347,7 @@ public void shouldIncrementNoCookieMetrics() { given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponse(mapper.valueToTree( ExtPrebid.of(ExtBidPrebid.of(null, null, null, null), null)))); @@ -370,7 +370,7 @@ public void shouldIncrementImpsRequestedMetrics() { .willReturn(Future.succeededFuture( givenBidRequest(builder -> builder.imp(singletonList(Imp.builder().build()))))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponse(mapper.valueToTree( ExtPrebid.of(ExtBidPrebid.of(null, null, null, null), null)))); @@ -417,7 +417,7 @@ public void shouldUpdateRequestTimeMetric() { given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // simulate calling end handler that is supposed to update request_time timer value @@ -453,7 +453,7 @@ public void shouldUpdateNetworkErrorMetric() { given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponse(mapper.valueToTree( ExtPrebid.of(ExtBidPrebid.of(null, null, null, null), null)))); @@ -476,7 +476,7 @@ public void shouldNotUpdateNetworkErrorMetricIfResponseSucceeded() { given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponse(mapper.valueToTree( ExtPrebid.of(ExtBidPrebid.of(null, null, null, null), null)))); @@ -493,7 +493,7 @@ public void shouldUpdateNetworkErrorMetricIfClientClosedConnection() { given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponse(mapper.valueToTree( ExtPrebid.of(ExtBidPrebid.of(null, null, null, null), null)))); @@ -532,7 +532,7 @@ public void shouldPassInternalServerErrorEventToAnalyticsReporterIfAuctionFails( given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(bidRequest)); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willThrow(new RuntimeException("Unexpected exception")); // when @@ -556,7 +556,7 @@ public void shouldPassSuccessfulEventToAnalyticsReporter() { given(ampRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(bidRequest)); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(givenBidResponse(mapper.valueToTree( ExtPrebid.of(ExtBidPrebid.of(null, singletonMap("hb_cache_id_bidder1", "value1"), null, null), null)))); diff --git a/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java b/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java index 7117189781e..9c1045e5bb3 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java @@ -26,6 +26,7 @@ import org.prebid.server.auction.AuctionRequestFactory; import org.prebid.server.auction.ExchangeService; import org.prebid.server.auction.TimeoutResolver; +import org.prebid.server.auction.model.RequestContext; import org.prebid.server.cookie.UidsCookie; import org.prebid.server.cookie.UidsCookieService; import org.prebid.server.exception.InvalidRequestException; @@ -129,7 +130,7 @@ public void shouldRespondWithInternalServerErrorIfAuctionFails() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willThrow(new RuntimeException("Unexpected exception")); // when @@ -160,14 +161,14 @@ public void shouldRespondWithBidResponse() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // when auctionHandler.handle(routingContext); // then - verify(exchangeService).holdAuction(any(), any(), any(), any(), any()); + verify(exchangeService).holdAuction(any()); verify(httpResponse).putHeader(HttpUtil.CONTENT_TYPE_HEADER, HttpHeaderValues.APPLICATION_JSON); verify(httpResponse).end(eq("{}")); } @@ -178,7 +179,7 @@ public void shouldUseTimeoutFromTimeoutResolver() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // when @@ -194,7 +195,7 @@ public void shouldComputeTimeoutBasedOnRequestProcessingStartTime() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); final Instant now = Instant.now(); @@ -213,7 +214,7 @@ public void shouldIncrementOkOpenrtb2WebRequestMetrics() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // when @@ -229,7 +230,7 @@ public void shouldIncrementOkOpenrtb2AppRequestMetrics() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(builder -> builder.app(App.builder().build())))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // when @@ -242,7 +243,7 @@ public void shouldIncrementOkOpenrtb2AppRequestMetrics() { @Test public void shouldIncrementAppRequestMetrics() { // given - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); given(auctionRequestFactory.fromRequest(any())) @@ -261,7 +262,7 @@ public void shouldIncrementNoCookieMetrics() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); given(uidsCookie.hasLiveUids()).willReturn(false); @@ -283,7 +284,7 @@ public void shouldIncrementImpsRequestedMetrics() { .willReturn(Future.succeededFuture( givenBidRequest(builder -> builder.imp(singletonList(Imp.builder().build()))))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // when @@ -329,7 +330,7 @@ public void shouldUpdateRequestTimeMetric() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // simulate calling end handler that is supposed to update request_time timer value @@ -365,7 +366,7 @@ public void shouldUpdateNetworkErrorMetric() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // simulate calling exception handler that is supposed to update networkerr timer value @@ -387,7 +388,7 @@ public void shouldNotUpdateNetworkErrorMetricIfResponseSucceeded() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // when @@ -403,7 +404,7 @@ public void shouldUpdateNetworkErrorMetricIfClientClosedConnection() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(givenBidRequest(identity()))); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); given(routingContext.response().closed()).willReturn(true); @@ -440,7 +441,7 @@ public void shouldPassInternalServerErrorEventToAnalyticsReporterIfAuctionFails( given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(bidRequest)); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willThrow(new RuntimeException("Unexpected exception")); // when @@ -463,7 +464,7 @@ public void shouldPassSuccessfulEventToAnalyticsReporter() { given(auctionRequestFactory.fromRequest(any())) .willReturn(Future.succeededFuture(bidRequest)); - given(exchangeService.holdAuction(any(), any(), any(), any(), any())) + given(exchangeService.holdAuction(any())) .willReturn(Future.succeededFuture(BidResponse.builder().build())); // when @@ -523,9 +524,9 @@ public void shouldTolerateDuplicateHeaderNames() { } private Timeout captureTimeout() { - final ArgumentCaptor timeoutCaptor = ArgumentCaptor.forClass(Timeout.class); - verify(exchangeService).holdAuction(any(), any(), timeoutCaptor.capture(), any(), any()); - return timeoutCaptor.getValue(); + final ArgumentCaptor timeoutCaptor = ArgumentCaptor.forClass(RequestContext.class); + verify(exchangeService).holdAuction(timeoutCaptor.capture()); + return timeoutCaptor.getValue().getTimeout(); } private AuctionEvent captureAuctionEvent() {