Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support testing the USGen privacy module #3695

Merged
merged 5 commits into from
Feb 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public class ActivityControllerCreationContext {

Map<PrivacyModuleQualifier, AccountPrivacyModuleConfig> privacyModulesConfigs;

Set<PrivacyModuleQualifier> skipPrivacyModules;

@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
Set<PrivacyModuleQualifier> usedPrivacyModules = EnumSet.noneOf(PrivacyModuleQualifier.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,13 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
Expand All @@ -41,6 +44,8 @@ public class ActivityInfrastructureCreator {

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

private static final int MODULE_MAX_SKIP_RATE = 100;

private final ActivityRuleFactory activityRuleFactory;
private final Purpose defaultPurpose4;
private final Metrics metrics;
Expand Down Expand Up @@ -75,15 +80,22 @@ Map<Activity, ActivityController> parse(Account account, GppContext gppContext,
final Map<Activity, AccountActivityConfiguration> activitiesConfiguration = accountPrivacyConfig
.map(AccountPrivacyConfig::getActivities)
.orElseGet(Collections::emptyMap);

final Map<PrivacyModuleQualifier, AccountPrivacyModuleConfig> modulesConfigs = accountPrivacyConfig
.map(AccountPrivacyConfig::getModules)
.orElseGet(Collections::emptyList)
.stream()
.filter(Objects::nonNull)
.collect(Collectors.toMap(
AccountPrivacyModuleConfig::getCode,
UnaryOperator.identity(),
takeFirstAndLogDuplicates(account.getId())));

final Set<PrivacyModuleQualifier> skipPrivacyModules = modulesConfigs.entrySet().stream()
.filter(entry -> shouldSkipPrivacyModule(entry.getValue()))
.map(Map.Entry::getKey)
.collect(Collectors.toCollection(() -> EnumSet.noneOf(PrivacyModuleQualifier.class)));

return Arrays.stream(Activity.values()).collect(Collectors.toMap(
UnaryOperator.identity(),
fallbackActivity(
Expand All @@ -93,6 +105,7 @@ Map<Activity, ActivityController> parse(Account account, GppContext gppContext,
activity,
activitiesConfiguration.get(activity),
modulesConfigs,
skipPrivacyModules,
gppContext,
debug)),
(oldValue, newValue) -> oldValue,
Expand Down Expand Up @@ -131,9 +144,14 @@ private Function<Activity, ActivityController> fallbackActivity(
: activityControllerCreator.apply(originalActivity);
}

private static boolean shouldSkipPrivacyModule(AccountPrivacyModuleConfig config) {
return ThreadLocalRandom.current().nextInt(MODULE_MAX_SKIP_RATE) < config.getSkipRate();
}

private ActivityController from(Activity activity,
AccountActivityConfiguration activityConfiguration,
Map<PrivacyModuleQualifier, AccountPrivacyModuleConfig> modulesConfigs,
Set<PrivacyModuleQualifier> skipPrivacyModules,
GppContext gppContext,
ActivityInfrastructureDebug debug) {

Expand All @@ -147,6 +165,7 @@ private ActivityController from(Activity activity,
final ActivityControllerCreationContext creationContext = ActivityControllerCreationContext.of(
activity,
modulesConfigs,
skipPrivacyModules,
gppContext);

final boolean allow = allowFromConfig(activityConfiguration.getAllow());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.prebid.server.activity.infrastructure.creator.ActivityControllerCreationContext;
import org.prebid.server.activity.infrastructure.creator.PrivacyModuleCreationContext;
import org.prebid.server.activity.infrastructure.creator.privacy.PrivacyModuleCreator;
import org.prebid.server.activity.infrastructure.privacy.AbstainPrivacyModule;
import org.prebid.server.activity.infrastructure.privacy.PrivacyModule;
import org.prebid.server.activity.infrastructure.privacy.PrivacyModuleQualifier;
import org.prebid.server.activity.infrastructure.rule.AndRule;
Expand Down Expand Up @@ -82,6 +83,10 @@ private static boolean isModuleEnabled(AccountPrivacyModuleConfig accountPrivacy
private PrivacyModule createPrivacyModule(PrivacyModuleQualifier privacyModuleQualifier,
ActivityControllerCreationContext creationContext) {

if (creationContext.getSkipPrivacyModules().contains(privacyModuleQualifier)) {
return new AbstainPrivacyModule(privacyModuleQualifier);
}

return privacyModulesCreators.get(privacyModuleQualifier)
.from(creationContext(privacyModuleQualifier, creationContext));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.prebid.server.activity.infrastructure.privacy;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.prebid.server.activity.infrastructure.debug.Loggable;
import org.prebid.server.activity.infrastructure.payload.ActivityInvocationPayload;

import java.util.Objects;

public class AbstainPrivacyModule implements PrivacyModule, Loggable {

private final PrivacyModuleQualifier privacyModuleQualifier;

public AbstainPrivacyModule(PrivacyModuleQualifier privacyModuleQualifier) {
this.privacyModuleQualifier = Objects.requireNonNull(privacyModuleQualifier);
}

@Override
public Result proceed(ActivityInvocationPayload activityInvocationPayload) {
return Result.ABSTAIN;
}

@Override
public JsonNode asLogEntry(ObjectMapper mapper) {
return mapper.createObjectNode()
.put("privacy_module", privacyModuleQualifier.moduleName())
.put("skipped", true)
.put("result", Result.ABSTAIN.name());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ public sealed interface AccountPrivacyModuleConfig permits

PrivacyModuleQualifier getCode();

@JsonProperty("skipRate")
int getSkipRate();

@JsonProperty
Boolean enabled();
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ public class AccountUSCustomLogicModuleConfig implements AccountPrivacyModuleCon
@Accessors(fluent = true)
Boolean enabled;

int skipRate;

Config config;

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public class AccountUSNatModuleConfig implements AccountPrivacyModuleConfig {
@Accessors(fluent = true)
Boolean enabled;

int skipRate;

Config config;

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ class AccountGppConfig {

PrivacyModule code
Boolean enabled
Integer skipRate
GppModuleConfig config
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class ActivityInfrastructure {
RuleConfiguration ruleConfiguration
Boolean allowByDefault
Boolean allowed
String result
RuleResult result
String region
String country
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package org.prebid.server.functional.model.response.auction

import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString
import org.prebid.server.functional.model.request.auction.PrivacyModule

@ToString(includeNames = true, ignoreNulls = true)
@EqualsAndHashCode
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy)
class And {

List<String> and
PrivacyModule privacyModule
Boolean skipped
RuleResult result
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.prebid.server.functional.model.response.auction

enum RuleResult {

ALLOW, DISALLOW, ABSTAIN
}
Loading
Loading