Skip to content

Commit

Permalink
Merge branch 'add-usnat-privacy-module' into tests-gpp-full-support
Browse files Browse the repository at this point in the history
  • Loading branch information
osulzhenko committed Jul 26, 2023
2 parents 155e39b + f60b612 commit 3cee153
Show file tree
Hide file tree
Showing 6 changed files with 273 additions and 39 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.prebid.server.activity.infrastructure.creator.privacy.usnat;

import com.iab.gpp.encoder.GppModel;
import org.prebid.server.activity.infrastructure.privacy.usnat.USNatGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USCaliforniaGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USColoradoGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USConnecticutGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USNationalGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USUtahGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USVirginiaGppReader;

public class USNatGppReaderFactory {

public USNatGppReader forSection(Integer sectionId, GppModel gppModel) {
return switch (USNatSection.from(sectionId)) {
case NATIONAL -> new USNationalGppReader(gppModel);
case CALIFORNIA -> new USCaliforniaGppReader(gppModel);
case VIRGINIA -> new USVirginiaGppReader(gppModel);
case COLORADO -> new USColoradoGppReader(gppModel);
case UTAH -> new USUtahGppReader(gppModel);
case CONNECTICUT -> new USConnecticutGppReader(gppModel);
};
}
}
Original file line number Diff line number Diff line change
@@ -1,41 +1,35 @@
package org.prebid.server.activity.infrastructure.creator.privacy;
package org.prebid.server.activity.infrastructure.creator.privacy.usnat;

import com.iab.gpp.encoder.GppModel;
import com.iab.gpp.encoder.section.UspCaV1;
import com.iab.gpp.encoder.section.UspCoV1;
import com.iab.gpp.encoder.section.UspCtV1;
import com.iab.gpp.encoder.section.UspNatV1;
import com.iab.gpp.encoder.section.UspUtV1;
import com.iab.gpp.encoder.section.UspVaV1;
import org.apache.commons.collections4.SetUtils;
import org.prebid.server.activity.Activity;
import org.prebid.server.activity.infrastructure.creator.PrivacyModuleCreationContext;
import org.prebid.server.activity.infrastructure.creator.privacy.PrivacyModuleCreator;
import org.prebid.server.activity.infrastructure.privacy.PrivacyModule;
import org.prebid.server.activity.infrastructure.privacy.PrivacyModuleQualifier;
import org.prebid.server.activity.infrastructure.privacy.usnat.USNatGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.USNatModule;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USCaliforniaGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USColoradoGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USConnecticutGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USNationalGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USUtahGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USVirginiaGppReader;
import org.prebid.server.activity.infrastructure.rule.AndRule;
import org.prebid.server.auction.gpp.model.GppContext;
import org.prebid.server.settings.model.activity.privacy.AccountUSNatModuleConfig;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

