From a0234330afb27445fbd1eb308e2e7e5c50a3c8d9 Mon Sep 17 00:00:00 2001 From: Danylo Date: Mon, 2 Feb 2026 23:05:40 +0100 Subject: [PATCH 1/4] Add `HookHttpEndpoint` --- .../v1/model/BidderInvocationContextImpl.java | 3 + .../requestfactory/AmpRequestFactory.java | 3 +- .../requestfactory/AuctionRequestFactory.java | 3 +- .../requestfactory/Ortb2RequestFactory.java | 4 +- .../requestfactory/VideoRequestFactory.java | 9 +- .../hooks/execution/HookStageExecutor.java | 82 ++++--- .../hooks/execution/model/ExecutionPlan.java | 6 +- .../execution/model/HookExecutionContext.java | 5 +- .../execution/model/HookHttpEndpoint.java | 35 +++ .../execution/v1/InvocationContextImpl.java | 3 + .../server/hooks/v1/InvocationContext.java | 3 + ...cutionPlanEndpointsConfigDeserializer.java | 115 ++++++++++ .../org/prebid/server/model/Endpoint.java | 3 +- .../EnrichingApplicationSettings.java | 2 +- .../ApplicationServerConfiguration.java | 2 +- .../LiveintentAnalyticsReporterTest.java | 36 +-- .../server/auction/ExchangeServiceTest.java | 26 +-- .../auction/HooksMetricsServiceTest.java | 6 +- .../requestfactory/AmpRequestFactoryTest.java | 13 +- .../Ortb2RequestFactoryTest.java | 8 +- .../handler/openrtb2/AmpHandlerTest.java | 12 +- .../handler/openrtb2/AuctionHandlerTest.java | 12 +- .../handler/openrtb2/VideoHandlerTest.java | 4 +- .../execution/HookStageExecutorTest.java | 215 +++++++++--------- .../abtest/ABTestHookProviderTest.java | 10 +- .../EnrichingApplicationSettingsTest.java | 3 +- 26 files changed, 393 insertions(+), 230 deletions(-) create mode 100644 src/main/java/org/prebid/server/hooks/execution/model/HookHttpEndpoint.java create mode 100644 src/main/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializer.java diff --git a/extra/modules/ortb2-blocking/src/test/java/org/prebid/server/hooks/modules/ortb2/blocking/v1/model/BidderInvocationContextImpl.java b/extra/modules/ortb2-blocking/src/test/java/org/prebid/server/hooks/modules/ortb2/blocking/v1/model/BidderInvocationContextImpl.java index 5812885d88d..c64e3a4b2f6 100644 --- a/extra/modules/ortb2-blocking/src/test/java/org/prebid/server/hooks/modules/ortb2/blocking/v1/model/BidderInvocationContextImpl.java +++ b/extra/modules/ortb2-blocking/src/test/java/org/prebid/server/hooks/modules/ortb2/blocking/v1/model/BidderInvocationContextImpl.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.BidRequest; +import io.vertx.core.http.HttpMethod; import lombok.Builder; import lombok.Value; import lombok.experimental.Accessors; @@ -21,6 +22,8 @@ public class BidderInvocationContextImpl implements BidderInvocationContext { Timeout timeout; + HttpMethod httpMethod; + Endpoint endpoint; AuctionContext auctionContext; diff --git a/src/main/java/org/prebid/server/auction/requestfactory/AmpRequestFactory.java b/src/main/java/org/prebid/server/auction/requestfactory/AmpRequestFactory.java index e1c5e4240ce..e2afd049a28 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/AmpRequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/AmpRequestFactory.java @@ -31,6 +31,7 @@ import org.prebid.server.auction.privacy.contextfactory.AmpPrivacyContextFactory; import org.prebid.server.auction.versionconverter.BidRequestOrtbVersionConversionManager; import org.prebid.server.exception.InvalidRequestException; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.json.JacksonMapper; import org.prebid.server.metric.MetricName; import org.prebid.server.model.CaseInsensitiveMultiMap; @@ -139,7 +140,7 @@ public Future fromRequest(RoutingContext routingContext, long st final String body = routingContext.body().asString(); final AuctionContext initialAuctionContext = ortb2RequestFactory.createAuctionContext( - Endpoint.openrtb2_amp, MetricName.amp); + HookHttpEndpoint.AMP, MetricName.amp); return ortb2RequestFactory.executeEntrypointHooks(routingContext, body, initialAuctionContext) .compose(httpRequest -> parseBidRequest(initialAuctionContext, httpRequest) diff --git a/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java b/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java index d873af3e696..7e6810e173c 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java @@ -21,6 +21,7 @@ import org.prebid.server.bidadjustments.BidAdjustmentsEnricher; import org.prebid.server.cookie.CookieDeprecationService; import org.prebid.server.exception.InvalidRequestException; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.json.JacksonMapper; import org.prebid.server.metric.MetricName; import org.prebid.server.model.Endpoint; @@ -104,7 +105,7 @@ public Future parseRequest(RoutingContext routingContext, long s } final AuctionContext initialAuctionContext = ortb2RequestFactory.createAuctionContext( - Endpoint.openrtb2_auction, MetricName.openrtb2web); + HookHttpEndpoint.POST_AUCTION, MetricName.openrtb2web); return ortb2RequestFactory.executeEntrypointHooks(routingContext, body, initialAuctionContext) .compose(httpRequest -> parseBidRequest(httpRequest, initialAuctionContext.getPrebidErrors()) diff --git a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java index 1604783c3b8..ec0aff7a68e 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java @@ -42,6 +42,7 @@ import org.prebid.server.geolocation.model.GeoInfo; import org.prebid.server.hooks.execution.HookStageExecutor; import org.prebid.server.hooks.execution.model.HookExecutionContext; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookStageExecutionResult; import org.prebid.server.hooks.v1.auction.AuctionRequestPayload; import org.prebid.server.hooks.v1.entrypoint.EntrypointPayload; @@ -51,7 +52,6 @@ import org.prebid.server.metric.MetricName; import org.prebid.server.metric.Metrics; import org.prebid.server.model.CaseInsensitiveMultiMap; -import org.prebid.server.model.Endpoint; import org.prebid.server.model.HttpRequestContext; import org.prebid.server.model.UpdateResult; import org.prebid.server.privacy.model.PrivacyContext; @@ -147,7 +147,7 @@ public Ortb2RequestFactory(int timeoutAdjustmentFactor, this.metrics = Objects.requireNonNull(metrics); } - public AuctionContext createAuctionContext(Endpoint endpoint, MetricName requestTypeMetric) { + public AuctionContext createAuctionContext(HookHttpEndpoint endpoint, MetricName requestTypeMetric) { return AuctionContext.builder() .requestTypeMetric(requestTypeMetric) .prebidErrors(new ArrayList<>()) diff --git a/src/main/java/org/prebid/server/auction/requestfactory/VideoRequestFactory.java b/src/main/java/org/prebid/server/auction/requestfactory/VideoRequestFactory.java index 811db804fb9..9c663bd55d7 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/VideoRequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/VideoRequestFactory.java @@ -25,6 +25,7 @@ import org.prebid.server.auction.privacy.contextfactory.AuctionPrivacyContextFactory; import org.prebid.server.auction.versionconverter.BidRequestOrtbVersionConversionManager; import org.prebid.server.exception.InvalidRequestException; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.json.DecodeException; import org.prebid.server.json.JacksonMapper; import org.prebid.server.metric.MetricName; @@ -105,7 +106,7 @@ public Future> fromRequest(RoutingContext routingC final List podErrors = new ArrayList<>(); final AuctionContext initialAuctionContext = ortb2RequestFactory.createAuctionContext( - Endpoint.openrtb2_video, MetricName.video); + HookHttpEndpoint.VIDEO, MetricName.video); return ortb2RequestFactory.executeEntrypointHooks(routingContext, body, initialAuctionContext) .compose(httpRequest -> createBidRequest(httpRequest) @@ -120,9 +121,9 @@ public Future> fromRequest(RoutingContext routingC .map(auctionContext -> auctionContext.with(debugResolver.debugContextFrom(auctionContext))) .compose(auctionContext -> ortb2RequestFactory.limitImpressions( - auctionContext.getAccount(), - auctionContext.getBidRequest(), - auctionContext.getDebugWarnings()) + auctionContext.getAccount(), + auctionContext.getBidRequest(), + auctionContext.getDebugWarnings()) .map(auctionContext::with)) .compose(auctionContext -> ortb2RequestFactory.validateRequest( diff --git a/src/main/java/org/prebid/server/hooks/execution/HookStageExecutor.java b/src/main/java/org/prebid/server/hooks/execution/HookStageExecutor.java index 4f8a1f3f209..1761e402351 100644 --- a/src/main/java/org/prebid/server/hooks/execution/HookStageExecutor.java +++ b/src/main/java/org/prebid/server/hooks/execution/HookStageExecutor.java @@ -26,6 +26,7 @@ import org.prebid.server.hooks.execution.model.ExecutionGroup; import org.prebid.server.hooks.execution.model.ExecutionPlan; import org.prebid.server.hooks.execution.model.HookExecutionContext; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookId; import org.prebid.server.hooks.execution.model.HookStageExecutionResult; import org.prebid.server.hooks.execution.model.Stage; @@ -57,7 +58,6 @@ import org.prebid.server.json.DecodeException; import org.prebid.server.json.JacksonMapper; import org.prebid.server.model.CaseInsensitiveMultiMap; -import org.prebid.server.model.Endpoint; import org.prebid.server.settings.model.Account; import org.prebid.server.settings.model.AccountHooksConfiguration; import org.prebid.server.settings.model.HooksAdminConfig; @@ -193,7 +193,7 @@ public Future> executeEntrypointStag AuctionContext auctionContext) { final HookExecutionContext context = auctionContext.getHookExecutionContext(); - final Endpoint endpoint = context.getEndpoint(); + final HookHttpEndpoint endpoint = context.getEndpoint(); return stageExecutor(StageWithHookType.ENTRYPOINT, ENTITY_HTTP_REQUEST, context) .withExecutionPlan(planForEntrypointStage(endpoint)) @@ -212,12 +212,9 @@ public Future> executeRawAuction final BidRequest bidRequest = auctionContext.getBidRequest(); final Account account = auctionContext.getAccount(); final HookExecutionContext context = auctionContext.getHookExecutionContext(); + final HookHttpEndpoint endpoint = context.getEndpoint(); - final Endpoint endpoint = context.getEndpoint(); - - return this - .stageExecutor( - StageWithHookType.RAW_AUCTION_REQUEST, ENTITY_AUCTION_REQUEST, context, account, endpoint) + return stageExecutor(StageWithHookType.RAW_AUCTION_REQUEST, ENTITY_AUCTION_REQUEST, context, account, endpoint) .withInitialPayload(AuctionRequestPayloadImpl.of(bidRequest)) .withInvocationContextProvider(auctionInvocationContextProvider(endpoint, auctionContext)) .withRejectAllowed(true) @@ -231,12 +228,10 @@ public Future> executeProcessedA final BidRequest bidRequest = auctionContext.getBidRequest(); final Account account = auctionContext.getAccount(); final HookExecutionContext context = auctionContext.getHookExecutionContext(); + final HookHttpEndpoint endpoint = context.getEndpoint(); - final Endpoint endpoint = context.getEndpoint(); - - return this - .stageExecutor( - StageWithHookType.PROCESSED_AUCTION_REQUEST, ENTITY_AUCTION_REQUEST, context, account, endpoint) + return stageExecutor( + StageWithHookType.PROCESSED_AUCTION_REQUEST, ENTITY_AUCTION_REQUEST, context, account, endpoint) .withInitialPayload(AuctionRequestPayloadImpl.of(bidRequest)) .withInvocationContextProvider(auctionInvocationContextProvider(endpoint, auctionContext)) .withRejectAllowed(true) @@ -245,17 +240,16 @@ public Future> executeProcessedA } public Future> executeBidderRequestStage( - BidderRequest bidderRequest, AuctionContext auctionContext) { + BidderRequest bidderRequest, + AuctionContext auctionContext) { final Account account = auctionContext.getAccount(); final HookExecutionContext context = auctionContext.getHookExecutionContext(); + final HookHttpEndpoint endpoint = context.getEndpoint(); final String bidder = bidderRequest.getBidder(); - final Endpoint endpoint = context.getEndpoint(); - - return this - .stageExecutor(StageWithHookType.BIDDER_REQUEST, bidder, context, account, endpoint) + return stageExecutor(StageWithHookType.BIDDER_REQUEST, bidder, context, account, endpoint) .withInitialPayload(BidderRequestPayloadImpl.of(bidderRequest.getBidRequest())) .withInvocationContextProvider(bidderInvocationContextProvider(endpoint, auctionContext, bidder)) .withRejectAllowed(true) @@ -269,14 +263,12 @@ public Future> executeRawBidderR final Account account = auctionContext.getAccount(); final HookExecutionContext context = auctionContext.getHookExecutionContext(); + final HookHttpEndpoint endpoint = context.getEndpoint(); final List bids = bidderResponse.getSeatBid().getBids(); final String bidder = bidderResponse.getBidder(); - final Endpoint endpoint = context.getEndpoint(); - - return this - .stageExecutor(StageWithHookType.RAW_BIDDER_RESPONSE, bidder, context, account, endpoint) + return stageExecutor(StageWithHookType.RAW_BIDDER_RESPONSE, bidder, context, account, endpoint) .withInitialPayload(BidderResponsePayloadImpl.of(bids)) .withInvocationContextProvider(bidderInvocationContextProvider(endpoint, auctionContext, bidder)) .withRejectAllowed(true) @@ -290,12 +282,11 @@ public Future> executeProcessedB final Account account = auctionContext.getAccount(); final HookExecutionContext context = auctionContext.getHookExecutionContext(); + final HookHttpEndpoint endpoint = context.getEndpoint(); final List bids = bidderResponse.getSeatBid().getBids(); final String bidder = bidderResponse.getBidder(); - final Endpoint endpoint = context.getEndpoint(); - return stageExecutor(StageWithHookType.PROCESSED_BIDDER_RESPONSE, bidder, context, account, endpoint) .withInitialPayload(BidderResponsePayloadImpl.of(bids)) .withInvocationContextProvider(bidderInvocationContextProvider(endpoint, auctionContext, bidder)) @@ -310,12 +301,14 @@ public Future> execute final Account account = auctionContext.getAccount(); final HookExecutionContext context = auctionContext.getHookExecutionContext(); - - final Endpoint endpoint = context.getEndpoint(); + final HookHttpEndpoint endpoint = context.getEndpoint(); return stageExecutor( - StageWithHookType.ALL_PROCESSED_BID_RESPONSES, ENTITY_ALL_PROCESSED_BID_RESPONSES, - context, account, endpoint) + StageWithHookType.ALL_PROCESSED_BID_RESPONSES, + ENTITY_ALL_PROCESSED_BID_RESPONSES, + context, + account, + endpoint) .withInitialPayload(AllProcessedBidResponsesPayloadImpl.of(bidderResponses)) .withInvocationContextProvider(auctionInvocationContextProvider(endpoint, auctionContext)) .withRejectAllowed(false) @@ -329,8 +322,7 @@ public Future> executeAuctionRe final Account account = ObjectUtils.defaultIfNull(auctionContext.getAccount(), EMPTY_ACCOUNT); final HookExecutionContext context = auctionContext.getHookExecutionContext(); - - final Endpoint endpoint = context.getEndpoint(); + final HookHttpEndpoint endpoint = context.getEndpoint(); return stageExecutor(StageWithHookType.AUCTION_RESPONSE, ENTITY_AUCTION_RESPONSE, context, account, endpoint) .withInitialPayload(AuctionResponsePayloadImpl.of(bidResponse)) @@ -345,8 +337,7 @@ public Future> executeExitpointStage( final Account account = ObjectUtils.defaultIfNull(auctionContext.getAccount(), EMPTY_ACCOUNT); final HookExecutionContext context = auctionContext.getHookExecutionContext(); - - final Endpoint endpoint = context.getEndpoint(); + final HookHttpEndpoint endpoint = context.getEndpoint(); return stageExecutor(StageWithHookType.EXITPOINT, ENTITY_HTTP_RESPONSE, context, account, endpoint) .withInitialPayload(ExitpointPayloadImpl.of(responseHeaders, responseBody)) @@ -371,7 +362,7 @@ private StageExecutor modulesExecutionForAccount(Account account) { return DefaultedMap.defaultedMap(resultModulesExecution, !isConfigToInvokeRequired); } - private StageExecutionPlan planForEntrypointStage(Endpoint endpoint) { + private StageExecutionPlan planForEntrypointStage(HookHttpEndpoint endpoint) { return effectiveStagePlanFrom(ExecutionPlan.empty(), endpoint, Stage.entrypoint); } - private StageExecutionPlan planForStage(Account account, Endpoint endpoint, Stage stage) { + private StageExecutionPlan planForStage(Account account, HookHttpEndpoint endpoint, Stage stage) { return effectiveStagePlanFrom(effectiveExecutionPlanFor(account), endpoint, stage); } - private StageExecutionPlan effectiveStagePlanFrom( - ExecutionPlan accountExecutionPlan, Endpoint endpoint, Stage stage) { + private StageExecutionPlan effectiveStagePlanFrom(ExecutionPlan accountExecutionPlan, + HookHttpEndpoint endpoint, + Stage stage) { final StageExecutionPlan hostStageExecutionPlan = stagePlanFrom(hostExecutionPlan, endpoint, stage); final StageExecutionPlan accountStageExecutionPlan = stagePlanFrom(accountExecutionPlan, endpoint, stage); @@ -428,7 +420,10 @@ private StageExecutionPlan effectiveStagePlanFrom( return StageExecutionPlan.of(combinedGroups); } - private static StageExecutionPlan stagePlanFrom(ExecutionPlan executionPlan, Endpoint endpoint, Stage stage) { + private static StageExecutionPlan stagePlanFrom(ExecutionPlan executionPlan, + HookHttpEndpoint endpoint, + Stage stage) { + return MapUtils.emptyIfNull(executionPlan.getEndpoints()) .getOrDefault(endpoint, EndpointExecutionPlan.empty()) .getStages() @@ -471,23 +466,23 @@ private HookProvider hookCatalog.hookById(hookId, stage); } - private InvocationContextProvider invocationContextProvider(Endpoint endpoint) { + private InvocationContextProvider invocationContextProvider(HookHttpEndpoint endpoint) { return (timeout, hookId, moduleContext) -> invocationContext(endpoint, timeout); } - private InvocationContextImpl invocationContext(Endpoint endpoint, Long timeout) { - return InvocationContextImpl.of(createTimeout(timeout), endpoint); + private InvocationContextImpl invocationContext(HookHttpEndpoint endpoint, Long timeout) { + return InvocationContextImpl.of(createTimeout(timeout), endpoint.httpMethod(), endpoint.endpoint()); } private InvocationContextProvider auctionInvocationContextProvider( - Endpoint endpoint, + HookHttpEndpoint endpoint, AuctionContext auctionContext) { return (timeout, hookId, moduleContext) -> auctionInvocationContext( endpoint, timeout, auctionContext, hookId, moduleContext); } - private AuctionInvocationContextImpl auctionInvocationContext(Endpoint endpoint, + private AuctionInvocationContextImpl auctionInvocationContext(HookHttpEndpoint endpoint, Long timeout, AuctionContext auctionContext, HookId hookId, @@ -502,7 +497,7 @@ private AuctionInvocationContextImpl auctionInvocationContext(Endpoint endpoint, } private InvocationContextProvider bidderInvocationContextProvider( - Endpoint endpoint, + HookHttpEndpoint endpoint, AuctionContext auctionContext, String bidder) { @@ -561,7 +556,6 @@ private static boolean isABTestApplicable(ABTest abTest, String account) { } //todo: should it be more strict? e.g. allowing rejecting only imps/bids on the particular stages - private HookStageExecutionResult rejectAll(AuctionContext auctionContext, HookStageExecutionResult result) { diff --git a/src/main/java/org/prebid/server/hooks/execution/model/ExecutionPlan.java b/src/main/java/org/prebid/server/hooks/execution/model/ExecutionPlan.java index 7137cef162d..f9407738165 100644 --- a/src/main/java/org/prebid/server/hooks/execution/model/ExecutionPlan.java +++ b/src/main/java/org/prebid/server/hooks/execution/model/ExecutionPlan.java @@ -1,8 +1,9 @@ package org.prebid.server.hooks.execution.model; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import lombok.Value; -import org.prebid.server.model.Endpoint; +import org.prebid.server.json.deserializer.ExecutionPlanEndpointsConfigDeserializer; import java.util.List; import java.util.Map; @@ -15,7 +16,8 @@ public class ExecutionPlan { @JsonProperty("abtests") List abTests; - Map endpoints; + @JsonDeserialize(using = ExecutionPlanEndpointsConfigDeserializer.class) + Map endpoints; public static ExecutionPlan empty() { return EMPTY; diff --git a/src/main/java/org/prebid/server/hooks/execution/model/HookExecutionContext.java b/src/main/java/org/prebid/server/hooks/execution/model/HookExecutionContext.java index 32129252d41..27bae4d1c4e 100644 --- a/src/main/java/org/prebid/server/hooks/execution/model/HookExecutionContext.java +++ b/src/main/java/org/prebid/server/hooks/execution/model/HookExecutionContext.java @@ -1,7 +1,6 @@ package org.prebid.server.hooks.execution.model; import lombok.Value; -import org.prebid.server.model.Endpoint; import java.util.EnumMap; import java.util.HashMap; @@ -11,13 +10,13 @@ @Value(staticConstructor = "of") public class HookExecutionContext { - Endpoint endpoint; + HookHttpEndpoint endpoint; EnumMap> stageOutcomes; Map moduleContexts = new HashMap<>(); - public static HookExecutionContext of(Endpoint endpoint) { + public static HookExecutionContext of(HookHttpEndpoint endpoint) { return of(endpoint, new EnumMap<>(Stage.class)); } } diff --git a/src/main/java/org/prebid/server/hooks/execution/model/HookHttpEndpoint.java b/src/main/java/org/prebid/server/hooks/execution/model/HookHttpEndpoint.java new file mode 100644 index 00000000000..67e76a513ce --- /dev/null +++ b/src/main/java/org/prebid/server/hooks/execution/model/HookHttpEndpoint.java @@ -0,0 +1,35 @@ +package org.prebid.server.hooks.execution.model; + +import com.fasterxml.jackson.annotation.JsonValue; +import io.vertx.core.http.HttpMethod; +import org.prebid.server.model.Endpoint; + +public enum HookHttpEndpoint { + + POST_AUCTION(HttpMethod.POST, Endpoint.openrtb2_auction), + AMP(HttpMethod.GET, Endpoint.openrtb2_amp), + VIDEO(HttpMethod.POST, Endpoint.openrtb2_video); + + private final HttpMethod httpMethod; + + private final Endpoint endpoint; + + HookHttpEndpoint(HttpMethod httpMethod, Endpoint endpoint) { + this.httpMethod = httpMethod; + this.endpoint = endpoint; + } + + public HttpMethod httpMethod() { + return httpMethod; + } + + public Endpoint endpoint() { + return endpoint; + } + + @JsonValue + @Override + public String toString() { + return httpMethod.name() + " " + endpoint.value(); + } +} diff --git a/src/main/java/org/prebid/server/hooks/execution/v1/InvocationContextImpl.java b/src/main/java/org/prebid/server/hooks/execution/v1/InvocationContextImpl.java index 99399d5ba6b..84ea304caee 100644 --- a/src/main/java/org/prebid/server/hooks/execution/v1/InvocationContextImpl.java +++ b/src/main/java/org/prebid/server/hooks/execution/v1/InvocationContextImpl.java @@ -1,5 +1,6 @@ package org.prebid.server.hooks.execution.v1; +import io.vertx.core.http.HttpMethod; import lombok.Value; import lombok.experimental.Accessors; import org.prebid.server.execution.timeout.Timeout; @@ -12,5 +13,7 @@ public class InvocationContextImpl implements InvocationContext { Timeout timeout; + HttpMethod httpMethod; + Endpoint endpoint; } diff --git a/src/main/java/org/prebid/server/hooks/v1/InvocationContext.java b/src/main/java/org/prebid/server/hooks/v1/InvocationContext.java index 22493ea8a07..45eba0ce959 100644 --- a/src/main/java/org/prebid/server/hooks/v1/InvocationContext.java +++ b/src/main/java/org/prebid/server/hooks/v1/InvocationContext.java @@ -1,5 +1,6 @@ package org.prebid.server.hooks.v1; +import io.vertx.core.http.HttpMethod; import org.prebid.server.execution.timeout.Timeout; import org.prebid.server.model.Endpoint; @@ -7,5 +8,7 @@ public interface InvocationContext { Timeout timeout(); + HttpMethod httpMethod(); + Endpoint endpoint(); } diff --git a/src/main/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializer.java b/src/main/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializer.java new file mode 100644 index 00000000000..b5195a5ba8e --- /dev/null +++ b/src/main/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializer.java @@ -0,0 +1,115 @@ +package org.prebid.server.json.deserializer; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import io.vertx.core.http.HttpMethod; +import org.prebid.server.hooks.execution.model.EndpointExecutionPlan; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; +import org.prebid.server.model.Endpoint; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; + +public class ExecutionPlanEndpointsConfigDeserializer + extends StdDeserializer> { + + private static final TypeReference> TEMP_MAP_REFERENCE = + new TypeReference<>() { + }; + + protected ExecutionPlanEndpointsConfigDeserializer() { + super(Map.class); + } + + @Override + public Map deserialize(JsonParser parser, DeserializationContext context) + throws IOException { + + final Map tempMap = parser.readValueAs(TEMP_MAP_REFERENCE); + if (tempMap == null) { + return null; + } + if (tempMap.isEmpty()) { + return Collections.emptyMap(); + } + + return Collections.unmodifiableMap(convertKeys(unpack(tempMap), context)); + } + + private static Map unpack(Map map) { + final Map unpacked = new HashMap<>(map); + for (ConfigKey key : map.keySet()) { + final HttpMethod httpMethod = key.httpMethod(); + if (httpMethod != null) { + continue; + } + + final Endpoint endpoint = key.endpoint(); + final EndpointExecutionPlan value = unpacked.remove(key); + + Arrays.stream(HookHttpEndpoint.values()) + .filter(httpEndpoint -> httpEndpoint.endpoint() == endpoint) + .map(HookHttpEndpoint::httpMethod) + .forEach(newHttpMethod -> unpacked.putIfAbsent(new ConfigKey(newHttpMethod, endpoint), value)); + } + + return unpacked; + } + + private static Map convertKeys(Map map, + DeserializationContext context) + throws JsonMappingException { + + EnumMap result = new EnumMap<>(HookHttpEndpoint.class); + for (Map.Entry entry : map.entrySet()) { + result.put(convertKey(entry.getKey(), context), entry.getValue()); + } + + return result; + } + + private static HookHttpEndpoint convertKey(ConfigKey configKey, DeserializationContext context) + throws JsonMappingException { + + return Arrays.stream(HookHttpEndpoint.values()) + .filter(endpoint -> endpoint.endpoint() == configKey.endpoint() + && endpoint.httpMethod().equals(configKey.httpMethod())) + .findFirst() + .orElseThrow(() -> context.weirdStringException( + configKey.toString(), + HookHttpEndpoint.class, + "not one of the values accepted for Enum class: %s" + .formatted((Object) HookHttpEndpoint.values()))); + } + + private record ConfigKey(HttpMethod httpMethod, Endpoint endpoint) { + + @SuppressWarnings("unused") + @JsonCreator + public static ConfigKey fromString(String value) { + if (value == null) { + return null; + } + + final int delimiterIndex = value.indexOf(' '); + final HttpMethod httpMethod = delimiterIndex != -1 + ? HttpMethod.valueOf(value.substring(0, delimiterIndex)) + : null; + + return new ConfigKey(httpMethod, Endpoint.fromString(value)); + } + + @Override + public String toString() { + return httpMethod.name() + " " + endpoint.value(); + } + } +} diff --git a/src/main/java/org/prebid/server/model/Endpoint.java b/src/main/java/org/prebid/server/model/Endpoint.java index 71131b0b85b..c464fc6a577 100644 --- a/src/main/java/org/prebid/server/model/Endpoint.java +++ b/src/main/java/org/prebid/server/model/Endpoint.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import org.apache.commons.lang3.StringUtils; import java.util.Arrays; @@ -41,7 +42,7 @@ public String value() { @JsonCreator public static Endpoint fromString(String value) { return Arrays.stream(values()) - .filter(endpoint -> endpoint.value.equals(value)) + .filter(endpoint -> StringUtils.endsWith(value, endpoint.value)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("Unknown endpoint")); } diff --git a/src/main/java/org/prebid/server/settings/EnrichingApplicationSettings.java b/src/main/java/org/prebid/server/settings/EnrichingApplicationSettings.java index 5d1875c742c..6e6c74a0b8e 100644 --- a/src/main/java/org/prebid/server/settings/EnrichingApplicationSettings.java +++ b/src/main/java/org/prebid/server/settings/EnrichingApplicationSettings.java @@ -39,8 +39,8 @@ public EnrichingApplicationSettings(boolean enforceValidAccount, JacksonMapper mapper) { this.enforceValidAccount = enforceValidAccount; - this.activitiesConfigResolver = Objects.requireNonNull(activitiesConfigResolver); this.priceFloorsConfigResolver = Objects.requireNonNull(priceFloorsConfigResolver); + this.activitiesConfigResolver = Objects.requireNonNull(activitiesConfigResolver); this.delegate = Objects.requireNonNull(delegate); this.jsonMerger = Objects.requireNonNull(jsonMerger); diff --git a/src/main/java/org/prebid/server/spring/config/server/application/ApplicationServerConfiguration.java b/src/main/java/org/prebid/server/spring/config/server/application/ApplicationServerConfiguration.java index c6ae167ae94..e77edbd0ab8 100644 --- a/src/main/java/org/prebid/server/spring/config/server/application/ApplicationServerConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/server/application/ApplicationServerConfiguration.java @@ -39,9 +39,9 @@ import org.prebid.server.handler.NoCacheHandler; import org.prebid.server.handler.NotificationEventHandler; import org.prebid.server.handler.OptoutHandler; +import org.prebid.server.handler.PostVtrackHandler; import org.prebid.server.handler.SetuidHandler; import org.prebid.server.handler.StatusHandler; -import org.prebid.server.handler.PostVtrackHandler; import org.prebid.server.handler.info.BidderDetailsHandler; import org.prebid.server.handler.info.BiddersHandler; import org.prebid.server.handler.info.filters.BaseOnlyBidderInfoFilterStrategy; diff --git a/src/test/java/org/prebid/server/analytics/reporter/liveintent/LiveintentAnalyticsReporterTest.java b/src/test/java/org/prebid/server/analytics/reporter/liveintent/LiveintentAnalyticsReporterTest.java index 1d044a60821..e2f9f0aacc6 100644 --- a/src/test/java/org/prebid/server/analytics/reporter/liveintent/LiveintentAnalyticsReporterTest.java +++ b/src/test/java/org/prebid/server/analytics/reporter/liveintent/LiveintentAnalyticsReporterTest.java @@ -1,5 +1,7 @@ package org.prebid.server.analytics.reporter.liveintent; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; import com.iab.openrtb.response.Bid; @@ -7,11 +9,11 @@ import com.iab.openrtb.response.SeatBid; import io.vertx.core.Future; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.junit.jupiter.api.Test; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; import org.prebid.server.analytics.model.AuctionEvent; @@ -23,20 +25,18 @@ import org.prebid.server.hooks.execution.model.GroupExecutionOutcome; import org.prebid.server.hooks.execution.model.HookExecutionContext; import org.prebid.server.hooks.execution.model.HookExecutionOutcome; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookId; import org.prebid.server.hooks.execution.model.Stage; import org.prebid.server.hooks.execution.model.StageExecutionOutcome; import org.prebid.server.hooks.execution.v1.analytics.ActivityImpl; -import org.prebid.server.hooks.execution.v1.analytics.TagsImpl; import org.prebid.server.hooks.execution.v1.analytics.AppliedToImpl; import org.prebid.server.hooks.execution.v1.analytics.ResultImpl; +import org.prebid.server.hooks.execution.v1.analytics.TagsImpl; import org.prebid.server.json.ObjectMapperProvider; -import org.prebid.server.model.Endpoint; import org.prebid.server.util.ListUtil; import org.prebid.server.vertx.httpclient.HttpClient; import org.prebid.server.vertx.httpclient.model.HttpClientResponse; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.math.BigDecimal; import java.util.EnumMap; @@ -183,15 +183,25 @@ private AuctionEvent buildEvent(Boolean isEnriched, Boolean withTags) { final EnumMap> stageOutcomes = new EnumMap<>(Stage.class); stageOutcomes.put(Stage.processed_auction_request, List.of(stageExecutionOutcome)); - return AuctionEvent.builder().auctionContext(AuctionContext.builder() - .bidRequest(BidRequest.builder().id("request-id") - .imp(List.of(Imp.builder().id("imp-id").tagid("ad-unit-id").build())).build()) - .bidResponse(BidResponse.builder().bidid("bid-id").cur("USD") - .seatbid(List.of(SeatBid.builder() - .bid(List.of(Bid.builder().id("bid-id").impid("imp-id").price(BigDecimal.ONE).build())) - .build())) + return AuctionEvent.builder() + .auctionContext(AuctionContext.builder() + .bidRequest(BidRequest.builder() + .id("request-id") + .imp(List.of(Imp.builder().id("imp-id").tagid("ad-unit-id").build())) + .build()) + .bidResponse(BidResponse.builder() + .bidid("bid-id") + .cur("USD") + .seatbid(List.of(SeatBid.builder() + .bid(List.of(Bid.builder() + .id("bid-id") + .impid("imp-id") + .price(BigDecimal.ONE) + .build())) + .build())) + .build()) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION, stageOutcomes)) .build()) - .hookExecutionContext(HookExecutionContext.of(Endpoint.openrtb2_auction, stageOutcomes)).build()) .build(); } } diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index 8e5291b4c1c..e9806f3350c 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -85,6 +85,7 @@ import org.prebid.server.hooks.execution.model.GroupExecutionOutcome; import org.prebid.server.hooks.execution.model.HookExecutionContext; import org.prebid.server.hooks.execution.model.HookExecutionOutcome; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookId; import org.prebid.server.hooks.execution.model.HookStageExecutionResult; import org.prebid.server.hooks.execution.model.Stage; @@ -101,7 +102,6 @@ import org.prebid.server.metric.MetricName; import org.prebid.server.metric.Metrics; import org.prebid.server.model.CaseInsensitiveMultiMap; -import org.prebid.server.model.Endpoint; import org.prebid.server.model.HttpRequestContext; import org.prebid.server.model.UpdateResult; import org.prebid.server.proto.openrtb.ext.ExtPrebid; @@ -3392,7 +3392,7 @@ public void shouldReturnBidResponseModifiedByAuctionResponseHooks() { public void shouldReturnEmptyBidResponseWhenRequestIsRejected() { // given final AuctionContext auctionContext = AuctionContext.builder() - .hookExecutionContext(HookExecutionContext.of(Endpoint.openrtb2_auction)) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION)) .debugContext(DebugContext.empty()) .requestRejected(true) .build(); @@ -3419,7 +3419,7 @@ public void shouldReturnBidResponseWithHooksDebugInfoWhenAuctionHappened() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("bidder", 2))); final AuctionContext auctionContext = givenRequestContext(bidRequest).toBuilder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl(identity())))) .debugContext(DebugContext.of(true, true, null)) .build(); @@ -3487,7 +3487,7 @@ public void shouldReturnBidResponseWithHooksBasicTraceInfoWhenAuctionHappened() final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("bidder", 2))); final AuctionContext auctionContext = givenRequestContext(bidRequest).toBuilder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl(identity())))) .debugContext(DebugContext.of(false, false, TraceLevel.basic)) .build(); @@ -3581,7 +3581,7 @@ public void shouldReturnBidResponseWithHooksVerboseTraceInfoWhenAuctionHappened( final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("bidder", 2))); final AuctionContext auctionContext = givenRequestContext(bidRequest).toBuilder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl(identity())))) .debugContext(DebugContext.of(false, false, TraceLevel.verbose)) .build(); @@ -3619,7 +3619,7 @@ public void shouldReturnProperBidResponseWithAppliedToIfResultImplAppliedToIsPre final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("bidder", 2))); final AuctionContext auctionContext = givenRequestContext(bidRequest).toBuilder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl(appliedToImplBuilder -> appliedToImplBuilder .impIds(asList("impId1", "impId2")) .response(true) @@ -3666,7 +3666,7 @@ public void shouldReturnBidResponseAppliedToRequestNullIfResultImplAppliedToIsNu final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("bidder", 2))); final AuctionContext auctionContext = givenRequestContext(bidRequest).toBuilder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(null))) .debugContext(DebugContext.of(false, false, TraceLevel.verbose)) .build(); @@ -3704,7 +3704,7 @@ public void shouldReturnBidResponseWithHooksDebugAndTraceInfoWhenAuctionHappened final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("bidder", 2))); final AuctionContext auctionContext = givenRequestContext(bidRequest).toBuilder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl(identity())))) .debugContext(DebugContext.of(true, true, TraceLevel.basic)) .build(); @@ -3726,7 +3726,7 @@ public void shouldReturnBidResponseWithHooksDebugAndTraceInfoWhenRequestIsReject // given final AuctionContext auctionContext = AuctionContext.builder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl(identity())))) .debugContext(DebugContext.of(true, true, TraceLevel.basic)) .requestRejected(true) @@ -3753,7 +3753,7 @@ public void shouldReturnBidResponseWithoutHooksTraceInfoWhenNoHooksExecuted() { final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("bidder", 2))); final AuctionContext auctionContext = givenRequestContext(bidRequest).toBuilder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, new EnumMap<>(singletonMap( Stage.entrypoint, singletonList(StageExecutionOutcome.of("http-request", emptyList())))))) @@ -3790,7 +3790,7 @@ public void shouldReturnBidResponseWithAnalyticsTagsWhenRequested() { .build(); final AuctionContext auctionContext = givenRequestContext(bidRequest, account).toBuilder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl(identity())))) .build(); @@ -3829,7 +3829,7 @@ public void shouldReturnBidResponseWithWarningWhenAnalyticsTagsDisabledAndReques .build()))); final AuctionContext auctionContext = givenRequestContext(bidRequest).toBuilder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl(identity())))) .build(); @@ -4274,7 +4274,7 @@ private AuctionContext givenRequestContext(BidRequest bidRequest, Account accoun .account(account) .requestTypeMetric(MetricName.openrtb2web) .timeoutContext(TimeoutContext.of(clock.millis(), timeout, 90)) - .hookExecutionContext(HookExecutionContext.of(Endpoint.openrtb2_auction)) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION)) .debugContext(DebugContext.empty()) .bidRejectionTrackers(new HashMap<>()) .activityInfrastructure(activityInfrastructure) diff --git a/src/test/java/org/prebid/server/auction/HooksMetricsServiceTest.java b/src/test/java/org/prebid/server/auction/HooksMetricsServiceTest.java index 4d90cc637d7..314cea9a327 100644 --- a/src/test/java/org/prebid/server/auction/HooksMetricsServiceTest.java +++ b/src/test/java/org/prebid/server/auction/HooksMetricsServiceTest.java @@ -13,6 +13,7 @@ import org.prebid.server.hooks.execution.model.GroupExecutionOutcome; import org.prebid.server.hooks.execution.model.HookExecutionContext; import org.prebid.server.hooks.execution.model.HookExecutionOutcome; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookId; import org.prebid.server.hooks.execution.model.Stage; import org.prebid.server.hooks.execution.model.StageExecutionOutcome; @@ -21,7 +22,6 @@ import org.prebid.server.hooks.execution.v1.analytics.ResultImpl; import org.prebid.server.hooks.execution.v1.analytics.TagsImpl; import org.prebid.server.metric.Metrics; -import org.prebid.server.model.Endpoint; import org.prebid.server.settings.model.Account; import org.prebid.server.settings.model.AccountAuctionConfig; import org.prebid.server.settings.model.AccountEventsConfig; @@ -59,7 +59,7 @@ public void shouldIncrementHooksGlobalMetrics() { // given final AuctionContext auctionContext = AuctionContext.builder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl()))) .debugContext(DebugContext.empty()) .requestRejected(true) @@ -121,7 +121,7 @@ public void shouldIncrementHooksGlobalAndAccountMetrics() { // given final AuctionContext auctionContext = AuctionContext.builder() .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, stageOutcomes(givenAppliedToImpl()))) .debugContext(DebugContext.empty()) .requestRejected(true) diff --git a/src/test/java/org/prebid/server/auction/requestfactory/AmpRequestFactoryTest.java b/src/test/java/org/prebid/server/auction/requestfactory/AmpRequestFactoryTest.java index 32de14a2390..dae4e000c16 100644 --- a/src/test/java/org/prebid/server/auction/requestfactory/AmpRequestFactoryTest.java +++ b/src/test/java/org/prebid/server/auction/requestfactory/AmpRequestFactoryTest.java @@ -39,9 +39,9 @@ import org.prebid.server.auction.versionconverter.BidRequestOrtbVersionConversionManager; import org.prebid.server.exception.InvalidRequestException; import org.prebid.server.geolocation.model.GeoInfo; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.metric.MetricName; import org.prebid.server.model.CaseInsensitiveMultiMap; -import org.prebid.server.model.Endpoint; import org.prebid.server.model.HttpRequestContext; import org.prebid.server.privacy.ccpa.Ccpa; import org.prebid.server.privacy.gdpr.model.TcfContext; @@ -157,10 +157,11 @@ public void setUp() { given(httpRequest.headers()).willReturn(MultiMap.caseInsensitiveMultiMap()); given(httpRequest.remoteAddress()).willReturn(new SocketAddressImpl(1234, "host")); - given(ortb2RequestFactory.createAuctionContext(any(), eq(MetricName.amp))).willReturn(AuctionContext.builder() - .prebidErrors(new ArrayList<>()) - .debugWarnings(new ArrayList<>()) - .build()); + given(ortb2RequestFactory.createAuctionContext(any(), eq(MetricName.amp))) + .willReturn(AuctionContext.builder() + .prebidErrors(new ArrayList<>()) + .debugWarnings(new ArrayList<>()) + .build()); given(ortb2RequestFactory.executeEntrypointHooks(any(), any(), any())) .willAnswer(invocation -> toHttpRequest(invocation.getArgument(0), invocation.getArgument(1))); given(ortb2RequestFactory.restoreResultFromRejection(any())) @@ -1649,7 +1650,7 @@ public void shouldPassAmpEndpointAndRequestMetricType() { target.fromRequest(routingContext, 0L); // then - verify(ortb2RequestFactory).createAuctionContext(eq(Endpoint.openrtb2_amp), eq(MetricName.amp)); + verify(ortb2RequestFactory).createAuctionContext(eq(HookHttpEndpoint.AMP), eq(MetricName.amp)); } @Test diff --git a/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java b/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java index c6b62cf9186..6273b2b3117 100644 --- a/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java +++ b/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java @@ -48,13 +48,13 @@ import org.prebid.server.geolocation.model.GeoInfo; import org.prebid.server.hooks.execution.HookStageExecutor; import org.prebid.server.hooks.execution.model.HookExecutionContext; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookStageExecutionResult; import org.prebid.server.hooks.execution.v1.auction.AuctionRequestPayloadImpl; import org.prebid.server.hooks.execution.v1.entrypoint.EntrypointPayloadImpl; import org.prebid.server.metric.MetricName; import org.prebid.server.metric.Metrics; import org.prebid.server.model.CaseInsensitiveMultiMap; -import org.prebid.server.model.Endpoint; import org.prebid.server.model.HttpRequestContext; import org.prebid.server.privacy.ccpa.Ccpa; import org.prebid.server.privacy.gdpr.model.TcfContext; @@ -149,7 +149,7 @@ public void setUp() { httpRequest = HttpRequestContext.builder() .headers(CaseInsensitiveMultiMap.empty()) .build(); - hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); given(timeoutResolver.limitToMax(any())).willReturn(2000L); @@ -596,7 +596,9 @@ public void shouldFetchAccountFromProfileIfStoredLookupIsTrueAndAccountIsNotFoun @Test public void createAuctionContextShouldReturnExpectedAuctionContext() { // when - final AuctionContext result = target.createAuctionContext(Endpoint.openrtb2_auction, MetricName.openrtb2app); + final AuctionContext result = target.createAuctionContext( + HookHttpEndpoint.POST_AUCTION, + MetricName.openrtb2app); // then assertThat(result).isEqualTo(AuctionContext.builder() 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 72ea07c12da..933a9654ee6 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/AmpHandlerTest.java @@ -48,6 +48,7 @@ import org.prebid.server.hooks.execution.model.GroupExecutionOutcome; import org.prebid.server.hooks.execution.model.HookExecutionContext; import org.prebid.server.hooks.execution.model.HookExecutionOutcome; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookId; import org.prebid.server.hooks.execution.model.HookStageExecutionResult; import org.prebid.server.hooks.execution.model.Stage; @@ -61,7 +62,6 @@ import org.prebid.server.metric.MetricName; import org.prebid.server.metric.Metrics; import org.prebid.server.model.CaseInsensitiveMultiMap; -import org.prebid.server.model.Endpoint; import org.prebid.server.model.HttpRequestContext; import org.prebid.server.proto.openrtb.ext.ExtPrebid; import org.prebid.server.proto.openrtb.ext.request.ExtRequest; @@ -1125,9 +1125,7 @@ public void shouldPassSuccessfulEventToAnalyticsReporterWhenExitpointHookChanges public void shouldReturnSendAmpEventWithAuctionContextBidResponseDebugInfoHoldingExitpointHookOutcome() { // given final AuctionContext auctionContext = givenAuctionContext(identity()).toBuilder() - .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_amp, - stageOutcomes())) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.AMP, stageOutcomes())) .build(); given(ampRequestFactory.fromRequest(any(), anyLong())) @@ -1239,9 +1237,7 @@ public void shouldReturnSendAmpEventWithAuctionContextBidResponseAnalyticsTagsHo request -> request.ext(ExtRequest.of(ExtRequestPrebid.builder() .analytics(analyticsNode) .build()))).toBuilder() - .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_amp, - stageOutcomes())) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.AMP, stageOutcomes())) .build(); given(ampRequestFactory.fromRequest(any(), anyLong())) @@ -1353,7 +1349,7 @@ private AuctionContext givenAuctionContext( .requestTypeMetric(MetricName.amp) .timeoutContext(TimeoutContext.of(0, timeout, 0)) .debugContext(DebugContext.of(true, false, TraceLevel.verbose)) - .hookExecutionContext(HookExecutionContext.of(Endpoint.openrtb2_amp)) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.AMP)) .build(); } 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 0210095affd..0c133c2bc7d 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/AuctionHandlerTest.java @@ -42,6 +42,7 @@ import org.prebid.server.hooks.execution.model.GroupExecutionOutcome; import org.prebid.server.hooks.execution.model.HookExecutionContext; import org.prebid.server.hooks.execution.model.HookExecutionOutcome; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookId; import org.prebid.server.hooks.execution.model.HookStageExecutionResult; import org.prebid.server.hooks.execution.model.Stage; @@ -55,7 +56,6 @@ import org.prebid.server.metric.MetricName; import org.prebid.server.metric.Metrics; import org.prebid.server.model.CaseInsensitiveMultiMap; -import org.prebid.server.model.Endpoint; import org.prebid.server.model.HttpRequestContext; import org.prebid.server.proto.openrtb.ext.request.ExtGranularityRange; import org.prebid.server.proto.openrtb.ext.request.ExtMediaTypePriceGranularity; @@ -1004,9 +1004,7 @@ public void shouldSkipAuction() { public void shouldReturnSendAuctionEventWithAuctionContextBidResponseDebugInfoHoldingExitpointHookOutcome() { // given final AuctionContext auctionContext = givenAuctionContext(identity()).toBuilder() - .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_amp, - stageOutcomes())) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.AMP, stageOutcomes())) .build(); given(auctionRequestFactory.parseRequest(any(), anyLong())) @@ -1120,9 +1118,7 @@ public void shouldReturnSendAuctionEventWithAuctionContextBidResponseAnalyticsTa request -> request.ext(ExtRequest.of(ExtRequestPrebid.builder() .analytics(analyticsNode) .build()))).toBuilder() - .hookExecutionContext(HookExecutionContext.of( - Endpoint.openrtb2_amp, - stageOutcomes())) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.AMP, stageOutcomes())) .build(); given(auctionRequestFactory.parseRequest(any(), anyLong())) @@ -1257,7 +1253,7 @@ private AuctionContext givenAuctionContext( .bidRequest(bidRequest) .requestTypeMetric(MetricName.openrtb2web) .debugContext(DebugContext.of(true, false, TraceLevel.verbose)) - .hookExecutionContext(HookExecutionContext.of(Endpoint.openrtb2_auction)) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION)) .timeoutContext(TimeoutContext.of(0, timeout, 0)); return auctionContextCustomizer.apply(auctionContextBuilder) diff --git a/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java b/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java index 2e89435181b..3be7f7a60b1 100644 --- a/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java +++ b/src/test/java/org/prebid/server/handler/openrtb2/VideoHandlerTest.java @@ -35,10 +35,10 @@ import org.prebid.server.execution.timeout.TimeoutFactory; import org.prebid.server.hooks.execution.HookStageExecutor; import org.prebid.server.hooks.execution.model.HookExecutionContext; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookStageExecutionResult; import org.prebid.server.hooks.execution.v1.exitpoint.ExitpointPayloadImpl; import org.prebid.server.metric.Metrics; -import org.prebid.server.model.Endpoint; import org.prebid.server.proto.openrtb.ext.request.TraceLevel; import org.prebid.server.proto.response.VideoResponse; import org.prebid.server.settings.model.Account; @@ -461,7 +461,7 @@ private WithPodErrors givenAuctionContext( .bidRequest(bidRequest) .timeoutContext(TimeoutContext.of(0, timeout, 0)) .debugContext(DebugContext.of(true, false, TraceLevel.verbose)) - .hookExecutionContext(HookExecutionContext.of(Endpoint.openrtb2_video)) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.VIDEO)) .build(); return WithPodErrors.of(auctionContext, errors); diff --git a/src/test/java/org/prebid/server/hooks/execution/HookStageExecutorTest.java b/src/test/java/org/prebid/server/hooks/execution/HookStageExecutorTest.java index 24210ae6b72..43fd61c7ba6 100644 --- a/src/test/java/org/prebid/server/hooks/execution/HookStageExecutorTest.java +++ b/src/test/java/org/prebid/server/hooks/execution/HookStageExecutorTest.java @@ -26,10 +26,10 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; import org.prebid.server.auction.model.AuctionContext; +import org.prebid.server.auction.model.BidRejection; import org.prebid.server.auction.model.BidRejectionTracker; import org.prebid.server.auction.model.BidderRequest; import org.prebid.server.auction.model.BidderResponse; -import org.prebid.server.auction.model.BidRejection; import org.prebid.server.auction.model.ImpRejection; import org.prebid.server.auction.model.debug.DebugContext; import org.prebid.server.bidder.model.BidderBid; @@ -44,6 +44,7 @@ import org.prebid.server.hooks.execution.model.GroupExecutionOutcome; import org.prebid.server.hooks.execution.model.HookExecutionContext; import org.prebid.server.hooks.execution.model.HookExecutionOutcome; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookId; import org.prebid.server.hooks.execution.model.HookStageExecutionResult; import org.prebid.server.hooks.execution.model.Stage; @@ -163,7 +164,7 @@ public void creationShouldFailWhenExecutionPlanIsInvalid() { @Test public void creationShouldFailWhenHostExecutionPlanHasUnknownHook() { final String hostPlan = executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.entrypoint, StageExecutionPlan.of(singletonList( ExecutionGroup.of( @@ -186,7 +187,7 @@ public void creationShouldFailWhenHostExecutionPlanHasUnknownHook() { @Test public void creationShouldFailWhenDefaultAccountExecutionPlanHasUnknownHook() { final String defaultAccountPlan = executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.entrypoint, StageExecutionPlan.of(singletonList( ExecutionGroup.of( @@ -216,7 +217,7 @@ public void shouldTolerateMissingHostAndDefaultAccountExecutionPlans() { final String body = "body"; final AuctionContext givenAuctionContext = AuctionContext.builder() - .hookExecutionContext(HookExecutionContext.of(Endpoint.openrtb2_auction)) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION)) .build(); // when @@ -243,7 +244,7 @@ public void shouldTolerateMissingAllExecutionPlans() { AuctionContext.builder() .bidRequest(bidRequest) .account(Account.empty("accountId")) - .hookExecutionContext(HookExecutionContext.of(Endpoint.openrtb2_auction)) + .hookExecutionContext(HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION)) .debugContext(DebugContext.empty()) .build()); @@ -287,10 +288,10 @@ public void shouldExecuteEntrypointHooksHappyPath(VertxTestContext context) { final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.entrypoint, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -375,7 +376,7 @@ public void shouldBypassEntrypointHooksWhenNoPlanForEndpoint(VertxTestContext co final HookStageExecutor executor = createExecutor( executionPlan(emptyMap())); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_amp); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.AMP); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -406,11 +407,9 @@ public void shouldBypassEntrypointHooksWhenNoPlanForEndpoint(VertxTestContext co public void shouldBypassEntrypointHooksWhenNoPlanForStage(VertxTestContext context) { // given final HookStageExecutor executor = createExecutor( - executionPlan(singletonMap( - Endpoint.openrtb2_auction, - EndpointExecutionPlan.of(emptyMap())))); + executionPlan(singletonMap(HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(emptyMap())))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -470,7 +469,7 @@ public void shouldBypassEntrypointHooksThatAreDisabled(VertxTestContext context) final HookStageExecutor executor = HookStageExecutor.create( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.entrypoint, execPlanTwoGroupsTwoHooksEach())))), null, Map.of("module-alpha", false), @@ -482,7 +481,7 @@ public void shouldBypassEntrypointHooksThatAreDisabled(VertxTestContext context) false, 0.0); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -536,10 +535,10 @@ public void shouldExecuteEntrypointHooksToleratingMisbehavingHooks(VertxTestCont final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.entrypoint, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -649,14 +648,14 @@ public void shouldExecuteEntrypointHooksToleratingTimeoutAndFailedFuture(VertxTe immediateHook(InvocationResultUtils.succeeded(payload -> EntrypointPayloadImpl.of( payload.queryParams(), payload.headers(), payload.body() + "-jkl")))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.entrypoint, execPlanTwoGroupsTwoHooksEach()))))); // when @@ -753,10 +752,10 @@ public void shouldExecuteEntrypointHooksHonoringStatusAndAction(VertxTestContext final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.entrypoint, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -837,7 +836,7 @@ public void shouldExecuteEntrypointHooksWhenRequestIsRejectedByFirstGroup(VertxT final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.entrypoint, StageExecutionPlan.of(singletonList( @@ -847,7 +846,7 @@ public void shouldExecuteEntrypointHooksWhenRequestIsRejectedByFirstGroup(VertxT HookId.of("module-alpha", "hook-a"), HookId.of("module-beta", "hook-a")))))))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -924,10 +923,10 @@ public void shouldExecuteEntrypointHooksWhenRequestIsRejectedBySecondGroup(Vertx final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.entrypoint, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -1027,10 +1026,10 @@ public void shouldExecuteEntrypointHooksToleratingMisbehavingInvocationResult(Ve final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.entrypoint, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -1123,11 +1122,11 @@ public void shouldExecuteEntrypointHooksAndStoreResultInExecutionContext(VertxTe final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.entrypoint, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -1181,10 +1180,10 @@ public void shouldExecuteEntrypointHooksAndPassInvocationContext(VertxTestContex final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.entrypoint, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext givenAuctionContext = AuctionContext.builder() .hookExecutionContext(hookExecutionContext) .build(); @@ -1240,17 +1239,17 @@ public void shouldExecuteRawAuctionRequestHooksWhenNoExecutionPlanInAccount(Vert .willReturn(hookImpl); final String hostPlan = executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, execPlanOneGroupOneHook("module-alpha", "hook-a"))))); final String defaultAccountPlan = executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, execPlanOneGroupOneHook("module-alpha", "hook-b"))))); final HookStageExecutor executor = createExecutor(hostPlan, defaultAccountPlan); final BidRequest bidRequest = BidRequest.builder().build(); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeRawAuctionRequestStage( @@ -1285,12 +1284,12 @@ public void shouldExecuteRawAuctionRequestHooksWhenAccountOverridesExecutionPlan .willReturn(hookImpl); final String hostPlan = executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, execPlanOneGroupOneHook("module-alpha", "hook-a"))))); final String defaultAccountPlan = executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, execPlanOneGroupOneHook("module-alpha", "hook-b"))))); @@ -1298,7 +1297,7 @@ public void shouldExecuteRawAuctionRequestHooksWhenAccountOverridesExecutionPlan final BidRequest bidRequest = BidRequest.builder().build(); final ExecutionPlan accountPlan = ExecutionPlan.of(emptyList(), singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, execPlanOneGroupOneHook("module-beta", "hook-b"))))); @@ -1306,7 +1305,7 @@ public void shouldExecuteRawAuctionRequestHooksWhenAccountOverridesExecutionPlan .id("accountId") .hooks(AccountHooksConfiguration.of(accountPlan, null, null)) .build(); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeRawAuctionRequestStage( @@ -1349,7 +1348,7 @@ public void shouldExecuteRawAuctionRequestHooksToleratingUnknownHookInAccountPla final HookStageExecutor executor = createExecutor(null, null); final ExecutionPlan accountPlan = ExecutionPlan.of(emptyList(), singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, StageExecutionPlan.of(singletonList( @@ -1362,7 +1361,7 @@ public void shouldExecuteRawAuctionRequestHooksToleratingUnknownHookInAccountPla .id("accountId") .hooks(AccountHooksConfiguration.of(accountPlan, null, null)) .build(); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeRawAuctionRequestStage( @@ -1469,7 +1468,7 @@ public void shouldNotExecuteRawAuctionRequestHooksWhenAccountConfigIsNotRequired HookId.of("module-zeta", "hook-b"))))); final String hostExecutionPlan = executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.raw_auction_request, stageExecutionPlan)))); final HookStageExecutor executor = HookStageExecutor.create( @@ -1484,7 +1483,7 @@ public void shouldNotExecuteRawAuctionRequestHooksWhenAccountConfigIsNotRequired false, 0.0); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final BidRequest givenBidRequest = BidRequest.builder().build(); @@ -1587,7 +1586,7 @@ public void shouldExecuteRawAuctionRequestHooksWhenAccountConfigIsRequired(Vertx HookId.of("module-zeta", "hook-b"))))); final String hostExecutionPlan = executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.raw_auction_request, stageExecutionPlan)))); final HookStageExecutor executor = HookStageExecutor.create( @@ -1602,7 +1601,7 @@ public void shouldExecuteRawAuctionRequestHooksWhenAccountConfigIsRequired(Vertx true, 0.0); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final BidRequest givenBidRequest = BidRequest.builder().build(); @@ -1679,12 +1678,12 @@ public void shouldExecuteRawAuctionRequestHooksHappyPath(VertxTestContext contex final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeRawAuctionRequestStage( @@ -1767,12 +1766,12 @@ public void shouldExecuteRawAuctionRequestHooksWithAllRejectionsPopulated(VertxT final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final AuctionContext givenAuctionContext = AuctionContext.builder() @@ -1847,7 +1846,7 @@ public void shouldExecuteRawAuctionRequestHooksAndPassAuctionInvocationContext(V final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, execPlanTwoGroupsTwoHooksEach()))))); @@ -1858,7 +1857,7 @@ public void shouldExecuteRawAuctionRequestHooksAndPassAuctionInvocationContext(V accountModulesConfiguration.put("module-alpha", moduleAlphaConfiguration); accountModulesConfiguration.put("module-beta", moduleBetaConfiguration); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeRawAuctionRequestStage( @@ -1941,7 +1940,7 @@ public void shouldExecuteRawAuctionRequestHooksAndPassModuleContextBetweenHooks( final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, StageExecutionPlan.of(asList( @@ -1958,7 +1957,7 @@ public void shouldExecuteRawAuctionRequestHooksAndPassModuleContextBetweenHooks( HookId.of("module-alpha", "hook-b"), HookId.of("module-beta", "hook-c")))))))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeRawAuctionRequestStage( @@ -2012,11 +2011,11 @@ public void shouldExecuteRawAuctionRequestHooksWhenRequestIsRejected(VertxTestCo final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_auction_request, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeRawAuctionRequestStage( @@ -2064,12 +2063,12 @@ public void shouldExecuteProcessedAuctionRequestHooksHappyPath(VertxTestContext final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.processed_auction_request, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = @@ -2120,7 +2119,7 @@ public void shouldExecuteProcessedAuctionRequestHooksAndPassAuctionInvocationCon final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.processed_auction_request, execPlanTwoGroupsTwoHooksEach()))))); @@ -2131,7 +2130,7 @@ public void shouldExecuteProcessedAuctionRequestHooksAndPassAuctionInvocationCon accountModulesConfiguration.put("module-alpha", moduleAlphaConfiguration); accountModulesConfiguration.put("module-beta", moduleBetaConfiguration); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = @@ -2215,7 +2214,7 @@ public void shouldExecuteProcessedAuctionRequestHooksAndPassModuleContextBetween final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.processed_auction_request, StageExecutionPlan.of(asList( @@ -2232,7 +2231,7 @@ public void shouldExecuteProcessedAuctionRequestHooksAndPassModuleContextBetween HookId.of("module-alpha", "hook-b"), HookId.of("module-beta", "hook-c")))))))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = @@ -2287,12 +2286,12 @@ public void shouldExecuteProcessedAuctionRequestHooksWhenRequestIsRejected(Vertx final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.processed_auction_request, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = @@ -2342,12 +2341,12 @@ public void shouldExecuteBidderRequestHooksHappyPath(VertxTestContext context) { final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.bidder_request, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext auctionContext = AuctionContext.builder() .bidRequest(BidRequest.builder().build()) .account(Account.empty("accountId")) @@ -2410,11 +2409,11 @@ public void shouldExecuteBidderRequestHooksAndPassBidderInvocationContext(VertxT final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.bidder_request, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeBidderRequestStage( @@ -2498,12 +2497,12 @@ public void shouldExecuteRawBidderResponseHooksHappyPath(VertxTestContext contex final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.raw_bidder_response, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext auctionContext = AuctionContext.builder() .bidRequest(BidRequest.builder().build()) .account(Account.empty("accountId")) @@ -2565,11 +2564,11 @@ public void shouldExecuteRawBidderResponseHooksAndPassBidderInvocationContext(Ve final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap(Stage.raw_bidder_response, execPlanOneGroupOneHook( "module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeRawBidderResponseStage( @@ -2653,12 +2652,12 @@ public void shouldExecuteProcessedBidderResponseHooksHappyPath(VertxTestContext final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.processed_bidder_response, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext auctionContext = AuctionContext.builder() .bidRequest(BidRequest.builder().build()) .account(Account.empty("accountId")) @@ -2723,12 +2722,12 @@ public void shouldExecuteProcessedBidderResponseHooksAndPassBidderInvocationCont final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.processed_bidder_response, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = @@ -2828,12 +2827,12 @@ public void shouldExecuteAllProcessedBidResponsesHooksHappyPath() { final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.all_processed_bid_responses, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext auctionContext = AuctionContext.builder() .bidRequest(BidRequest.builder().build()) .account(Account.empty("accountId")) @@ -2967,7 +2966,7 @@ public void shouldExecuteAllProcessedBidResponsesHooksRejectionAllIgnoringUnknow final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.all_processed_bid_responses, execPlanTwoGroupsTwoHooksEach()))))); @@ -2977,7 +2976,7 @@ public void shouldExecuteAllProcessedBidResponsesHooksRejectionAllIgnoringUnknow bidRejectionTrackers.put("bidderB", new BidRejectionTracker("bidderB", Set.of("impId"), 0.0)); bidRejectionTrackers.put("bidderC", new BidRejectionTracker("bidderC", Set.of("impId"), 0.0)); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); final AuctionContext auctionContext = AuctionContext.builder() .bidRequest(BidRequest.builder().build()) .account(Account.empty("accountId")) @@ -3011,20 +3010,20 @@ public void shouldExecuteAllProcessedBidResponsesHooksRejectionAllIgnoringUnknow assertThat(bidRejectionTrackers.keySet()).containsOnly("bidderA", "bidderB", "bidderC"); assertThat(bidRejectionTrackers.get("bidderA").getAllRejected().get("impId")).containsOnly( - BidRejection.of(bidderABid1, REQUEST_BLOCKED_OPTIMIZED), - BidRejection.of(bidderABid1, REQUEST_BLOCKED_UNSUPPORTED_MEDIA_TYPE), - BidRejection.of(bidderABid2, REQUEST_BLOCKED_GENERAL), - BidRejection.of(bidderABid2, REQUEST_BLOCKED_GENERAL)); + BidRejection.of(bidderABid1, REQUEST_BLOCKED_OPTIMIZED), + BidRejection.of(bidderABid1, REQUEST_BLOCKED_UNSUPPORTED_MEDIA_TYPE), + BidRejection.of(bidderABid2, REQUEST_BLOCKED_GENERAL), + BidRejection.of(bidderABid2, REQUEST_BLOCKED_GENERAL)); assertThat(bidRejectionTrackers.get("bidderB").getAllRejected().get("impId")).containsOnly( - BidRejection.of(bidderBBid3, REQUEST_BLOCKED_UNACCEPTABLE_CURRENCY), - BidRejection.of(bidderBBid3, REQUEST_BLOCKED_PRIVACY), - BidRejection.of(bidderBBid4, REQUEST_BLOCKED_GENERAL), - BidRejection.of(bidderBBid4, REQUEST_BLOCKED_GENERAL)); + BidRejection.of(bidderBBid3, REQUEST_BLOCKED_UNACCEPTABLE_CURRENCY), + BidRejection.of(bidderBBid3, REQUEST_BLOCKED_PRIVACY), + BidRejection.of(bidderBBid4, REQUEST_BLOCKED_GENERAL), + BidRejection.of(bidderBBid4, REQUEST_BLOCKED_GENERAL)); assertThat(bidRejectionTrackers.get("bidderC").getAllRejected().get("impId")).containsOnly( - BidRejection.of(bidderCBid5, REQUEST_BLOCKED_GENERAL), - BidRejection.of(bidderCBid5, REQUEST_BLOCKED_GENERAL), - BidRejection.of(bidderCBid5, REQUEST_BLOCKED_GENERAL), - BidRejection.of(bidderCBid5, REQUEST_BLOCKED_GENERAL)); + BidRejection.of(bidderCBid5, REQUEST_BLOCKED_GENERAL), + BidRejection.of(bidderCBid5, REQUEST_BLOCKED_GENERAL), + BidRejection.of(bidderCBid5, REQUEST_BLOCKED_GENERAL), + BidRejection.of(bidderCBid5, REQUEST_BLOCKED_GENERAL)); } @Test @@ -3037,12 +3036,12 @@ public void shouldExecuteAllProcessedBidResponsesHooksAndPassAuctionInvocationCo final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.all_processed_bid_responses, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = @@ -3088,11 +3087,11 @@ public void shouldExecuteBidderRequestHooksWhenRequestIsRejected(VertxTestContex final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.bidder_request, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeBidderRequestStage( @@ -3143,12 +3142,12 @@ public void shouldExecuteAuctionResponseHooksHappyPath(VertxTestContext context) final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.auction_response, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeAuctionResponseStage( @@ -3185,11 +3184,11 @@ public void shouldExecuteAuctionResponseHooksAndPassAuctionInvocationContext(Ver final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.auction_response, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeAuctionResponseStage( @@ -3230,11 +3229,11 @@ public void shouldExecuteAuctionResponseHooksAndTolerateNullAccount(VertxTestCon final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.auction_response, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeAuctionResponseStage( @@ -3272,11 +3271,11 @@ public void shouldExecuteAuctionResponseHooksAndIgnoreRejection(VertxTestContext final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.auction_response, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeAuctionResponseStage( @@ -3351,12 +3350,12 @@ public void shouldExecuteExitpointHooksHappyPath(VertxTestContext context) { final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.exitpoint, execPlanTwoGroupsTwoHooksEach()))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeExitpointStage( @@ -3400,11 +3399,11 @@ public void shouldExecuteExitpointHooksAndPassAuctionInvocationContext(VertxTest final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.exitpoint, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeExitpointStage( @@ -3446,11 +3445,11 @@ public void shouldExecuteExitpointHooksAndIgnoreRejection(VertxTestContext conte final HookStageExecutor executor = createExecutor( executionPlan(singletonMap( - Endpoint.openrtb2_auction, + HookHttpEndpoint.POST_AUCTION, EndpointExecutionPlan.of(singletonMap( Stage.exitpoint, execPlanOneGroupOneHook("module-alpha", "hook-a")))))); - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); // when final Future> future = executor.executeExitpointStage( @@ -3569,7 +3568,7 @@ public void abTestsShouldReturnEnabledTestsFromHost() { ABTest.builder().enabled(true).build()); } - private String executionPlan(Map endpoints) { + private String executionPlan(Map endpoints) { return jacksonMapper.encodeToString(ExecutionPlan.of(null, endpoints)); } diff --git a/src/test/java/org/prebid/server/hooks/execution/provider/abtest/ABTestHookProviderTest.java b/src/test/java/org/prebid/server/hooks/execution/provider/abtest/ABTestHookProviderTest.java index fa6f3291267..98e8d22466a 100644 --- a/src/test/java/org/prebid/server/hooks/execution/provider/abtest/ABTestHookProviderTest.java +++ b/src/test/java/org/prebid/server/hooks/execution/provider/abtest/ABTestHookProviderTest.java @@ -13,13 +13,13 @@ import org.prebid.server.hooks.execution.model.GroupExecutionOutcome; import org.prebid.server.hooks.execution.model.HookExecutionContext; import org.prebid.server.hooks.execution.model.HookExecutionOutcome; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; import org.prebid.server.hooks.execution.model.HookId; import org.prebid.server.hooks.execution.model.Stage; import org.prebid.server.hooks.execution.model.StageExecutionOutcome; import org.prebid.server.hooks.execution.provider.HookProvider; import org.prebid.server.hooks.v1.Hook; import org.prebid.server.hooks.v1.InvocationContext; -import org.prebid.server.model.Endpoint; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; @@ -50,7 +50,7 @@ public void applyShouldReturnOriginalHookIfNoABTestFound() { final HookProvider target = new ABTestHookProvider<>( innerHookProvider, singletonList(ABTest.builder().moduleCode("otherModule").build()), - HookExecutionContext.of(Endpoint.openrtb2_auction), + HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION), mapper); // when @@ -68,7 +68,7 @@ public void applyShouldReturnWrappedHook() { final HookProvider target = new ABTestHookProvider<>( innerHookProvider, singletonList(ABTest.builder().moduleCode("module").build()), - HookExecutionContext.of(Endpoint.openrtb2_auction), + HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION), mapper); // when @@ -83,7 +83,7 @@ public void applyShouldReturnWrappedHook() { @Test public void shouldInvokeHookShouldReturnTrueIfThereIsAPreviousInvocation() { // given - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); hookExecutionContext.getStageOutcomes().put(Stage.entrypoint, singletonList( StageExecutionOutcome.of("entity", singletonList(GroupExecutionOutcome.of(singletonList( HookExecutionOutcome.builder() @@ -106,7 +106,7 @@ public void shouldInvokeHookShouldReturnTrueIfThereIsAPreviousInvocation() { @Test public void shouldInvokeHookShouldReturnFalseIfThereIsAPreviousExecutionWithoutInvocation() { // given - final HookExecutionContext hookExecutionContext = HookExecutionContext.of(Endpoint.openrtb2_auction); + final HookExecutionContext hookExecutionContext = HookExecutionContext.of(HookHttpEndpoint.POST_AUCTION); hookExecutionContext.getStageOutcomes().put(Stage.entrypoint, singletonList( StageExecutionOutcome.of("entity", singletonList(GroupExecutionOutcome.of(singletonList( HookExecutionOutcome.builder() diff --git a/src/test/java/org/prebid/server/settings/EnrichingApplicationSettingsTest.java b/src/test/java/org/prebid/server/settings/EnrichingApplicationSettingsTest.java index f3180d3651e..0a843de8ff6 100644 --- a/src/test/java/org/prebid/server/settings/EnrichingApplicationSettingsTest.java +++ b/src/test/java/org/prebid/server/settings/EnrichingApplicationSettingsTest.java @@ -83,7 +83,8 @@ public void getAccountByIdShouldSuccessfullyMergeWhenDefaultAccountIsEmpty() { "{}", delegate, priceFloorsConfigResolver, - activitiesConfigResolver, jsonMerger, + activitiesConfigResolver, + jsonMerger, jacksonMapper); final Account returnedAccount = Account.builder().build(); From 958bc57bb719f8210c9bca84faeff0af8192b344 Mon Sep 17 00:00:00 2001 From: Danylo Date: Mon, 2 Feb 2026 23:29:20 +0100 Subject: [PATCH 2/4] Refactor --- .../ExecutionPlanEndpointsConfigDeserializer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializer.java b/src/main/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializer.java index b5195a5ba8e..860650ecd7d 100644 --- a/src/main/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializer.java +++ b/src/main/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializer.java @@ -68,7 +68,7 @@ private static Map convertKeys(Map result = new EnumMap<>(HookHttpEndpoint.class); + final Map result = new EnumMap<>(HookHttpEndpoint.class); for (Map.Entry entry : map.entrySet()) { result.put(convertKey(entry.getKey(), context), entry.getValue()); } @@ -87,7 +87,7 @@ private static HookHttpEndpoint convertKey(ConfigKey configKey, DeserializationC configKey.toString(), HookHttpEndpoint.class, "not one of the values accepted for Enum class: %s" - .formatted((Object) HookHttpEndpoint.values()))); + .formatted(Arrays.toString(HookHttpEndpoint.values())))); } private record ConfigKey(HttpMethod httpMethod, Endpoint endpoint) { From eed83b3a2b4d4fa270b9691f655975db28a1b5cf Mon Sep 17 00:00:00 2001 From: Danylo Date: Thu, 5 Feb 2026 19:12:48 +0100 Subject: [PATCH 3/4] Add units --- .../org/prebid/server/model/Endpoint.java | 1 - ...onPlanEndpointsConfigDeserializerTest.java | 174 ++++++++++++++++++ 2 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializerTest.java diff --git a/src/main/java/org/prebid/server/model/Endpoint.java b/src/main/java/org/prebid/server/model/Endpoint.java index c464fc6a577..6a8c8531264 100644 --- a/src/main/java/org/prebid/server/model/Endpoint.java +++ b/src/main/java/org/prebid/server/model/Endpoint.java @@ -38,7 +38,6 @@ public String value() { return value; } - @SuppressWarnings("unused") @JsonCreator public static Endpoint fromString(String value) { return Arrays.stream(values()) diff --git a/src/test/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializerTest.java b/src/test/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializerTest.java new file mode 100644 index 00000000000..e5743114897 --- /dev/null +++ b/src/test/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializerTest.java @@ -0,0 +1,174 @@ +package org.prebid.server.json.deserializer; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import com.fasterxml.jackson.databind.exc.MismatchedInputException; +import org.junit.jupiter.api.Test; +import org.prebid.server.VertxTest; +import org.prebid.server.hooks.execution.model.EndpointExecutionPlan; +import org.prebid.server.hooks.execution.model.ExecutionGroup; +import org.prebid.server.hooks.execution.model.ExecutionPlan; +import org.prebid.server.hooks.execution.model.HookHttpEndpoint; +import org.prebid.server.hooks.execution.model.HookId; +import org.prebid.server.hooks.execution.model.Stage; +import org.prebid.server.hooks.execution.model.StageExecutionPlan; +import org.prebid.server.model.Endpoint; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static java.util.Collections.singletonList; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.prebid.server.hooks.execution.model.HookHttpEndpoint.POST_AUCTION; + +public class ExecutionPlanEndpointsConfigDeserializerTest extends VertxTest { + + @Test + public void deserializeShouldReturnNullOnNull() throws JsonProcessingException { + // given + final String executionPlan = givenExecutionPlan((Map) null); + + // when + final ExecutionPlan result = mapper.readValue(executionPlan, ExecutionPlan.class); + + // then + assertThat(result.getEndpoints()).isNull(); + } + + @Test + public void deserializeShouldReturnEmptyOnEmpty() throws JsonProcessingException { + // given + final String executionPlan = givenExecutionPlan(Collections.emptyMap()); + + // when + final ExecutionPlan result = mapper.readValue(executionPlan, ExecutionPlan.class); + + // then + assertThat(result.getEndpoints()).isEmpty(); + } + + @Test + public void deserializeShouldReadAllPossibleEndpoints() throws JsonProcessingException { + // given + final String executionPlan = givenExecutionPlan(allEndpoints()); + + // when + final ExecutionPlan result = mapper.readValue(executionPlan, ExecutionPlan.class); + + // then + assertThat(result.getEndpoints()).containsExactlyInAnyOrderEntriesOf(allEndpoints()); + } + + @Test + public void deserializeShouldFailOnInvalidEndpointExecutionPlan() { + // given + final String executionPlan = """ + { + "endpoints": { + "POST /openrtb2/auction": "invalid" + } + }"""; + + // when and then + assertThatExceptionOfType(MismatchedInputException.class) + .isThrownBy(() -> mapper.readValue(executionPlan, ExecutionPlan.class)) + .withMessageContaining("Cannot construct instance of") + .withMessageContaining("deserialize from String value ('invalid')"); + } + + @Test + public void deserializeShouldFailOnInvalidEndpoint() throws JsonProcessingException { + // given + final String executionPlan = givenExecutionPlan("invalid"); + + // when and then + assertThatExceptionOfType(InvalidFormatException.class) + .isThrownBy(() -> mapper.readValue(executionPlan, ExecutionPlan.class)) + .withMessageContaining("Cannot deserialize Map key of type") + .withMessageContaining("from String \"invalid\": not a valid representation"); + } + + @Test + public void deserializeShouldFailOnInvalidHttpHookEndpoint() throws JsonProcessingException { + // given + final String executionPlan = givenExecutionPlan("INVALID " + Endpoint.openrtb2_auction.value()); + + // when and then + assertThatExceptionOfType(InvalidFormatException.class) + .isThrownBy(() -> mapper.readValue(executionPlan, ExecutionPlan.class)) + .withMessageContaining("Cannot deserialize value of type") + .withMessageContaining(""" + from String "INVALID /openrtb2/auction": \ + not one of the values accepted for Enum class"""); + } + + @Test + public void deserializeShouldCorrectlyUnpackAllEndpointsWithoutMethod() throws JsonProcessingException { + // given + final String[] endpointsWithoutMethod = Arrays.stream(HookHttpEndpoint.values()) + .map(HookHttpEndpoint::endpoint) + .map(Endpoint::value) + .distinct() + .toArray(String[]::new); + final String executionPlan = givenExecutionPlan(endpointsWithoutMethod); + + // when + final ExecutionPlan result = mapper.readValue(executionPlan, ExecutionPlan.class); + + // then + assertThat(result.getEndpoints()).containsExactlyInAnyOrderEntriesOf( + Arrays.stream(HookHttpEndpoint.values()) + .collect(Collectors.toMap( + Function.identity(), + key -> givenEndpointExecutionPlan(key.endpoint().value())))); + } + + @Test + public void deserializeShouldNotOverrideInitialConfigAfterUnpacking() throws JsonProcessingException { + // given + final String executionPlan = givenExecutionPlan( + POST_AUCTION.toString(), + POST_AUCTION.endpoint().value()); + + // when + final ExecutionPlan result = mapper.readValue(executionPlan, ExecutionPlan.class); + + // when and then + assertThat(result.getEndpoints()).containsExactlyInAnyOrderEntriesOf( + Map.of(POST_AUCTION, givenEndpointExecutionPlan(POST_AUCTION.toString()))); + } + + private static Map allEndpoints() { + return Arrays.stream(HookHttpEndpoint.values()) + .collect(Collectors.toMap( + Function.identity(), + key -> givenEndpointExecutionPlan(key.toString()))); + } + + private static EndpointExecutionPlan givenEndpointExecutionPlan(String id) { + return EndpointExecutionPlan.of(Map.of(Stage.entrypoint, StageExecutionPlan.of( + singletonList(ExecutionGroup.of(0L, singletonList(HookId.of(id, id))))))); + } + + private static String givenExecutionPlan(Map endpoints) + throws JsonProcessingException { + + return mapper.writeValueAsString(ExecutionPlan.of(null, endpoints)); + } + + private static String givenExecutionPlan(String... hookHttpEndpointsAsStrings) throws JsonProcessingException { + final Map endpoints = Arrays.stream(hookHttpEndpointsAsStrings) + .collect(Collectors.toMap( + Function.identity(), + ExecutionPlanEndpointsConfigDeserializerTest::givenEndpointExecutionPlan)); + + return """ + { + "endpoints": %s + }""".formatted(mapper.writeValueAsString(endpoints)); + } +} From d6c44320777f7dd0db14b4c962fe9383a76c044d Mon Sep 17 00:00:00 2001 From: Danylo Date: Thu, 5 Feb 2026 19:22:53 +0100 Subject: [PATCH 4/4] Fix comment --- .../ExecutionPlanEndpointsConfigDeserializerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializerTest.java b/src/test/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializerTest.java index e5743114897..c8a487e3514 100644 --- a/src/test/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializerTest.java +++ b/src/test/java/org/prebid/server/json/deserializer/ExecutionPlanEndpointsConfigDeserializerTest.java @@ -137,7 +137,7 @@ public void deserializeShouldNotOverrideInitialConfigAfterUnpacking() throws Jso // when final ExecutionPlan result = mapper.readValue(executionPlan, ExecutionPlan.class); - // when and then + // then assertThat(result.getEndpoints()).containsExactlyInAnyOrderEntriesOf( Map.of(POST_AUCTION, givenEndpointExecutionPlan(POST_AUCTION.toString()))); }