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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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 @@ -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 All @@ -17,12 +18,16 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;

public class PrivacyModulesRuleCreator extends AbstractRuleCreator<AccountActivityPrivacyModulesRuleConfig> {

private static final String WILDCARD = "*";
private static final int SKIP_RATE_MIN = 0;
private static final int SKIP_RATE_MAX = 100;

private final Map<PrivacyModuleQualifier, PrivacyModuleCreator> privacyModulesCreators;

Expand Down Expand Up @@ -82,6 +87,15 @@ private static boolean isModuleEnabled(AccountPrivacyModuleConfig accountPrivacy
private PrivacyModule createPrivacyModule(PrivacyModuleQualifier privacyModuleQualifier,
ActivityControllerCreationContext creationContext) {

final Integer skipRate = Optional.ofNullable(creationContext.getPrivacyModulesConfigs())
.map(configs -> configs.get(privacyModuleQualifier))
.map(AccountPrivacyModuleConfig::getSkipRate)
.orElse(SKIP_RATE_MIN);

if (ThreadLocalRandom.current().nextInt(SKIP_RATE_MAX) < skipRate) {
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")
Integer 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;

Integer 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;

Integer skipRate;

Config config;

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ public void parseShouldSkipPrivacyModulesDuplicatesAndEmitWarnings() {
.activities(Map.of(Activity.SYNC_USER, AccountActivityConfiguration.of(
null, singletonList(AccountActivityConditionsRuleConfig.of(null, null)))))
.modules(asList(
AccountUSNatModuleConfig.of(null, null),
AccountUSNatModuleConfig.of(null, null)))
AccountUSNatModuleConfig.of(null, null, null),
AccountUSNatModuleConfig.of(null, null, null)))
.build())
.build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ private static PrivacyModuleCreationContext givenCreationContext(List<Integer> s

return PrivacyModuleCreationContext.of(
Activity.CALL_BIDDER,
AccountUSCustomLogicModuleConfig.of(true, config),
AccountUSCustomLogicModuleConfig.of(true, null, config),
GppContextCreator.from(null, sectionsIds).build().getGppContext());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ private static PrivacyModuleCreationContext givenCreationContext(List<Integer> s

return PrivacyModuleCreationContext.of(
Activity.CALL_BIDDER,
AccountUSNatModuleConfig.of(true, AccountUSNatModuleConfig.Config.of(skipSectionsIds)),
AccountUSNatModuleConfig.of(true, null, AccountUSNatModuleConfig.Config.of(skipSectionsIds)),
GppContextCreator.from(null, sectionsIds).build().getGppContext());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void fromShouldCreateDefaultRuleIfNoneOfConfiguredPrivacyModulesMatches()
final AccountActivityPrivacyModulesRuleConfig config = AccountActivityPrivacyModulesRuleConfig.of(
singletonList("not_configured"));
final ActivityControllerCreationContext creationContext = creationContext(Map.of(
PrivacyModuleQualifier.US_NAT, AccountUSNatModuleConfig.of(null, null)));
PrivacyModuleQualifier.US_NAT, AccountUSNatModuleConfig.of(null, null, null)));

// when
final Rule rule = target.from(config, creationContext);
Expand All @@ -70,7 +70,7 @@ public void fromShouldCreateRuleWithAllConfiguredPrivacyModules() {
// given
final AccountActivityPrivacyModulesRuleConfig config = AccountActivityPrivacyModulesRuleConfig.of(
singletonList("*"));
final AccountPrivacyModuleConfig moduleConfig = AccountUSNatModuleConfig.of(null, null);
final AccountPrivacyModuleConfig moduleConfig = AccountUSNatModuleConfig.of(null, null, null);
final ActivityControllerCreationContext creationContext = creationContext(
Map.of(PrivacyModuleQualifier.US_NAT, moduleConfig));

Expand All @@ -89,7 +89,7 @@ public void fromShouldCreateRuleWithAllConfiguredPrivacyModulesThatMatches() {
// given
final AccountActivityPrivacyModulesRuleConfig config = AccountActivityPrivacyModulesRuleConfig.of(
singletonList("iab.*"));
final AccountPrivacyModuleConfig moduleConfig = AccountUSNatModuleConfig.of(null, null);
final AccountPrivacyModuleConfig moduleConfig = AccountUSNatModuleConfig.of(null, null, null);
final ActivityControllerCreationContext creationContext = creationContext(
Map.of(PrivacyModuleQualifier.US_NAT, moduleConfig));

Expand All @@ -108,7 +108,7 @@ public void fromShouldCreateRuleAndModifyContextWithUsedPrivacyModules() {
// given
final AccountActivityPrivacyModulesRuleConfig config = AccountActivityPrivacyModulesRuleConfig.of(
singletonList(PrivacyModuleQualifier.US_NAT.moduleName()));
final AccountPrivacyModuleConfig moduleConfig = AccountUSNatModuleConfig.of(null, null);
final AccountPrivacyModuleConfig moduleConfig = AccountUSNatModuleConfig.of(null, null, null);
final ActivityControllerCreationContext creationContext = creationContext(
Map.of(PrivacyModuleQualifier.US_NAT, moduleConfig));

Expand All @@ -129,7 +129,7 @@ public void fromShouldSkipAlreadyUsedPrivacyModule() {
final AccountActivityPrivacyModulesRuleConfig config = AccountActivityPrivacyModulesRuleConfig.of(
singletonList(PrivacyModuleQualifier.US_NAT.moduleName()));
final ActivityControllerCreationContext creationContext = creationContext(Map.of(
PrivacyModuleQualifier.US_NAT, AccountUSNatModuleConfig.of(true, null)));
PrivacyModuleQualifier.US_NAT, AccountUSNatModuleConfig.of(true, null, null)));
creationContext.use(PrivacyModuleQualifier.US_NAT);

// when
Expand All @@ -145,7 +145,22 @@ public void fromShouldSkipDisabledPrivacyModule() {
final AccountActivityPrivacyModulesRuleConfig config = AccountActivityPrivacyModulesRuleConfig.of(
singletonList(PrivacyModuleQualifier.US_NAT.moduleName()));
final ActivityControllerCreationContext creationContext = creationContext(Map.of(
PrivacyModuleQualifier.US_NAT, AccountUSNatModuleConfig.of(false, null)));
PrivacyModuleQualifier.US_NAT, AccountUSNatModuleConfig.of(false, null, null)));

// when
final Rule rule = target.from(config, creationContext);

// then
assertThat(rule.proceed(null)).isEqualTo(Rule.Result.ABSTAIN);
}

@Test
public void fromShouldDisableSkippedPrivacyModule() {
// given
final AccountActivityPrivacyModulesRuleConfig config = AccountActivityPrivacyModulesRuleConfig.of(
singletonList(PrivacyModuleQualifier.US_NAT.moduleName()));
final ActivityControllerCreationContext creationContext = creationContext(Map.of(
PrivacyModuleQualifier.US_NAT, AccountUSNatModuleConfig.of(true, 100, null)));

// when
final Rule rule = target.from(config, creationContext);
Expand All @@ -162,7 +177,7 @@ public void fromShouldSkipPrivacyModuleWithoutCreator() {
final AccountActivityPrivacyModulesRuleConfig config = AccountActivityPrivacyModulesRuleConfig.of(
singletonList(PrivacyModuleQualifier.US_NAT.moduleName()));
final ActivityControllerCreationContext creationContext = creationContext(Map.of(
PrivacyModuleQualifier.US_NAT, AccountUSNatModuleConfig.of(null, null)));
PrivacyModuleQualifier.US_NAT, AccountUSNatModuleConfig.of(null, null, null)));

// when
final Rule rule = target.from(config, creationContext);
Expand Down
Loading