diff --git a/src/test/groovy/org/prebid/server/functional/model/config/AccountGdprConfig.groovy b/src/test/groovy/org/prebid/server/functional/model/config/AccountGdprConfig.groovy index f2f549f003a..1425f339fea 100644 --- a/src/test/groovy/org/prebid/server/functional/model/config/AccountGdprConfig.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/config/AccountGdprConfig.groovy @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming import groovy.transform.ToString import org.prebid.server.functional.model.ChannelType +import org.prebid.server.functional.model.bidder.BidderName @ToString(includeNames = true, ignoreNulls = true) @JsonNaming(PropertyNamingStrategies.KebabCaseStrategy) @@ -22,7 +23,7 @@ class AccountGdprConfig { PurposeOneTreatmentInterpretation purposeOneTreatmentInterpretation @JsonProperty("purpose_one_treatment_interpretation") PurposeOneTreatmentInterpretation purposeOneTreatmentInterpretationSnakeCase - List basicEnforcementVendors + List basicEnforcementVendors @JsonProperty("basic_enforcement_vendors") - List basicEnforcementVendorsSnakeCase + List basicEnforcementVendorsSnakeCase } diff --git a/src/test/groovy/org/prebid/server/functional/model/config/SpecialFeatureConfig.groovy b/src/test/groovy/org/prebid/server/functional/model/config/SpecialFeatureConfig.groovy index fc0d90ca6f8..483c4e81b01 100644 --- a/src/test/groovy/org/prebid/server/functional/model/config/SpecialFeatureConfig.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/config/SpecialFeatureConfig.groovy @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming import groovy.transform.ToString +import org.prebid.server.functional.model.bidder.BidderName @ToString(includeNames = true, ignoreNulls = true) @JsonNaming(PropertyNamingStrategies.KebabCaseStrategy) @@ -12,5 +13,5 @@ class SpecialFeatureConfig { Boolean enforce List vendorExceptions @JsonProperty("vendor_exceptions") - List vendorExceptionsSnakeCase + List vendorExceptionsSnakeCase } diff --git a/src/test/groovy/org/prebid/server/functional/model/privacy/EnforcementRequirement.groovy b/src/test/groovy/org/prebid/server/functional/model/privacy/EnforcementRequirement.groovy index 23e2684e51a..3b4eda25b3d 100644 --- a/src/test/groovy/org/prebid/server/functional/model/privacy/EnforcementRequirement.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/privacy/EnforcementRequirement.groovy @@ -9,6 +9,11 @@ import org.prebid.server.functional.model.config.Purpose import org.prebid.server.functional.model.config.PurposeEnforcement import org.prebid.server.functional.util.privacy.TcfConsent +import java.time.ZonedDateTime + +import static org.prebid.server.functional.util.privacy.TcfConsent.RestrictionType.REQUIRE_CONSENT +import static org.prebid.server.functional.util.privacy.TcfConsent.RestrictionType.UNDEFINED + @ToString(includeNames = true, ignoreNulls = true) @JsonNaming(PropertyNamingStrategies.KebabCaseStrategy) class EnforcementRequirement { @@ -27,4 +32,32 @@ class EnforcementRequirement { List restrictionType Integer vendorIdGvl Integer vendorListVersion + List disclosedVendorsId + ZonedDateTime created = ZonedDateTime.now() + ZonedDateTime updated = ZonedDateTime.now() + + static EnforcementRequirement getDefaultBase(Integer disclosedVendorsId, Purpose purpose = Purpose.P2) { + new EnforcementRequirement().tap { + it.purpose = purpose + it.enforcePurpose = PurposeEnforcement.BASIC + it.enforceVendor = false + it.disclosedVendorsId = [disclosedVendorsId] + } + } + + static EnforcementRequirement getDefaultFull(Integer vendorId, + Integer vendorListVersion, + Purpose purpose = Purpose.P2) { + + new EnforcementRequirement().tap { + it.enforcePurpose = PurposeEnforcement.FULL + it.purpose = purpose + it.enforceVendor = true + it.vendorIdGvl = vendorId + it.restrictionType = [REQUIRE_CONSENT, UNDEFINED] + it.vendorConsentBitField = vendorId + it.vendorListVersion = vendorListVersion + it.disclosedVendorsId = [vendorId] + } + } } diff --git a/src/test/groovy/org/prebid/server/functional/testcontainers/PbsServiceFactory.groovy b/src/test/groovy/org/prebid/server/functional/testcontainers/PbsServiceFactory.groovy index e0911a2b1ca..60ca02ad762 100644 --- a/src/test/groovy/org/prebid/server/functional/testcontainers/PbsServiceFactory.groovy +++ b/src/test/groovy/org/prebid/server/functional/testcontainers/PbsServiceFactory.groovy @@ -4,6 +4,7 @@ import org.prebid.server.functional.service.PrebidServerService import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer import org.prebid.server.functional.testcontainers.container.PrebidServerContainer import org.prebid.server.functional.util.SystemProperties +import org.testcontainers.images.builder.Transferable import static org.prebid.server.functional.util.SystemProperties.USE_FIXED_CONTAINER_PORTS @@ -19,7 +20,7 @@ class PbsServiceFactory { this.networkServiceContainer = networkServiceContainer } - static PrebidServerService getService(Map config) { + static PrebidServerService getService(Map config, Map additionalFiles = [:]) { if (containers.containsKey(config)) { def container = containers.get(config) container.refresh() @@ -33,6 +34,9 @@ class PbsServiceFactory { remove([(container.key): container.value]) } def pbsContainer = new PrebidServerContainer(config) + if (!additionalFiles.isEmpty()) { + additionalFiles.each { k, v -> pbsContainer.withCopyToContainer(v, k) } + } pbsContainer.start() containers.put(config, pbsContainer) return new PrebidServerService(pbsContainer) diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/PrivacyBaseSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/PrivacyBaseSpec.groovy index 7d8ed79de7d..1b655769512 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/PrivacyBaseSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/PrivacyBaseSpec.groovy @@ -29,6 +29,7 @@ import org.prebid.server.functional.model.request.amp.ConsentType import org.prebid.server.functional.model.request.auction.AllowActivities import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Data +import org.prebid.server.functional.model.request.auction.DebugCondition import org.prebid.server.functional.model.request.auction.Device import org.prebid.server.functional.model.request.auction.DistributionChannel import org.prebid.server.functional.model.request.auction.Eid @@ -211,6 +212,8 @@ abstract class PrivacyBaseSpec extends BaseSpec { getBidRequestWithGeo(channel).tap { regs.gdpr = 1 user = new User(consent: consentString) + test = DebugCondition.DISABLED + ext.prebid.debug = DebugCondition.DISABLED } } @@ -253,21 +256,6 @@ abstract class PrivacyBaseSpec extends BaseSpec { geo } - protected static void cacheVendorList(PrebidServerService pbsService) { - def isVendorListCachedClosure = { - def validConsentString = new TcfConsent.Builder() - .setPurposesLITransparency(BASIC_ADS) - .setVendorLegitimateInterest([GENERIC_VENDOR_ID]) - .build() - def bidRequest = getGdprBidRequest(validConsentString) - - pbsService.sendAuctionRequest(bidRequest) - - pbsService.sendCollectedMetricsRequest()["privacy.tcf.v2.vendorlist.missing"] == 0 - } - PBSUtils.waitUntil(isVendorListCachedClosure, 10000, 1000) - } - protected static Account getAccountWithGdpr(String accountId, AccountGdprConfig gdprConfig) { getAccountWithPrivacy(accountId, new AccountPrivacyConfig(gdpr: gdprConfig)) } @@ -298,291 +286,6 @@ abstract class PrivacyBaseSpec extends BaseSpec { "/app/prebid-server/data/vendorlist-v${TCF_POLICY_V2.vendorListVersion}/${gvlVersion}.json" } - protected static List getBasicTcfCompanyBasedEnforcementRequirements(Purpose purpose) { - [new EnforcementRequirement(purpose: purpose, enforcePurpose: BASIC, enforceVendor: false), - new EnforcementRequirement(purpose: purpose, enforcePurpose: NO, enforceVendor: false), - new EnforcementRequirement(purpose: purpose, enforcePurpose: NO, enforceVendor: true, vendorConsentBitField: GENERIC_VENDOR_ID) - ] - } - - protected static List getBasicTcfLegalBasedEnforcementRequirements(Purpose purpose) { - [new EnforcementRequirement(purpose: purpose, enforcePurpose: BASIC, enforceVendor: true, vendorConsentBitField: GENERIC_VENDOR_ID), - new EnforcementRequirement(purpose: purpose, vendorExceptions: [GENERIC]) - ] - } - - protected static List getBasicTcfCompanySoftVendorExceptionsRequirements(Purpose purpose) { - [new EnforcementRequirement(purpose: purpose, enforcePurpose: BASIC, vendorExceptions: [GENERIC]), - new EnforcementRequirement(purpose: purpose, enforcePurpose: NO, vendorExceptions: [GENERIC])] - } - - protected static List getBasicTcfLegalPurposesLITEnforcementRequirements(Purpose purpose) { - [new EnforcementRequirement(purpose: purpose, enforcePurpose: BASIC, purposesLITransparency: true)] - } - - protected static List getFullTcfLegalEnforcementRequirements(Purpose purpose, boolean isPurposeExcludedAndListRandom = false) { - [new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - restrictionType: [REQUIRE_CONSENT, UNDEFINED], - vendorIdGvl: GENERIC_VENDOR_ID, - enforcePurpose: FULL, - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_ONLY_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST, UNDEFINED], - purposesLITransparency: true, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_PURPOSES_ONLY_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST, UNDEFINED], - purposesLITransparency: true, - enforceVendor: false, - vendorListVersion: LEG_INT_PURPOSES_ONLY_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - purposesLITransparency: true, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - purposesLITransparency: true, - enforceVendor: false, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST], - purposesLITransparency: true, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST], - purposesLITransparency: true, - enforceVendor: false, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_CONSENT], - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - purposesLITransparency: true, - enforceVendor: false, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - purposesLITransparency: true, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_CONSENT], - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST], - purposesLITransparency: true, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST], - purposesLITransparency: true, - enforceVendor: false, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION) - ] - } - - protected static List getFullTcfLegalEnforcementRequirementsRandomlyWithExcludePurpose(Purpose purpose) { - getFullTcfLegalEnforcementRequirements(purpose, true) - } - - protected static List getFullTcfCompanyEnforcementRequirements(Purpose purpose, boolean isPurposeExcludedAndListRandom = false) { - [new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - restrictionType: [REQUIRE_CONSENT, UNDEFINED], - vendorIdGvl: GENERIC_VENDOR_ID, - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: PURPOSES_ONLY_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - restrictionType: [REQUIRE_CONSENT], - vendorIdGvl: GENERIC_VENDOR_ID, - enforcePurpose: FULL, - enforceVendor: false, - vendorListVersion: PURPOSES_ONLY_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - restrictionType: [REQUIRE_CONSENT], - vendorIdGvl: GENERIC_VENDOR_ID, - enforcePurpose: NO, - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_ONLY_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST, UNDEFINED], - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: LEG_INT_PURPOSES_ONLY_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST, UNDEFINED], - enforcePurpose: NO, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_PURPOSES_ONLY_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforceVendor: false, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforcePurpose: NO, - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforcePurpose: NO, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST], - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST], - enforcePurpose: NO, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_CONSENT], - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_CONSENT], - enforceVendor: false, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_CONSENT], - enforcePurpose: NO, - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforceVendor: false, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforcePurpose: NO, - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [UNDEFINED], - enforcePurpose: NO, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_CONSENT], - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_CONSENT], - enforceVendor: false, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_CONSENT], - enforcePurpose: NO, - vendorConsentBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST], - enforcePurpose: NO, - enforceVendor: false, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - vendorIdGvl: GENERIC_VENDOR_ID, - restrictionType: [REQUIRE_LEGITIMATE_INTEREST], - enforcePurpose: NO, - vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, - vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION), - - new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, - enforcePurpose: NO, - enforceVendor: false)] - } - protected static String generateSensitiveGpp(GppSectionId sectionId, Map fieldsMap) { Object sensitiveData Object consentBuilder @@ -650,10 +353,6 @@ abstract class PrivacyBaseSpec extends BaseSpec { } } - protected static List getFullTcfCompanyEnforcementRequirementsRandomlyWithExcludePurpose(Purpose purpose) { - getFullTcfCompanyEnforcementRequirements(purpose, true) - } - protected static String getVendorListContent(boolean includePurposes, boolean includeLegIntPurposes, boolean includeFlexiblePurposes) { def purposeValues = TcfConsent.PurposeId.values().value def vendor = VendorListResponse.Vendor.getDefaultVendor(GENERIC_VENDOR_ID).tap { @@ -669,9 +368,4 @@ abstract class PrivacyBaseSpec extends BaseSpec { it.vendors = [(GENERIC_VENDOR_ID): vendor] }) } - - private static Purpose getRandomPurposeWithExclusion(Purpose excludeFromRandom) { - def availablePurposes = Purpose.values().toList() - excludeFromRandom - availablePurposes.shuffled().first() - } } diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/TcfFullTransmitEidsActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/TcfFullTransmitEidsActivitiesSpec.groovy deleted file mode 100644 index d798bc4c478..00000000000 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/TcfFullTransmitEidsActivitiesSpec.groovy +++ /dev/null @@ -1,219 +0,0 @@ -package org.prebid.server.functional.tests.privacy - -import org.prebid.server.functional.model.config.AccountGdprConfig -import org.prebid.server.functional.model.request.auction.Activity -import org.prebid.server.functional.model.request.auction.ActivityRule -import org.prebid.server.functional.model.request.auction.AllowActivities -import org.prebid.server.functional.model.request.auction.Condition -import org.prebid.server.functional.model.request.auction.Eid -import org.prebid.server.functional.service.PrebidServerService -import org.prebid.server.functional.testcontainers.container.PrebidServerContainer -import org.prebid.server.functional.util.privacy.TcfUtils -import org.testcontainers.images.builder.Transferable -import spock.lang.Shared - -import static org.prebid.server.functional.model.config.Purpose.P1 -import static org.prebid.server.functional.model.config.Purpose.P4 -import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_EIDS - -class TcfFullTransmitEidsActivitiesSpec extends PrivacyBaseSpec { - - @Shared - private static PrebidServerContainer privacyPbsContainerWithMultipleGvl - - @Shared - private static PrebidServerService privacyPbsServiceWithMultipleGvl - - def setupSpec() { - privacyPbsContainerWithMultipleGvl = new PrebidServerContainer(GENERAL_PRIVACY_CONFIG) - def prepareEncodeResponseBodyWithPurposesOnly = getVendorListContent(true, false, false) - def prepareEncodeResponseBodyWithLegIntPurposes = getVendorListContent(false, true, false) - def prepareEncodeResponseBodyWithLegIntAndFlexiblePurposes = getVendorListContent(false, true, true) - def prepareEncodeResponseBodyWithPurposesAndFlexiblePurposes = getVendorListContent(true, false, true) - privacyPbsContainerWithMultipleGvl.withCopyToContainer(Transferable.of(prepareEncodeResponseBodyWithPurposesOnly), getVendorListPath(PURPOSES_ONLY_GVL_VERSION)) - privacyPbsContainerWithMultipleGvl.withCopyToContainer(Transferable.of(prepareEncodeResponseBodyWithLegIntPurposes), getVendorListPath(LEG_INT_PURPOSES_ONLY_GVL_VERSION)) - privacyPbsContainerWithMultipleGvl.withCopyToContainer(Transferable.of(prepareEncodeResponseBodyWithLegIntAndFlexiblePurposes), getVendorListPath(LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION)) - privacyPbsContainerWithMultipleGvl.withCopyToContainer(Transferable.of(prepareEncodeResponseBodyWithPurposesAndFlexiblePurposes), getVendorListPath(PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION)) - privacyPbsContainerWithMultipleGvl.start() - privacyPbsServiceWithMultipleGvl = new PrebidServerService(privacyPbsContainerWithMultipleGvl) - } - - def cleanupSpec() { - privacyPbsContainerWithMultipleGvl.stop() - } - - def "PBS should leave the original request with eids data when requireConsent is enabled and #enforcementRequirements.purpose have full consent"() { - given: "Default Generic BidRequests with Eid field" - def userEids = [Eid.defaultEid] - def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) - def bidRequest = getGdprBidRequest(tcfConsent).tap { - it.user.eids = userEids - } - - and: "Save account config with requireConsent into DB" - def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes) - def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) - def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { - config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) - } - accountDao.save(account) - - when: "PBS processes auction requests" - privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) - - then: "Generic bidder request should have data in Eid field" - def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest?.user?.eids == userEids - - where: - enforcementRequirements << getFullTcfLegalEnforcementRequirements(P4) + getFullTcfCompanyEnforcementRequirements(P4) - } - - def "PBS should remove the original request with eids data when requireConsent is enabled and #enforcementRequirements.purpose have full consent"() { - given: "Default Generic BidRequests with Eid field" - def userEids = [Eid.defaultEid] - def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) - def bidRequest = getGdprBidRequest(tcfConsent).tap { - it.user.eids = userEids - } - - and: "Save account config with requireConsent into DB" - def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes) - def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) - def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { - config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) - } - accountDao.save(account) - - when: "PBS processes auction requests" - privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) - - then: "Generic bidder request shouldn't have data in Eid field" - def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert !bidderRequest?.user?.eids - assert !bidderRequest.user?.ext?.eids - - where: - enforcementRequirements << getFullTcfLegalEnforcementRequirementsRandomlyWithExcludePurpose(P4) + - getFullTcfCompanyEnforcementRequirementsRandomlyWithExcludePurpose(P4) - } - - def "PBS should leave the original request with eids data when requireConsent is enabled but bidder is excepted and #enforcementRequirements.purpose have full consent"() { - given: "Default Generic BidRequests with Eid field" - def userEids = [Eid.defaultEid] - def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) - def bidRequest = getGdprBidRequest(tcfConsent).tap { - it.user.eids = userEids - } - - and: "Save account config with requireConsent into DB" - def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true, userEids.source) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes) - def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) - def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { - config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) - } - accountDao.save(account) - - when: "PBS processes auction requests" - privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) - - then: "Generic bidder request should have data in Eid field" - def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest?.user?.eids == userEids - - where: - enforcementRequirements << getFullTcfLegalEnforcementRequirementsRandomlyWithExcludePurpose(P1) - } - - def "PBS should remove the original request with eids data when requireConsent is enabled, bidder is excepted and #enforcementRequirements.purpose have unsupported full consent"() { - given: "Default Generic BidRequests with Eid field" - def userEids = [Eid.defaultEid] - def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) - def bidRequest = getGdprBidRequest(tcfConsent).tap { - it.user.eids = userEids - } - - and: "Save account config with requireConsent into DB" - def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true, userEids.source) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes) - def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) - def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { - config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) - } - accountDao.save(account) - - when: "PBS processes auction requests" - privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) - - then: "Generic bidder request shouldn't have data in Eid field" - def bidderRequest = bidder.getBidderRequest(bidRequest.id) - - assert !bidderRequest?.user?.eids - assert !bidderRequest.user?.ext?.eids - - where: - enforcementRequirements << getFullTcfLegalEnforcementRequirements(P1) + - getFullTcfCompanyEnforcementRequirementsRandomlyWithExcludePurpose(P4) - } - - def "PBS should leave the original request with eids data when requireConsent is disabled and #enforcementRequirements.purpose have full consent"() { - given: "Default Generic BidRequests with Eid field" - def userEids = [Eid.defaultEid] - def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) - def bidRequest = getGdprBidRequest(tcfConsent).tap { - it.user.eids = userEids - } - - and: "Save account config with requireConsent into DB" - def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, false) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes) - def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) - def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { - config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) - } - accountDao.save(account) - - when: "PBS processes auction requests" - privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) - - then: "Generic bidder request should have data in Eid field" - def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert bidderRequest?.user?.eids == userEids - - where: - enforcementRequirements << getFullTcfLegalEnforcementRequirementsRandomlyWithExcludePurpose(P1) - } - - def "PBS should remove the original request with eids data when requireConsent is disabled and #enforcementRequirements.purpose have unsupported full consent"() { - given: "Default Generic BidRequests with Eid field" - def userEids = [Eid.defaultEid] - def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) - def bidRequest = getGdprBidRequest(tcfConsent).tap { - it.user.eids = userEids - } - - and: "Save account config with requireConsent into DB" - def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, false) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes) - def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) - def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { - config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) - } - accountDao.save(account) - - when: "PBS processes auction requests" - privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) - - then: "Generic bidder request shouldn't have data in Eid field" - def bidderRequest = bidder.getBidderRequest(bidRequest.id) - assert !bidderRequest.user?.eids - assert !bidderRequest.user?.ext?.eids - - where: - enforcementRequirements << getFullTcfLegalEnforcementRequirements(P1) + - getFullTcfCompanyEnforcementRequirementsRandomlyWithExcludePurpose(P4) - } -} diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAmpSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/ccpa/CcpaAmpSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAmpSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/ccpa/CcpaAmpSpec.groovy index 945ee175ee1..ad6a320b943 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAmpSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/ccpa/CcpaAmpSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.ccpa import org.prebid.server.functional.model.config.AccountCcpaConfig import org.prebid.server.functional.model.config.AccountConfig @@ -7,6 +7,7 @@ import org.prebid.server.functional.model.db.Account import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.response.auction.ErrorType +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.privacy.BogusConsent import org.prebid.server.functional.util.privacy.CcpaConsent import org.prebid.server.functional.util.privacy.TcfConsent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAuctionSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/ccpa/CcpaAuctionSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAuctionSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/ccpa/CcpaAuctionSpec.groovy index d544c7a2788..719688ea015 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/CcpaAuctionSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/ccpa/CcpaAuctionSpec.groovy @@ -1,8 +1,9 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.ccpa import org.prebid.server.functional.model.ChannelType import org.prebid.server.functional.model.config.AccountCcpaConfig import org.prebid.server.functional.model.request.auction.DistributionChannel +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.privacy.BogusConsent import org.prebid.server.functional.util.privacy.CcpaConsent import spock.lang.PendingFeature diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/CoppaSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/coppa/CoppaSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/CoppaSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/coppa/CoppaSpec.groovy index 134aa10c9a4..36d6ea3d13d 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/CoppaSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/coppa/CoppaSpec.groovy @@ -1,7 +1,8 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.coppa import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.request.amp.AmpRequest +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import spock.lang.PendingFeature import static org.prebid.server.functional.model.bidder.BidderName.GENERIC diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/DsaSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/dsa/DsaSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/DsaSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/dsa/DsaSpec.groovy index c2bf06fe50a..d1a246f5509 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/DsaSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/dsa/DsaSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.dsa import org.prebid.server.functional.model.bidder.BidderName import org.prebid.server.functional.model.config.AccountDsaConfig @@ -12,6 +12,7 @@ import org.prebid.server.functional.model.response.auction.BidExt import org.prebid.server.functional.model.response.auction.BidResponse import org.prebid.server.functional.model.response.auction.DsaResponse import org.prebid.server.functional.model.response.auction.DsaResponse as BidDsa +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.TcfConsent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAmpSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gdpr/GdprAmpSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAmpSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gdpr/GdprAmpSpec.groovy index 717c9f32d5b..df76af992dc 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAmpSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gdpr/GdprAmpSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gdpr import org.mockserver.model.Delay import org.prebid.server.functional.model.ChannelType @@ -13,6 +13,7 @@ import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.DistributionChannel import org.prebid.server.functional.model.request.auction.Regs import org.prebid.server.functional.model.request.auction.RegsExt +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.BogusConsent import org.prebid.server.functional.util.privacy.CcpaConsent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gdpr/GdprAuctionSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gdpr/GdprAuctionSpec.groovy index 299d911a398..26230f63972 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprAuctionSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gdpr/GdprAuctionSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gdpr import org.mockserver.model.Delay import org.prebid.server.functional.model.ChannelType @@ -12,6 +12,7 @@ import org.prebid.server.functional.model.request.auction.DistributionChannel import org.prebid.server.functional.model.request.auction.Regs import org.prebid.server.functional.model.request.auction.RegsExt import org.prebid.server.functional.model.response.auction.ErrorType +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.BogusConsent import org.prebid.server.functional.util.privacy.TcfConsent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprSetUidSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gdpr/GdprSetUidSpec.groovy similarity index 98% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GdprSetUidSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gdpr/GdprSetUidSpec.groovy index df46f493775..1f6cfe99ad2 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GdprSetUidSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gdpr/GdprSetUidSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gdpr import org.prebid.server.functional.model.UidsCookie import org.prebid.server.functional.model.config.AccountAuctionConfig @@ -11,6 +11,8 @@ import org.prebid.server.functional.model.request.setuid.SetuidRequest import org.prebid.server.functional.model.response.cookiesync.UserSyncInfo import org.prebid.server.functional.service.PrebidServerException import org.prebid.server.functional.service.PrebidServerService +import org.prebid.server.functional.testcontainers.Dependencies +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.TcfConsent import org.prebid.server.util.ResourceUtil @@ -23,14 +25,13 @@ import static org.prebid.server.functional.model.config.PurposeEnforcement.FULL import static org.prebid.server.functional.model.config.PurposeEnforcement.NO import static org.prebid.server.functional.model.request.setuid.UidWithExpiry.getDefaultUidWithExpiry import static org.prebid.server.functional.model.response.cookiesync.UserSyncInfo.Type.REDIRECT -import static org.prebid.server.functional.testcontainers.Dependencies.getNetworkServiceContainer import static org.prebid.server.functional.util.privacy.TcfConsent.GENERIC_VENDOR_ID import static org.prebid.server.functional.util.privacy.TcfConsent.PurposeId.DEVICE_ACCESS class GdprSetUidSpec extends PrivacyBaseSpec { private static final boolean CORS_SUPPORT = false - private static final String USER_SYNC_URL = "$networkServiceContainer.rootUri/generic-usersync" + private static final String USER_SYNC_URL = "$Dependencies.networkServiceContainer.rootUri/generic-usersync" private static final UserSyncInfo.Type USER_SYNC_TYPE = REDIRECT private static final Map VENDOR_GENERIC_PBS_CONFIG = GENERIC_VENDOR_CONFIG + ["gdpr.purposes.p1.enforce-purpose" : NO.value, diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/ActivityTraceLogSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/general/ActivityTraceLogSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/ActivityTraceLogSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/general/ActivityTraceLogSpec.groovy index d9563b7fe4d..562a6fb7a4f 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/ActivityTraceLogSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/general/ActivityTraceLogSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.general import org.prebid.server.functional.model.config.AccountGppConfig import org.prebid.server.functional.model.request.auction.Activity @@ -15,6 +15,7 @@ import org.prebid.server.functional.model.response.auction.ActivityInvocationPay import org.prebid.server.functional.model.response.auction.And import org.prebid.server.functional.model.response.auction.GeoCode import org.prebid.server.functional.model.response.auction.RuleConfiguration +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.gpp.v1.UsNatV1Consent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/PrivacyCookieSyncSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/general/PrivacyCookieSyncSpec.groovy similarity index 92% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/PrivacyCookieSyncSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/general/PrivacyCookieSyncSpec.groovy index 6e424bbdb48..b4b8c947103 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/PrivacyCookieSyncSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/general/PrivacyCookieSyncSpec.groovy @@ -1,7 +1,8 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.general import org.prebid.server.functional.model.config.AccountCcpaConfig import org.prebid.server.functional.model.request.cookiesync.CookieSyncRequest +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.CcpaConsent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppAmpSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppAmpSpec.groovy similarity index 98% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppAmpSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppAmpSpec.groovy index ab4d46117ab..b1c646ac4ae 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppAmpSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppAmpSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.request.amp.AmpRequest @@ -6,6 +6,7 @@ import org.prebid.server.functional.model.request.amp.ConsentType import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Regs import org.prebid.server.functional.model.request.auction.RegsExt +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.gpp.v2.TcfEuV2Consent import org.prebid.server.functional.util.privacy.gpp.v1.UspV1Consent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppAuctionSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppAuctionSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppAuctionSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppAuctionSpec.groovy index d0282d48ddd..a503c4c67e5 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppAuctionSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppAuctionSpec.groovy @@ -1,10 +1,11 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Regs import org.prebid.server.functional.model.request.auction.RegsExt import org.prebid.server.functional.model.request.auction.User import org.prebid.server.functional.model.response.auction.ErrorType +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.CcpaConsent import org.prebid.server.functional.util.privacy.TcfConsent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppCookieSyncSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppCookieSyncSpec.groovy similarity index 97% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppCookieSyncSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppCookieSyncSpec.groovy index 045dd33a784..c9dff075dae 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppCookieSyncSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppCookieSyncSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import io.netty.handler.codec.http.HttpResponseStatus import org.prebid.server.functional.model.config.AccountConfig @@ -11,6 +11,7 @@ import org.prebid.server.functional.model.request.cookiesync.CookieSyncRequest import org.prebid.server.functional.model.response.cookiesync.UserSyncInfo import org.prebid.server.functional.service.PrebidServerException import org.prebid.server.functional.service.PrebidServerService +import org.prebid.server.functional.testcontainers.Dependencies import org.prebid.server.functional.tests.BaseSpec import org.prebid.server.functional.util.HttpUtil import org.prebid.server.functional.util.PBSUtils @@ -28,7 +29,6 @@ import static org.prebid.server.functional.model.request.GppSectionId.TCF_EU_V2 import static org.prebid.server.functional.model.request.GppSectionId.USP_V1 import static org.prebid.server.functional.model.response.cookiesync.UserSyncInfo.Type.IFRAME import static org.prebid.server.functional.model.response.cookiesync.UserSyncInfo.Type.REDIRECT -import static org.prebid.server.functional.testcontainers.Dependencies.networkServiceContainer import static org.prebid.server.functional.util.privacy.CcpaConsent.Signal.ENFORCED import static org.prebid.server.functional.util.privacy.TcfConsent.GENERIC_VENDOR_ID import static org.prebid.server.functional.util.privacy.TcfConsent.PurposeId.DEVICE_ACCESS @@ -37,7 +37,7 @@ class GppCookieSyncSpec extends BaseSpec { private static final UserSyncInfo.Type USER_SYNC_TYPE = REDIRECT private static final boolean CORS_SUPPORT = false - private static final String USER_SYNC_URL = "$networkServiceContainer.rootUri/generic-usersync" + private static final String USER_SYNC_URL = "$Dependencies.networkServiceContainer.rootUri/generic-usersync" private static final GppSectionId FIRST_GPP_SECTION = PBSUtils.getRandomEnum(GppSectionId.class) private static final GppSectionId SECOND_GPP_SECTION = PBSUtils.getRandomEnum(GppSectionId.class, [FIRST_GPP_SECTION]) @@ -47,7 +47,7 @@ class GppCookieSyncSpec extends BaseSpec { "adapters.${GENERIC.value}.usersync.${USER_SYNC_TYPE.value}.support-cors": CORS_SUPPORT.toString()] private static final Map GENERIC_WITH_SKIP_CONFIG = [ "adapters.${GENERIC.value}.meta-info.vendor-id" : GENERIC_VENDOR_ID as String, - "adapters.${GENERIC.value}.usersync.${USER_SYNC_TYPE.value}.url" : "$networkServiceContainer.rootUri/generic-usersync&redir={{redirect_url}}".toString(), + "adapters.${GENERIC.value}.usersync.${USER_SYNC_TYPE.value}.url" : "$Dependencies.networkServiceContainer.rootUri/generic-usersync&redir={{redirect_url}}".toString(), "adapters.${GENERIC.value}.usersync.skipwhen.gdpr" : 'true', "adapters.${GENERIC.value}.usersync.skipwhen.gpp_sid" : "${FIRST_GPP_SECTION.value}, ${SECOND_GPP_SECTION.value}".toString(), "adapters.${GENERIC.value}.usersync.${USER_SYNC_TYPE.value}.support-cors": CORS_SUPPORT.toString()] @@ -229,7 +229,7 @@ class GppCookieSyncSpec extends BaseSpec { def "PBS should return empty gpp and gppSid in usersync url when gpp and gppSid is not present in request"() { given: "Pbs config with usersync.#userSyncFormat.url" - def pbsConfig = ["adapters.generic.usersync.${userSyncFormat.value}.url" : "$networkServiceContainer.rootUri/generic-usersync&redir={{redirect_url}}".toString(), + def pbsConfig = ["adapters.generic.usersync.${userSyncFormat.value}.url" : "$Dependencies.networkServiceContainer.rootUri/generic-usersync&redir={{redirect_url}}".toString(), "adapters.generic.usersync.${userSyncFormat.value}.support-cors": "false"] def prebidServerService = pbsServiceFactory.getService(pbsConfig) @@ -256,7 +256,7 @@ class GppCookieSyncSpec extends BaseSpec { def "PBS should populate gpp and gppSid in usersync url when gpp and gppSid is present in request"() { given: "Pbs config with usersync.#userSyncFormat.url" - def pbsConfig = ["adapters.generic.usersync.${userSyncFormat.value}.url" : "$networkServiceContainer.rootUri/generic-usersync&redir={{redirect_url}}".toString(), + def pbsConfig = ["adapters.generic.usersync.${userSyncFormat.value}.url" : "$Dependencies.networkServiceContainer.rootUri/generic-usersync&redir={{redirect_url}}".toString(), "adapters.generic.usersync.${userSyncFormat.value}.support-cors": "false"] def prebidServerService = pbsServiceFactory.getService(pbsConfig) diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppFetchBidActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppFetchBidActivitiesSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppFetchBidActivitiesSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppFetchBidActivitiesSpec.groovy index d292bd9e6f1..7160c95c0ea 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppFetchBidActivitiesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppFetchBidActivitiesSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import org.prebid.server.functional.model.config.AccountGppConfig import org.prebid.server.functional.model.config.ActivityConfig @@ -21,6 +21,7 @@ import org.prebid.server.functional.model.request.auction.Device import org.prebid.server.functional.model.request.auction.Geo import org.prebid.server.functional.model.request.auction.RegsExt import org.prebid.server.functional.service.PrebidServerException +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.gpp.v1.UsCaV1Consent import org.prebid.server.functional.util.privacy.gpp.v1.UsCoV1Consent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppSetUidSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppSetUidSpec.groovy similarity index 97% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppSetUidSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppSetUidSpec.groovy index d49565222d2..6f3da0d53a5 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppSetUidSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppSetUidSpec.groovy @@ -1,9 +1,10 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import org.prebid.server.functional.model.UidsCookie import org.prebid.server.functional.model.request.GppSectionId import org.prebid.server.functional.model.request.setuid.SetuidRequest import org.prebid.server.functional.service.PrebidServerException +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.gpp.v2.TcfEuV2Consent import org.prebid.server.functional.util.privacy.gpp.v1.UspV1Consent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppSyncUserActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppSyncUserActivitiesSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppSyncUserActivitiesSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppSyncUserActivitiesSpec.groovy index 87d23a3d740..9cbd8671a80 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppSyncUserActivitiesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppSyncUserActivitiesSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import org.prebid.server.functional.model.UidsCookie import org.prebid.server.functional.model.config.AccountCcpaConfig @@ -23,6 +23,7 @@ import org.prebid.server.functional.model.request.auction.Condition import org.prebid.server.functional.model.request.cookiesync.CookieSyncRequest import org.prebid.server.functional.model.request.setuid.SetuidRequest import org.prebid.server.functional.service.PrebidServerException +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.gpp.v1.UsCaV1Consent import org.prebid.server.functional.util.privacy.gpp.v1.UsCoV1Consent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitEidsActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitEidsActivitiesSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitEidsActivitiesSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitEidsActivitiesSpec.groovy index 1db77ef0b90..1a52cbcea86 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitEidsActivitiesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitEidsActivitiesSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import org.prebid.server.functional.model.config.AccountGppConfig import org.prebid.server.functional.model.config.ActivityConfig @@ -21,6 +21,7 @@ import org.prebid.server.functional.model.request.auction.Device import org.prebid.server.functional.model.request.auction.Geo import org.prebid.server.functional.model.request.auction.RegsExt import org.prebid.server.functional.service.PrebidServerException +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.gpp.v1.UsCaV1Consent import org.prebid.server.functional.util.privacy.gpp.v1.UsCoV1Consent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitPreciseGeoActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitPreciseGeoActivitiesSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitPreciseGeoActivitiesSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitPreciseGeoActivitiesSpec.groovy index e3be1b13e98..da9dd38561f 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitPreciseGeoActivitiesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitPreciseGeoActivitiesSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import org.prebid.server.functional.model.config.AccountGppConfig import org.prebid.server.functional.model.config.ActivityConfig @@ -20,6 +20,7 @@ import org.prebid.server.functional.model.request.auction.Condition import org.prebid.server.functional.model.request.auction.Geo import org.prebid.server.functional.model.request.auction.RegsExt import org.prebid.server.functional.service.PrebidServerException +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.gpp.v1.UsCaV1Consent import org.prebid.server.functional.util.privacy.gpp.v1.UsCoV1Consent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitTidActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitTidActivitiesSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitTidActivitiesSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitTidActivitiesSpec.groovy index df0d0ab531f..fd02a755fe1 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitTidActivitiesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitTidActivitiesSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.request.amp.AmpRequest @@ -8,6 +8,7 @@ import org.prebid.server.functional.model.request.auction.AllowActivities import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Condition import org.prebid.server.functional.model.request.auction.Source +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import java.time.Instant diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitUfpdActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitUfpdActivitiesSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitUfpdActivitiesSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitUfpdActivitiesSpec.groovy index b648a4fe91c..185726ecc0c 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/GppTransmitUfpdActivitiesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/gpp/GppTransmitUfpdActivitiesSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.gpp import org.prebid.server.functional.model.config.AccountGdprConfig import org.prebid.server.functional.model.config.AccountGppConfig @@ -26,6 +26,7 @@ import org.prebid.server.functional.model.request.auction.Device import org.prebid.server.functional.model.request.auction.Geo import org.prebid.server.functional.model.request.auction.RegsExt import org.prebid.server.functional.service.PrebidServerException +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.gpp.v1.UsCaV1Consent import org.prebid.server.functional.util.privacy.gpp.v1.UsCoV1Consent diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/LmtSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/lmt/LmtSpec.groovy similarity index 99% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/LmtSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/lmt/LmtSpec.groovy index 4966fe43ddf..ffbd958a508 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/LmtSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/lmt/LmtSpec.groovy @@ -1,10 +1,11 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.lmt import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.request.amp.AmpRequest import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Device import org.prebid.server.functional.model.request.auction.DeviceExt +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec import org.prebid.server.functional.util.PBSUtils import static org.prebid.server.functional.model.privacy.Metric.TEMPLATE_ACCOUNT_DISALLOWED_COUNT diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfBaseSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfBaseSpec.groovy new file mode 100644 index 00000000000..995bd6adbfe --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfBaseSpec.groovy @@ -0,0 +1,392 @@ +package org.prebid.server.functional.tests.privacy.tcf + +import org.prebid.server.functional.model.config.Purpose +import org.prebid.server.functional.model.privacy.EnforcementRequirement +import org.prebid.server.functional.service.PrebidServerService +import org.prebid.server.functional.tests.privacy.PrivacyBaseSpec +import org.testcontainers.images.builder.Transferable + +import static org.prebid.server.functional.model.bidder.BidderName.GENERIC +import static org.prebid.server.functional.model.config.PurposeEnforcement.BASIC +import static org.prebid.server.functional.model.config.PurposeEnforcement.FULL +import static org.prebid.server.functional.model.config.PurposeEnforcement.NO +import static org.prebid.server.functional.util.privacy.TcfConsent.GENERIC_VENDOR_ID +import static org.prebid.server.functional.util.privacy.TcfConsent.RestrictionType.REQUIRE_CONSENT +import static org.prebid.server.functional.util.privacy.TcfConsent.RestrictionType.REQUIRE_LEGITIMATE_INTEREST +import static org.prebid.server.functional.util.privacy.TcfConsent.RestrictionType.UNDEFINED + +class TcfBaseSpec extends PrivacyBaseSpec { + + private static final Map PBS_CONFIG = SETTING_CONFIG + GENERIC_VENDOR_CONFIG + GENERIC_CONFIG + ["gdpr.vendorlist.v2.http-endpoint-template": null, + "gdpr.vendorlist.v3.http-endpoint-template": null] + private static String prepareEncodeResponseBodyWithPurposesOnly = getVendorListContent(true, false, false) + private static String prepareEncodeResponseBodyWithLegIntPurposes = getVendorListContent(false, true, false) + private static String prepareEncodeResponseBodyWithLegIntAndFlexiblePurposes = getVendorListContent(false, true, true) + private static String prepareEncodeResponseBodyWithPurposesAndFlexiblePurposes = getVendorListContent(true, false, true) + private static Map GLV_LISTS_FILES = [(getVendorListPath(PURPOSES_ONLY_GVL_VERSION) ) : Transferable.of(prepareEncodeResponseBodyWithPurposesOnly), + (getVendorListPath(LEG_INT_PURPOSES_ONLY_GVL_VERSION) ) : Transferable.of(prepareEncodeResponseBodyWithLegIntPurposes), + (getVendorListPath(LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION)): Transferable.of(prepareEncodeResponseBodyWithLegIntAndFlexiblePurposes), + (getVendorListPath(PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION)): Transferable.of(prepareEncodeResponseBodyWithPurposesAndFlexiblePurposes) + ] + + protected static PrebidServerService privacyPbsServiceWithMultipleGvl + protected static PrebidServerService activityPbsServiceExcludeGvl + + def setupSpec() { + activityPbsServiceExcludeGvl = pbsServiceFactory.getService(PBS_CONFIG) + privacyPbsServiceWithMultipleGvl = pbsServiceFactory.getService(GENERAL_PRIVACY_CONFIG, GLV_LISTS_FILES) + } + + protected static List getBasicTcfCompanyBasedEnforcementRequirements(Purpose purpose) { + [new EnforcementRequirement(purpose: purpose, enforcePurpose: BASIC, enforceVendor: false, disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: purpose, enforcePurpose: NO, enforceVendor: false, disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: purpose, enforcePurpose: NO, enforceVendor: true, vendorConsentBitField: GENERIC_VENDOR_ID, disclosedVendorsId: [GENERIC_VENDOR_ID]) + ] + } + + protected static List getBasicTcfLegalBasedEnforcementRequirements(Purpose purpose) { + [new EnforcementRequirement(purpose: purpose, + enforcePurpose: BASIC, + enforceVendor: true, + vendorConsentBitField: GENERIC_VENDOR_ID, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: purpose, vendorExceptions: [GENERIC]) + ] + } + + protected static List getBasicTcfCompanySoftVendorExceptionsRequirements(Purpose purpose) { + [new EnforcementRequirement(purpose: purpose, enforcePurpose: BASIC, vendorExceptions: [GENERIC]), + new EnforcementRequirement(purpose: purpose, enforcePurpose: NO, vendorExceptions: [GENERIC])] + } + + protected static List getBasicTcfLegalPurposesLITEnforcementRequirements(Purpose purpose) { + [new EnforcementRequirement(purpose: purpose, enforcePurpose: BASIC, purposesLITransparency: true, disclosedVendorsId: [GENERIC_VENDOR_ID])] + } + + protected static List getFullTcfLegalEnforcementRequirements(Purpose purpose, boolean isPurposeExcludedAndListRandom = false) { + [new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + restrictionType: [REQUIRE_CONSENT, UNDEFINED], + vendorIdGvl: GENERIC_VENDOR_ID, + enforcePurpose: FULL, + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_ONLY_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_CONSENT], + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_CONSENT], + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + ] + } + + protected static List getFullTcfLegalEnforcementRequirementsRandomlyWithExcludePurpose(Purpose purpose) { + getFullTcfLegalEnforcementRequirements(purpose, true) + } + + protected static List getFullTcfLegalLegitimateInterestsRequirements(Purpose purpose, boolean isPurposeExcludedAndListRandom = false) { + [new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST, UNDEFINED], + purposesLITransparency: true, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_PURPOSES_ONLY_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST, UNDEFINED], + purposesLITransparency: true, + enforceVendor: false, + vendorListVersion: LEG_INT_PURPOSES_ONLY_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + purposesLITransparency: true, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + purposesLITransparency: true, + enforceVendor: false, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST], + purposesLITransparency: true, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST], + purposesLITransparency: true, + enforceVendor: false, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + purposesLITransparency: true, + enforceVendor: false, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + purposesLITransparency: true, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST], + purposesLITransparency: true, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST], + purposesLITransparency: true, + enforceVendor: false, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]) + ] + } + + protected static List getFullTcfCompanyEnforcementRequirements(Purpose purpose, boolean isPurposeExcludedAndListRandom = false) { + [new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + restrictionType: [REQUIRE_CONSENT, UNDEFINED], + vendorIdGvl: GENERIC_VENDOR_ID, + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: PURPOSES_ONLY_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + restrictionType: [REQUIRE_CONSENT], + vendorIdGvl: GENERIC_VENDOR_ID, + enforcePurpose: FULL, + enforceVendor: false, + vendorListVersion: PURPOSES_ONLY_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + restrictionType: [REQUIRE_CONSENT], + vendorIdGvl: GENERIC_VENDOR_ID, + enforcePurpose: NO, + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_ONLY_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST, UNDEFINED], + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: LEG_INT_PURPOSES_ONLY_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforceVendor: false, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforcePurpose: NO, + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST], + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_CONSENT], + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_CONSENT], + enforceVendor: false, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_CONSENT], + enforcePurpose: NO, + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforceVendor: false, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforcePurpose: NO, + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_CONSENT], + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_CONSENT], + enforceVendor: false, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_CONSENT], + enforcePurpose: NO, + vendorConsentBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST], + enforcePurpose: NO, + enforceVendor: false, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + enforcePurpose: NO, + enforceVendor: false, + disclosedVendorsId: [GENERIC_VENDOR_ID])] + } + + protected static List getFullTcfCompanyEnforcementRequirementsRandomlyWithExcludePurpose(Purpose purpose) { + getFullTcfCompanyEnforcementRequirements(purpose, true) + } + + protected static List getFullTcfCompanyLegitimateInterestsRequirements(Purpose purpose, boolean isPurposeExcludedAndListRandom = false) { + [ + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST, UNDEFINED], + enforcePurpose: NO, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_PURPOSES_ONLY_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforcePurpose: NO, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST], + enforcePurpose: NO, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: LEG_INT_AND_FLEXIBLE_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [UNDEFINED], + enforcePurpose: NO, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]), + + new EnforcementRequirement(purpose: isPurposeExcludedAndListRandom ? getRandomPurposeWithExclusion(purpose) : purpose, + vendorIdGvl: GENERIC_VENDOR_ID, + restrictionType: [REQUIRE_LEGITIMATE_INTEREST], + enforcePurpose: NO, + vendorLegitimateInterestBitField: GENERIC_VENDOR_ID, + vendorListVersion: PURPOSES_AND_LEG_INT_PURPOSES_GVL_VERSION, + disclosedVendorsId: [GENERIC_VENDOR_ID]) + ] + } + + private static Purpose getRandomPurposeWithExclusion(Purpose excludeFromRandom) { + def availablePurposes = Purpose.values().toList() - excludeFromRandom + availablePurposes.shuffled().first() + } +} diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/TcfBasicTransmitEidsActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfBasicTransmitEidsActivitiesSpec.groovy similarity index 87% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/TcfBasicTransmitEidsActivitiesSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfBasicTransmitEidsActivitiesSpec.groovy index 924ee285661..9582d47d2f0 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/TcfBasicTransmitEidsActivitiesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfBasicTransmitEidsActivitiesSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.tcf import org.prebid.server.functional.model.bidder.Generic import org.prebid.server.functional.model.config.AccountGdprConfig @@ -7,12 +7,12 @@ import org.prebid.server.functional.model.request.auction.ActivityRule import org.prebid.server.functional.model.request.auction.AllowActivities import org.prebid.server.functional.model.request.auction.Condition import org.prebid.server.functional.model.request.auction.Eid -import org.prebid.server.functional.service.PrebidServerService import org.prebid.server.functional.util.privacy.TcfUtils 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.config.Purpose.P1 +import static org.prebid.server.functional.model.config.Purpose.P10 import static org.prebid.server.functional.model.config.Purpose.P2 import static org.prebid.server.functional.model.config.Purpose.P3 import static org.prebid.server.functional.model.config.Purpose.P4 @@ -21,22 +21,12 @@ import static org.prebid.server.functional.model.config.Purpose.P6 import static org.prebid.server.functional.model.config.Purpose.P7 import static org.prebid.server.functional.model.config.Purpose.P8 import static org.prebid.server.functional.model.config.Purpose.P9 -import static org.prebid.server.functional.model.config.Purpose.P10 import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_EIDS import static org.prebid.server.functional.model.request.auction.TraceLevel.VERBOSE -class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { - - private static final Map PBS_CONFIG = SETTING_CONFIG + GENERIC_VENDOR_CONFIG + GENERIC_CONFIG + ["gdpr.vendorlist.v2.http-endpoint-template": null, - "gdpr.vendorlist.v3.http-endpoint-template": null] - - private static final PrebidServerService activityPbsServiceExcludeGvl = pbsServiceFactory.getService(PBS_CONFIG) - - def cleanupSpec() { - pbsServiceFactory.removeContainer(PBS_CONFIG) - } +class TcfBasicTransmitEidsActivitiesSpec extends TcfBaseSpec { - def "PBS should leave the original request with eids data when requireConsent is enabled and #enforcementRequirements.purpose have any basic consent"() { + def "PBS should preserve eids from original request when requireConsent is enabled and #enforcementRequirements.purpose have any basic consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -47,7 +37,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAdsWithSnakeCase(enforcementRequirements, true) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -62,12 +52,12 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { assert bidderRequest?.user?.eids == userEids where: - enforcementRequirements << getBasicTcfCompanyBasedEnforcementRequirements(P4) + + enforcementRequirements << getBasicTcfLegalBasedEnforcementRequirements(P4) + getBasicTcfCompanySoftVendorExceptionsRequirements(P4) } - def "PBS should leave the original request with eids data when requireConsent is enabled and #enforcementRequirements.purpose have softVendorExceptions consent"() { + def "PBS should preserve eids from original request when requireConsent is enabled and #enforcementRequirements.purpose have softVendorExceptions consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -80,7 +70,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [ALIAS.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [ALIAS]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -98,7 +88,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { enforcementRequirements << getBasicTcfCompanySoftVendorExceptionsRequirements(P4) } - def "PBS should remove the original request with eids data when requireConsent is enabled and #enforcementRequirements.purpose have any basic consent"() { + def "PBS should not transmit eids from original request when requireConsent is enabled and #enforcementRequirements.purpose have any basic consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -108,7 +98,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendorsSnakeCase: [GENERIC.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendorsSnakeCase: [GENERIC]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -125,35 +115,37 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { where: enforcementRequirements << getBasicTcfLegalBasedEnforcementRequirements(P1) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P1) + - getBasicTcfCompanyBasedEnforcementRequirements(P1) + getBasicTcfLegalBasedEnforcementRequirements(P2) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P2) + - getBasicTcfCompanyBasedEnforcementRequirements(P2) + getBasicTcfLegalBasedEnforcementRequirements(P3) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P3) + - getBasicTcfCompanyBasedEnforcementRequirements(P3) + getBasicTcfLegalBasedEnforcementRequirements(P5) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P5) + - getBasicTcfCompanyBasedEnforcementRequirements(P5) + getBasicTcfLegalBasedEnforcementRequirements(P6) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P6) + - getBasicTcfCompanyBasedEnforcementRequirements(P6) + getBasicTcfLegalBasedEnforcementRequirements(P7) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P7) + - getBasicTcfCompanyBasedEnforcementRequirements(P7) + getBasicTcfLegalBasedEnforcementRequirements(P8) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P8) + - getBasicTcfCompanyBasedEnforcementRequirements(P8) + getBasicTcfLegalBasedEnforcementRequirements(P9) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P9) + - getBasicTcfCompanyBasedEnforcementRequirements(P9) + getBasicTcfLegalBasedEnforcementRequirements(P10) + + + getBasicTcfLegalPurposesLITEnforcementRequirements(P1) + + getBasicTcfLegalPurposesLITEnforcementRequirements(P2) + + getBasicTcfLegalPurposesLITEnforcementRequirements(P3) + + getBasicTcfLegalPurposesLITEnforcementRequirements(P5) + + getBasicTcfLegalPurposesLITEnforcementRequirements(P6) + + getBasicTcfLegalPurposesLITEnforcementRequirements(P7) + + getBasicTcfLegalPurposesLITEnforcementRequirements(P8) + + getBasicTcfLegalPurposesLITEnforcementRequirements(P9) + getBasicTcfLegalPurposesLITEnforcementRequirements(P10) + + + getBasicTcfCompanyBasedEnforcementRequirements(P1) + + getBasicTcfCompanyBasedEnforcementRequirements(P2) + + getBasicTcfCompanyBasedEnforcementRequirements(P3) + + getBasicTcfCompanyBasedEnforcementRequirements(P5) + + getBasicTcfCompanyBasedEnforcementRequirements(P6) + + getBasicTcfCompanyBasedEnforcementRequirements(P7) + + getBasicTcfCompanyBasedEnforcementRequirements(P8) + + getBasicTcfCompanyBasedEnforcementRequirements(P9) + getBasicTcfCompanyBasedEnforcementRequirements(P10) } - def "PBS should remove the original request with eids data when requireConsent is enabled and #enforcementRequirements.purpose have softVendorExceptions consent"() { + def "PBS should not transmit eids from original request when requireConsent is enabled and #enforcementRequirements.purpose have softVendorExceptions consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -166,7 +158,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [ALIAS.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [ALIAS]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -193,7 +185,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { getBasicTcfCompanySoftVendorExceptionsRequirements(P10) } - def "PBS should leave the original request with eids data when requireConsent is enabled but bidder is excepted and #enforcementRequirements.purpose have legal basic consent"() { + def "PBS should preserve eids from original request when requireConsent is enabled but bidder is excepted and #enforcementRequirements.purpose have legal basic consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -203,7 +195,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true, userEids.source) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -220,17 +212,18 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { where: enforcementRequirements << getBasicTcfLegalBasedEnforcementRequirements(P2) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P2) + getBasicTcfLegalBasedEnforcementRequirements(P3) + getBasicTcfLegalBasedEnforcementRequirements(P5) + getBasicTcfLegalBasedEnforcementRequirements(P6) + getBasicTcfLegalBasedEnforcementRequirements(P7) + getBasicTcfLegalBasedEnforcementRequirements(P8) + getBasicTcfLegalBasedEnforcementRequirements(P9) + - getBasicTcfLegalBasedEnforcementRequirements(P10) + getBasicTcfLegalBasedEnforcementRequirements(P10) + + + getBasicTcfLegalPurposesLITEnforcementRequirements(P2) } - def "PBS should remove the original request with eids data when requireConsent is enabled, bidder is excepted and #enforcementRequirements.purpose have unsupported basic consent"() { + def "PBS should not transmit eids from original request when requireConsent is enabled, bidder is excepted and #enforcementRequirements.purpose have unsupported basic consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -240,7 +233,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true, userEids.source) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -257,27 +250,29 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { where: enforcementRequirements << getBasicTcfLegalBasedEnforcementRequirements(P1) + - getBasicTcfCompanyBasedEnforcementRequirements(P1) + + getBasicTcfLegalPurposesLITEnforcementRequirements(P1) + - getBasicTcfCompanyBasedEnforcementRequirements(P2) + - getBasicTcfCompanyBasedEnforcementRequirements(P3) + getBasicTcfLegalPurposesLITEnforcementRequirements(P3) + getBasicTcfLegalPurposesLITEnforcementRequirements(P4) + - getBasicTcfCompanyBasedEnforcementRequirements(P5) + getBasicTcfLegalPurposesLITEnforcementRequirements(P5) + - getBasicTcfCompanyBasedEnforcementRequirements(P6) + getBasicTcfLegalPurposesLITEnforcementRequirements(P6) + - getBasicTcfCompanyBasedEnforcementRequirements(P7) + getBasicTcfLegalPurposesLITEnforcementRequirements(P7) + - getBasicTcfCompanyBasedEnforcementRequirements(P8) + getBasicTcfLegalPurposesLITEnforcementRequirements(P8) + - getBasicTcfCompanyBasedEnforcementRequirements(P9) + getBasicTcfLegalPurposesLITEnforcementRequirements(P9) + - getBasicTcfCompanyBasedEnforcementRequirements(P10) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P10) + getBasicTcfLegalPurposesLITEnforcementRequirements(P10) + + + getBasicTcfCompanyBasedEnforcementRequirements(P1) + + getBasicTcfCompanyBasedEnforcementRequirements(P2) + + getBasicTcfCompanyBasedEnforcementRequirements(P3) + + getBasicTcfCompanyBasedEnforcementRequirements(P5) + + getBasicTcfCompanyBasedEnforcementRequirements(P6) + + getBasicTcfCompanyBasedEnforcementRequirements(P7) + + getBasicTcfCompanyBasedEnforcementRequirements(P8) + + getBasicTcfCompanyBasedEnforcementRequirements(P9) + + getBasicTcfCompanyBasedEnforcementRequirements(P10) } - def "PBS should leave the original request with eids data when requireConsent is disabled and #enforcementRequirements.purpose have legal basic consent"() { + def "PBS should preserve eids from original request when requireConsent is disabled and #enforcementRequirements.purpose have legal basic consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -287,7 +282,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, false) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -314,7 +309,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { getBasicTcfLegalBasedEnforcementRequirements(P10) } - def "PBS should remove the original request with eids data when requireConsent is disabled and #enforcementRequirements.purpose have softVendorExceptions consent"() { + def "PBS should not transmit eids from original request when requireConsent is disabled and #enforcementRequirements.purpose have softVendorExceptions consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -327,7 +322,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, false) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [ALIAS.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [ALIAS]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -354,7 +349,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { getBasicTcfCompanySoftVendorExceptionsRequirements(P10) } - def "PBS should remove the original request with eids data when requireConsent is disabled and #enforcementRequirements.purpose have unsupported basic consent"() { + def "PBS should not transmit eids from original request when requireConsent is disabled and #enforcementRequirements.purpose have unsupported basic consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -364,7 +359,7 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, false) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -381,23 +376,25 @@ class TcfBasicTransmitEidsActivitiesSpec extends PrivacyBaseSpec { where: enforcementRequirements << getBasicTcfLegalBasedEnforcementRequirements(P1) + - getBasicTcfCompanyBasedEnforcementRequirements(P1) + + getBasicTcfLegalPurposesLITEnforcementRequirements(P1) + - getBasicTcfCompanyBasedEnforcementRequirements(P2) + - getBasicTcfCompanyBasedEnforcementRequirements(P3) + getBasicTcfLegalPurposesLITEnforcementRequirements(P3) + getBasicTcfLegalPurposesLITEnforcementRequirements(P4) + - getBasicTcfCompanyBasedEnforcementRequirements(P5) + getBasicTcfLegalPurposesLITEnforcementRequirements(P5) + - getBasicTcfCompanyBasedEnforcementRequirements(P6) + getBasicTcfLegalPurposesLITEnforcementRequirements(P6) + - getBasicTcfCompanyBasedEnforcementRequirements(P7) + getBasicTcfLegalPurposesLITEnforcementRequirements(P7) + - getBasicTcfCompanyBasedEnforcementRequirements(P8) + getBasicTcfLegalPurposesLITEnforcementRequirements(P8) + - getBasicTcfCompanyBasedEnforcementRequirements(P9) + getBasicTcfLegalPurposesLITEnforcementRequirements(P9) + - getBasicTcfCompanyBasedEnforcementRequirements(P10) + - getBasicTcfLegalPurposesLITEnforcementRequirements(P10) + getBasicTcfLegalPurposesLITEnforcementRequirements(P10) + + + getBasicTcfCompanyBasedEnforcementRequirements(P1) + + getBasicTcfCompanyBasedEnforcementRequirements(P2) + + getBasicTcfCompanyBasedEnforcementRequirements(P3) + + getBasicTcfCompanyBasedEnforcementRequirements(P5) + + getBasicTcfCompanyBasedEnforcementRequirements(P6) + + getBasicTcfCompanyBasedEnforcementRequirements(P7) + + getBasicTcfCompanyBasedEnforcementRequirements(P8) + + getBasicTcfCompanyBasedEnforcementRequirements(P9) + + getBasicTcfCompanyBasedEnforcementRequirements(P10) } } diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfFullTransmitEidsActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfFullTransmitEidsActivitiesSpec.groovy new file mode 100644 index 00000000000..499422dd57b --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfFullTransmitEidsActivitiesSpec.groovy @@ -0,0 +1,374 @@ +package org.prebid.server.functional.tests.privacy.tcf + +import org.prebid.server.functional.model.config.AccountGdprConfig +import org.prebid.server.functional.model.request.auction.Activity +import org.prebid.server.functional.model.request.auction.ActivityRule +import org.prebid.server.functional.model.request.auction.AllowActivities +import org.prebid.server.functional.model.request.auction.Condition +import org.prebid.server.functional.model.request.auction.Eid +import org.prebid.server.functional.util.privacy.TcfUtils + +import static org.prebid.server.functional.model.config.Purpose.P1 +import static org.prebid.server.functional.model.config.Purpose.P10 +import static org.prebid.server.functional.model.config.Purpose.P2 +import static org.prebid.server.functional.model.config.Purpose.P3 +import static org.prebid.server.functional.model.config.Purpose.P4 +import static org.prebid.server.functional.model.config.Purpose.P5 +import static org.prebid.server.functional.model.config.Purpose.P6 +import static org.prebid.server.functional.model.config.Purpose.P7 +import static org.prebid.server.functional.model.config.Purpose.P8 +import static org.prebid.server.functional.model.config.Purpose.P9 +import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_EIDS + +class TcfFullTransmitEidsActivitiesSpec extends TcfBaseSpec { + + def "PBS should preserve eids from original request when requireConsent is enabled and #enforcementRequirements.purpose have full consent"() { + given: "Default Generic BidRequests with Eid field" + def userEids = [Eid.defaultEid] + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent).tap { + it.user.eids = userEids + } + + and: "Save account config with requireConsent into DB" + def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes) + def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) + def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { + config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) + } + accountDao.save(account) + + when: "PBS processes auction requests" + privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Generic bidder request should have data in Eid field" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest?.user?.eids == userEids + + where: + enforcementRequirements << getFullTcfLegalEnforcementRequirements(P4) + + getFullTcfCompanyEnforcementRequirements(P4) + } + + def "PBS should not transmit eids from original request when #enforcementRequirements.purpose have legitimate interests consent"() { + given: "Default Generic BidRequests with Eid field" + def userEids = [Eid.defaultEid] + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent).tap { + it.user.eids = userEids + } + + and: "Save account config with requireConsent into DB" + def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes) + def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) + def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { + config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) + } + accountDao.save(account) + + when: "PBS processes auction requests" + privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Generic bidder request shouldn't have data in Eid field" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest?.user?.eids + assert !bidderRequest.user?.ext?.eids + + where: + enforcementRequirements << getFullTcfLegalLegitimateInterestsRequirements(P4) + + getFullTcfCompanyLegitimateInterestsRequirements(P4) + } + + def "PBS should not transmit eids from original request when requireConsent is enabled and #enforcementRequirements.purpose have full consent"() { + given: "Default Generic BidRequests with Eid field" + def userEids = [Eid.defaultEid] + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent).tap { + it.user.eids = userEids + } + + and: "Save account config with requireConsent into DB" + def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes) + def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) + def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { + config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) + } + accountDao.save(account) + + when: "PBS processes auction requests" + privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Generic bidder request shouldn't have data in Eid field" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest?.user?.eids + assert !bidderRequest.user?.ext?.eids + + where: + enforcementRequirements << + getFullTcfLegalEnforcementRequirements(P1) + + getFullTcfLegalEnforcementRequirements(P2) + + getFullTcfLegalEnforcementRequirements(P3) + + getFullTcfLegalEnforcementRequirements(P5) + + getFullTcfLegalEnforcementRequirements(P6) + + getFullTcfLegalEnforcementRequirements(P7) + + getFullTcfLegalEnforcementRequirements(P8) + + getFullTcfLegalEnforcementRequirements(P9) + + getFullTcfLegalEnforcementRequirements(P10) + + + getFullTcfCompanyEnforcementRequirements(P1) + + getFullTcfCompanyEnforcementRequirements(P2) + + getFullTcfCompanyEnforcementRequirements(P3) + + getFullTcfCompanyEnforcementRequirements(P5) + + getFullTcfCompanyEnforcementRequirements(P6) + + getFullTcfCompanyEnforcementRequirements(P7) + + getFullTcfCompanyEnforcementRequirements(P8) + + getFullTcfCompanyEnforcementRequirements(P9) + + getFullTcfCompanyEnforcementRequirements(P10) + + + getFullTcfLegalLegitimateInterestsRequirements(P1) + + getFullTcfLegalLegitimateInterestsRequirements(P2) + + getFullTcfLegalLegitimateInterestsRequirements(P3) + + getFullTcfLegalLegitimateInterestsRequirements(P5) + + getFullTcfLegalLegitimateInterestsRequirements(P6) + + getFullTcfLegalLegitimateInterestsRequirements(P7) + + getFullTcfLegalLegitimateInterestsRequirements(P8) + + getFullTcfLegalLegitimateInterestsRequirements(P9) + + getFullTcfLegalLegitimateInterestsRequirements(P10) + + + getFullTcfCompanyLegitimateInterestsRequirements(P1) + + getFullTcfCompanyLegitimateInterestsRequirements(P2) + + getFullTcfCompanyLegitimateInterestsRequirements(P3) + + getFullTcfCompanyLegitimateInterestsRequirements(P5) + + getFullTcfCompanyLegitimateInterestsRequirements(P6) + + getFullTcfCompanyLegitimateInterestsRequirements(P7) + + getFullTcfCompanyLegitimateInterestsRequirements(P8) + + getFullTcfCompanyLegitimateInterestsRequirements(P9) + + getFullTcfCompanyLegitimateInterestsRequirements(P10) + } + + def "PBS should preserve eids from original request when requireConsent is enabled but bidder is excepted and #enforcementRequirements.purpose have full consent"() { + given: "Default Generic BidRequests with Eid field" + def userEids = [Eid.defaultEid] + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent).tap { + it.user.eids = userEids + } + + and: "Save account config with requireConsent into DB" + def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true, userEids.source) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes) + def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) + def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { + config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) + } + accountDao.save(account) + + when: "PBS processes auction requests" + privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Generic bidder request should have data in Eid field" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest?.user?.eids == userEids + + where: + enforcementRequirements << + getFullTcfLegalEnforcementRequirements(P2) + + getFullTcfLegalEnforcementRequirements(P3) + + getFullTcfLegalEnforcementRequirements(P4) + + getFullTcfLegalEnforcementRequirements(P5) + + getFullTcfLegalEnforcementRequirements(P6) + + getFullTcfLegalEnforcementRequirements(P7) + + getFullTcfLegalEnforcementRequirements(P8) + + getFullTcfLegalEnforcementRequirements(P9) + + getFullTcfLegalEnforcementRequirements(P10) + + + getFullTcfLegalLegitimateInterestsRequirements(P2) + + getFullTcfLegalLegitimateInterestsRequirements(P7) + + getFullTcfLegalLegitimateInterestsRequirements(P8) + + getFullTcfLegalLegitimateInterestsRequirements(P9) + + getFullTcfLegalLegitimateInterestsRequirements(P10) + } + + def "PBS should not transmit eids from original request when requireConsent is enabled, bidder is excepted and #enforcementRequirements.purpose have unsupported full consent"() { + given: "Default Generic BidRequests with Eid field" + def userEids = [Eid.defaultEid] + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent).tap { + it.user.eids = userEids + } + + and: "Save account config with requireConsent into DB" + def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true, userEids.source) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes) + def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) + def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { + config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) + } + accountDao.save(account) + + when: "PBS processes auction requests" + privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Generic bidder request shouldn't have data in Eid field" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + + assert !bidderRequest?.user?.eids + assert !bidderRequest.user?.ext?.eids + + where: + enforcementRequirements << getFullTcfLegalEnforcementRequirements(P1) + + + getFullTcfCompanyEnforcementRequirements(P1) + + getFullTcfCompanyEnforcementRequirements(P2) + + getFullTcfCompanyEnforcementRequirements(P3) + + getFullTcfCompanyEnforcementRequirements(P5) + + getFullTcfCompanyEnforcementRequirements(P6) + + getFullTcfCompanyEnforcementRequirements(P7) + + getFullTcfCompanyEnforcementRequirements(P8) + + getFullTcfCompanyEnforcementRequirements(P9) + + getFullTcfCompanyEnforcementRequirements(P10) + + + getFullTcfCompanyLegitimateInterestsRequirements(P1) + + getFullTcfCompanyLegitimateInterestsRequirements(P2) + + getFullTcfCompanyLegitimateInterestsRequirements(P3) + + getFullTcfCompanyLegitimateInterestsRequirements(P5) + + getFullTcfCompanyLegitimateInterestsRequirements(P6) + + getFullTcfCompanyLegitimateInterestsRequirements(P7) + + getFullTcfCompanyLegitimateInterestsRequirements(P8) + + getFullTcfCompanyLegitimateInterestsRequirements(P9) + + getFullTcfCompanyLegitimateInterestsRequirements(P10) + } + + def "PBS should preserve eids from original request when requireConsent is disabled and #enforcementRequirements.purpose have full consent"() { + given: "Default Generic BidRequests with Eid field" + def userEids = [Eid.defaultEid] + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent).tap { + it.user.eids = userEids + } + + and: "Save account config with requireConsent into DB" + def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, false) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes) + def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) + def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { + config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) + } + accountDao.save(account) + + when: "PBS processes auction requests" + privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Generic bidder request should have data in Eid field" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert bidderRequest?.user?.eids == userEids + + where: + enforcementRequirements << + getFullTcfLegalEnforcementRequirements(P2) + + getFullTcfLegalEnforcementRequirements(P3) + + getFullTcfLegalEnforcementRequirements(P4) + + getFullTcfLegalEnforcementRequirements(P5) + + getFullTcfLegalEnforcementRequirements(P6) + + getFullTcfLegalEnforcementRequirements(P7) + + getFullTcfLegalEnforcementRequirements(P8) + + getFullTcfLegalEnforcementRequirements(P9) + + getFullTcfLegalEnforcementRequirements(P10) + + + getFullTcfLegalLegitimateInterestsRequirements(P2) + + getFullTcfLegalLegitimateInterestsRequirements(P7) + + getFullTcfLegalLegitimateInterestsRequirements(P8) + + getFullTcfLegalLegitimateInterestsRequirements(P9) + + getFullTcfLegalLegitimateInterestsRequirements(P10) + } + + def "PBS should not transmit eids from original request when requireConsent is disabled and #enforcementRequirements.purpose have unsupported full consent"() { + given: "Default Generic BidRequests with Eid field" + def userEids = [Eid.defaultEid] + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent).tap { + it.user.eids = userEids + } + + and: "Save account config with requireConsent into DB" + def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, false) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes) + def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) + def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { + config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) + } + accountDao.save(account) + + when: "PBS processes auction requests" + privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Generic bidder request shouldn't have data in Eid field" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest.user?.eids + assert !bidderRequest.user?.ext?.eids + + where: + enforcementRequirements << getFullTcfLegalEnforcementRequirements(P1) + + + getFullTcfCompanyEnforcementRequirements(P1) + + getFullTcfCompanyEnforcementRequirements(P2) + + getFullTcfCompanyEnforcementRequirements(P3) + + getFullTcfCompanyEnforcementRequirements(P5) + + getFullTcfCompanyEnforcementRequirements(P6) + + getFullTcfCompanyEnforcementRequirements(P7) + + getFullTcfCompanyEnforcementRequirements(P8) + + getFullTcfCompanyEnforcementRequirements(P9) + + getFullTcfCompanyEnforcementRequirements(P10) + + + getFullTcfCompanyLegitimateInterestsRequirements(P1) + + getFullTcfCompanyLegitimateInterestsRequirements(P2) + + getFullTcfCompanyLegitimateInterestsRequirements(P3) + + getFullTcfCompanyLegitimateInterestsRequirements(P5) + + getFullTcfCompanyLegitimateInterestsRequirements(P6) + + getFullTcfCompanyLegitimateInterestsRequirements(P7) + + getFullTcfCompanyLegitimateInterestsRequirements(P8) + + getFullTcfCompanyLegitimateInterestsRequirements(P9) + + getFullTcfCompanyLegitimateInterestsRequirements(P10) + } + + def "PBS should not transmit eids when only legitimate interest is present for TCF 2.3"() { + given: "Default Generic BidRequests with Eid field" + def userEids = [Eid.defaultEid] + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent).tap { + it.user.eids = userEids + } + + and: "Save account config with requireConsent into DB" + def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, false) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes) + def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) + def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { + config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) + } + accountDao.save(account) + + when: "PBS processes auction requests" + privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Generic bidder request shouldn't have data in Eid field" + def bidderRequest = bidder.getBidderRequest(bidRequest.id) + assert !bidderRequest?.user?.eids + assert !bidderRequest.user?.ext?.eids + + where: + enforcementRequirements << + getFullTcfLegalLegitimateInterestsRequirements(P3) + + getFullTcfLegalLegitimateInterestsRequirements(P4) + + getFullTcfLegalLegitimateInterestsRequirements(P5) + + getFullTcfLegalLegitimateInterestsRequirements(P6) + + + getFullTcfCompanyLegitimateInterestsRequirements(P3) + + getFullTcfCompanyLegitimateInterestsRequirements(P4) + + getFullTcfCompanyLegitimateInterestsRequirements(P5) + + getFullTcfCompanyLegitimateInterestsRequirements(P6) + } +} diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfGeneralSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfGeneralSpec.groovy new file mode 100644 index 00000000000..6b6cd5dd1a2 --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TcfGeneralSpec.groovy @@ -0,0 +1,327 @@ +package org.prebid.server.functional.tests.privacy.tcf + + +import org.prebid.server.functional.model.config.AccountGdprConfig +import org.prebid.server.functional.model.db.Account +import org.prebid.server.functional.model.privacy.EnforcementRequirement +import org.prebid.server.functional.model.response.auction.NoBidResponse +import org.prebid.server.functional.util.PBSUtils +import org.prebid.server.functional.util.privacy.TcfUtils + +import java.time.ZoneId +import java.time.ZonedDateTime + +import static org.prebid.server.functional.model.response.auction.ErrorType.PREBID +import static org.prebid.server.functional.util.privacy.TcfConsent.GENERIC_VENDOR_ID + +class TcfGeneralSpec extends TcfBaseSpec { + + private static final ZonedDateTime TCF_2_3_ENFORCEMENT_DATE = ZonedDateTime.parse("2026-03-01T00:00:00Z") + + def "PBS should accept base consent when disclosedVendors includes vendor after TCF v2.3 enforcement"() { + given: "Generic BidRequests with valid tcf string" + def enforcementRequirements = EnforcementRequirement.getDefaultBase(GENERIC_VENDOR_ID).tap { + it.created = TCF_2_3_ENFORCEMENT_DATE + it.updated = TCF_2_3_ENFORCEMENT_DATE + } + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent) + + and: "Save account config with requireConsent into DB" + def account = generateDefaultTcfAccount(bidRequest.accountId, enforcementRequirements) + accountDao.save(account) + + when: "PBS processes auction requests" + def response = activityPbsServiceExcludeGvl.sendAuctionRequest(bidRequest) + + then: "Response should contain seatBid" + assert response?.seatbid?.bid?.flatten()?.size() == 1 + + and: "PBS should emit proper nbr code" + assert !response.noBidResponse + + and: "Response shouldn't contain errors or warnings" + assert !response.ext.errors + assert !response.ext.warnings + + and: "PBS should sent bid request to bidder" + assert bidder.getBidderRequests(bidRequest.id).size() == 1 + } + + def "PBS should accept full consent when disclosedVendors includes vendor after TCF v2.3 enforcement"() { + given: "Generic BidRequests with valid tcf string" + def enforcementRequirements = EnforcementRequirement.getDefaultFull(GENERIC_VENDOR_ID, PURPOSES_ONLY_GVL_VERSION).tap { + it.created = TCF_2_3_ENFORCEMENT_DATE + it.updated = TCF_2_3_ENFORCEMENT_DATE + } + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent) + + and: "Save account config with requireConsent into DB" + def account = generateDefaultTcfAccount(bidRequest.accountId, enforcementRequirements) + accountDao.save(account) + + when: "PBS processes auction requests" + def response = privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Response should contain seatBid" + assert response?.seatbid?.bid?.flatten()?.size() == 1 + + and: "PBS should emit proper nbr code" + assert !response.noBidResponse + + and: "Response shouldn't contain errors or warnings" + assert !response.ext.errors + assert !response.ext.warnings + + and: "PBS should sent bid request to bidder" + assert bidder.getBidderRequests(bidRequest.id).size() == 1 + } + + def "PBS should accept base consent regardless of disclosedVendors before TCF v2.3 enforcement"() { + given: "Generic BidRequests with valid tcf string" + def enforcementRequirements = EnforcementRequirement.getDefaultBase(GENERIC_VENDOR_ID).tap { + it.created = TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1) + it.updated = TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1) + it.disclosedVendorsId = disclosedIds + } + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent) + + and: "Save account config with requireConsent into DB" + def account = generateDefaultTcfAccount(bidRequest.accountId, enforcementRequirements) + accountDao.save(account) + + when: "PBS processes auction requests" + def response = activityPbsServiceExcludeGvl.sendAuctionRequest(bidRequest) + + then: "Response should contain seatBid" + assert response?.seatbid?.bid?.flatten()?.size() == 1 + + and: "PBS should emit proper nbr code" + assert !response.noBidResponse + + and: "Response shouldn't contain errors or warnings" + assert !response.ext.errors + assert !response.ext.warnings + + and: "PBS should sent bid request to bidder" + assert bidder.getBidderRequests(bidRequest.id).size() == 1 + + where: + disclosedIds << [null, [], [PBSUtils.getRandomNumber(0, 65535)]] + } + + def "PBS should accept full consent regardless of disclosedVendors before TCF v2.3 enforcement"() { + given: "Generic BidRequests with valid tcf string" + def enforcementRequirements = EnforcementRequirement.getDefaultFull(GENERIC_VENDOR_ID, PURPOSES_ONLY_GVL_VERSION).tap { + it.created = TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1) + it.updated = TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1) + it.disclosedVendorsId = disclosedIds + } + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent) + + and: "Save account config with requireConsent into DB" + def account = generateDefaultTcfAccount(bidRequest.accountId, enforcementRequirements) + accountDao.save(account) + + when: "PBS processes auction requests" + def response = privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Response should contain seatBid" + assert response?.seatbid?.bid?.flatten()?.size() == 1 + + and: "PBS should emit proper nbr code" + assert !response.noBidResponse + + and: "Response shouldn't contain errors or warnings" + assert !response.ext.errors + assert !response.ext.warnings + + and: "PBS should sent bid request to bidder" + assert bidder.getBidderRequests(bidRequest.id).size() == 1 + + where: + disclosedIds << [null, [], [PBSUtils.getRandomNumber(0, 65535)]] + } + + def "PBS should reject base consent with warning when disclosedVendors is empty after TCF v2.3 enforcement"() { + given: "Generic BidRequests with invalid tcf string" + def enforcementRequirements = EnforcementRequirement.getDefaultBase(GENERIC_VENDOR_ID).tap { + it.disclosedVendorsId = disclosedIds + } + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent) + + and: "Save account config with requireConsent into DB" + def account = generateDefaultTcfAccount(bidRequest.accountId, enforcementRequirements) + accountDao.save(account) + + when: "PBS processes auction requests" + def response = activityPbsServiceExcludeGvl.sendAuctionRequest(bidRequest) + + then: "Response shouldn't contain seatBid" + assert response?.seatbid?.bid?.flatten()?.isEmpty() + + and: "PBS should emit proper nbr code" + assert response.noBidResponse == NoBidResponse.UNKNOWN_ERROR + + and: "PBS response shouldn't provide proper error" + assert !response.ext.errors + + and: "PBS response should include warnings" + assert response.ext.warnings[PREBID].message == ['Invalid TCF string: `disclosedVendors` list is empty.'] + + and: "PBS should not send bid request to bidder" + assert bidder.getBidderRequests(bidRequest.id).isEmpty() + + where: + disclosedIds << [null, []] + } + + def "PBS should reject full consent with warning when disclosedVendors is empty after TCF v2.3 enforcement"() { + given: "Generic BidRequests with invalid tcf string" + def enforcementRequirements = EnforcementRequirement.getDefaultFull(GENERIC_VENDOR_ID, PURPOSES_ONLY_GVL_VERSION).tap { + it.disclosedVendorsId = disclosedIds + } + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent) + + and: "Save account config with requireConsent into DB" + def account = generateDefaultTcfAccount(bidRequest.accountId, enforcementRequirements) + accountDao.save(account) + + when: "PBS processes auction requests" + def response = privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Response shouldn't contain seatBid" + assert response?.seatbid?.bid?.flatten()?.isEmpty() + + and: "PBS should emit proper nbr code" + assert response.noBidResponse == NoBidResponse.UNKNOWN_ERROR + + and: "PBS response shouldn't provide proper error" + assert !response.ext.errors + + and: "PBS response should include warnings" + assert response.ext.warnings[PREBID].message == ['Invalid TCF string: `disclosedVendors` list is empty.'] + + and: "PBS should not send bid request to bidder" + assert bidder.getBidderRequests(bidRequest.id).isEmpty() + + where: + disclosedIds << [null, []] + } + + def "PBS should reject base consent without warning when disclosedVendors does not match vendor after TCF v2.3 enforcement"() { + given: "Generic BidRequests with non-corresponding TCF strings" + def enforcementRequirements = EnforcementRequirement.getDefaultBase(GENERIC_VENDOR_ID).tap { + it.disclosedVendorsId = [PBSUtils.getRandomNumber(0, 65535)] + } + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent) + + and: "Save account config with requireConsent into DB" + def account = generateDefaultTcfAccount(bidRequest.accountId, enforcementRequirements) + accountDao.save(account) + + when: "PBS processes auction requests" + def response = activityPbsServiceExcludeGvl.sendAuctionRequest(bidRequest) + + then: "Response shouldn't contain seatBid" + assert response?.seatbid?.bid?.flatten()?.isEmpty() + + and: "PBS should emit proper nbr code" + assert response.noBidResponse == NoBidResponse.UNKNOWN_ERROR + + and: "No error or warning should be emitted" + assert !response.ext.errors + assert !response.ext.warnings + + and: "PBS should not send bid request to bidder" + assert bidder.getBidderRequests(bidRequest.id).isEmpty() + } + + def "PBS should reject full consent without warning when disclosedVendors does not match vendor after TCF v2.3 enforcement"() { + given: "Generic BidRequests with non-corresponding TCF strings" + def enforcementRequirements = EnforcementRequirement.getDefaultFull(GENERIC_VENDOR_ID, PURPOSES_ONLY_GVL_VERSION).tap { + it.disclosedVendorsId = [PBSUtils.getRandomNumber(0, 65535)] + } + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent) + + and: "Save account config with requireConsent into DB" + def account = generateDefaultTcfAccount(bidRequest.accountId, enforcementRequirements) + accountDao.save(account) + + when: "PBS processes auction requests" + def response = privacyPbsServiceWithMultipleGvl.sendAuctionRequest(bidRequest) + + then: "Response shouldn't contain seatBid" + assert response?.seatbid?.bid?.flatten()?.isEmpty() + + and: "PBS should emit proper nbr code" + assert response.noBidResponse == NoBidResponse.UNKNOWN_ERROR + + and: "No error or warning should be emitted" + assert !response.ext.errors + assert !response.ext.warnings + + and: "PBS should not send bid request to bidder" + assert bidder.getBidderRequests(bidRequest.id).isEmpty() + } + + def "PBS should use latest UTC timestamp between created and updated for processing TCF string"() { + given: "Generic BidRequests with invalid tcf string" + def enforcementRequirements = EnforcementRequirement.getDefaultBase(GENERIC_VENDOR_ID).tap { + it.created = createDate + it.updated = updateDate + it.disclosedVendorsId = null + } + def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) + def bidRequest = getGdprBidRequest(tcfConsent) + + and: "Save account config with requireConsent into DB" + def account = generateDefaultTcfAccount(bidRequest.accountId, enforcementRequirements) + accountDao.save(account) + + when: "PBS processes auction requests" + def response = activityPbsServiceExcludeGvl.sendAuctionRequest(bidRequest) + + then: "Response shouldn't contain seatBid" + assert response?.seatbid?.bid?.flatten()?.isEmpty() + + and: "PBS should emit proper nbr code" + assert response.noBidResponse == NoBidResponse.UNKNOWN_ERROR + + and: "PBS response shouldn't provide proper error" + assert !response.ext.errors + + and: "PBS response should include warnings" + assert response.ext.warnings[PREBID].message == ['Invalid TCF string: `disclosedVendors` list is empty.'] + + and: "PBS should not send bid request to bidder" + assert bidder.getBidderRequests(bidRequest.id).isEmpty() + + where: + createDate | updateDate + TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1) | TCF_2_3_ENFORCEMENT_DATE + TCF_2_3_ENFORCEMENT_DATE | TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1) + + TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1).withZoneSameInstant(ZoneId.of("Pacific/Honolulu")) | TCF_2_3_ENFORCEMENT_DATE + TCF_2_3_ENFORCEMENT_DATE | TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1).withZoneSameInstant(ZoneId.of("Pacific/Honolulu")) + + TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1) | TCF_2_3_ENFORCEMENT_DATE.withZoneSameInstant(ZoneId.of("Pacific/Kiritimati")) + TCF_2_3_ENFORCEMENT_DATE.withZoneSameInstant(ZoneId.of("Pacific/Kiritimati")) | TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1) + + TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1).withZoneSameInstant(ZoneId.of("Pacific/Honolulu")) | TCF_2_3_ENFORCEMENT_DATE.withZoneSameInstant(ZoneId.of("Pacific/Kiritimati")) + TCF_2_3_ENFORCEMENT_DATE.withZoneSameInstant(ZoneId.of("Pacific/Kiritimati")) | TCF_2_3_ENFORCEMENT_DATE.minusSeconds(1).withZoneSameInstant(ZoneId.of("Pacific/Honolulu")) + } + + private static Account generateDefaultTcfAccount(String accountId, EnforcementRequirement enforcementRequirements) { + def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes) + getAccountWithGdpr(accountId, accountGdprConfig) + } +} diff --git a/src/test/groovy/org/prebid/server/functional/tests/privacy/TransmitEidsOrtbConverterActivitiesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TransmitEidsOrtbConverterActivitiesSpec.groovy similarity index 91% rename from src/test/groovy/org/prebid/server/functional/tests/privacy/TransmitEidsOrtbConverterActivitiesSpec.groovy rename to src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TransmitEidsOrtbConverterActivitiesSpec.groovy index e5534476613..40322aede1f 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/privacy/TransmitEidsOrtbConverterActivitiesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/privacy/tcf/TransmitEidsOrtbConverterActivitiesSpec.groovy @@ -1,4 +1,4 @@ -package org.prebid.server.functional.tests.privacy +package org.prebid.server.functional.tests.privacy.tcf import org.prebid.server.functional.model.config.AccountGdprConfig import org.prebid.server.functional.model.request.auction.Activity @@ -14,6 +14,7 @@ import spock.lang.Shared import static org.prebid.server.functional.model.bidder.BidderName.GENERIC import static org.prebid.server.functional.model.config.Purpose.P1 +import static org.prebid.server.functional.model.config.Purpose.P10 import static org.prebid.server.functional.model.config.Purpose.P2 import static org.prebid.server.functional.model.config.Purpose.P3 import static org.prebid.server.functional.model.config.Purpose.P4 @@ -22,11 +23,10 @@ import static org.prebid.server.functional.model.config.Purpose.P6 import static org.prebid.server.functional.model.config.Purpose.P7 import static org.prebid.server.functional.model.config.Purpose.P8 import static org.prebid.server.functional.model.config.Purpose.P9 -import static org.prebid.server.functional.model.config.Purpose.P10 import static org.prebid.server.functional.model.request.auction.ActivityType.TRANSMIT_EIDS import static org.prebid.server.functional.model.request.auction.TraceLevel.VERBOSE -class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { +class TransmitEidsOrtbConverterActivitiesSpec extends TcfBaseSpec { private static final Map PBS_CONFIG = SETTING_CONFIG + GENERIC_VENDOR_CONFIG + GENERIC_CONFIG + ["gdpr.vendorlist.v2.http-endpoint-template": null, "gdpr.vendorlist.v3.http-endpoint-template": null] @@ -57,7 +57,7 @@ class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { pbsServiceFactory.removeContainer(PBS_CONFIG + ["adapters.generic.ortb-version": "2.5"]) } - def "PBS should leave the original request with ext.eids data for elder ortb when requireConsent is enabled and #enforcementRequirements.purpose have any basic consent"() { + def "PPBS should leave ext.eids for older ORTB versions when requireConsent is enabled and #enforcementRequirements.purpose have any basic consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -68,7 +68,7 @@ class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -91,7 +91,7 @@ class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { getBasicTcfCompanySoftVendorExceptionsRequirements(P4) } - def "PBS should remove the original request with ext.eids data for elder ortb when requireConsent is enabled and #enforcementRequirements.purpose have any basic consent"() { + def "PBS should remove ext.eids for older ORTB versions when requireConsent is enabled and #enforcementRequirements.purpose have any basic consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -101,7 +101,7 @@ class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, true) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -146,7 +146,7 @@ class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { getBasicTcfCompanyBasedEnforcementRequirements(P10) } - def "PBS should leave the original request with ext.eids data for elder ortb when requireConsent is disabled and #enforcementRequirements.purpose have legal basic consent"() { + def "PBS should leave ext.eids for older ORTB versions when requireConsent is disabled and #enforcementRequirements.purpose have legal basic consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -156,7 +156,7 @@ class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { and: "Save account config with requireConsent into DB" def purposes = TcfUtils.getPurposeConfigsForPersonalizedAds(enforcementRequirements, false) - def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC.value]) + def accountGdprConfig = new AccountGdprConfig(purposes: purposes, basicEnforcementVendors: [GENERIC]) def activity = Activity.getDefaultActivity([ActivityRule.getDefaultActivityRule(Condition.baseCondition, true)]) def account = getAccountWithGdpr(bidRequest.accountId, accountGdprConfig).tap { config.privacy.allowActivities = AllowActivities.getDefaultAllowActivities(TRANSMIT_EIDS, activity) @@ -186,7 +186,7 @@ class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { getBasicTcfLegalBasedEnforcementRequirements(P10) } - def "PBS should leave the original request with ext.eids data for elder ortb when requireConsent is enabled and #enforcementRequirements.purpose have full consent"() { + def "PBS should leave ext.eids for older ORTB versions when requireConsent is enabled and #enforcementRequirements.purpose have full consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -217,7 +217,7 @@ class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { enforcementRequirements << getFullTcfLegalEnforcementRequirements(P4) + getFullTcfCompanyEnforcementRequirements(P4) } - def "PBS should remove the original request with ext.eids data for elder ortb when requireConsent is enabled and #enforcementRequirements.purpose have full consent"() { + def "PBS should remove ext.eids for older ORTB versions when requireConsent is enabled and #enforcementRequirements.purpose have full consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) @@ -249,7 +249,7 @@ class TransmitEidsOrtbConverterActivitiesSpec extends PrivacyBaseSpec { getFullTcfCompanyEnforcementRequirementsRandomlyWithExcludePurpose(P4) } - def "PBS should leave the original request with ext.eids data for elder ortb when requireConsent is disabled and #enforcementRequirements.purpose have full consent"() { + def "PBS should leave ext.eids for older ORTB versions when requireConsent is disabled and #enforcementRequirements.purpose have full consent"() { given: "Default Generic BidRequests with Eid field" def userEids = [Eid.defaultEid] def tcfConsent = TcfUtils.getConsentString(enforcementRequirements) diff --git a/src/test/groovy/org/prebid/server/functional/util/privacy/TcfConsent.groovy b/src/test/groovy/org/prebid/server/functional/util/privacy/TcfConsent.groovy index cdb6fce665b..c0bd51125b1 100644 --- a/src/test/groovy/org/prebid/server/functional/util/privacy/TcfConsent.groovy +++ b/src/test/groovy/org/prebid/server/functional/util/privacy/TcfConsent.groovy @@ -6,6 +6,8 @@ import com.iabtcf.utils.BitSetIntIterable import org.prebid.server.functional.model.config.Purpose import org.prebid.server.functional.util.PBSUtils +import java.time.ZonedDateTime + import static org.prebid.server.functional.util.privacy.TcfConsent.TcfPolicyVersion.TCF_POLICY_V2 class TcfConsent implements ConsentString { @@ -96,6 +98,20 @@ class TcfConsent implements ConsentString { this } + Builder setDisclosedVendors(List vendorIds) { + vendorIds.forEach { id -> tcStringEncoder.addDisclosedVendors(id) } + } + + Builder setCreateTime(ZonedDateTime time) { + tcStringEncoder.created(time.toInstant()) + this + } + + Builder setUpdatedTime(ZonedDateTime time) { + tcStringEncoder.lastUpdated(time.toInstant()) + this + } + Builder setPublisherRestrictionEntry(PurposeId purposeId, List restrictionTypes, Integer vendorId) { restrictionTypes.each { restrictionType -> def publisherRestrictionEntry = PublisherRestrictionEntry diff --git a/src/test/groovy/org/prebid/server/functional/util/privacy/TcfUtils.groovy b/src/test/groovy/org/prebid/server/functional/util/privacy/TcfUtils.groovy index e5101390060..669064051b8 100644 --- a/src/test/groovy/org/prebid/server/functional/util/privacy/TcfUtils.groovy +++ b/src/test/groovy/org/prebid/server/functional/util/privacy/TcfUtils.groovy @@ -11,7 +11,10 @@ import static org.prebid.server.functional.util.privacy.TcfConsent.TcfPolicyVers class TcfUtils { - static Map getPurposeConfigsForPersonalizedAds(EnforcementRequirement enforcementRequirements, boolean requireConsent = false, List eidsExceptions = []) { + static Map getPurposeConfigsForPersonalizedAds(EnforcementRequirement enforcementRequirements, + boolean requireConsent = false, + List eidsExceptions = []) { + def purpose = enforcementRequirements.purpose // Basic Ads required for any bidder call, should be present at least as company consent def purposes = [(Purpose.P2): new PurposeConfig(enforcePurpose: NO, enforceVendors: false)] @@ -35,6 +38,9 @@ class TcfUtils { def purposesLITransparency = enforcementRequirements.getPurposesLITransparency() def restrictionType = enforcementRequirements.restrictionType def vendorIdGvl = enforcementRequirements.vendorIdGvl + def disclosedVendorsId = enforcementRequirements.disclosedVendorsId + def createTime = enforcementRequirements.created + def updateTime = enforcementRequirements.updated def builder = new TcfConsent.Builder() if (purposeConsent != null && !purposesLITransparency) { builder.setPurposesConsent(PurposeId.convertPurposeToPurposeId(purposeConsent)) @@ -51,11 +57,23 @@ class TcfUtils { if (vendorIdGvl != null) { builder.setVendorLegitimateInterest(vendorIdGvl) } + if(disclosedVendorsId != null) { + builder.setDisclosedVendors(disclosedVendorsId) + } + if (createTime != null) { + builder.setCreateTime(createTime) + } + if (updateTime != null) { + builder.setUpdatedTime(updateTime) + } builder.setVendorListVersion(enforcementRequirements.vendorListVersion ?: TCF_POLICY_V2.vendorListVersion) return builder.build() } - static Map getPurposeConfigsForPersonalizedAdsWithSnakeCase(EnforcementRequirement enforcementRequirements, boolean requireConsent = false, List eidsExceptions = []) { + static Map getPurposeConfigsForPersonalizedAdsWithSnakeCase(EnforcementRequirement enforcementRequirements, + boolean requireConsent = false, + List eidsExceptions = []) { + def purpose = enforcementRequirements.purpose // Basic Ads required for any bidder call, should be present at least as company consent def purposes = [(Purpose.P2): new PurposeConfig(enforcePurposeSnakeCase: NO, enforceVendors: false)]