From a0234330afb27445fbd1eb308e2e7e5c50a3c8d9 Mon Sep 17 00:00:00 2001 From: Danylo Date: Mon, 2 Feb 2026 23:05:40 +0100 Subject: [PATCH 1/8] 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/8] 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 f676acb7c8a9864b533e7cb1fb8e40ef73090e67 Mon Sep 17 00:00:00 2001 From: osulzhenko Date: Fri, 6 Feb 2026 14:51:07 +0200 Subject: [PATCH 3/8] Tests: Add support for endpoints with same path but different method --- .../requestfactory/Ortb2RequestFactory.java | 2 +- .../functional/model/config/Endpoint.groovy | 12 +- .../model/config/ExecutionPlan.groovy | 10 +- .../model/config/HookHttpEndpoint.groovy | 32 +++++ .../service/PrebidServerService.groovy | 66 +++++----- .../container/PrebidServerContainer.groovy | 3 +- .../functional/tests/AuctionSpec.groovy | 3 +- .../functional/tests/BidderParamsSpec.groovy | 5 +- .../functional/tests/CacheVtrackSpec.groovy | 3 +- .../functional/tests/HttpSettingsSpec.groovy | 5 +- .../tests/module/AbTestingModuleSpec.groovy | 46 +++---- .../tests/module/GeneralModuleSpec.groovy | 115 +++++++++++++++++- .../tests/module/ModuleBaseSpec.groovy | 15 ++- .../AnalyticsTagsModuleSpec.groovy | 18 +-- .../ortb2blocking/Ortb2BlockingSpec.groovy | 5 +- .../richmedia/RichMediaFilterSpec.groovy | 4 +- 16 files changed, 248 insertions(+), 96 deletions(-) create mode 100644 src/test/groovy/org/prebid/server/functional/model/config/HookHttpEndpoint.groovy 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 ec0aff7a68e..e7d42855464 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java @@ -558,7 +558,7 @@ private Future wrapFailure(Throwable exception, String accountId, HttpR if (exception instanceof UnauthorizedAccountException) { return Future.failedFuture(exception); } else if (exception instanceof PreBidException) { - unknownAccountLogger.warn(accountErrorMessage(exception.getMessage(), httpRequest), 100); + unknownAccountLogger.warn(accountErrorMessage(exception.getMessage(), httpRequest), logSamplingRate); } else { metrics.updateAccountRequestRejectedByFailedFetch(accountId); logger.warn("Error occurred while fetching account: {}", exception.getMessage()); diff --git a/src/test/groovy/org/prebid/server/functional/model/config/Endpoint.groovy b/src/test/groovy/org/prebid/server/functional/model/config/Endpoint.groovy index eee6d80d319..3d3ee4a1b13 100644 --- a/src/test/groovy/org/prebid/server/functional/model/config/Endpoint.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/config/Endpoint.groovy @@ -6,16 +6,20 @@ import groovy.transform.ToString @ToString enum Endpoint { - OPENRTB2_AUCTION("/openrtb2/auction"), - OPENRTB2_AMP("/openrtb2/amp"), - OPENRTB2_VIDEO("/openrtb2/video"), + AUCTION("/openrtb2/auction"), + AMP("/openrtb2/amp"), + VIDEO("/openrtb2/video"), COOKIE_SYNC("/cookie_sync"), SETUID("/setuid"), BIDDER_PARAMS("/bidders/params"), EVENT("/event"), GETUIDS("/getuids"), INFO_BIDDERS("/info/bidders"), - OPTOUT("/optout"), + CURRENCY_RATES("/currency/rates"), + HTTP_INTERACTION("/logging/httpinteraction"), + COLLECTED_METRICS("/collected-metrics"), + PROMETHEUS_METRICS ("/metrics"), + INFLUX_DB("/query"), STATUS("/status"), VTRACK("/vtrack") diff --git a/src/test/groovy/org/prebid/server/functional/model/config/ExecutionPlan.groovy b/src/test/groovy/org/prebid/server/functional/model/config/ExecutionPlan.groovy index 653f8c8cbea..5c7e6e393b9 100644 --- a/src/test/groovy/org/prebid/server/functional/model/config/ExecutionPlan.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/config/ExecutionPlan.groovy @@ -10,13 +10,17 @@ import org.prebid.server.functional.model.ModuleName class ExecutionPlan { List abTests - Map endpoints + Map endpoints - static ExecutionPlan getSingleEndpointExecutionPlan(Endpoint endpoint, ModuleName moduleName, List stage) { + static ExecutionPlan getSingleEndpointExecutionPlan(HookHttpEndpoint endpoint, ModuleName moduleName, List stage) { new ExecutionPlan(endpoints: [(endpoint): EndpointExecutionPlan.getModuleEndpointExecutionPlan(moduleName, stage)]) } - static ExecutionPlan getSingleEndpointExecutionPlan(Endpoint endpoint, Map> modulesStages) { + static ExecutionPlan getSingleEndpointExecutionPlan(HookHttpEndpoint endpoint, Map> modulesStages) { new ExecutionPlan(endpoints: [(endpoint): EndpointExecutionPlan.getModulesEndpointExecutionPlan(modulesStages)]) } + + List getListOfModuleCodes() { + endpoints.values().stages*.values().groups.hookSequence.moduleCode.flatten() as List + } } diff --git a/src/test/groovy/org/prebid/server/functional/model/config/HookHttpEndpoint.groovy b/src/test/groovy/org/prebid/server/functional/model/config/HookHttpEndpoint.groovy new file mode 100644 index 00000000000..56ccd169148 --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/config/HookHttpEndpoint.groovy @@ -0,0 +1,32 @@ +package org.prebid.server.functional.model.config + +import com.fasterxml.jackson.annotation.JsonValue +import groovy.transform.ToString + +@ToString +enum HookHttpEndpoint { + + AUCTION("/openrtb2/auction"), + AUCTION_GET("GET /openrtb2/auction"), + AUCTION_POST("POST /openrtb2/auction"), + + AMP("/openrtb2/amp"), + AMP_GET("GET /openrtb2/amp"), + AMP_POST("POST /openrtb2/amp"), + + VIDEO("/openrtb2/video"), + VIDEO_GET("GET /openrtb2/video"), + VIDEO_POST("POST /openrtb2/video"), + + @JsonValue + final String value + + HookHttpEndpoint(String value) { + this.value = value + } + + @Override + String toString() { + value + } +} diff --git a/src/test/groovy/org/prebid/server/functional/service/PrebidServerService.groovy b/src/test/groovy/org/prebid/server/functional/service/PrebidServerService.groovy index 249d6fa3f13..ea418f3d68d 100644 --- a/src/test/groovy/org/prebid/server/functional/service/PrebidServerService.groovy +++ b/src/test/groovy/org/prebid/server/functional/service/PrebidServerService.groovy @@ -43,26 +43,26 @@ import java.time.format.DateTimeFormatter import static io.restassured.RestAssured.given import static java.time.ZoneOffset.UTC +import static org.prebid.server.functional.model.config.Endpoint.AMP +import static org.prebid.server.functional.model.config.Endpoint.AUCTION +import static org.prebid.server.functional.model.config.Endpoint.BIDDER_PARAMS +import static org.prebid.server.functional.model.config.Endpoint.COLLECTED_METRICS +import static org.prebid.server.functional.model.config.Endpoint.COOKIE_SYNC +import static org.prebid.server.functional.model.config.Endpoint.CURRENCY_RATES +import static org.prebid.server.functional.model.config.Endpoint.EVENT +import static org.prebid.server.functional.model.config.Endpoint.GETUIDS +import static org.prebid.server.functional.model.config.Endpoint.HTTP_INTERACTION +import static org.prebid.server.functional.model.config.Endpoint.INFLUX_DB +import static org.prebid.server.functional.model.config.Endpoint.INFO_BIDDERS +import static org.prebid.server.functional.model.config.Endpoint.PROMETHEUS_METRICS +import static org.prebid.server.functional.model.config.Endpoint.SETUID +import static org.prebid.server.functional.model.config.Endpoint.STATUS +import static org.prebid.server.functional.model.config.Endpoint.VTRACK import static org.prebid.server.functional.testcontainers.Dependencies.influxdbContainer class PrebidServerService implements ObjectMapperWrapper { - static final String AUCTION_ENDPOINT = "/openrtb2/auction" - static final String AMP_ENDPOINT = "/openrtb2/amp" - static final String COOKIE_SYNC_ENDPOINT = "/cookie_sync" - static final String SET_UID_ENDPOINT = "/setuid" - static final String GET_UIDS_ENDPOINT = "/getuids" - static final String EVENT_ENDPOINT = "/event" - static final String VTRACK_ENDPOINT = "/vtrack" - static final String STATUS_ENDPOINT = "/status" - static final String INFO_BIDDERS_ENDPOINT = "/info/bidders" - static final String BIDDERS_PARAMS_ENDPOINT = "/bidders/params" - static final String CURRENCY_RATES_ENDPOINT = "/currency/rates" - static final String HTTP_INTERACTION_ENDPOINT = "/logging/httpinteraction" - static final String COLLECTED_METRICS_ENDPOINT = "/collected-metrics" - static final String PROMETHEUS_METRICS_ENDPOINT = "/metrics" - static final String INFLUX_DB_ENDPOINT = "/query" static final String UIDS_COOKIE_NAME = "uids" private final PrebidServerContainer pbsContainer @@ -190,7 +190,7 @@ class PrebidServerService implements ObjectMapperWrapper { .cookies(cookies) .queryParams(toMap(request)) .headers(header) - .get(SET_UID_ENDPOINT) + .get(SETUID.value) checkResponseStatusCode(response) @@ -206,7 +206,7 @@ class PrebidServerService implements ObjectMapperWrapper { def uidsCookieAsEncodedJson = Base64.urlEncoder.encodeToString(uidsCookieAsJson.bytes) def response = given(requestSpecification).cookie(UIDS_COOKIE_NAME, uidsCookieAsEncodedJson) - .get(GET_UIDS_ENDPOINT) + .get(GETUIDS.value) checkResponseStatusCode(response) decode(response.body.asString(), GetuidResponse) @@ -215,7 +215,7 @@ class PrebidServerService implements ObjectMapperWrapper { byte[] sendEventRequest(EventRequest eventRequest, Map headers = [:]) { def response = given(requestSpecification).headers(headers) .queryParams(toMap(eventRequest)) - .get(EVENT_ENDPOINT) + .get(EVENT.value) checkResponseStatusCode(response) response.body.asByteArray() @@ -224,7 +224,7 @@ class PrebidServerService implements ObjectMapperWrapper { PrebidCacheResponse sendPostVtrackRequest(VtrackRequest request, String account) { def response = given(requestSpecification).queryParams(["a": account]) .body(request) - .post(VTRACK_ENDPOINT) + .post(VTRACK.value) checkResponseStatusCode(response) decode(response.body.asString(), PrebidCacheResponse) @@ -233,28 +233,28 @@ class PrebidServerService implements ObjectMapperWrapper { TransferValue sendGetVtrackRequest(Map parameters) { def response = given(requestSpecification) .queryParams(parameters) - .get(VTRACK_ENDPOINT) + .get(VTRACK.value) checkResponseStatusCode(response) decode(response.body.asString(), TransferValue) } StatusResponse sendStatusRequest() { - def response = given(requestSpecification).get(STATUS_ENDPOINT) + def response = given(requestSpecification).get(STATUS.value) checkResponseStatusCode(response) decode(response.body.asString(), StatusResponse) } String sendInfoBiddersRequest() { - def response = given(requestSpecification).get(INFO_BIDDERS_ENDPOINT) + def response = given(requestSpecification).get(INFO_BIDDERS.value) checkResponseStatusCode(response) response.body().asString() } List sendInfoBiddersRequest(Map queryParam) { - def response = given(requestSpecification).queryParams(queryParam).get(INFO_BIDDERS_ENDPOINT) + def response = given(requestSpecification).queryParams(queryParam).get(INFO_BIDDERS.value) checkResponseStatusCode(response) decode(response.asString(), new TypeReference>() {}) @@ -262,21 +262,21 @@ class PrebidServerService implements ObjectMapperWrapper { BidderInfoResponse sendBidderInfoRequest(BidderName bidderName) { - def response = given(requestSpecification).get("$INFO_BIDDERS_ENDPOINT/$bidderName.value") + def response = given(requestSpecification).get("${INFO_BIDDERS.value}/$bidderName.value") checkResponseStatusCode(response) decode(response.body.asString(), BidderInfoResponse) } BiddersParamsResponse sendBiddersParamsRequest() { - def response = given(requestSpecification).get(BIDDERS_PARAMS_ENDPOINT) + def response = given(requestSpecification).get(BIDDER_PARAMS.value) checkResponseStatusCode(response) decode(response.body.asString(), BiddersParamsResponse) } CurrencyRatesResponse sendCurrencyRatesRequest() { - def response = given(adminRequestSpecification).get(CURRENCY_RATES_ENDPOINT) + def response = given(adminRequestSpecification).get(CURRENCY_RATES.value) checkResponseStatusCode(response) decode(response.body.asString(), CurrencyRatesResponse) @@ -284,14 +284,14 @@ class PrebidServerService implements ObjectMapperWrapper { String sendLoggingHttpInteractionRequest(HttpInteractionRequest httpInteractionRequest) { def response = given(adminRequestSpecification).queryParams(toMap(httpInteractionRequest)) - .get(HTTP_INTERACTION_ENDPOINT) + .get(HTTP_INTERACTION.value) checkResponseStatusCode(response) response.body().asString() } Map sendCollectedMetricsRequest() { - def response = given(adminRequestSpecification).get(COLLECTED_METRICS_ENDPOINT) + def response = given(adminRequestSpecification).get(COLLECTED_METRICS.value) checkResponseStatusCode(response) decode(response.asString(), new TypeReference>() {}) @@ -301,14 +301,14 @@ class PrebidServerService implements ObjectMapperWrapper { def response = given(influxRequestSpecification) .queryParams(["db": influxdbContainer.getDatabase(), "q" : "SELECT COUNT(count) FROM /.*/ WHERE count >= 1 GROUP BY \"measurement\""]) - .get(INFLUX_DB_ENDPOINT) + .get(INFLUX_DB.value) checkResponseStatusCode(response) collectInToMap(decode(response.getBody().asString(), InfluxResponse)) } String sendPrometheusMetricsRequest() { - def response = given(prometheusRequestSpecification).get(PROMETHEUS_METRICS_ENDPOINT) + def response = given(prometheusRequestSpecification).get(PROMETHEUS_METRICS.value) checkResponseStatusCode(response) response.body().asString() @@ -324,7 +324,7 @@ class PrebidServerService implements ObjectMapperWrapper { given(requestSpecification).headers(headers) .body(payload) - .post(AUCTION_ENDPOINT) + .post(AUCTION.value) } private Response postCookieSync(CookieSyncRequest cookieSyncRequest, @@ -355,7 +355,7 @@ class PrebidServerService implements ObjectMapperWrapper { requestSpecification.headers(headers) } - requestSpecification.post(COOKIE_SYNC_ENDPOINT) + requestSpecification.post(COOKIE_SYNC.value) } private Response getAmp(AmpRequest ampRequest, @@ -369,7 +369,7 @@ class PrebidServerService implements ObjectMapperWrapper { given(requestSpecification).headers(headers) .queryParams(map) - .get(AMP_ENDPOINT) + .get(AMP.value) } private void checkResponseStatusCode(Response response, int statusCode = 200) { diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/container/PrebidServerContainer.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/container/PrebidServerContainer.groovy index 70509252af6..94b786fd634 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/container/PrebidServerContainer.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/container/PrebidServerContainer.groovy @@ -7,6 +7,7 @@ import org.testcontainers.containers.GenericContainer import org.testcontainers.containers.wait.strategy.Wait import org.testcontainers.images.builder.Transferable +import static org.prebid.server.functional.model.config.Endpoint.STATUS import static org.prebid.server.functional.testcontainers.PbsConfig.DEFAULT_ENV class PrebidServerContainer extends GenericContainer { @@ -29,7 +30,7 @@ class PrebidServerContainer extends GenericContainer { withExposedPorts(PORT, DEBUG_PORT, ADMIN_PORT, PROMETHEUS_PORT) withFixedPorts() withStartupAttempts(3) - waitingFor(Wait.forHttp("/status") + waitingFor(Wait.forHttp(STATUS.value) .forPort(PORT) .forStatusCode(200)) withDebug() diff --git a/src/test/groovy/org/prebid/server/functional/tests/AuctionSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/AuctionSpec.groovy index 1506e2e0a4d..c3a0a77d7ce 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/AuctionSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/AuctionSpec.groovy @@ -34,6 +34,7 @@ import static org.prebid.server.functional.model.bidder.BidderName.ALIAS import static org.prebid.server.functional.model.bidder.BidderName.APPNEXUS import static org.prebid.server.functional.model.bidder.BidderName.GENERIC import static org.prebid.server.functional.model.bidder.BidderName.GENERIC_CAMEL_CASE +import static org.prebid.server.functional.model.config.Endpoint.AUCTION import static org.prebid.server.functional.model.response.auction.ErrorType.PREBID import static org.prebid.server.functional.model.response.cookiesync.UserSyncInfo.Type.REDIRECT import static org.prebid.server.functional.testcontainers.Dependencies.networkServiceContainer @@ -329,7 +330,7 @@ class AuctionSpec extends BaseSpec { then: "BidderRequest should contain endpoint in ext.prebid.server.endpoint instead of ext.prebid.pbs.endpoint" def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest?.ext?.prebid?.server?.endpoint == "/openrtb2/auction" + assert bidderRequest?.ext?.prebid?.server?.endpoint == AUCTION.value assert !bidderRequest?.ext?.prebid?.pbs?.endpoint and: "BidderRequest shouldn't populate fields" diff --git a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy index 220585f008f..f874077f1fa 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy @@ -3,6 +3,7 @@ package org.prebid.server.functional.tests import org.prebid.server.functional.model.bidder.AppNexus import org.prebid.server.functional.model.bidder.BidderName import org.prebid.server.functional.model.bidder.Generic +import org.prebid.server.functional.model.config.Endpoint import org.prebid.server.functional.model.db.Account import org.prebid.server.functional.model.db.StoredImp import org.prebid.server.functional.model.db.StoredRequest @@ -145,7 +146,7 @@ class BidderParamsSpec extends BaseSpec { then: "vast xml is modified" def prebidCacheRequest = prebidCache.getXmlRecordedRequestsBody(payload) assert prebidCacheRequest.size() == 1 - assert prebidCacheRequest.first().contains("/event?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") + assert prebidCacheRequest.first().contains("${Endpoint.EVENT}?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") cleanup: "Stop and remove pbs container" pbsServiceFactory.removeContainer(pbsConfig) @@ -177,7 +178,7 @@ class BidderParamsSpec extends BaseSpec { then: "vast xml is not modified" def prebidCacheRequest = prebidCache.getXmlRecordedRequestsBody(payload) assert prebidCacheRequest.size() == 1 - assert !prebidCacheRequest.first().contains("/event?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") + assert !prebidCacheRequest.first().contains("${Endpoint.EVENT}?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") cleanup: "Stop and remove pbs container" pbsServiceFactory.removeContainer(pbsConfig) diff --git a/src/test/groovy/org/prebid/server/functional/tests/CacheVtrackSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/CacheVtrackSpec.groovy index e5637fe80e2..8f817643571 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/CacheVtrackSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/CacheVtrackSpec.groovy @@ -5,6 +5,7 @@ import org.prebid.server.functional.model.config.AccountCacheConfig import org.prebid.server.functional.model.config.AccountConfig import org.prebid.server.functional.model.config.AccountEventsConfig import org.prebid.server.functional.model.config.AccountVtrackConfig +import org.prebid.server.functional.model.config.Endpoint import org.prebid.server.functional.model.db.Account import org.prebid.server.functional.model.request.vtrack.VtrackRequest import org.prebid.server.functional.model.request.vtrack.xml.Vast @@ -89,7 +90,7 @@ class CacheVtrackSpec extends BaseSpec { then: "Vast xml is modified" def prebidCacheRequest = prebidCache.getXmlRecordedRequestsBody(payload) assert prebidCacheRequest.size() == 1 - assert prebidCacheRequest[0].contains("/event?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") + assert prebidCacheRequest[0].contains("${Endpoint.EVENT}?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") and: "prebid_cache.creative_size.xml metric should be updated" def metrics = defaultPbsService.sendCollectedMetricsRequest() diff --git a/src/test/groovy/org/prebid/server/functional/tests/HttpSettingsSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/HttpSettingsSpec.groovy index 4a0229122b6..288db8d3208 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/HttpSettingsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/HttpSettingsSpec.groovy @@ -1,6 +1,7 @@ package org.prebid.server.functional.tests import org.prebid.server.functional.model.UidsCookie +import org.prebid.server.functional.model.config.Endpoint import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.mock.services.httpsettings.HttpAccountsResponse import org.prebid.server.functional.model.request.amp.AmpRequest @@ -282,7 +283,7 @@ class HttpSettingsSpec extends BaseSpec { and: "VastXml that was send to PrebidCache must contain event url" def prebidCacheRequest = prebidCache.getXmlRecordedRequestsBody(payload)[0] - assert prebidCacheRequest.contains("/event?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") + assert prebidCacheRequest.contains("${Endpoint.EVENT}?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") } def "PBS should take account information from http data source on vtrack request when rfc3986 enabled"() { @@ -307,7 +308,7 @@ class HttpSettingsSpec extends BaseSpec { and: "VastXml that was send to PrebidCache must contain event url" def prebidCacheRequest = prebidCache.getXmlRecordedRequestsBody(payload)[0] - assert prebidCacheRequest.contains("/event?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") + assert prebidCacheRequest.contains("${Endpoint.EVENT}?t=imp&b=${request.puts[0].bidid}&a=$accountId&bidder=${request.puts[0].bidder}") } def "PBS should return error if account settings isn't found"() { diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/AbTestingModuleSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/AbTestingModuleSpec.groovy index 1582f3b200d..09fe086a4bc 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/AbTestingModuleSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/AbTestingModuleSpec.groovy @@ -16,7 +16,7 @@ import org.prebid.server.functional.service.PrebidServerService import org.prebid.server.functional.util.PBSUtils import static org.prebid.server.functional.model.ModuleName.PB_RESPONSE_CORRECTION -import static org.prebid.server.functional.model.config.Endpoint.OPENRTB2_AUCTION +import static org.prebid.server.functional.model.config.HookHttpEndpoint.AUCTION import static org.prebid.server.functional.model.config.ModuleHookImplementation.ORTB2_BLOCKING_BIDDER_REQUEST import static org.prebid.server.functional.model.config.ModuleHookImplementation.ORTB2_BLOCKING_RAW_BIDDER_RESPONSE import static org.prebid.server.functional.model.config.ModuleHookImplementation.RESPONSE_CORRECTION_ALL_PROCESSED_RESPONSES @@ -67,7 +67,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def abTest = AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { enabled = false } - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { it.abTests = [abTest] } def accountConfig = new AccountConfig(hooks: new AccountHooksConfiguration(executionPlan: executionPlan)) @@ -110,7 +110,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(prebidServerService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code)] } def accountConfig = new AccountConfig(hooks: new AccountHooksConfiguration(executionPlan: executionPlan)) @@ -153,7 +153,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(moduleName)] } def accountConfig = new AccountConfig(hooks: new AccountHooksConfiguration(executionPlan: executionPlan)) @@ -201,7 +201,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def richMediaAbTestConfig = AbTest.getDefault(PB_RESPONSE_CORRECTION.code).tap { it.percentActive = MAX_PERCENT_AB } - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [ortb2AbTestConfig, richMediaAbTestConfig] } def accountConfig = new AccountConfig(hooks: new AccountHooksConfiguration(executionPlan: executionPlan)) @@ -262,7 +262,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def richMediaAbTestConfig = AbTest.getDefault(PB_RESPONSE_CORRECTION.code).tap { it.percentActive = MIN_PERCENT_AB } - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [ortb2AbTestConfig, richMediaAbTestConfig] } def accountConfig = new AccountConfig(hooks: new AccountHooksConfiguration(executionPlan: executionPlan)) @@ -323,7 +323,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def richMediaAbTestConfig = AbTest.getDefault(PB_RESPONSE_CORRECTION.code).tap { it.percentActive = MAX_PERCENT_AB } - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [ortb2AbTestConfig, richMediaAbTestConfig] } def accountConfig = new AccountConfig(hooks: new AccountHooksConfiguration(executionPlan: executionPlan)) @@ -376,7 +376,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code, [PBSUtils.randomNumber]).tap { percentActive = MIN_PERCENT_AB }] @@ -413,7 +413,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { it.percentActive = percentActive it.percentActiveSnakeCase = percentActiveSnakeCase @@ -462,7 +462,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { it.percentActive = percentActive it.percentActiveSnakeCase = percentActiveSnakeCase @@ -505,7 +505,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { it.percentActive = percentActive it.percentActiveSnakeCase = percentActiveSnakeCase @@ -552,7 +552,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { it.percentActive = percentActive it.percentActiveSnakeCase = percentActiveSnakeCase @@ -605,7 +605,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { percentActive = MIN_PERCENT_AB it.logAnalyticsTag = logAnalyticsTag @@ -650,7 +650,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { percentActive = MIN_PERCENT_AB it.logAnalyticsTag = logAnalyticsTag @@ -693,7 +693,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { percentActive = MAX_PERCENT_AB it.logAnalyticsTag = logAnalyticsTag @@ -741,7 +741,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(ortbModulePbsService) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { percentActive = PBSUtils.getRandomNumber(MIN_PERCENT_AB, MAX_PERCENT_AB) }] @@ -771,7 +771,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def "PBS should apply a/b test config from host config when accounts is not specified when account config and default account doesn't include a/b test config"() { given: "PBS service with specific ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code, accouns).tap { percentActive = MIN_PERCENT_AB }] @@ -831,7 +831,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def "PBS should apply a/b test config from host config for specific accounts and only specified module when account config and default account doesn't include a/b test config"() { given: "PBS service with specific ab test config" def accountId = PBSUtils.randomNumber - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code, [PBSUtils.randomNumber, accountId]).tap { percentActive = MIN_PERCENT_AB }] @@ -897,7 +897,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def richMediaAbTestConfig = AbTest.getDefault(PB_RESPONSE_CORRECTION.code, [accountId]).tap { it.percentActive = MIN_PERCENT_AB } - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [ortb2AbTestConfig, richMediaAbTestConfig] } def pbsConfig = MULTI_MODULE_CONFIG + ['hooks.host-execution-plan': encode(executionPlan)] @@ -957,7 +957,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def "PBS shouldn't apply a/b test config from host config for non specified accounts when account config and default account doesn't include a/b test config"() { given: "PBS service with specific ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code, [PBSUtils.randomNumber]).tap { percentActive = MIN_PERCENT_AB }] @@ -1019,7 +1019,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def "PBS should prioritise a/b test config from default account and only specified module when host and default account contains a/b test configs"() { given: "PBS service with specific ab test config" - def accountExecutionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def accountExecutionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { percentActive = MIN_PERCENT_AB }] @@ -1028,7 +1028,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { hooks = new AccountHooksConfiguration(executionPlan: accountExecutionPlan) } - def hostExecutionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def hostExecutionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code)] } def pbsConfig = MULTI_MODULE_CONFIG + ['hooks.host-execution-plan': encode(hostExecutionPlan)] + ["settings.default-account-config": encode(defaultAccountConfigSettings)] @@ -1099,7 +1099,7 @@ class AbTestingModuleSpec extends ModuleBaseSpec { flushMetrics(pbsServiceWithMultipleModules) and: "Save account with ab test config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES).tap { + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { abTests = [AbTest.getDefault(ModuleName.ORTB2_BLOCKING.code).tap { percentActive = MIN_PERCENT_AB }] diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy index 23316766a7d..17293457ee3 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy @@ -13,12 +13,20 @@ import org.prebid.server.functional.model.db.Account import org.prebid.server.functional.model.request.auction.RichmediaFilter import org.prebid.server.functional.model.request.auction.TraceLevel import org.prebid.server.functional.model.response.auction.InvocationResult +import org.prebid.server.functional.service.PrebidServerException import org.prebid.server.functional.service.PrebidServerService import org.prebid.server.functional.util.PBSUtils +import spock.lang.IgnoreRest +import java.time.Instant + +import static io.netty.handler.codec.http.HttpResponseStatus.UNAUTHORIZED +import static org.prebid.server.functional.model.AccountStatus.ACTIVE import static org.prebid.server.functional.model.ModuleName.ORTB2_BLOCKING import static org.prebid.server.functional.model.ModuleName.PB_RICHMEDIA_FILTER -import static org.prebid.server.functional.model.config.Endpoint.OPENRTB2_AUCTION +import static org.prebid.server.functional.model.config.HookHttpEndpoint.AUCTION +import static org.prebid.server.functional.model.config.HookHttpEndpoint.AUCTION_GET +import static org.prebid.server.functional.model.config.HookHttpEndpoint.AUCTION_POST import static org.prebid.server.functional.model.config.ModuleHookImplementation.ORTB2_BLOCKING_BIDDER_REQUEST import static org.prebid.server.functional.model.config.ModuleHookImplementation.ORTB2_BLOCKING_RAW_BIDDER_RESPONSE import static org.prebid.server.functional.model.config.ModuleHookImplementation.PB_RICHMEDIA_FILTER_ALL_PROCESSED_RESPONSES @@ -41,9 +49,11 @@ class GeneralModuleSpec extends ModuleBaseSpec { (RAW_BIDDER_RESPONSE): [ORTB2_BLOCKING]] private final static Map> RESPONSE_STAGES = [(ALL_PROCESSED_BID_RESPONSES): [PB_RICHMEDIA_FILTER]] private final static Map> MODULES_STAGES = ORTB_STAGES + RESPONSE_STAGES + private final static ExecutionPlan GLOBAL_EXECUTION_PLAN = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES) private final static Map MULTI_MODULE_CONFIG = getRichMediaFilterSettings(PBSUtils.randomString) + getOrtb2BlockingSettings() + - ['hooks.host-execution-plan': encode(ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, MODULES_STAGES))] + ['settings.enforce-valid-account': 'true', + 'hooks.host-execution-plan' : encode(GLOBAL_EXECUTION_PLAN)] private static final PrebidServerService pbsServiceWithMultipleModule = pbsServiceFactory.getService(MULTI_MODULE_CONFIG + DISABLED_INVOKE_CONFIG) private static final PrebidServerService pbsServiceWithMultipleModuleWithRequireInvoke = pbsServiceFactory.getService(MULTI_MODULE_CONFIG + ENABLED_INVOKE_CONFIG) @@ -155,6 +165,10 @@ class GeneralModuleSpec extends ModuleBaseSpec { and: "Flush metrics" flushMetrics(pbsServiceWithMultipleModules) + and: "Save base active account" + def account = new Account(uuid: bidRequest.getAccountId(), status: ACTIVE) + accountDao.save(account) + when: "PBS processes auction request" def response = pbsServiceWithMultipleModules.sendAuctionRequest(bidRequest) @@ -311,6 +325,10 @@ class GeneralModuleSpec extends ModuleBaseSpec { and: "Flush metrics" flushMetrics(pbsServiceWithMultipleModules) + and: "Save base active account" + def account = new Account(uuid: bidRequest.getAccountId(), status: ACTIVE) + accountDao.save(account) + when: "PBS processes auction request" def response = pbsServiceWithMultipleModules.sendAuctionRequest(bidRequest) @@ -346,6 +364,10 @@ class GeneralModuleSpec extends ModuleBaseSpec { and: "Flush metrics" flushMetrics(pbsServiceWithMultipleModules) + and: "Save account without modules config" + def account = new Account(uuid: bidRequest.getAccountId(), status: ACTIVE) + accountDao.save(account) + when: "PBS processes auction request" def response = pbsServiceWithMultipleModules.sendAuctionRequest(bidRequest) @@ -369,7 +391,7 @@ class GeneralModuleSpec extends ModuleBaseSpec { hooks = new AccountHooksConfiguration(admin: new AdminConfig(moduleExecution: [(ORTB2_BLOCKING): true])) } def pbsConfig = MULTI_MODULE_CONFIG + ENABLED_INVOKE_CONFIG + ["settings.default-account-config": encode(defaultAccountConfigSettings)] + - [("hooks.admin.module-execution.${ORTB2_BLOCKING.code}".toString()): 'false'] + [("hooks.admin.module-execution.${ORTB2_BLOCKING.code}".toString()): 'false'] def pbsServiceWithMultipleModules = pbsServiceFactory.getService(pbsConfig) and: "Default bid request with verbose trace" @@ -534,4 +556,91 @@ class GeneralModuleSpec extends ModuleBaseSpec { cleanup: "Stop and remove pbs container" pbsServiceFactory.removeContainer(pbsConfig) } + + def "PBS should merge account level config without any errors when config contains proper request methods"() { + given: "Test start time" + def startTime = Instant.now() + + and: "Default bid request with verbose trace" + def bidRequest = defaultBidRequest.tap { + ext.prebid.trace = TraceLevel.VERBOSE + } + + and: "Save account without modules config" + def pbsModulesConfig = new PbsModulesConfig(pbRichmediaFilter: new RichmediaFilter(filterMraid: true), ortb2Blocking: new Ortb2BlockingConfig()) + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(endpoint, RESPONSE_STAGES) + def accountConfig = new AccountConfig(hooks: new AccountHooksConfiguration(executionPlan: executionPlan, modules: pbsModulesConfig)) + def account = new Account(uuid: bidRequest.getAccountId(), config: accountConfig) + accountDao.save(account) + + and: "Flush metrics" + flushMetrics(pbsServiceWithMultipleModule) + + when: "PBS processes auction request" + def response = pbsServiceWithMultipleModule.sendAuctionRequest(bidRequest) + + then: "PBS response should include trace information about called modules" + def modulesCodes = GLOBAL_EXECUTION_PLAN.listOfModuleCodes + executionPlan.listOfModuleCodes + verifyAll(response?.ext?.prebid?.modules?.trace?.stages?.outcomes?.groups?.invocationResults?.flatten() as List) { + it.status == [SUCCESS] * modulesCodes.size() + it.action == [NO_ACTION] * modulesCodes.size() + it.hookId.moduleCode.sort() == modulesCodes.sort() + } + + and: "Ortb2blocking module call metrics should be updated" + def metrics = pbsServiceWithMultipleModule.sendCollectedMetricsRequest() + assert metrics[CALL_METRIC.formatted(ORTB2_BLOCKING.code, BIDDER_REQUEST.metricValue, ORTB2_BLOCKING_BIDDER_REQUEST.code)] == 1 + assert metrics[CALL_METRIC.formatted(ORTB2_BLOCKING.code, RAW_BIDDER_RESPONSE.metricValue, ORTB2_BLOCKING_RAW_BIDDER_RESPONSE.code)] == 1 + assert metrics[NOOP_METRIC.formatted(ORTB2_BLOCKING.code, BIDDER_REQUEST.metricValue, ORTB2_BLOCKING_BIDDER_REQUEST.code)] == 1 + assert metrics[NOOP_METRIC.formatted(ORTB2_BLOCKING.code, RAW_BIDDER_RESPONSE.metricValue, ORTB2_BLOCKING_RAW_BIDDER_RESPONSE.code)] == 1 + + and: "RB-Richmedia-Filter module call metrics should be updated" + def richmediaCounts = modulesCodes.count(PB_RICHMEDIA_FILTER.code) + assert metrics[CALL_METRIC.formatted(PB_RICHMEDIA_FILTER.code, ALL_PROCESSED_BID_RESPONSES.metricValue, PB_RICHMEDIA_FILTER_ALL_PROCESSED_RESPONSES.code)] == richmediaCounts + assert metrics[NOOP_METRIC.formatted(PB_RICHMEDIA_FILTER.code, ALL_PROCESSED_BID_RESPONSES.metricValue, PB_RICHMEDIA_FILTER_ALL_PROCESSED_RESPONSES.code)] == richmediaCounts + + and: "Response shouldn't contain warnings and errors" + assert !response.ext?.warnings + assert !response.ext?.errors + + and: "PBS log should contain message" + def logs = pbsServiceWithMultipleModule.getLogsByTime(startTime) + assert !getLogsByText(logs, "Cannot deserialize value of type `org.prebid.server.hooks.execution.model.HookHttpEndpoint` " + + "from String \"${AUCTION_GET}\": not one of the values accepted for Enum class").size() + + where: + endpoint << [AUCTION, AUCTION_POST] + } + + def "PBS should merge account level config and emit error when config contains invalid request methods"() { + given: "Test start time" + def startTime = Instant.now() + + and: "Default bid request with verbose trace" + def bidRequest = defaultBidRequest.tap { + ext.prebid.trace = TraceLevel.VERBOSE + } + + and: "Save account without modules config" + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION_GET, MODULES_STAGES) + def accountConfig = new AccountConfig(hooks: new AccountHooksConfiguration(executionPlan: executionPlan)) + def account = new Account(uuid: bidRequest.getAccountId(), config: accountConfig) + accountDao.save(account) + + and: "Flush metrics" + flushMetrics(pbsServiceWithMultipleModule) + + when: "PBS processes auction request" + pbsServiceWithMultipleModule.sendAuctionRequest(bidRequest) + + then: "PBS response should include trace information about called modules" + def exception = thrown(PrebidServerException) + assert exception.statusCode == UNAUTHORIZED.code() + assert exception.responseBody == "Unauthorized account id: ${account.uuid}" + + and: "PBS log should contain message" + def logs = pbsServiceWithMultipleModule.getLogsByTime(startTime) + assert getLogsByText(logs, "Cannot deserialize value of type `org.prebid.server.hooks.execution.model.HookHttpEndpoint` " + + "from String \"${AUCTION_GET}\": not one of the values accepted for Enum class").size() == 1 + } } diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/ModuleBaseSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/ModuleBaseSpec.groovy index c0933a238e7..c258208adf8 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/ModuleBaseSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/ModuleBaseSpec.groovy @@ -1,11 +1,10 @@ package org.prebid.server.functional.tests.module -import org.prebid.server.functional.model.config.Endpoint import org.prebid.server.functional.model.config.ExecutionPlan +import org.prebid.server.functional.model.config.HookHttpEndpoint import org.prebid.server.functional.model.config.Stage import org.prebid.server.functional.model.response.auction.AnalyticResult import org.prebid.server.functional.model.response.auction.BidResponse -import org.prebid.server.functional.model.response.auction.InvocationResult import org.prebid.server.functional.tests.BaseSpec import org.prebid.server.functional.util.PBSUtils @@ -15,7 +14,7 @@ import static org.prebid.server.functional.model.ModuleName.PB_RESPONSE_CORRECTI import static org.prebid.server.functional.model.ModuleName.PB_RICHMEDIA_FILTER import static org.prebid.server.functional.model.ModuleName.PB_REQUEST_CORRECTION import static org.prebid.server.functional.model.ModuleName.PB_RULE_ENGINE -import static org.prebid.server.functional.model.config.Endpoint.OPENRTB2_AUCTION +import static org.prebid.server.functional.model.config.HookHttpEndpoint.AUCTION import static org.prebid.server.functional.model.config.Stage.ALL_PROCESSED_BID_RESPONSES import static org.prebid.server.functional.model.config.Stage.PROCESSED_AUCTION_REQUEST import static org.prebid.server.functional.testcontainers.Dependencies.getNetworkServiceContainer @@ -33,7 +32,7 @@ class ModuleBaseSpec extends BaseSpec { repository.removeAllDatabaseData() } - protected static Map getResponseCorrectionConfig(Endpoint endpoint = OPENRTB2_AUCTION) { + protected static Map getResponseCorrectionConfig(HookHttpEndpoint endpoint = AUCTION) { ["hooks.${PB_RESPONSE_CORRECTION.code}.enabled": true, "hooks.host-execution-plan" : encode(ExecutionPlan.getSingleEndpointExecutionPlan(endpoint, [(ALL_PROCESSED_BID_RESPONSES): [PB_RESPONSE_CORRECTION]]))] .collectEntries { key, value -> [(key.toString()): value.toString()] } @@ -41,7 +40,7 @@ class ModuleBaseSpec extends BaseSpec { protected static Map getRichMediaFilterSettings(String scriptPattern, Boolean filterMraidEnabled = true, - Endpoint endpoint = OPENRTB2_AUCTION) { + HookHttpEndpoint endpoint = AUCTION) { ["hooks.${PB_RICHMEDIA_FILTER.code}.enabled" : true, "hooks.modules.${PB_RICHMEDIA_FILTER.code}.mraid-script-pattern": scriptPattern, @@ -59,7 +58,7 @@ class ModuleBaseSpec extends BaseSpec { .collectEntries { key, value -> [(key.toString()): value.toString()] } } - protected static Map getOptableTargetingSettings(boolean isEnabled = true, Endpoint endpoint = OPENRTB2_AUCTION) { + protected static Map getOptableTargetingSettings(boolean isEnabled = true, HookHttpEndpoint endpoint = AUCTION) { ["hooks.${OPTABLE_TARGETING.code}.enabled": isEnabled as String, "hooks.modules.${OPTABLE_TARGETING.code}.api-endpoint" : "$networkServiceContainer.rootUri/stored-cache".toString(), "hooks.modules.${OPTABLE_TARGETING.code}.tenant" : PBSUtils.randomString, @@ -72,12 +71,12 @@ class ModuleBaseSpec extends BaseSpec { ["hooks.${ORTB2_BLOCKING.code}.enabled": isEnabled as String] } - protected static Map getRequestCorrectionSettings(Endpoint endpoint = OPENRTB2_AUCTION, Stage stage = PROCESSED_AUCTION_REQUEST) { + protected static Map getRequestCorrectionSettings(HookHttpEndpoint endpoint = AUCTION, Stage stage = PROCESSED_AUCTION_REQUEST) { ["hooks.${PB_REQUEST_CORRECTION.code}.enabled": "true", "hooks.host-execution-plan" : encode(ExecutionPlan.getSingleEndpointExecutionPlan(endpoint, PB_REQUEST_CORRECTION, [stage]))] } - protected static Map getRulesEngineSettings(Endpoint endpoint = OPENRTB2_AUCTION, Stage stage = PROCESSED_AUCTION_REQUEST) { + protected static Map getRulesEngineSettings(HookHttpEndpoint endpoint = AUCTION, Stage stage = PROCESSED_AUCTION_REQUEST) { ["hooks.${PB_RULE_ENGINE.code}.enabled" : "true", "hooks.${PB_RULE_ENGINE.code}.rule-cache.expire-after-minutes" : "10000", "hooks.${PB_RULE_ENGINE.code}.rule-cache.max-size" : "20000", diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/analyticstag/AnalyticsTagsModuleSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/analyticstag/AnalyticsTagsModuleSpec.groovy index 82355a47996..df9ea9dbac9 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/analyticstag/AnalyticsTagsModuleSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/analyticstag/AnalyticsTagsModuleSpec.groovy @@ -22,7 +22,7 @@ import org.prebid.server.functional.util.PBSUtils import static org.prebid.server.functional.model.ModuleName.ORTB2_BLOCKING import static org.prebid.server.functional.model.ModuleName.PB_RICHMEDIA_FILTER import static org.prebid.server.functional.model.bidder.BidderName.GENERIC -import static org.prebid.server.functional.model.config.Endpoint.OPENRTB2_AUCTION +import static org.prebid.server.functional.model.config.HookHttpEndpoint.AUCTION import static org.prebid.server.functional.model.config.Stage.ALL_PROCESSED_BID_RESPONSES import static org.prebid.server.functional.model.config.Stage.RAW_BIDDER_RESPONSE import static org.prebid.server.functional.model.request.auction.TraceLevel.VERBOSE @@ -43,7 +43,7 @@ class AnalyticsTagsModuleSpec extends ModuleBaseSpec { } and: "Account in the DB" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) def hooksConfiguration = new AccountHooksConfiguration(executionPlan: executionPlan) def accountConfig = new AccountConfig(hooks: hooksConfiguration, analytics: new AccountAnalyticsConfig(allowClientDetails: true)) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -122,7 +122,7 @@ class AnalyticsTagsModuleSpec extends ModuleBaseSpec { def "PBS should include analytics tag in response when request and default account allow client details"() { given: "Default account with module config" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) def hooksConfiguration = new AccountHooksConfiguration(executionPlan: executionPlan) def accountConfig = new AccountConfig(hooks: hooksConfiguration, analytics: new AccountAnalyticsConfig(allowClientDetails: true)) @@ -161,7 +161,7 @@ class AnalyticsTagsModuleSpec extends ModuleBaseSpec { def "PBS should include analytics tag in response when request and account allow client details but default doesn't"() { given: "Default account with module config" - def defaultExecutionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) + def defaultExecutionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) def defaultHooksConfiguration = new AccountHooksConfiguration(executionPlan: defaultExecutionPlan) def defaultAccountConfig = new AccountConfig(hooks: defaultHooksConfiguration, analytics: new AccountAnalyticsConfig(allowClientDetails: false)) @@ -175,7 +175,7 @@ class AnalyticsTagsModuleSpec extends ModuleBaseSpec { } and: "Account in the DB" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) def hooksConfiguration = new AccountHooksConfiguration(executionPlan: executionPlan) def accountConfig = new AccountConfig(hooks: hooksConfiguration, analytics: new AccountAnalyticsConfig(allowClientDetails: true)) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -212,7 +212,7 @@ class AnalyticsTagsModuleSpec extends ModuleBaseSpec { } and: "Account in the DB" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) def hooksConfiguration = new AccountHooksConfiguration(executionPlan: executionPlan) def accountConfig = new AccountConfig(hooks: hooksConfiguration, analytics: new AccountAnalyticsConfig(allowClientDetails: true)) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -235,7 +235,7 @@ class AnalyticsTagsModuleSpec extends ModuleBaseSpec { } and: "Account in the DB" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) def hooksConfiguration = new AccountHooksConfiguration(executionPlan: executionPlan) def accountConfig = new AccountConfig(hooks: hooksConfiguration, analytics: new AccountAnalyticsConfig(allowClientDetails: true)) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -258,7 +258,7 @@ class AnalyticsTagsModuleSpec extends ModuleBaseSpec { } and: "Account in the DB" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) def hooksConfiguration = new AccountHooksConfiguration(executionPlan: executionPlan) def accountConfig = new AccountConfig(hooks: hooksConfiguration, analytics: new AccountAnalyticsConfig(allowClientDetails: false)) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -282,7 +282,7 @@ class AnalyticsTagsModuleSpec extends ModuleBaseSpec { } and: "Account in the DB" - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB2_BLOCKING, [RAW_BIDDER_RESPONSE]) def hooksConfiguration = new AccountHooksConfiguration(executionPlan: executionPlan) def accountConfig = new AccountConfig(hooks: hooksConfiguration, analytics: new AccountAnalyticsConfig(allowClientDetails: false)) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/ortb2blocking/Ortb2BlockingSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/ortb2blocking/Ortb2BlockingSpec.groovy index a7a97bc8816..512f9fa3100 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/ortb2blocking/Ortb2BlockingSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/ortb2blocking/Ortb2BlockingSpec.groovy @@ -27,7 +27,6 @@ import org.prebid.server.functional.model.response.auction.Adm import org.prebid.server.functional.model.response.auction.Bid import org.prebid.server.functional.model.response.auction.BidMediaType import org.prebid.server.functional.model.response.auction.BidResponse -import org.prebid.server.functional.model.response.auction.ErrorType import org.prebid.server.functional.model.response.auction.MediaType import org.prebid.server.functional.model.response.auction.SeatBid import org.prebid.server.functional.service.PrebidServerService @@ -38,7 +37,7 @@ import static org.prebid.server.functional.model.ModuleName.ORTB2_BLOCKING import static org.prebid.server.functional.model.bidder.BidderName.ALIAS import static org.prebid.server.functional.model.bidder.BidderName.GENERIC import static org.prebid.server.functional.model.bidder.BidderName.IX -import static org.prebid.server.functional.model.config.Endpoint.OPENRTB2_AUCTION +import static org.prebid.server.functional.model.config.HookHttpEndpoint.AUCTION import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.AUDIO_BATTR import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BADV import static org.prebid.server.functional.model.config.Ortb2BlockingAttribute.BAPP @@ -1532,7 +1531,7 @@ class Ortb2BlockingSpec extends ModuleBaseSpec { private static Account getAccountWithOrtb2BlockingConfig(String accountId, Map attributes) { def blockingConfig = new Ortb2BlockingConfig(attributes: attributes) - def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, ORTB2_BLOCKING, [BIDDER_REQUEST, RAW_BIDDER_RESPONSE]) + def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, ORTB2_BLOCKING, [BIDDER_REQUEST, RAW_BIDDER_RESPONSE]) def moduleConfig = new PbsModulesConfig(ortb2Blocking: blockingConfig) def accountHooksConfig = new AccountHooksConfiguration(executionPlan: executionPlan, modules: moduleConfig) def accountConfig = new AccountConfig(hooks: accountHooksConfig) diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/richmedia/RichMediaFilterSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/richmedia/RichMediaFilterSpec.groovy index 517da393668..8f8de7077dd 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/richmedia/RichMediaFilterSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/richmedia/RichMediaFilterSpec.groovy @@ -19,7 +19,7 @@ import org.prebid.server.functional.util.PBSUtils import static org.prebid.server.functional.model.response.auction.BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE import static org.prebid.server.functional.model.ModuleName.PB_RICHMEDIA_FILTER import static org.prebid.server.functional.model.bidder.BidderName.GENERIC -import static org.prebid.server.functional.model.config.Endpoint.OPENRTB2_AUCTION +import static org.prebid.server.functional.model.config.Endpoint.AUCTION import static org.prebid.server.functional.model.config.Stage.ALL_PROCESSED_BID_RESPONSES import static org.prebid.server.functional.model.request.auction.TraceLevel.VERBOSE @@ -30,7 +30,7 @@ class RichMediaFilterSpec extends ModuleBaseSpec { private static final Map DISABLED_FILTER_SPECIFIC_PATTERN_NAME_CONFIG = getRichMediaFilterSettings(PATTERN_NAME, false) private static final Map SPECIFIC_PATTERN_NAME_CONFIG = getRichMediaFilterSettings(PATTERN_NAME) private static final Map SNAKE_SPECIFIC_PATTERN_NAME_CONFIG = (getRichMediaFilterSettings(PATTERN_NAME) + - ["hooks.host-execution-plan": encode(ExecutionPlan.getSingleEndpointExecutionPlan(OPENRTB2_AUCTION, PB_RICHMEDIA_FILTER, [ALL_PROCESSED_BID_RESPONSES]).tap { + ["hooks.host-execution-plan": encode(ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, PB_RICHMEDIA_FILTER, [ALL_PROCESSED_BID_RESPONSES]).tap { endpoints.values().first().stages.values().first().groups.first.hookSequenceSnakeCase = [new HookId(moduleCodeSnakeCase: PB_RICHMEDIA_FILTER.code, hookImplCodeSnakeCase: "${PB_RICHMEDIA_FILTER.code}-${ALL_PROCESSED_BID_RESPONSES.value}-hook")] })]).collectEntries { key, value -> [(key.toString()): value.toString()] } From 3a4586686b339c290953322fae458e27fc1768d0 Mon Sep 17 00:00:00 2001 From: osulzhenko Date: Thu, 26 Feb 2026 13:09:27 +0200 Subject: [PATCH 4/8] update after review --- .../server/functional/tests/module/GeneralModuleSpec.groovy | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy index 17293457ee3..0d227797603 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy @@ -16,7 +16,6 @@ import org.prebid.server.functional.model.response.auction.InvocationResult import org.prebid.server.functional.service.PrebidServerException import org.prebid.server.functional.service.PrebidServerService import org.prebid.server.functional.util.PBSUtils -import spock.lang.IgnoreRest import java.time.Instant @@ -603,7 +602,7 @@ class GeneralModuleSpec extends ModuleBaseSpec { assert !response.ext?.warnings assert !response.ext?.errors - and: "PBS log should contain message" + and: "PBS log should not contain deserialization error messages" def logs = pbsServiceWithMultipleModule.getLogsByTime(startTime) assert !getLogsByText(logs, "Cannot deserialize value of type `org.prebid.server.hooks.execution.model.HookHttpEndpoint` " + "from String \"${AUCTION_GET}\": not one of the values accepted for Enum class").size() @@ -633,7 +632,7 @@ class GeneralModuleSpec extends ModuleBaseSpec { when: "PBS processes auction request" pbsServiceWithMultipleModule.sendAuctionRequest(bidRequest) - then: "PBS response should include trace information about called modules" + then: "Response should contain error" def exception = thrown(PrebidServerException) assert exception.statusCode == UNAUTHORIZED.code() assert exception.responseBody == "Unauthorized account id: ${account.uuid}" From e5efe978c08c91b3a1cf4911a0eccc40cb241e02 Mon Sep 17 00:00:00 2001 From: osulzhenko Date: Thu, 26 Feb 2026 13:10:43 +0200 Subject: [PATCH 5/8] revert core change --- .../server/auction/requestfactory/Ortb2RequestFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e7d42855464..ec0aff7a68e 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java @@ -558,7 +558,7 @@ private Future wrapFailure(Throwable exception, String accountId, HttpR if (exception instanceof UnauthorizedAccountException) { return Future.failedFuture(exception); } else if (exception instanceof PreBidException) { - unknownAccountLogger.warn(accountErrorMessage(exception.getMessage(), httpRequest), logSamplingRate); + unknownAccountLogger.warn(accountErrorMessage(exception.getMessage(), httpRequest), 100); } else { metrics.updateAccountRequestRejectedByFailedFetch(accountId); logger.warn("Error occurred while fetching account: {}", exception.getMessage()); From f737834e1ff671d9679976ed60d9c0f7094f12d3 Mon Sep 17 00:00:00 2001 From: osulzhenko Date: Wed, 4 Mar 2026 19:33:17 +0200 Subject: [PATCH 6/8] update naming --- .../server/functional/tests/module/GeneralModuleSpec.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy index 0d227797603..8885f2d38fa 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy @@ -349,7 +349,7 @@ class GeneralModuleSpec extends ModuleBaseSpec { pbsServiceFactory.removeContainer(pbsConfig) } - def "PBS shouldn't call any module without account config when modules disabled in module-execution host config"() { + def "PBS shouldn't call module when disabled in host config and no account config provided"() { given: "PBS service with module-execution config" def pbsConfig = MULTI_MODULE_CONFIG + ENABLED_INVOKE_CONFIG + [("hooks.admin.module-execution.${ORTB2_BLOCKING.code}".toString()): 'false'] From 083ff190595cf963dbcf0717c7674f885ed2389e Mon Sep 17 00:00:00 2001 From: osulzhenko Date: Fri, 24 Jul 2026 17:57:23 +0300 Subject: [PATCH 7/8] rename field --- .../server/functional/model/request/auction/Server.groovy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Server.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Server.groovy index c088163b38b..12238301ca1 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/Server.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Server.groovy @@ -1,5 +1,6 @@ package org.prebid.server.functional.model.request.auction +import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming import groovy.transform.ToString @@ -12,5 +13,6 @@ class Server { Integer gvlId String datacenter String endpoint + @JsonProperty("http_method") String httpMethod } From 889f46bfba9dbef09fc44f9d034f437393181458 Mon Sep 17 00:00:00 2001 From: osulzhenko Date: Mon, 27 Jul 2026 15:06:06 +0300 Subject: [PATCH 8/8] Fix invalid imports and tests --- .../tests/module/AbTestingModuleSpec.groovy | 8 +++++--- .../tests/module/GeneralModuleSpec.groovy | 14 +++++++------- .../pbrichmedia/PbRichMediaFilterSpec.groovy | 6 +++--- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/AbTestingModuleSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/AbTestingModuleSpec.groovy index 99da2f8e716..de9d940de43 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/AbTestingModuleSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/AbTestingModuleSpec.groovy @@ -1,10 +1,10 @@ package org.prebid.server.functional.tests.module -import org.prebid.server.functional.model.config.ModuleName import org.prebid.server.functional.model.config.AbTest import org.prebid.server.functional.model.config.AccountConfig import org.prebid.server.functional.model.config.AccountHooksConfiguration import org.prebid.server.functional.model.config.ExecutionPlan +import org.prebid.server.functional.model.config.ModuleName import org.prebid.server.functional.model.config.Stage import org.prebid.server.functional.model.db.Account import org.prebid.server.functional.model.request.auction.BidRequest @@ -15,8 +15,8 @@ import org.prebid.server.functional.model.response.auction.InvocationResult import org.prebid.server.functional.service.PrebidServerService import org.prebid.server.functional.util.PBSUtils +import static org.prebid.server.functional.model.config.HookHttpEndpoint.AUCTION import static org.prebid.server.functional.model.config.ModuleName.PB_RESPONSE_CORRECTION -import static org.prebid.server.functional.model.config.Endpoint.OPENRTB2_AUCTION import static org.prebid.server.functional.model.config.Stage.ALL_PROCESSED_BID_RESPONSES import static org.prebid.server.functional.model.config.Stage.BIDDER_REQUEST import static org.prebid.server.functional.model.config.Stage.RAW_BIDDER_RESPONSE @@ -1077,7 +1077,9 @@ class AbTestingModuleSpec extends ModuleBaseSpec { def "PBS should prioritise a/b test config from account over default account and only specified module when specific account and default account contains a/b test configs"() { given: "PBS service with specific ab test config" - def accountExecutionPlan = new ExecutionPlan(abTests: [AbTest.getDefault(ModuleName.PB_ORTB2_BLOCKING.code)]) + def accountExecutionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(AUCTION, MODULES_STAGES).tap { + abTests = [AbTest.getDefault(ModuleName.PB_ORTB2_BLOCKING.code)] + } def defaultAccountConfigSettings = AccountConfig.defaultAccountConfig.tap { hooks = new AccountHooksConfiguration(executionPlan: accountExecutionPlan) } diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy index f21cfef5f0b..d883da8f219 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/GeneralModuleSpec.groovy @@ -560,7 +560,7 @@ class GeneralModuleSpec extends ModuleBaseSpec { } and: "Save account without modules config" - def pbsModulesConfig = new PbsModulesConfig(pbRichmediaFilter: new RichmediaFilter(filterMraid: true), ortb2Blocking: new Ortb2BlockingConfig()) + def pbsModulesConfig = new PbsModulesConfig(pbRichmediaFilter: new RichmediaFilter(filterMraid: true), pbOrtb2Blocking: new Ortb2BlockingConfig()) def executionPlan = ExecutionPlan.getSingleEndpointExecutionPlan(endpoint, RESPONSE_STAGES) def accountConfig = new AccountConfig(hooks: new AccountHooksConfiguration(executionPlan: executionPlan, modules: pbsModulesConfig)) def account = new Account(uuid: bidRequest.getAccountId(), config: accountConfig) @@ -582,15 +582,15 @@ class GeneralModuleSpec extends ModuleBaseSpec { and: "Ortb2blocking module call metrics should be updated" def metrics = pbsServiceWithMultipleModule.sendCollectedMetricsRequest() - assert metrics[CALL_METRIC.formatted(ORTB2_BLOCKING.code, BIDDER_REQUEST.metricValue, ORTB2_BLOCKING_BIDDER_REQUEST.code)] == 1 - assert metrics[CALL_METRIC.formatted(ORTB2_BLOCKING.code, RAW_BIDDER_RESPONSE.metricValue, ORTB2_BLOCKING_RAW_BIDDER_RESPONSE.code)] == 1 - assert metrics[NOOP_METRIC.formatted(ORTB2_BLOCKING.code, BIDDER_REQUEST.metricValue, ORTB2_BLOCKING_BIDDER_REQUEST.code)] == 1 - assert metrics[NOOP_METRIC.formatted(ORTB2_BLOCKING.code, RAW_BIDDER_RESPONSE.metricValue, ORTB2_BLOCKING_RAW_BIDDER_RESPONSE.code)] == 1 + assert metrics[CALL_METRIC(PB_ORTB2_BLOCKING, BIDDER_REQUEST)] == 1 + assert metrics[CALL_METRIC(PB_ORTB2_BLOCKING, RAW_BIDDER_RESPONSE)] == 1 + assert metrics[NOOP_METRIC(PB_ORTB2_BLOCKING, BIDDER_REQUEST)] == 1 + assert metrics[NOOP_METRIC(PB_ORTB2_BLOCKING, RAW_BIDDER_RESPONSE)] == 1 and: "RB-Richmedia-Filter module call metrics should be updated" def richmediaCounts = modulesCodes.count(PB_RICHMEDIA_FILTER.code) - assert metrics[CALL_METRIC.formatted(PB_RICHMEDIA_FILTER.code, ALL_PROCESSED_BID_RESPONSES.metricValue, PB_RICHMEDIA_FILTER_ALL_PROCESSED_RESPONSES.code)] == richmediaCounts - assert metrics[NOOP_METRIC.formatted(PB_RICHMEDIA_FILTER.code, ALL_PROCESSED_BID_RESPONSES.metricValue, PB_RICHMEDIA_FILTER_ALL_PROCESSED_RESPONSES.code)] == richmediaCounts + assert metrics[CALL_METRIC(PB_RICHMEDIA_FILTER, ALL_PROCESSED_BID_RESPONSES)] == richmediaCounts + assert metrics[NOOP_METRIC(PB_RICHMEDIA_FILTER, ALL_PROCESSED_BID_RESPONSES)] == richmediaCounts and: "Response shouldn't contain warnings and errors" assert !response.ext?.warnings diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/pbrichmedia/PbRichMediaFilterSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/pbrichmedia/PbRichMediaFilterSpec.groovy index fffe1e10724..037a38fb922 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/pbrichmedia/PbRichMediaFilterSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/pbrichmedia/PbRichMediaFilterSpec.groovy @@ -16,12 +16,12 @@ import org.prebid.server.functional.service.PrebidServerService import org.prebid.server.functional.tests.module.ModuleBaseSpec import org.prebid.server.functional.util.PBSUtils -import static org.prebid.server.functional.model.response.auction.BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE -import static org.prebid.server.functional.model.config.ModuleName.PB_RICHMEDIA_FILTER import static org.prebid.server.functional.model.bidder.BidderName.GENERIC -import static org.prebid.server.functional.model.config.Endpoint.AUCTION +import static org.prebid.server.functional.model.config.HookHttpEndpoint.AUCTION +import static org.prebid.server.functional.model.config.ModuleName.PB_RICHMEDIA_FILTER import static org.prebid.server.functional.model.config.Stage.ALL_PROCESSED_BID_RESPONSES import static org.prebid.server.functional.model.request.auction.TraceLevel.VERBOSE +import static org.prebid.server.functional.model.response.auction.BidRejectionReason.RESPONSE_REJECTED_INVALID_CREATIVE class PbRichMediaFilterSpec extends ModuleBaseSpec {