diff --git a/src/main/java/org/prebid/server/analytics/reporter/AnalyticsReporterDelegator.java b/src/main/java/org/prebid/server/analytics/reporter/AnalyticsReporterDelegator.java index f51db7f8ead..10db83bec8a 100644 --- a/src/main/java/org/prebid/server/analytics/reporter/AnalyticsReporterDelegator.java +++ b/src/main/java/org/prebid/server/analytics/reporter/AnalyticsReporterDelegator.java @@ -239,8 +239,12 @@ private boolean isNotAllowedAdapterByGlobalOrAccountAnalyticsConfig(String adapt if (modules != null && modules.containsKey(adapter)) { final ObjectNode moduleConfig = modules.get(adapter); - return moduleConfig == null || !moduleConfig.has("enabled") - || !moduleConfig.get("enabled").asBoolean(); + + if (moduleConfig == null || !moduleConfig.has("enabled")) { + return false; + } + + return !moduleConfig.get("enabled").asBoolean(); } return !globalEnabledAdapters.contains(adapter); diff --git a/src/test/groovy/org/prebid/server/functional/tests/AnalyticsSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/AnalyticsSpec.groovy index a16811b8261..b113f649834 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/AnalyticsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/AnalyticsSpec.groovy @@ -62,22 +62,23 @@ class AnalyticsSpec extends BaseSpec { when: "PBS processes auction request" pbsServiceWithLogAnalytics.sendAuctionRequest(bidRequest) - then: "PBS should call log analytics" + then: "Bidder request shouldn't contain additional field from logAnalytics" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.analytics + + and: "Analytics bid request shouldn't be emitted in logs" PBSUtils.waitUntil({ pbsServiceWithLogAnalytics.isContainLogsByValue(bidRequest.id) }) def logsByValue = pbsServiceWithLogAnalytics.getLogsByValue(bidRequest.id) - assert logsByValue - - and: "Analytics adapter shouldn't contain additional info" def analyticsBidRequest = extractResolvedRequestFromLog(logsByValue) assert !analyticsBidRequest?.ext?.prebid?.analytics?.logAnalytics?.additionalData } - def "PBS shouldn't populate log analytics when log enabled in account and disabled in global config"() { + def "PBS shouldn't populate log analytics when log analytics is directly non-restricted for account and disabled in global config"() { given: "Basic bid request" def bidRequest = BidRequest.defaultBidRequest and: "Account in the DB" - def logAnalyticsModule = new LogAnalytics(enabled: true) + def logAnalyticsModule = new LogAnalytics(enabled: logAnalyticsEnable) def config = new AccountAnalyticsConfig(modules: new AnalyticsModule(logAnalytics: logAnalyticsModule)) def accountConfig = new AccountConfig(analytics: config) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -86,17 +87,24 @@ class AnalyticsSpec extends BaseSpec { when: "PBS processes auction request" pbsServiceWithoutLogAnalytics.sendAuctionRequest(bidRequest) + then: "Bidder request shouldn't contain additional field from logAnalytics" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.analytics + then: "PBS shouldn't call log analytics" def logsByValue = pbsServiceWithLogAnalytics.getLogsByValue(bidRequest.id) assert !logsByValue + + where: + logAnalyticsEnable << [null, true] } - def "PBS should populate log analytics when log enabled in account and global config"() { + def "PBS should populate log analytics when log analytics is directly non-restricted for account and enabled global config"() { given: "Basic bid request" def bidRequest = BidRequest.defaultBidRequest and: "Account in the DB" - def logAnalyticsModule = new LogAnalytics(enabled: true) + def logAnalyticsModule = new LogAnalytics(enabled: logAnalyticsEnable) def config = new AccountAnalyticsConfig(modules: new AnalyticsModule(logAnalytics: logAnalyticsModule)) def accountConfig = new AccountConfig(analytics: config) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -105,17 +113,17 @@ class AnalyticsSpec extends BaseSpec { when: "PBS processes auction request" pbsServiceWithLogAnalytics.sendAuctionRequest(bidRequest) - then: "PBS should call log analytics" + then: "Analytics bid request shouldn't be emitted in logs" PBSUtils.waitUntil({ pbsServiceWithLogAnalytics.isContainLogsByValue(bidRequest.id) }) def logsByValue = pbsServiceWithLogAnalytics.getLogsByValue(bidRequest.id) - assert logsByValue - - and: "Analytics adapter shouldn't contain additional info" def analyticsBidRequest = extractResolvedRequestFromLog(logsByValue) assert !analyticsBidRequest?.ext?.prebid?.analytics?.logAnalytics?.additionalData + + where: + logAnalyticsEnable << [null, true] } - def "PBS shouldn't populate log analytics when log disabled in account and enabled in global config"() { + def "PBS shouldn't populate log analytics when log analytics is directly restricted for account and enabled in global config"() { given: "Basic bid request" def bidRequest = BidRequest.defaultBidRequest @@ -129,12 +137,16 @@ class AnalyticsSpec extends BaseSpec { when: "PBS processes auction request" pbsServiceWithLogAnalytics.sendAuctionRequest(bidRequest) - then: "PBS shouldn't call log analytics" + then: "Bidder request shouldn't contain additional field from logAnalytics" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.analytics + + and: "PBS shouldn't call log analytics" def logsByValue = pbsServiceWithLogAnalytics.getLogsByValue(bidRequest.id) assert !logsByValue } - def "PBS shouldn't populate log analytics when log disabled in global config and without account"() { + def "PBS shouldn't populate log analytics when log disabled in global config and not set for account"() { given: "Basic bid request" def bidRequest = BidRequest.defaultBidRequest @@ -147,12 +159,16 @@ class AnalyticsSpec extends BaseSpec { when: "PBS processes auction request" pbsServiceWithoutLogAnalytics.sendAuctionRequest(bidRequest) - then: "PBS shouldn't call log analytics" + then: "Bidder request shouldn't contain additional field from logAnalytics" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.analytics + + and: "PBS shouldn't call log analytics" def logsByValue = pbsServiceWithLogAnalytics.getLogsByValue(bidRequest.id) assert !logsByValue } - def "PBS should populate log analytics with additional data when log enabled in account and data specified"() { + def "PBS should populate log analytics with additional data when log is directly non-restricted for account and data specified"() { given: "Basic bid request" def bidRequest = BidRequest.defaultBidRequest.tap { ext.prebid.analytics = new PrebidAnalytics() @@ -160,7 +176,7 @@ class AnalyticsSpec extends BaseSpec { and: "Account in the DB" def additionalData = PBSUtils.randomString - def logAnalyticsModule = new LogAnalytics(enabled: true, additionalData: additionalData) + def logAnalyticsModule = new LogAnalytics(enabled: logAnalyticsEnable, additionalData: additionalData) def config = new AccountAnalyticsConfig(modules: new AnalyticsModule(logAnalytics: logAnalyticsModule)) def accountConfig = new AccountConfig(analytics: config) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -169,17 +185,21 @@ class AnalyticsSpec extends BaseSpec { when: "PBS processes auction request" pbsServiceWithLogAnalytics.sendAuctionRequest(bidRequest) - then: "PBS should call log analytics" + then: "Bidder request shouldn't contain additional field from logAnalytics" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.ext.prebid.analytics.logAnalytics + + then: "Analytics bid request should be emitted in logs" PBSUtils.waitUntil({ pbsServiceWithLogAnalytics.isContainLogsByValue(bidRequest.id) }) def logsByValue = pbsServiceWithLogAnalytics.getLogsByValue(bidRequest.id) - assert logsByValue - - and: "Analytics adapter should contain additional info" def analyticsBidRequest = extractResolvedRequestFromLog(logsByValue) assert analyticsBidRequest.ext.prebid.analytics.logAnalytics.additionalData == additionalData + + where: + logAnalyticsEnable << [null, true] } - def "PBS should populate log analytics with additional data from request when log enabled in account and data specified in request only"() { + def "PBS should populate log analytics with additional data from request when data specified in request only"() { given: "Basic bid request" def additionalData = PBSUtils.randomString def bidRequest = BidRequest.defaultBidRequest.tap { @@ -187,7 +207,7 @@ class AnalyticsSpec extends BaseSpec { } and: "Account in the DB" - def logAnalyticsModule = new LogAnalytics(enabled: true, additionalData: null) + def logAnalyticsModule = new LogAnalytics(enabled: logAnalyticsEnable, additionalData: null) def config = new AccountAnalyticsConfig(modules: new AnalyticsModule(logAnalytics: logAnalyticsModule)) def accountConfig = new AccountConfig(analytics: config) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -196,14 +216,14 @@ class AnalyticsSpec extends BaseSpec { when: "PBS processes auction request" pbsServiceWithLogAnalytics.sendAuctionRequest(bidRequest) - then: "PBS should call log analytics" + then: "Analytics bid request should be emitted in logs" PBSUtils.waitUntil({ pbsServiceWithLogAnalytics.isContainLogsByValue(bidRequest.id) }) def logsByValue = pbsServiceWithLogAnalytics.getLogsByValue(bidRequest.id) - assert logsByValue - - and: "Analytics adapter should contain additional info" def analyticsBidRequest = extractResolvedRequestFromLog(logsByValue) assert analyticsBidRequest.ext.prebid.analytics.logAnalytics.additionalData == additionalData + + where: + logAnalyticsEnable << [null, true] } def "PBS should prioritize logAnalytics from request when data specified in account and request"() { @@ -215,7 +235,7 @@ class AnalyticsSpec extends BaseSpec { and: "Account in the DB" def accountAdditionalData = PBSUtils.randomString - def logAnalyticsModule = new LogAnalytics(enabled: true, additionalData: accountAdditionalData) + def logAnalyticsModule = new LogAnalytics(enabled: logAnalyticsEnable, additionalData: accountAdditionalData) def config = new AccountAnalyticsConfig(modules: new AnalyticsModule(logAnalytics: logAnalyticsModule)) def accountConfig = new AccountConfig(analytics: config) def account = new Account(uuid: bidRequest.accountId, config: accountConfig) @@ -224,14 +244,14 @@ class AnalyticsSpec extends BaseSpec { when: "PBS processes auction request" pbsServiceWithLogAnalytics.sendAuctionRequest(bidRequest) - then: "PBS should call log analytics" + then: "Analytics bid request should be emitted in logs" PBSUtils.waitUntil({ pbsServiceWithLogAnalytics.isContainLogsByValue(bidRequest.id) }) def logsByValue = pbsServiceWithLogAnalytics.getLogsByValue(bidRequest.id) - assert logsByValue - - and: "Analytics adapter should contain additional info" def analyticsBidRequest = extractResolvedRequestFromLog(logsByValue) assert analyticsBidRequest.ext.prebid.analytics.logAnalytics.additionalData == bidRequestAdditionalData + + where: + logAnalyticsEnable << [null, true] } private static BidRequest extractResolvedRequestFromLog(String logsByText) { diff --git a/src/test/java/org/prebid/server/analytics/reporter/AnalyticsReporterDelegatorTest.java b/src/test/java/org/prebid/server/analytics/reporter/AnalyticsReporterDelegatorTest.java index cc0a712b4e8..4f81b761e59 100644 --- a/src/test/java/org/prebid/server/analytics/reporter/AnalyticsReporterDelegatorTest.java +++ b/src/test/java/org/prebid/server/analytics/reporter/AnalyticsReporterDelegatorTest.java @@ -426,6 +426,31 @@ public void shouldNotCallAnalyticsAdapterIfDisabledByAccount() { verify(firstReporter, never()).processEvent(auctionEventCaptor.capture()); } + @Test + public void shouldCallAnalyticsAdapterIfAdapterNodePresentButEnabledPropertyNotPresent() { + // given + final ObjectNode moduleConfig = mapper.createObjectNode(); + moduleConfig.put("property1", "value1"); + moduleConfig.put("property2", "value2"); + + final AuctionContext auctionContext = AuctionContext.builder() + .account(Account.builder() + .analytics(AccountAnalyticsConfig.of( + true, null, Map.of("logAnalytics", moduleConfig))) + .build()) + .bidRequest(BidRequest.builder() + .ext(ExtRequest.of(ExtRequestPrebid.builder().analytics(mapper.createObjectNode()).build())) + .build()) + .build(); + + // when + target.processEvent(AuctionEvent.builder().auctionContext(auctionContext).build()); + + // then + verify(vertx, times(2)).runOnContext(any()); + verify(firstReporter).processEvent(any()); + } + @Test public void shouldUpdateAuctionEventWithPropertiesFromAdapterSpecificAccountConfig() { // given