public class USNatModuleCreator implements PrivacyModuleCreator {

private static final Set<Integer> ALLOWED_SECTIONS_IDS = Set.of(
UspNatV1.ID,
UspCaV1.ID,
UspVaV1.ID,
UspCoV1.ID,
UspUtV1.ID,
UspCtV1.ID);
private static final Set<Integer> ALLOWED_SECTIONS_IDS =
Arrays.stream(USNatSection.values())
.map(USNatSection::sectionId)
.collect(Collectors.toSet());

private final USNatGppReaderFactory gppReaderFactory;

public USNatModuleCreator(USNatGppReaderFactory gppReaderFactory) {
this.gppReaderFactory = Objects.requireNonNull(gppReaderFactory);
}

@Override
public PrivacyModuleQualifier qualifier() {
Expand Down Expand Up @@ -68,19 +62,7 @@ private static boolean shouldSkip(Integer sectionId, AccountUSNatModuleConfig mo
|| (skipSectionIds != null && skipSectionIds.contains(sectionId));
}

private static PrivacyModule forSection(Activity activity, Integer sectionId, GppModel gppModel) {
return new USNatModule(activity, forSection(sectionId, gppModel));
}

private static USNatGppReader forSection(Integer sectionId, GppModel gppModel) {
return switch (sectionId) {
case 7 -> new USNationalGppReader(gppModel);
case 8 -> new USCaliforniaGppReader(gppModel);
case 9 -> new USVirginiaGppReader(gppModel);
case 10 -> new USColoradoGppReader(gppModel);
case 11 -> new USUtahGppReader(gppModel);
case 12 -> new USConnecticutGppReader(gppModel);
default -> throw new IllegalStateException("Unexpected sectionId: " + sectionId);
};
private PrivacyModule forSection(Activity activity, Integer sectionId, GppModel gppModel) {
return new USNatModule(activity, gppReaderFactory.forSection(sectionId, gppModel));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.prebid.server.activity.infrastructure.creator.privacy.usnat;

public enum USNatSection {

NATIONAL,
CALIFORNIA,
VIRGINIA,
COLORADO,
UTAH,
CONNECTICUT;

private static final int SHIFT = 7;

public Integer sectionId() {
return ordinal() + SHIFT;
}

public static USNatSection from(Integer sectionId) {
final USNatSection[] values = USNatSection.values();
if (sectionId < SHIFT || sectionId >= values.length + SHIFT) {
throw new IllegalArgumentException("US sectionId must be in [%s, %s]."
.formatted(SHIFT, values.length + SHIFT - 1));
}

return values[sectionId - SHIFT];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import org.prebid.server.activity.infrastructure.creator.ActivityInfrastructureCreator;
import org.prebid.server.activity.infrastructure.creator.ActivityRuleFactory;
import org.prebid.server.activity.infrastructure.creator.privacy.PrivacyModuleCreator;
import org.prebid.server.activity.infrastructure.creator.privacy.USNatModuleCreator;
import org.prebid.server.activity.infrastructure.creator.privacy.usnat.USNatGppReaderFactory;
import org.prebid.server.activity.infrastructure.creator.privacy.usnat.USNatModuleCreator;
import org.prebid.server.activity.infrastructure.creator.rule.ComponentRuleCreator;
import org.prebid.server.activity.infrastructure.creator.rule.GeoRuleCreator;
import org.prebid.server.activity.infrastructure.creator.rule.PrivacyModulesRuleCreator;
Expand All @@ -20,9 +21,18 @@ public class ActivityInfrastructureConfiguration {
@Configuration
static class PrivacyModuleCreatorConfiguration {

@Bean
USNatModuleCreator usNatModuleCreator() {
return new USNatModuleCreator();
@Configuration
static class USNatModuleCreatorConfiguration {

@Bean
USNatGppReaderFactory usNatGppReaderFactory() {
return new USNatGppReaderFactory();
}

@Bean
USNatModuleCreator usNatModuleCreator(USNatGppReaderFactory gppReaderFactory) {
return new USNatModuleCreator(gppReaderFactory);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package org.prebid.server.activity.infrastructure.creator.privacy.usnat;

import org.junit.Test;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USCaliforniaGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USColoradoGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USConnecticutGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USNationalGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USUtahGppReader;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USVirginiaGppReader;

import static org.assertj.core.api.Assertions.assertThat;

public class USNatGppReaderFactoryTest {

private final USNatGppReaderFactory target = new USNatGppReaderFactory();

@Test
public void fromShouldReturnNationalGppReader() {
// when and then
assertThat(target.forSection(USNatSection.NATIONAL.sectionId(), null))
.isInstanceOf(USNationalGppReader.class);
}

@Test
public void fromShouldReturnCaliforniaGppReader() {
// when and then
assertThat(target.forSection(USNatSection.CALIFORNIA.sectionId(), null))
.isInstanceOf(USCaliforniaGppReader.class);
}

@Test
public void fromShouldReturnVirginiaGppReader() {
// when and then
assertThat(target.forSection(USNatSection.VIRGINIA.sectionId(), null))
.isInstanceOf(USVirginiaGppReader.class);
}

@Test
public void fromShouldReturnColoradoGppReader() {
// when and then
assertThat(target.forSection(USNatSection.COLORADO.sectionId(), null))
.isInstanceOf(USColoradoGppReader.class);
}

@Test
public void fromShouldReturnUtahGppReader() {
// when and then
assertThat(target.forSection(USNatSection.UTAH.sectionId(), null))
.isInstanceOf(USUtahGppReader.class);
}

@Test
public void fromShouldReturnConnecticutGppReader() {
// when and then
assertThat(target.forSection(USNatSection.CONNECTICUT.sectionId(), null))
.isInstanceOf(USConnecticutGppReader.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package org.prebid.server.activity.infrastructure.creator.privacy.usnat;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.prebid.server.activity.Activity;
import org.prebid.server.activity.infrastructure.creator.PrivacyModuleCreationContext;
import org.prebid.server.activity.infrastructure.privacy.PrivacyModule;
import org.prebid.server.activity.infrastructure.privacy.PrivacyModuleQualifier;
import org.prebid.server.activity.infrastructure.privacy.usnat.reader.USNationalGppReader;
import org.prebid.server.activity.infrastructure.rule.Rule;
import org.prebid.server.auction.gpp.model.GppContextCreator;
import org.prebid.server.settings.model.activity.privacy.AccountUSNatModuleConfig;

import java.util.List;

import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.verifyNoMoreInteractions;

public class USNatModuleCreatorTest {

@org.junit.Rule
public final MockitoRule mockitoRule = MockitoJUnit.rule();

@Mock
private USNatGppReaderFactory gppReaderFactory;

private USNatModuleCreator target;

@Before
public void setUp() {
given(gppReaderFactory.forSection(any(), any())).willReturn(new USNationalGppReader(null));

target = new USNatModuleCreator(gppReaderFactory);
}

@Test
public void qualifierShouldReturnExpectedResult() {
// when and then
assertThat(target.qualifier()).isEqualTo(PrivacyModuleQualifier.US_NAT);
}

@Test
public void fromShouldCreateProperPrivacyModuleIfSectionsIdsIsNull() {
// given
final PrivacyModuleCreationContext creationContext = givenCreationContext(null, null);

// when
final PrivacyModule privacyModule = target.from(creationContext);

// then
assertThat(privacyModule.proceed(null)).isEqualTo(Rule.Result.ABSTAIN);
verifyNoInteractions(gppReaderFactory);
}

@Test
public void fromShouldCreateProperPrivacyModuleIfSectionsIdsIsEmpty() {
// given
final PrivacyModuleCreationContext creationContext = givenCreationContext(emptyList(), null);

// when
final PrivacyModule privacyModule = target.from(creationContext);

// then
assertThat(privacyModule.proceed(null)).isEqualTo(Rule.Result.ABSTAIN);
verifyNoInteractions(gppReaderFactory);
}

@Test
public void fromShouldCreateProperPrivacyModuleIfAllSectionsIdsSkipped() {
// given
final PrivacyModuleCreationContext creationContext = givenCreationContext(singletonList(1), null);

// when
final PrivacyModule privacyModule = target.from(creationContext);

// then
assertThat(privacyModule.proceed(null)).isEqualTo(Rule.Result.ABSTAIN);
verifyNoInteractions(gppReaderFactory);
}

@Test
public void fromShouldShouldSkipNotSupportedSectionsIds() {
// given
final PrivacyModuleCreationContext creationContext = givenCreationContext(
asList(6, 7, 8, 9, 10, 11, 12, 13), null);

// when
target.from(creationContext);

// then
verify(gppReaderFactory, times(1)).forSection(eq(7), any());
verify(gppReaderFactory, times(1)).forSection(eq(8), any());
verify(gppReaderFactory, times(1)).forSection(eq(9), any());
verify(gppReaderFactory, times(1)).forSection(eq(10), any());
verify(gppReaderFactory, times(1)).forSection(eq(11), any());
verify(gppReaderFactory, times(1)).forSection(eq(12), any());
verifyNoMoreInteractions(gppReaderFactory);
}

@Test
public void fromShouldShouldSkipConfiguredSectionsIds() {
// given
final PrivacyModuleCreationContext creationContext = givenCreationContext(asList(7, 8, 9), asList(8, 9));

// when
target.from(creationContext);

// then
verify(gppReaderFactory, times(1)).forSection(eq(7), any());
verifyNoMoreInteractions(gppReaderFactory);
}

private static PrivacyModuleCreationContext givenCreationContext(List<Integer> sectionsIds,
List<Integer> skipSectionsIds) {

return PrivacyModuleCreationContext.of(
Activity.CALL_BIDDER,
AccountUSNatModuleConfig.of(true, AccountUSNatModuleConfig.Config.of(skipSectionsIds)),
GppContextCreator.from(null, sectionsIds).build().getGppContext());
}
}

0 comments on commit 3cee153

Please sign in to comment.