Skip to content

Commit bddec5e

Browse files
Support testing the USGen privacy module (#3695)
1 parent cfac8fa commit bddec5e

File tree

17 files changed

+431
-20
lines changed

17 files changed

+431
-20
lines changed

src/main/java/org/prebid/server/activity/infrastructure/creator/ActivityControllerCreationContext.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public class ActivityControllerCreationContext {
2020

2121
Map<PrivacyModuleQualifier, AccountPrivacyModuleConfig> privacyModulesConfigs;
2222

23+
Set<PrivacyModuleQualifier> skipPrivacyModules;
24+
2325
@Getter(AccessLevel.NONE)
2426
@Setter(AccessLevel.NONE)
2527
Set<PrivacyModuleQualifier> usedPrivacyModules = EnumSet.noneOf(PrivacyModuleQualifier.class);

src/main/java/org/prebid/server/activity/infrastructure/creator/ActivityInfrastructureCreator.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@
2727
import java.util.Arrays;
2828
import java.util.Collections;
2929
import java.util.EnumMap;
30+
import java.util.EnumSet;
3031
import java.util.List;
3132
import java.util.Map;
3233
import java.util.Objects;
3334
import java.util.Optional;
35+
import java.util.Set;
36+
import java.util.concurrent.ThreadLocalRandom;
3437
import java.util.function.BinaryOperator;
3538
import java.util.function.Function;
3639
import java.util.function.Supplier;
@@ -41,6 +44,8 @@ public class ActivityInfrastructureCreator {
4144

4245
private static final Logger logger = LoggerFactory.getLogger(ActivityInfrastructureCreator.class);
4346

47+
private static final int MODULE_MAX_SKIP_RATE = 100;
48+
4449
private final ActivityRuleFactory activityRuleFactory;
4550
private final Purpose defaultPurpose4;
4651
private final Metrics metrics;
@@ -75,15 +80,22 @@ Map<Activity, ActivityController> parse(Account account, GppContext gppContext,
7580
final Map<Activity, AccountActivityConfiguration> activitiesConfiguration = accountPrivacyConfig
7681
.map(AccountPrivacyConfig::getActivities)
7782
.orElseGet(Collections::emptyMap);
83+
7884
final Map<PrivacyModuleQualifier, AccountPrivacyModuleConfig> modulesConfigs = accountPrivacyConfig
7985
.map(AccountPrivacyConfig::getModules)
8086
.orElseGet(Collections::emptyList)
8187
.stream()
88+
.filter(Objects::nonNull)
8289
.collect(Collectors.toMap(
8390
AccountPrivacyModuleConfig::getCode,
8491
UnaryOperator.identity(),
8592
takeFirstAndLogDuplicates(account.getId())));
8693

94+
final Set<PrivacyModuleQualifier> skipPrivacyModules = modulesConfigs.entrySet().stream()
95+
.filter(entry -> shouldSkipPrivacyModule(entry.getValue()))
96+
.map(Map.Entry::getKey)
97+
.collect(Collectors.toCollection(() -> EnumSet.noneOf(PrivacyModuleQualifier.class)));
98+
8799
return Arrays.stream(Activity.values()).collect(Collectors.toMap(
88100
UnaryOperator.identity(),
89101
fallbackActivity(
@@ -93,6 +105,7 @@ Map<Activity, ActivityController> parse(Account account, GppContext gppContext,
93105
activity,
94106
activitiesConfiguration.get(activity),
95107
modulesConfigs,
108+
skipPrivacyModules,
96109
gppContext,
97110
debug)),
98111
(oldValue, newValue) -> oldValue,
@@ -131,9 +144,14 @@ private Function<Activity, ActivityController> fallbackActivity(
131144
: activityControllerCreator.apply(originalActivity);
132145
}
133146

147+
private static boolean shouldSkipPrivacyModule(AccountPrivacyModuleConfig config) {
148+
return ThreadLocalRandom.current().nextInt(MODULE_MAX_SKIP_RATE) < config.getSkipRate();
149+
}
150+
134151
private ActivityController from(Activity activity,
135152
AccountActivityConfiguration activityConfiguration,
136153
Map<PrivacyModuleQualifier, AccountPrivacyModuleConfig> modulesConfigs,
154+
Set<PrivacyModuleQualifier> skipPrivacyModules,
137155
GppContext gppContext,
138156
ActivityInfrastructureDebug debug) {
139157

@@ -147,6 +165,7 @@ private ActivityController from(Activity activity,
147165
final ActivityControllerCreationContext creationContext = ActivityControllerCreationContext.of(
148166
activity,
149167
modulesConfigs,
168+
skipPrivacyModules,
150169
gppContext);
151170

152171
final boolean allow = allowFromConfig(activityConfiguration.getAllow());

src/main/java/org/prebid/server/activity/infrastructure/creator/rule/PrivacyModulesRuleCreator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.prebid.server.activity.infrastructure.creator.ActivityControllerCreationContext;
66
import org.prebid.server.activity.infrastructure.creator.PrivacyModuleCreationContext;
77
import org.prebid.server.activity.infrastructure.creator.privacy.PrivacyModuleCreator;
8+
import org.prebid.server.activity.infrastructure.privacy.AbstainPrivacyModule;
89
import org.prebid.server.activity.infrastructure.privacy.PrivacyModule;
910
import org.prebid.server.activity.infrastructure.privacy.PrivacyModuleQualifier;
1011
import org.prebid.server.activity.infrastructure.rule.AndRule;
@@ -82,6 +83,10 @@ private static boolean isModuleEnabled(AccountPrivacyModuleConfig accountPrivacy
8283
private PrivacyModule createPrivacyModule(PrivacyModuleQualifier privacyModuleQualifier,
8384
ActivityControllerCreationContext creationContext) {
8485

86+
if (creationContext.getSkipPrivacyModules().contains(privacyModuleQualifier)) {
87+
return new AbstainPrivacyModule(privacyModuleQualifier);
88+
}
89+
8590
return privacyModulesCreators.get(privacyModuleQualifier)
8691
.from(creationContext(privacyModuleQualifier, creationContext));
8792
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.prebid.server.activity.infrastructure.privacy;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import org.prebid.server.activity.infrastructure.debug.Loggable;
6+
import org.prebid.server.activity.infrastructure.payload.ActivityInvocationPayload;
7+
8+
import java.util.Objects;
9+
10+
public class AbstainPrivacyModule implements PrivacyModule, Loggable {
11+
12+
private final PrivacyModuleQualifier privacyModuleQualifier;
13+
14+
public AbstainPrivacyModule(PrivacyModuleQualifier privacyModuleQualifier) {
15+
this.privacyModuleQualifier = Objects.requireNonNull(privacyModuleQualifier);
16+
}
17+
18+
@Override
19+
public Result proceed(ActivityInvocationPayload activityInvocationPayload) {
20+
return Result.ABSTAIN;
21+
}
22+
23+
@Override
24+
public JsonNode asLogEntry(ObjectMapper mapper) {
25+
return mapper.createObjectNode()
26+
.put("privacy_module", privacyModuleQualifier.moduleName())
27+
.put("skipped", true)
28+
.put("result", Result.ABSTAIN.name());
29+
}
30+
}

src/main/java/org/prebid/server/settings/model/activity/privacy/AccountPrivacyModuleConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ public sealed interface AccountPrivacyModuleConfig permits
2323

2424
PrivacyModuleQualifier getCode();
2525

26+
@JsonProperty("skipRate")
27+
int getSkipRate();
28+
2629
@JsonProperty
2730
Boolean enabled();
2831
}

src/main/java/org/prebid/server/settings/model/activity/privacy/AccountUSCustomLogicModuleConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public class AccountUSCustomLogicModuleConfig implements AccountPrivacyModuleCon
1717
@Accessors(fluent = true)
1818
Boolean enabled;
1919

20+
int skipRate;
21+
2022
Config config;
2123

2224
@Override

src/main/java/org/prebid/server/settings/model/activity/privacy/AccountUSNatModuleConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public class AccountUSNatModuleConfig implements AccountPrivacyModuleConfig {
1414
@Accessors(fluent = true)
1515
Boolean enabled;
1616

17+
int skipRate;
18+
1719
Config config;
1820

1921
@Override

src/test/groovy/org/prebid/server/functional/model/config/AccountGppConfig.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ class AccountGppConfig {
88

99
PrivacyModule code
1010
Boolean enabled
11+
Integer skipRate
1112
GppModuleConfig config
1213
}

src/test/groovy/org/prebid/server/functional/model/response/auction/ActivityInfrastructure.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class ActivityInfrastructure {
1717
RuleConfiguration ruleConfiguration
1818
Boolean allowByDefault
1919
Boolean allowed
20-
String result
20+
RuleResult result
2121
String region
2222
String country
2323
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package org.prebid.server.functional.model.response.auction
22

3+
import com.fasterxml.jackson.databind.PropertyNamingStrategies
4+
import com.fasterxml.jackson.databind.annotation.JsonNaming
35
import groovy.transform.EqualsAndHashCode
46
import groovy.transform.ToString
7+
import org.prebid.server.functional.model.request.auction.PrivacyModule
58

69
@ToString(includeNames = true, ignoreNulls = true)
710
@EqualsAndHashCode
11+
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy)
812
class And {
913

1014
List<String> and
15+
PrivacyModule privacyModule
16+
Boolean skipped
17+
RuleResult result
1118
}

0 commit comments

Comments
 (0)