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 fb8187ed231..a7b85bea5f6 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/AmpRequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/AmpRequestFactory.java @@ -417,6 +417,7 @@ private Future updateBidRequest(AuctionContext auctionContext) { .compose(resolvedBidRequest -> ortb2RequestFactory.validateRequest( resolvedBidRequest, auctionContext.getHttpRequest(), + auctionContext.getDebugContext(), auctionContext.getDebugWarnings())); } 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 34140a26228..18394806ef4 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/AuctionRequestFactory.java @@ -241,7 +241,8 @@ private Future updateAndValidateBidRequest(AuctionContext auctionCon return storedRequestProcessor.processAuctionRequest(account.getId(), auctionContext.getBidRequest()) .compose(auctionStoredResult -> updateBidRequest(auctionStoredResult, auctionContext)) - .compose(bidRequest -> ortb2RequestFactory.validateRequest(bidRequest, httpRequest, debugWarnings)) + .compose(bidRequest -> ortb2RequestFactory.validateRequest( + bidRequest, httpRequest, auctionContext.getDebugContext(), debugWarnings)) .map(interstitialProcessor::process); } 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 01c4c8a43dc..f76d61316f9 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactory.java @@ -194,9 +194,11 @@ public Future activityInfrastructureFrom(AuctionContext public Future validateRequest(BidRequest bidRequest, HttpRequestContext httpRequestContext, + DebugContext debugContext, List warnings) { - final ValidationResult validationResult = requestValidator.validate(bidRequest, httpRequestContext); + final ValidationResult validationResult = requestValidator.validate( + bidRequest, httpRequestContext, debugContext); if (validationResult.hasWarnings()) { warnings.addAll(validationResult.getWarnings()); 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 8c4d5de8614..623e20f5ffb 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/VideoRequestFactory.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/VideoRequestFactory.java @@ -110,10 +110,6 @@ public Future> fromRequest(RoutingContext routingC return ortb2RequestFactory.executeEntrypointHooks(routingContext, body, initialAuctionContext) .compose(httpRequest -> createBidRequest(httpRequest) .map(bidRequest -> removeEmptyEids(bidRequest, initialAuctionContext.getDebugWarnings())) - .compose(bidRequest -> validateRequest( - bidRequest, - httpRequest, - initialAuctionContext.getDebugWarnings())) .map(bidRequestWithErrors -> populatePodErrors( bidRequestWithErrors.getPodErrors(), podErrors, bidRequestWithErrors)) @@ -121,10 +117,17 @@ public Future> fromRequest(RoutingContext routingC .map(bidRequestWithErrors -> ortb2RequestFactory.enrichAuctionContext( initialAuctionContext, httpRequest, bidRequestWithErrors.getData(), startTime))) - .compose(auctionContext -> ortb2RequestFactory.fetchAccountWithoutStoredRequestLookup(auctionContext) + .map(auctionContext -> auctionContext.with(debugResolver.debugContextFrom(auctionContext))) + + .compose(auctionContext -> ortb2RequestFactory.validateRequest( + auctionContext.getBidRequest(), + auctionContext.getHttpRequest(), + auctionContext.getDebugContext(), + auctionContext.getDebugWarnings()) .map(auctionContext::with)) - .map(auctionContext -> auctionContext.with(debugResolver.debugContextFrom(auctionContext))) + .compose(auctionContext -> ortb2RequestFactory.fetchAccountWithoutStoredRequestLookup(auctionContext) + .map(auctionContext::with)) .compose(auctionContext -> geoLocationServiceWrapper.lookup(auctionContext) .map(auctionContext::with)) @@ -323,12 +326,4 @@ private WithPodErrors fillImplicitParameters(HttpRequestContext http return WithPodErrors.of(updatedWithDebugBidRequest, bidRequestToErrors.getPodErrors()); } - - private Future> validateRequest(WithPodErrors requestWithPodErrors, - HttpRequestContext httpRequestContext, - List warnings) { - - return ortb2RequestFactory.validateRequest(requestWithPodErrors.getData(), httpRequestContext, warnings) - .map(bidRequest -> requestWithPodErrors); - } } diff --git a/src/main/java/org/prebid/server/validation/RequestValidator.java b/src/main/java/org/prebid/server/validation/RequestValidator.java index f596850955d..cccac3edc75 100644 --- a/src/main/java/org/prebid/server/validation/RequestValidator.java +++ b/src/main/java/org/prebid/server/validation/RequestValidator.java @@ -15,6 +15,7 @@ import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.prebid.server.auction.model.debug.DebugContext; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.json.JacksonMapper; import org.prebid.server.log.ConditionalLogger; @@ -96,8 +97,12 @@ public RequestValidator(BidderCatalog bidderCatalog, * Validates the {@link BidRequest} against a list of validation checks, however, reports only one problem * at a time. */ - public ValidationResult validate(BidRequest bidRequest, HttpRequestContext httpRequestContext) { + public ValidationResult validate(BidRequest bidRequest, + HttpRequestContext httpRequestContext, + DebugContext debugContext) { + final List warnings = new ArrayList<>(); + final boolean isDebugEnabled = debugContext != null && debugContext.isDebugEnabled(); try { if (StringUtils.isBlank(bidRequest.getId())) { throw new ValidationException("request missing required field: \"id\""); @@ -124,7 +129,7 @@ public ValidationResult validate(BidRequest bidRequest, HttpRequestContext httpR validateAliases(aliases); validateAliasesGvlIds(extRequestPrebid, aliases); validateBidAdjustmentFactors(extRequestPrebid.getBidadjustmentfactors(), aliases); - validateExtBidPrebidData(extRequestPrebid.getData(), aliases); + validateExtBidPrebidData(extRequestPrebid.getData(), aliases, isDebugEnabled, warnings); validateSchains(extRequestPrebid.getSchains()); } @@ -313,15 +318,20 @@ private void validateSchains(List schains) throws Valida } } - private void validateExtBidPrebidData(ExtRequestPrebidData data, Map aliases) - throws ValidationException { + private void validateExtBidPrebidData(ExtRequestPrebidData data, + Map aliases, + boolean isDebugEnabled, + List warnings) throws ValidationException { + if (data != null) { - validateEidPermissions(data.getEidPermissions(), aliases); + validateEidPermissions(data.getEidPermissions(), aliases, isDebugEnabled, warnings); } } private void validateEidPermissions(List eidPermissions, - Map aliases) throws ValidationException { + Map aliases, + boolean isDebugEnabled, + List warnings) throws ValidationException { if (eidPermissions == null) { return; @@ -333,7 +343,7 @@ private void validateEidPermissions(List eid } validateEidPermissionSource(eidPermission.getSource()); - validateEidPermissionBidders(eidPermission.getBidders(), aliases); + validateEidPermissionBidders(eidPermission.getBidders(), aliases, isDebugEnabled, warnings); } } @@ -344,18 +354,22 @@ private void validateEidPermissionSource(String source) throws ValidationExcepti } private void validateEidPermissionBidders(List bidders, - Map aliases) throws ValidationException { + Map aliases, + boolean isDebugEnabled, + List warnings) throws ValidationException { if (CollectionUtils.isEmpty(bidders)) { throw new ValidationException("request.ext.prebid.data.eidpermissions[].bidders[] required values" + " but was empty or null"); } - for (String bidder : bidders) { - if (!bidderCatalog.isValidName(bidder) && !bidderCatalog.isValidName(aliases.get(bidder)) - && ObjectUtils.notEqual(bidder, ASTERISK)) { - throw new ValidationException( - "request.ext.prebid.data.eidPermissions[].bidders[] unrecognized biddercode: '%s'", bidder); + if (isDebugEnabled) { + for (String bidder : bidders) { + if (!bidderCatalog.isValidName(bidder) && !bidderCatalog.isValidName(aliases.get(bidder)) + && ObjectUtils.notEqual(bidder, ASTERISK)) { + warnings.add("request.ext.prebid.data.eidPermissions[].bidders[] unrecognized biddercode: '%s'" + .formatted(bidder)); + } } } } diff --git a/src/test/groovy/org/prebid/server/functional/tests/EidsSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/EidsSpec.groovy index 529f9c9c961..46b0ff2a5aa 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/EidsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/EidsSpec.groovy @@ -16,13 +16,17 @@ import org.prebid.server.functional.util.PBSUtils 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.OPENX +import static org.prebid.server.functional.model.bidder.BidderName.UNKNOWN import static org.prebid.server.functional.model.bidder.BidderName.WILDCARD +import static org.prebid.server.functional.model.request.auction.DebugCondition.DISABLED +import static org.prebid.server.functional.model.request.auction.DebugCondition.ENABLED import static org.prebid.server.functional.model.response.auction.ErrorType.PREBID import static org.prebid.server.functional.testcontainers.Dependencies.getNetworkServiceContainer class EidsSpec extends BaseSpec { private static final String EMPTY_STRING = "" + private static final String RANDOM_SOURCE_ID = PBSUtils.randomString def "PBS shouldn't populate user.id from user.ext data"() { given: "Default basic BidRequest with generic bidder" @@ -91,6 +95,68 @@ class EidsSpec extends BaseSpec { assert !bidderRequest.user.eids } + def "PBS eids shouldn't include warning for unknown bidder when test and debug disabled"() { + given: "Default bid request with generic bidder" + def bidRequest = BidRequest.defaultBidRequest.tap { + user = requestUser + ext.prebid.data = new ExtRequestPrebidData(eidpermissions: [new EidPermission(source: RANDOM_SOURCE_ID, bidders: [UNKNOWN])]) + it.ext.prebid.debug = DISABLED + it.test = DISABLED + } + + when: "PBS processes auction request" + def bidResponse = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain requested eids" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.user.eids + + and: "Bid response shouldn't contain warning" + assert !bidResponse.ext.warnings + + where: + requestUser << [new User(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)]), + new User(ext: new UserExt(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)])), + new User(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)], + ext: new UserExt(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)]))] + } + + def "PBS eids should include warning for unknown bidder when request in debug mode"() { + given: "Default bid request with generic bidder" + def bidRequest = BidRequest.defaultBidRequest.tap { + user = requestUser + ext.prebid.data = new ExtRequestPrebidData(eidpermissions: [new EidPermission(source: RANDOM_SOURCE_ID, bidders: [UNKNOWN])]) + it.ext.prebid.debug = debug + it.test = test + } + + when: "PBS processes auction request" + def bidResponse = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Bidder request shouldn't contain requested eids" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.user.eids + + and: "Bid response should contain warning" + assert bidResponse.ext.warnings[PREBID]?.code == [999] + assert bidResponse.ext.warnings[PREBID]?.message == + ["request.ext.prebid.data.eidPermissions[].bidders[] unrecognized biddercode: '$UNKNOWN'"] + + where: + debug | test | requestUser + DISABLED | ENABLED | new User(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)]) + DISABLED | ENABLED | new User(ext: new UserExt(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)])) + DISABLED | ENABLED | new User(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)], ext: new UserExt(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)])) + + ENABLED | DISABLED | new User(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)]) + ENABLED | DISABLED | new User(ext: new UserExt(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)])) + ENABLED | DISABLED | new User(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)], ext: new UserExt(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)])) + + ENABLED | ENABLED | new User(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)]) + ENABLED | ENABLED | new User(ext: new UserExt(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)])) + ENABLED | ENABLED | new User(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)], ext: new UserExt(eids: [Eid.getDefaultEid(RANDOM_SOURCE_ID)])) + } + def "PBs eid permissions should affect only specified on source"() { given: "PBs with openx bidder" def pbsService = pbsServiceFactory.getService( 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 1e0f63b9192..8090ebf74ef 100644 --- a/src/test/java/org/prebid/server/auction/requestfactory/AmpRequestFactoryTest.java +++ b/src/test/java/org/prebid/server/auction/requestfactory/AmpRequestFactoryTest.java @@ -1753,7 +1753,7 @@ private void givenBidRequest( given(ortb2ImplicitParametersResolver.resolve(any(), any(), any(), anyBoolean())).willAnswer( answerWithFirstArgument()); - given(ortb2RequestFactory.validateRequest(any(), any(), any())) + given(ortb2RequestFactory.validateRequest(any(), any(), any(), any())) .willAnswer(invocation -> Future.succeededFuture((BidRequest) invocation.getArgument(0))); given(ortb2RequestFactory.enrichBidRequestWithAccountAndPrivacyData(any())) diff --git a/src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java b/src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java index 96889137331..b9d49dfbde7 100644 --- a/src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java +++ b/src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java @@ -165,7 +165,7 @@ public void setUp() { given(ortb2RequestFactory.executeRawAuctionRequestHooks(any())) .willAnswer(invocation -> Future.succeededFuture( ((AuctionContext) invocation.getArgument(0)).getBidRequest())); - given(ortb2RequestFactory.validateRequest(any(), any(), any())) + given(ortb2RequestFactory.validateRequest(any(), any(), any(), any())) .willAnswer(invocationOnMock -> Future.succeededFuture((BidRequest) invocationOnMock.getArgument(0))); given(ortb2RequestFactory.removeEmptyEids(any(), any())) .willAnswer(invocationOnMock -> invocationOnMock.getArgument(0)); @@ -662,7 +662,7 @@ public void shouldReturnFailedFutureIfRequestValidationFailed() { // given givenValidBidRequest(); - given(ortb2RequestFactory.validateRequest(any(), any(), any())) + given(ortb2RequestFactory.validateRequest(any(), any(), any(), any())) .willReturn(Future.failedFuture(new InvalidRequestException("errors"))); // when 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 23d485e99a0..6aa83fecb1f 100644 --- a/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java +++ b/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java @@ -658,7 +658,7 @@ public void enrichAuctionContextShouldSetDebugOff() { @Test public void validateRequestShouldThrowInvalidRequestExceptionIfRequestIsInvalid() { // given - given(requestValidator.validate(any(), any())).willReturn(ValidationResult.error("error")); + given(requestValidator.validate(any(), any(), any())).willReturn(ValidationResult.error("error")); final BidRequest bidRequest = givenBidRequest(identity()); @@ -666,6 +666,7 @@ public void validateRequestShouldThrowInvalidRequestExceptionIfRequestIsInvalid( final Future result = target.validateRequest( bidRequest, HttpRequestContext.builder().build(), + DebugContext.empty(), new ArrayList<>()); // then @@ -674,13 +675,13 @@ public void validateRequestShouldThrowInvalidRequestExceptionIfRequestIsInvalid( .isInstanceOf(InvalidRequestException.class) .hasMessage("error"); - verify(requestValidator).validate(eq(bidRequest), any()); + verify(requestValidator).validate(eq(bidRequest), any(), any()); } @Test public void validateRequestShouldReturnSameBidRequest() { // given - given(requestValidator.validate(any(), any())).willReturn(ValidationResult.success()); + given(requestValidator.validate(any(), any(), any())).willReturn(ValidationResult.success()); final BidRequest bidRequest = givenBidRequest(identity()); @@ -688,10 +689,11 @@ public void validateRequestShouldReturnSameBidRequest() { final BidRequest result = target.validateRequest( bidRequest, HttpRequestContext.builder().build(), + DebugContext.empty(), new ArrayList<>()).result(); // then - verify(requestValidator).validate(eq(bidRequest), any()); + verify(requestValidator).validate(eq(bidRequest), any(), any()); assertThat(result).isSameAs(bidRequest); } diff --git a/src/test/java/org/prebid/server/auction/requestfactory/VideoRequestFactoryTest.java b/src/test/java/org/prebid/server/auction/requestfactory/VideoRequestFactoryTest.java index 475b22a5d5b..f44b581e071 100644 --- a/src/test/java/org/prebid/server/auction/requestfactory/VideoRequestFactoryTest.java +++ b/src/test/java/org/prebid/server/auction/requestfactory/VideoRequestFactoryTest.java @@ -345,7 +345,7 @@ public void shouldReturnExpectedResultAndReturnErrors() throws JsonProcessingExc verify(ortb2RequestFactory).createAuctionContext(any(), eq(MetricName.video)); verify(ortb2RequestFactory).enrichAuctionContext(any(), any(), eq(bidRequest), eq(0L)); verify(ortb2RequestFactory).fetchAccountWithoutStoredRequestLookup(any()); - verify(ortb2RequestFactory).validateRequest(eq(bidRequest), any(), any()); + verify(ortb2RequestFactory).validateRequest(eq(bidRequest), any(), any(), any()); verify(paramsResolver) .resolve(eq(bidRequest), any(), eq(Endpoint.openrtb2_video.value()), eq(false)); verify(ortb2RequestFactory).enrichBidRequestWithAccountAndPrivacyData( @@ -404,7 +404,7 @@ private void givenBidRequest(BidRequest bidRequest, List podErrors) { .build()); given(ortb2RequestFactory.fetchAccountWithoutStoredRequestLookup(any())).willReturn(Future.succeededFuture()); - given(ortb2RequestFactory.validateRequest(any(), any(), any())) + given(ortb2RequestFactory.validateRequest(any(), any(), any(), any())) .willAnswer(invocation -> Future.succeededFuture((BidRequest) invocation.getArgument(0))); given(paramsResolver.resolve(any(), any(), any(), anyBoolean())) diff --git a/src/test/java/org/prebid/server/validation/RequestValidatorTest.java b/src/test/java/org/prebid/server/validation/RequestValidatorTest.java index 29e12ea6b66..e492ae8baeb 100644 --- a/src/test/java/org/prebid/server/validation/RequestValidatorTest.java +++ b/src/test/java/org/prebid/server/validation/RequestValidatorTest.java @@ -21,6 +21,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; +import org.prebid.server.auction.model.debug.DebugContext; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.metric.MetricName; import org.prebid.server.metric.Metrics; @@ -90,7 +91,7 @@ public void validateShouldReturnOnlyOneErrorAtATime() { final BidRequest bidRequest = BidRequest.builder().build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result).isNotNull(); @@ -103,7 +104,7 @@ public void validateShouldReturnValidationMessageWhenRequestIdIsEmpty() { final BidRequest bidRequest = validBidRequestBuilder().id("").build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -116,7 +117,7 @@ public void validateShouldReturnValidationMessageWhenRequestIdIsNull() { final BidRequest bidRequest = validBidRequestBuilder().id(null).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -129,7 +130,7 @@ public void validateShouldReturnValidationMessageWhenTmaxIsNegative() { final BidRequest bidRequest = validBidRequestBuilder().id("1").tmax(-100L).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -142,7 +143,7 @@ public void validateShouldNotReturnValidationMessageWhenTmaxIsNull() { final BidRequest bidRequest = validBidRequestBuilder().tmax(null).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -154,7 +155,7 @@ public void validateShouldReturnValidationMessageWhenCurIsNull() { final BidRequest bidRequest = validBidRequestBuilder().cur(null).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -168,7 +169,7 @@ public void validateShouldReturnValidationMessageWhenNumberOfImpsIsZero() { final BidRequest bidRequest = validBidRequestBuilder().imp(null).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -186,7 +187,7 @@ public void validateShouldReturnValidationMessageWhenAliasesKeyDoesntContainAlia .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()) @@ -204,7 +205,7 @@ public void validateShouldReturnValidationMessageWhenAliasgvlidsValueLowerThatOn .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()) @@ -218,7 +219,7 @@ public void validateShouldReturnValidationMessageWhenSiteIdAndPageIsNull() { final BidRequest bidRequest = validBidRequestBuilder().site(Site.builder().id(null).build()).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -231,7 +232,7 @@ public void validateShouldReturnValidationMessageWhenSiteIdIsEmptyStringAndPageI final BidRequest bidRequest = validBidRequestBuilder().site(Site.builder().id("").build()).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -244,7 +245,7 @@ public void validateShouldReturnEmptyValidationMessagesWhenPageIdIsNullAndSiteId final BidRequest bidRequest = validBidRequestBuilder().site(Site.builder().id("1").page(null).build()).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.hasErrors()).isFalse(); @@ -256,7 +257,7 @@ public void validateShouldEmptyValidationMessagesWhenSitePageIsEmptyString() { final BidRequest bidRequest = validBidRequestBuilder().site(Site.builder().id("1").page("").build()).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.hasErrors()).isFalse(); @@ -268,7 +269,7 @@ public void validateShouldReturnValidationMessageWhenSiteIdAndPageBothEmpty() { final BidRequest bidRequest = validBidRequestBuilder().site(Site.builder().id("").page("").build()).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -283,7 +284,7 @@ public void validateShouldReturnValidationMessageWhenSiteExtAmpIsNegative() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -298,7 +299,7 @@ public void validateShouldReturnValidationMessageWhenSiteExtAmpIsGreaterThanOne( .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -312,7 +313,7 @@ public void validateShouldFailWhenDoohIdAndVenuetypeAreNulls() { final BidRequest bidRequest = validBidRequestBuilder().site(null).dooh(invalidDooh).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -326,7 +327,7 @@ public void validateShouldFailWhenDoohIdIsNullAndVenuetypeIsEmpty() { final BidRequest bidRequest = validBidRequestBuilder().site(null).dooh(invalidDooh).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -343,7 +344,7 @@ public void validateShouldReturnValidationMessageWhenRequestAppAndRequestSiteBot .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -359,7 +360,7 @@ public void validateShouldFailWhenDoohSiteAndAppArePresentInRequestAndStrictVali .app(App.builder().build()) .site(Site.builder().build()) .build(); - final ValidationResult result = target.validate(invalidRequest, null); + final ValidationResult result = target.validate(invalidRequest, null, null); // then verify(metrics).updateAlertsMetrics(MetricName.general); @@ -376,7 +377,7 @@ public void validateShouldFailWhenSiteAndAppArePresentInRequestAndStrictValidati .app(App.builder().build()) .site(Site.builder().build()) .build(); - final ValidationResult result = target.validate(invalidRequest, null); + final ValidationResult result = target.validate(invalidRequest, null, null); // then verify(metrics).updateAlertsMetrics(MetricName.general); @@ -393,7 +394,7 @@ public void validateShouldFailWhenDoohAndSiteArePresentInRequestAndStrictValidat .dooh(Dooh.builder().build()) .site(Site.builder().build()) .build(); - final ValidationResult result = target.validate(invalidRequest, null); + final ValidationResult result = target.validate(invalidRequest, null, null); // then verify(metrics).updateAlertsMetrics(MetricName.general); @@ -410,7 +411,7 @@ public void validateShouldFailWhenDoohAndAppArePresentInRequestAndStrictValidati .dooh(Dooh.builder().build()) .app(App.builder().build()) .build(); - final ValidationResult result = target.validate(invalidRequest, null); + final ValidationResult result = target.validate(invalidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -428,7 +429,7 @@ public void validateShouldReturnValidationMessageWhenMinWidthPercIsNull() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -445,7 +446,7 @@ public void validateShouldReturnValidationMessageWhenMinWidthPercIsLessThanZero( .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -462,7 +463,7 @@ public void validateShouldReturnValidationMessageWhenMinWidthPercGreaterThanHund .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -479,7 +480,7 @@ public void validateShouldReturnValidationMessageWhenMinHeightPercIsNull() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -497,7 +498,7 @@ public void validateShouldReturnValidationMessageWhenMinHeightPercIsLessThanZero .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -515,7 +516,7 @@ public void validateShouldReturnValidationMessageWhenMinHeightPercGreaterThanHun .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -529,7 +530,7 @@ public void validateShouldReturnEmptyValidationMessagesWhenBidRequestIsOk() { final BidRequest bidRequest = validBidRequestBuilder().build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -548,7 +549,7 @@ public void validateShouldReturnValidationMessageWhenRequestHaveDuplicatedImpIds .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -565,7 +566,7 @@ public void validateShouldNotReturnValidationMessageIfUserExtIsEmptyJsonObject() .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -579,7 +580,7 @@ public void validateShouldNotReturnErrorMessageWhenRegsIsEmptyObject() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -597,7 +598,7 @@ public void validateShouldReturnValidationMessageWhenPrebidBuyerIdsContainsNoVal .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -615,7 +616,7 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsHasNullEleme .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -633,7 +634,7 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsBiddersIsNul .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -652,7 +653,7 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsBiddersIsEmp .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -661,7 +662,7 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsBiddersIsEmp } @Test - public void validateShouldReturnValidationMessageWhenEidsPermissionsBidderIsNotRecognizedBidder() { + public void validateShouldReturnWarningsMessageWhenEidsPermissionsBidderIsNotRecognizedBidderAndDebugEnabled() { // given given(bidderCatalog.isValidName(eq("bidder1"))).willReturn(false); final BidRequest bidRequest = validBidRequestBuilder() @@ -673,16 +674,39 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsBidderIsNotR .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate( + bidRequest, null, DebugContext.of(true, false, null)); // then - assertThat(result.getErrors()).hasSize(1) + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getWarnings()).hasSize(1) .containsOnly( "request.ext.prebid.data.eidPermissions[].bidders[] unrecognized biddercode: 'bidder1'"); } @Test - public void validateShouldReturnValidationMessageWhenEidsPermissionsBidderHasBlankValue() { + public void validateShouldNotReturnWarningsMessageWhenEidsPermissionsBidderIsNotRecognizedBidderAndDebugDisabled() { + // given + given(bidderCatalog.isValidName(eq("bidder1"))).willReturn(false); + final BidRequest bidRequest = validBidRequestBuilder() + .ext(ExtRequest.of(ExtRequestPrebid.builder() + .data(ExtRequestPrebidData.of(null, + singletonList( + ExtRequestPrebidDataEidPermissions.of("source", singletonList("bidder1"))))) + .build())) + .build(); + + // when + final ValidationResult result = target.validate( + bidRequest, null, DebugContext.of(false, false, null)); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getWarnings()).isEmpty(); + } + + @Test + public void validateShouldReturnWarningMessageWhenEidsPermissionsBidderHasBlankValueAndDebugEnabled() { // given final BidRequest bidRequest = validBidRequestBuilder() .ext(ExtRequest.of(ExtRequestPrebid.builder() @@ -693,10 +717,12 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsBidderHasBla .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate( + bidRequest, null, DebugContext.of(true, false, null)); // then - assertThat(result.getErrors()).hasSize(1) + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getWarnings()).hasSize(1) .containsOnly("request.ext.prebid.data.eidPermissions[].bidders[] unrecognized biddercode: ' '"); } @@ -717,7 +743,7 @@ public void validateShouldNotReturnValidationErrorWhenBidderIsAlias() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -735,7 +761,7 @@ public void validateShouldNotReturnValidationErrorWhenBidderIsAsterisk() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -753,7 +779,7 @@ public void validateShouldReturnValidationMessageWhenEidsPermissionsHasMissingSo .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -772,7 +798,7 @@ public void validateShouldReturnValidationMessageWhenCantParseTargetingPriceGran .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -791,7 +817,7 @@ public void validateShouldReturnValidationMessageWhenRangesAreEmptyList() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -812,7 +838,7 @@ public void validateShouldReturnValidationMessageWhenIncrementIsZero() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -832,7 +858,7 @@ public void validateShouldReturnValidationMessageWhenIncrementIsMissed() { .build())) .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -853,7 +879,7 @@ public void validateShouldReturnValidationMessageWhenIncrementIsNegative() { .build())) .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -872,7 +898,7 @@ public void validateShouldReturnValidationMessageWhenPrecisionIsNegative() { .build())) .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -895,7 +921,7 @@ public void validateShouldReturnValidationMessageWhenMediaTypePriceGranularityTy .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -923,7 +949,7 @@ public void validateShouldReturnValidationMessageWithCorrectMediaType() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -950,7 +976,7 @@ public void validateShouldReturnValidationMessageForInvalidTargetingPrefix() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -972,7 +998,7 @@ public void validateShouldReturnValidationMessageWhenRangesContainsMissedMaxValu .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -993,7 +1019,7 @@ public void validateShouldReturnValidationMessageWhenRangesAreNotOrderedByMaxVal .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1016,7 +1042,7 @@ public void validateShouldReturnValidationMessageWhenRangesAreNotOrderedByMaxVal .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1038,7 +1064,7 @@ public void validateShouldReturnValidationMessageWhenIncrementIsNegativeInNotLea .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1057,7 +1083,7 @@ public void validateShouldReturnValidationMessageWhenPrebidBuyerIdsContainsUnkno .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1080,7 +1106,7 @@ public void validateShouldNotReturnAnyErrorInValidationResultWhenPrebidBuyerIdIs .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -1098,7 +1124,7 @@ public void validateShouldNotReturnAnyErrorInValidationResultWhenPrebidBuyerIdIs .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -1114,7 +1140,7 @@ public void validateShouldNotReturnValidationMessageWhenEidsIsEmpty() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -1130,7 +1156,7 @@ public void validateShouldReturnValidationMessageWhenEidHasEmptySource() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1146,7 +1172,7 @@ public void validateShouldReturnValidationMessageWhenAliasNameEqualsToBidderItPo final BidRequest bidRequest = validBidRequestBuilder().ext(ext).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1164,7 +1190,7 @@ public void validateShouldReturnValidationMessageWhenAliasPointOnNotValidBidderN final BidRequest bidRequest = validBidRequestBuilder().ext(ext).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1182,7 +1208,7 @@ public void validateShouldReturnValidationMessageWhenAliasPointOnDisabledBidder( given(bidderCatalog.isActive("appnexus")).willReturn(false); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1198,7 +1224,7 @@ public void validateShouldReturnEmptyValidationMessagesWhenAliasesWasUsed() { final BidRequest bidRequest = validBidRequestBuilder().ext(ext).build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -1212,7 +1238,7 @@ public void validateShouldReturnValidationResultWithErrorsWhenGdprIsNotOneOrZero .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1231,7 +1257,7 @@ public void validateShouldReturnValidationMessageWhenAdjustmentFactorNegative() .build())) .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1253,7 +1279,7 @@ public void validateShouldReturnValidationMessageWhenAdjustmentMediaFactorNegati .build())) .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1275,7 +1301,7 @@ public void validateShouldReturnValidationMessageWhenBidderUnknown() { .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1296,7 +1322,7 @@ public void validateShouldReturnValidationMessageWhenMediaBidderUnknown() { .build())) .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).hasSize(1) @@ -1320,7 +1346,7 @@ public void validateShouldReturnEmptyValidationMessagesWhenBidderIsKnownAndAdjus .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -1344,7 +1370,7 @@ public void validateShouldReturnEmptyValidationMessagesWhenBidderIsKnownAliasFor .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).isEmpty(); @@ -1365,7 +1391,7 @@ public void validateShouldReturnEmptyValidationMessagesWhenBidderIsKnownBidderCo .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then verify(bidderCatalog).isValidName(rubiconAlias); @@ -1386,7 +1412,7 @@ public void validateShouldReturnValidationMessageWhenMultipleSchainsForSameBidde .build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()) @@ -1403,7 +1429,7 @@ public void validateShouldReturnValidationMessageWhenImpValidationFailed() throw final BidRequest bidRequest = validBidRequestBuilder().build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getErrors()).containsOnly("imp[0] validation failed"); @@ -1418,7 +1444,7 @@ public void validateShouldReturnWarningMessageWhenImpValidationWarns() throws Va final BidRequest bidRequest = validBidRequestBuilder().build(); // when - final ValidationResult result = target.validate(bidRequest, null); + final ValidationResult result = target.validate(bidRequest, null, null); // then assertThat(result.getWarnings()).containsOnly("imp[0] validation warning");