blob: 83797de637197d7b6e4b0476f1cab103c868fe27 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.adservices.data.customaudience;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import android.adservices.common.AdSelectionSignals;
import android.content.Context;
import android.net.Uri;
import androidx.room.Room;
import androidx.test.core.app.ApplicationProvider;
import com.android.adservices.data.common.DBAdData;
import com.android.adservices.service.Flags;
import com.android.adservices.service.FlagsFactory;
import com.android.adservices.service.customaudience.BackgroundFetchRunner;
import com.android.adservices.service.customaudience.CustomAudienceUpdatableData;
import com.android.dx.mockito.inline.extended.ExtendedMockito;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoSession;
import java.time.Clock;
import java.time.Duration;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class CustomAudienceDaoTest {
private static final Flags TEST_FLAGS = FlagsFactory.getFlagsForTest();
private static final Uri DAILY_UPDATE_URL_1 = Uri.parse("https://www.example.com/d1");
private static final String USER_BIDDING_SIGNALS_1 = "ExampleBiddingSignal1";
private static final Uri AD_DATA_RENDER_URL_1 = Uri.parse("https://www.example.com/a1");
private static final String AD_DATA_METADATA_1 = "meta1";
private static final DBAdData ADS_1 =
new DBAdData.Builder()
.setRenderUri(AD_DATA_RENDER_URL_1)
.setMetadata(AD_DATA_METADATA_1)
.build();
private static final Uri DAILY_UPDATE_URL_2 = Uri.parse("https://www.example.com/d2");
private static final AdSelectionSignals USER_BIDDING_SIGNALS_2 =
AdSelectionSignals.fromString("ExampleBiddingSignal2");
private static final Uri AD_DATA_RENDER_URL_2 = Uri.parse("https://www.example.com/a2");
private static final String AD_DATA_METADATA_2 = "meta2";
private static final DBAdData ADS_2 =
new DBAdData.Builder()
.setRenderUri(AD_DATA_RENDER_URL_2)
.setMetadata(AD_DATA_METADATA_2)
.build();
private static final Uri TRUSTED_BIDDING_DATA_URL_2 = Uri.parse("https://www.example.com/t1");
private static final List<String> TRUSTED_BIDDING_DATA_KEYS_2 =
Collections.singletonList("key2");
private static final Context CONTEXT = ApplicationProvider.getApplicationContext();
private static final Clock CLOCK = Clock.fixed(Instant.now(), ZoneOffset.UTC);
private static final Instant CURRENT_TIME = CLOCK.instant();
private static final Instant CREATION_TIME_1 = CURRENT_TIME.truncatedTo(ChronoUnit.MILLIS);
private static final Instant ACTIVATION_TIME_1 =
CURRENT_TIME.plus(Duration.ofDays(1)).truncatedTo(ChronoUnit.MILLIS);
private static final Instant EXPIRATION_TIME_1 =
CURRENT_TIME.plus(Duration.ofDays(3)).truncatedTo(ChronoUnit.MILLIS);
private static final Instant LAST_UPDATED_TIME_1 = CURRENT_TIME.truncatedTo(ChronoUnit.MILLIS);
private static final Instant LAST_UPDATED_TIME_36_HRS =
CURRENT_TIME.minus(Duration.ofHours(36)).truncatedTo(ChronoUnit.MILLIS);
private static final Instant LAST_UPDATED_TIME_72_HRS =
CURRENT_TIME.minus(Duration.ofHours(72)).truncatedTo(ChronoUnit.MILLIS);
private static final Instant CREATION_TIME_2 =
CURRENT_TIME.plus(Duration.ofMinutes(1)).truncatedTo(ChronoUnit.MILLIS);
private static final Instant ACTIVATION_TIME_2 =
CURRENT_TIME
.plus(Duration.ofDays(1))
.plus(Duration.ofMinutes(1))
.truncatedTo(ChronoUnit.MILLIS);
private static final Instant EXPIRATION_TIME_2 =
CURRENT_TIME
.plus(Duration.ofDays(3))
.plus(Duration.ofMinutes(1))
.truncatedTo(ChronoUnit.MILLIS);
private static final Instant LAST_UPDATED_TIME_2 =
CURRENT_TIME.plus(Duration.ofMinutes(1)).truncatedTo(ChronoUnit.MILLIS);
private static final Instant ACTIVATION_TIME_MINUS_ONE_HOUR =
CURRENT_TIME.minus(Duration.ofHours(1)).truncatedTo(ChronoUnit.MILLIS);
private static final Instant CREATION_TIME_MINUS_THREE_DAYS =
CURRENT_TIME.minus(Duration.ofDays(3)).truncatedTo(ChronoUnit.MILLIS);
private static final Instant EXPIRATION_TIME_MINUS_ONE_DAY =
CURRENT_TIME.minus(Duration.ofDays(1)).truncatedTo(ChronoUnit.MILLIS);
private static final String OWNER_1 = "owner1";
private static final String OWNER_2 = "owner2";
private static final String OWNER_3 = "owner3";
private static final String BUYER_1 = "buyer1";
private static final String BUYER_2 = "buyer2";
private static final String BUYER_3 = "buyer3";
private static final String NAME_1 = "name1";
private static final String NAME_2 = "name2";
private static final String NAME_3 = "name3";
private static final Uri BIDDING_LOGIC_URL_1 = Uri.parse("https://www.example.com/e1");
private static final Uri BIDDING_LOGIC_URL_2 = Uri.parse("https://www.example.com/e2");
private static final DBTrustedBiddingData TRUSTED_BIDDING_DATA_2 =
new DBTrustedBiddingData.Builder()
.setUrl(TRUSTED_BIDDING_DATA_URL_2)
.setKeys(TRUSTED_BIDDING_DATA_KEYS_2)
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_1 =
new DBCustomAudience.Builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setActivationTime(ACTIVATION_TIME_1)
.setCreationTime(CREATION_TIME_1)
.setExpirationTime(EXPIRATION_TIME_1)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_1)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_1)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_1)
.setAds(List.of(ADS_1))
.setTrustedBiddingData(null)
.build();
private static final DBCustomAudienceBackgroundFetchData CUSTOM_AUDIENCE_BGF_DATA_1 =
DBCustomAudienceBackgroundFetchData.builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setDailyUpdateUrl(DAILY_UPDATE_URL_1)
.setEligibleUpdateTime(
DBCustomAudienceBackgroundFetchData
.computeNextEligibleUpdateTimeAfterSuccessfulUpdate(
CREATION_TIME_1, TEST_FLAGS))
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_1_1 =
new DBCustomAudience.Builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setActivationTime(ACTIVATION_TIME_1)
.setCreationTime(CREATION_TIME_2)
.setExpirationTime(EXPIRATION_TIME_2)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_2)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_2)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_1)
.setAds(List.of(ADS_1))
.setTrustedBiddingData(null)
.build();
private static final DBCustomAudienceBackgroundFetchData CUSTOM_AUDIENCE_BGF_DATA_1_1 =
DBCustomAudienceBackgroundFetchData.builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setDailyUpdateUrl(DAILY_UPDATE_URL_1)
.setEligibleUpdateTime(
DBCustomAudienceBackgroundFetchData
.computeNextEligibleUpdateTimeAfterSuccessfulUpdate(
CREATION_TIME_2, TEST_FLAGS))
.build();
private static final DBCustomAudienceBackgroundFetchData CUSTOM_AUDIENCE_BGF_DATA_1_UPDATED =
DBCustomAudienceBackgroundFetchData.builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setDailyUpdateUrl(DAILY_UPDATE_URL_1)
.setEligibleUpdateTime(
DBCustomAudienceBackgroundFetchData
.computeNextEligibleUpdateTimeAfterSuccessfulUpdate(
LAST_UPDATED_TIME_2, TEST_FLAGS))
.build();
private static final CustomAudienceUpdatableData CUSTOM_AUDIENCE_UPDATABLE_DATA =
CustomAudienceUpdatableData.builder()
.setUserBiddingSignals(USER_BIDDING_SIGNALS_2)
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.setAds(List.of(ADS_2))
.setAttemptedUpdateTime(LAST_UPDATED_TIME_2)
.setInitialUpdateResult(BackgroundFetchRunner.UpdateResultType.SUCCESS)
.setContainsSuccessfulUpdate(true)
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_1_UPDATED_FROM_UPDATABLE_DATA =
new DBCustomAudience.Builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setActivationTime(ACTIVATION_TIME_1)
.setCreationTime(CREATION_TIME_1)
.setExpirationTime(EXPIRATION_TIME_1)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_2)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_1)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_2.getStringForm())
.setAds(List.of(ADS_2))
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_2 =
new DBCustomAudience.Builder()
.setOwner(OWNER_2)
.setBuyer(BUYER_2)
.setName(NAME_2)
.setActivationTime(ACTIVATION_TIME_2)
.setCreationTime(CREATION_TIME_2)
.setExpirationTime(EXPIRATION_TIME_2)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_2)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_2)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_2.getStringForm())
.setAds(List.of(ADS_2))
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.build();
private static final DBCustomAudienceBackgroundFetchData CUSTOM_AUDIENCE_BGF_DATA_2 =
DBCustomAudienceBackgroundFetchData.builder()
.setOwner(OWNER_2)
.setBuyer(BUYER_2)
.setName(NAME_2)
.setDailyUpdateUrl(DAILY_UPDATE_URL_2)
.setEligibleUpdateTime(
DBCustomAudienceBackgroundFetchData
.computeNextEligibleUpdateTimeAfterSuccessfulUpdate(
CREATION_TIME_2, TEST_FLAGS))
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_INACTIVE =
new DBCustomAudience.Builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setActivationTime(ACTIVATION_TIME_1)
.setCreationTime(CREATION_TIME_1)
.setExpirationTime(EXPIRATION_TIME_1)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_1)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_1)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_1)
.setAds(List.of(ADS_1))
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_ACTIVE =
new DBCustomAudience.Builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setActivationTime(ACTIVATION_TIME_MINUS_ONE_HOUR)
.setCreationTime(CREATION_TIME_MINUS_THREE_DAYS)
.setExpirationTime(EXPIRATION_TIME_1)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_1)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_1)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_1)
.setAds(List.of(ADS_1))
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_EXPIRED =
new DBCustomAudience.Builder()
.setOwner(OWNER_2)
.setBuyer(BUYER_2)
.setName(NAME_3)
.setActivationTime(ACTIVATION_TIME_MINUS_ONE_HOUR)
.setCreationTime(CREATION_TIME_MINUS_THREE_DAYS)
.setExpirationTime(EXPIRATION_TIME_MINUS_ONE_DAY)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_2)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_2)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_2.getStringForm())
.setAds(List.of(ADS_2))
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.build();
private static final DBCustomAudienceBackgroundFetchData CUSTOM_AUDIENCE_BGF_DATA_EXPIRED =
DBCustomAudienceBackgroundFetchData.builder()
.setOwner(OWNER_2)
.setBuyer(BUYER_2)
.setName(NAME_3)
.setDailyUpdateUrl(DAILY_UPDATE_URL_2)
.setEligibleUpdateTime(
DBCustomAudienceBackgroundFetchData
.computeNextEligibleUpdateTimeAfterSuccessfulUpdate(
CREATION_TIME_MINUS_THREE_DAYS, TEST_FLAGS))
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_UPDATED =
new DBCustomAudience.Builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_3)
.setActivationTime(ACTIVATION_TIME_MINUS_ONE_HOUR)
.setCreationTime(CREATION_TIME_MINUS_THREE_DAYS)
.setExpirationTime(EXPIRATION_TIME_1)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_36_HRS)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_1)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_1)
.setAds(List.of(ADS_1))
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.build();
private static final DBCustomAudienceBackgroundFetchData CUSTOM_AUDIENCE_BGF_DATA_UPDATED =
DBCustomAudienceBackgroundFetchData.builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_3)
.setDailyUpdateUrl(DAILY_UPDATE_URL_1)
.setEligibleUpdateTime(
DBCustomAudienceBackgroundFetchData
.computeNextEligibleUpdateTimeAfterSuccessfulUpdate(
CREATION_TIME_MINUS_THREE_DAYS, TEST_FLAGS))
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_OUTDATED =
new DBCustomAudience.Builder()
.setOwner(OWNER_2)
.setBuyer(BUYER_2)
.setName(NAME_2)
.setActivationTime(ACTIVATION_TIME_MINUS_ONE_HOUR)
.setCreationTime(CREATION_TIME_MINUS_THREE_DAYS)
.setExpirationTime(EXPIRATION_TIME_1)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_72_HRS)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_1)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_1)
.setAds(List.of(ADS_1))
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_NO_USER_BIDDING_SIGNALS =
new DBCustomAudience.Builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setActivationTime(ACTIVATION_TIME_MINUS_ONE_HOUR)
.setCreationTime(CREATION_TIME_MINUS_THREE_DAYS)
.setExpirationTime(EXPIRATION_TIME_1)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_1)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_1)
.setUserBiddingSignals(null)
.setAds(List.of(ADS_1))
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_NO_TRUSTED_BIDDING_DATA_URL =
new DBCustomAudience.Builder()
.setOwner(OWNER_2)
.setBuyer(BUYER_2)
.setName(NAME_2)
.setActivationTime(ACTIVATION_TIME_MINUS_ONE_HOUR)
.setCreationTime(CREATION_TIME_MINUS_THREE_DAYS)
.setExpirationTime(EXPIRATION_TIME_1)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_1)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_1)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_1)
.setAds(List.of(ADS_1))
.setTrustedBiddingData(null)
.build();
private static final DBCustomAudience CUSTOM_AUDIENCE_NO_ADS =
new DBCustomAudience.Builder()
.setOwner(OWNER_3)
.setBuyer(BUYER_3)
.setName(NAME_3)
.setActivationTime(ACTIVATION_TIME_MINUS_ONE_HOUR)
.setCreationTime(CREATION_TIME_MINUS_THREE_DAYS)
.setExpirationTime(EXPIRATION_TIME_1)
.setLastAdsAndBiddingDataUpdatedTime(LAST_UPDATED_TIME_1)
.setBiddingLogicUrl(BIDDING_LOGIC_URL_1)
.setUserBiddingSignals(USER_BIDDING_SIGNALS_1)
.setAds(null)
.setTrustedBiddingData(TRUSTED_BIDDING_DATA_2)
.build();
private static final String APP_PACKAGE_NAME_1 = "appPackageName1";
private static final String BIDDING_LOGIC_JS_1 =
"function test() { return \"hello world_1\"; }";
private static final String TRUSTED_BIDDING_OVERRIDE_DATA_1 = "{\"trusted_bidding_data\":1}";
public static final DBCustomAudienceOverride DB_CUSTOM_AUDIENCE_OVERRIDE_1 =
DBCustomAudienceOverride.builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setAppPackageName(APP_PACKAGE_NAME_1)
.setBiddingLogicJS(BIDDING_LOGIC_JS_1)
.setTrustedBiddingData(TRUSTED_BIDDING_OVERRIDE_DATA_1)
.build();
private static final String APP_PACKAGE_NAME_2 = "appPackageName2";
private static final String BIDDING_LOGIC_JS_2 =
"function test() { return \"hello world_2\"; }";
private static final String TRUSTED_BIDDING_OVERRIDE_DATA_2 = "{\"trusted_bidding_data\":2}";
public static final DBCustomAudienceOverride DB_CUSTOM_AUDIENCE_OVERRIDE_2 =
DBCustomAudienceOverride.builder()
.setOwner(OWNER_2)
.setBuyer(BUYER_2)
.setName(NAME_2)
.setAppPackageName(APP_PACKAGE_NAME_2)
.setBiddingLogicJS(BIDDING_LOGIC_JS_2)
.setTrustedBiddingData(TRUSTED_BIDDING_OVERRIDE_DATA_2)
.build();
private static final String BIDDING_LOGIC_JS_3 =
"function test() { return \"hello world_3\"; }";
private static final String TRUSTED_BIDDING_OVERRIDE_DATA_3 = "{\"trusted_bidding_data\":3}";
public static final DBCustomAudienceOverride DB_CUSTOM_AUDIENCE_OVERRIDE_3 =
DBCustomAudienceOverride.builder()
.setOwner(OWNER_1)
.setBuyer(BUYER_1)
.setName(NAME_1)
.setAppPackageName(APP_PACKAGE_NAME_1)
.setBiddingLogicJS(BIDDING_LOGIC_JS_3)
.setTrustedBiddingData(TRUSTED_BIDDING_OVERRIDE_DATA_3)
.build();
private static final String OWNER_4 = "owner4";
private static final String BUYER_4 = "buyer4";
private static final String NAME_4 = "name4";
public static final DBCustomAudienceOverride DB_CUSTOM_AUDIENCE_OVERRIDE_4 =
DBCustomAudienceOverride.builder()
.setOwner(OWNER_4)
.setBuyer(BUYER_4)
.setName(NAME_4)
.setAppPackageName(APP_PACKAGE_NAME_1)
.setBiddingLogicJS(BIDDING_LOGIC_JS_1)
.setTrustedBiddingData(TRUSTED_BIDDING_OVERRIDE_DATA_1)
.build();
private MockitoSession mStaticMockSession = null;
private CustomAudienceDao mCustomAudienceDao;
@Before
public void setup() {
// Test applications don't have the required permissions to read config P/H flags, and
// injecting mocked flags everywhere is annoying and non-trivial for static methods
mStaticMockSession =
ExtendedMockito.mockitoSession().spyStatic(FlagsFactory.class).startMocking();
mCustomAudienceDao =
Room.inMemoryDatabaseBuilder(CONTEXT, CustomAudienceDatabase.class)
.build()
.customAudienceDao();
}
@After
public void teardown() {
if (mStaticMockSession != null) {
mStaticMockSession.finishMocking();
}
}
@Test
public void testReturnsTrueIfCustomAudienceOverrideExists() {
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_1);
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_2);
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_2, BUYER_2, NAME_2));
}
@Test
public void testDeletesCustomAudienceOverridesByPrimaryKey() {
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_1);
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_2);
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_2, BUYER_2, NAME_2));
mCustomAudienceDao.removeCustomAudienceOverrideByPrimaryKeyAndPackageName(
OWNER_1, BUYER_1, NAME_1, APP_PACKAGE_NAME_1);
assertFalse(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_2, BUYER_2, NAME_2));
}
@Test
public void testDoesNotDeleteCustomAudienceOverrideWithIncorrectPackageName() {
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_1);
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
mCustomAudienceDao.removeCustomAudienceOverrideByPrimaryKeyAndPackageName(
OWNER_1, BUYER_1, NAME_1, APP_PACKAGE_NAME_2);
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
}
@Test
public void testDeletesAllCustomAudienceOverridesThatMatchPackageName() {
// Adding with same package name
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_1);
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_4);
// Adding with different package name
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_2);
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_4, BUYER_4, NAME_4));
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_2, BUYER_2, NAME_2));
mCustomAudienceDao.removeAllCustomAudienceOverrides(APP_PACKAGE_NAME_1);
assertFalse(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
assertFalse(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_4, BUYER_4, NAME_4));
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_2, BUYER_2, NAME_2));
}
@Test
public void testGetCustomAudienceOverrideExists() {
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_1);
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
String biddingLogicJS =
mCustomAudienceDao.getBiddingLogicUrlOverride(
OWNER_1, BUYER_1, NAME_1, APP_PACKAGE_NAME_1);
assertEquals(BIDDING_LOGIC_JS_1, biddingLogicJS);
}
@Test
public void testCorrectlyOverridesCustomAudienceOverride() {
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_1);
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
String biddingLogicJs1 =
mCustomAudienceDao.getBiddingLogicUrlOverride(
OWNER_1, BUYER_1, NAME_1, APP_PACKAGE_NAME_1);
String trustedBiddingData_1 =
mCustomAudienceDao.getTrustedBiddingDataOverride(
OWNER_1, BUYER_1, NAME_1, APP_PACKAGE_NAME_1);
assertEquals(BIDDING_LOGIC_JS_1, biddingLogicJs1);
assertEquals(TRUSTED_BIDDING_OVERRIDE_DATA_1, trustedBiddingData_1);
// Persisting with same primary key
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_3);
String biddingLogicJs3 =
mCustomAudienceDao.getBiddingLogicUrlOverride(
OWNER_1, BUYER_1, NAME_1, APP_PACKAGE_NAME_1);
String trustedBiddingData_3 =
mCustomAudienceDao.getTrustedBiddingDataOverride(
OWNER_1, BUYER_1, NAME_1, APP_PACKAGE_NAME_1);
assertEquals(BIDDING_LOGIC_JS_3, biddingLogicJs3);
assertEquals(TRUSTED_BIDDING_OVERRIDE_DATA_3, trustedBiddingData_3);
}
@Test
public void testCorrectlyGetsBothCustomAudienceOverrides() {
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_1);
mCustomAudienceDao.persistCustomAudienceOverride(DB_CUSTOM_AUDIENCE_OVERRIDE_2);
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_1, BUYER_1, NAME_1));
assertTrue(mCustomAudienceDao.doesCustomAudienceOverrideExist(OWNER_2, BUYER_2, NAME_2));
String biddingLogicJs1 =
mCustomAudienceDao.getBiddingLogicUrlOverride(
OWNER_1, BUYER_1, NAME_1, APP_PACKAGE_NAME_1);
String trustedBiddingData_1 =
mCustomAudienceDao.getTrustedBiddingDataOverride(
OWNER_1, BUYER_1, NAME_1, APP_PACKAGE_NAME_1);
assertEquals(BIDDING_LOGIC_JS_1, biddingLogicJs1);
assertEquals(TRUSTED_BIDDING_OVERRIDE_DATA_1, trustedBiddingData_1);
String biddingLogicJs2 =
mCustomAudienceDao.getBiddingLogicUrlOverride(
OWNER_2, BUYER_2, NAME_2, APP_PACKAGE_NAME_2);
String trustedBiddingData_2 =
mCustomAudienceDao.getTrustedBiddingDataOverride(
OWNER_2, BUYER_2, NAME_2, APP_PACKAGE_NAME_2);
assertEquals(BIDDING_LOGIC_JS_2, biddingLogicJs2);
assertEquals(TRUSTED_BIDDING_OVERRIDE_DATA_2, trustedBiddingData_2);
}
@Test(expected = NullPointerException.class)
public void testPersistCustomAudienceOverride() {
mCustomAudienceDao.persistCustomAudienceOverride(null);
}
@Test
public void getByPrimaryKey_keyExistOrNotExist() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1, DAILY_UPDATE_URL_1);
assertNull(mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_2, BUYER_2, NAME_2));
assertNull(
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_2, BUYER_2, NAME_2));
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_2, DAILY_UPDATE_URL_2);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_2,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_2, BUYER_2, NAME_2));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_2,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_2, BUYER_2, NAME_2));
}
@Test
public void deleteByPrimaryKey_keyExist() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1, DAILY_UPDATE_URL_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_2, DAILY_UPDATE_URL_2);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_2,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_2, BUYER_2, NAME_2));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_2,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_2, BUYER_2, NAME_2));
mCustomAudienceDao.deleteAllCustomAudienceDataByPrimaryKey(OWNER_1, BUYER_1, NAME_1);
assertNull(mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertNull(
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_2,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_2, BUYER_2, NAME_2));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_2,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_2, BUYER_2, NAME_2));
}
@Test
public void deleteByPrimaryKey_keyNotExist() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1, DAILY_UPDATE_URL_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_2, DAILY_UPDATE_URL_2);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_2,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_2, BUYER_2, NAME_2));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_2,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_2, BUYER_2, NAME_2));
mCustomAudienceDao.deleteAllCustomAudienceDataByPrimaryKey(OWNER_1, BUYER_2, NAME_1);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_2,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_2, BUYER_2, NAME_2));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_2,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_2, BUYER_2, NAME_2));
}
@Test
public void testGetCustomAudienceStats_nullOwner() {
assertThrows(
NullPointerException.class,
() -> {
mCustomAudienceDao.getCustomAudienceStats(null);
});
}
@Test
public void testCustomAudienceStats_nonnullOwner() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
verifyCustomAudienceStats(
mCustomAudienceDao.getCustomAudienceStats(OWNER_1), OWNER_1, 0, 0, 0);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1, DAILY_UPDATE_URL_1);
verifyCustomAudienceStats(
mCustomAudienceDao.getCustomAudienceStats(OWNER_1), OWNER_1, 1, 1, 1);
verifyCustomAudienceStats(
mCustomAudienceDao.getCustomAudienceStats(OWNER_2), OWNER_2, 1, 0, 1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_2, DAILY_UPDATE_URL_1);
verifyCustomAudienceStats(
mCustomAudienceDao.getCustomAudienceStats(OWNER_1), OWNER_1, 2, 1, 2);
verifyCustomAudienceStats(
mCustomAudienceDao.getCustomAudienceStats(OWNER_2), OWNER_2, 2, 1, 2);
verifyCustomAudienceStats(
mCustomAudienceDao.getCustomAudienceStats(OWNER_3), OWNER_3, 2, 0, 2);
}
@Test(expected = NullPointerException.class)
public void testCreateOrUpdate_nullCustomAudience() {
mCustomAudienceDao.persistCustomAudience(null);
}
@Test(expected = NullPointerException.class)
public void testCreateOrUpdate_nullCustomAudienceBackgroundFetchData() {
mCustomAudienceDao.persistCustomAudienceBackgroundFetchData(null);
}
@Test
public void testCreateOrUpdate_UpdateExist() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1, DAILY_UPDATE_URL_1);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1_1, DAILY_UPDATE_URL_1);
assertEquals(
CUSTOM_AUDIENCE_1_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
}
@Test
public void testCreateOrUpdate_UpdateExistingBackgroundFetchData() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1, DAILY_UPDATE_URL_1);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
mCustomAudienceDao.persistCustomAudienceBackgroundFetchData(
CUSTOM_AUDIENCE_BGF_DATA_1_UPDATED);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1_UPDATED,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
}
@Test
public void testCreateOrUpdate_UpdateExistingCustomAudienceAndBackgroundFetchData() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1, DAILY_UPDATE_URL_1);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
mCustomAudienceDao.updateCustomAudienceAndBackgroundFetchData(
CUSTOM_AUDIENCE_BGF_DATA_1_1, CUSTOM_AUDIENCE_UPDATABLE_DATA);
assertEquals(
CUSTOM_AUDIENCE_1_UPDATED_FROM_UPDATABLE_DATA,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1_UPDATED,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
}
@Test
public void testUpdateMissingCustomAudienceAndBackgroundFetchData() {
mCustomAudienceDao.persistCustomAudienceBackgroundFetchData(CUSTOM_AUDIENCE_BGF_DATA_1);
assertNull(mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
// If a custom audience does not exist when we try to update the CA with its background
// fetch data, we assume it was cleaned up while the CA was being updated. In this case, we
// should not persist the CA again, and the operation is aborted.
mCustomAudienceDao.updateCustomAudienceAndBackgroundFetchData(
CUSTOM_AUDIENCE_BGF_DATA_1_1, CUSTOM_AUDIENCE_UPDATABLE_DATA);
assertNull(mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
}
@Test
public void testGetActiveCustomAudienceByBuyersInactiveCAs() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
List<String> buyers = Arrays.asList(BUYER_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_INACTIVE, DAILY_UPDATE_URL_1);
assertEquals(
CUSTOM_AUDIENCE_INACTIVE,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(OWNER_1, BUYER_1, NAME_1));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
OWNER_1, BUYER_1, NAME_1));
assertTrue(
mCustomAudienceDao.getActiveCustomAudienceByBuyers(buyers, CURRENT_TIME).isEmpty());
}
@Test
public void testGetActiveCustomAudienceByBuyersActivatedCAs() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
List<String> buyers = Arrays.asList(BUYER_1, BUYER_2);
List<DBCustomAudience> expectedCAs = Arrays.asList(CUSTOM_AUDIENCE_ACTIVE);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_ACTIVE, DAILY_UPDATE_URL_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_EXPIRED, DAILY_UPDATE_URL_2);
List<DBCustomAudience> result =
mCustomAudienceDao.getActiveCustomAudienceByBuyers(buyers, CURRENT_TIME);
assertThat(result).containsExactlyElementsIn(expectedCAs);
}
@Test
public void testGetActiveCustomAudienceByBuyersUpdatedCAs() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
List<String> buyers = Arrays.asList(BUYER_1, BUYER_2);
List<DBCustomAudience> expectedCAs = Arrays.asList(CUSTOM_AUDIENCE_UPDATED);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_UPDATED, DAILY_UPDATE_URL_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_OUTDATED, DAILY_UPDATE_URL_2);
List<DBCustomAudience> result =
mCustomAudienceDao.getActiveCustomAudienceByBuyers(buyers, CURRENT_TIME);
assertThat(result).containsExactlyElementsIn(expectedCAs);
}
@Test
public void testGetActiveCustomAudienceByBuyersInvalidCAs() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
List<String> buyers = Arrays.asList(BUYER_1, BUYER_2, BUYER_3);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_NO_TRUSTED_BIDDING_DATA_URL, DAILY_UPDATE_URL_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_NO_USER_BIDDING_SIGNALS, DAILY_UPDATE_URL_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_NO_ADS, DAILY_UPDATE_URL_1);
List<DBCustomAudience> result =
mCustomAudienceDao.getActiveCustomAudienceByBuyers(buyers, CURRENT_TIME);
assertTrue(result.isEmpty());
}
@Test
public void testGetNumActiveEligibleCustomAudienceBackgroundFetchData() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
// Prepopulate with three CAs, only one of which is eligible for update
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1, DAILY_UPDATE_URL_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_UPDATED, DAILY_UPDATE_URL_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_EXPIRED, DAILY_UPDATE_URL_2);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(
CUSTOM_AUDIENCE_1.getOwner(),
CUSTOM_AUDIENCE_1.getBuyer(),
CUSTOM_AUDIENCE_1.getName()));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
CUSTOM_AUDIENCE_1.getOwner(),
CUSTOM_AUDIENCE_1.getBuyer(),
CUSTOM_AUDIENCE_1.getName()));
assertEquals(
CUSTOM_AUDIENCE_UPDATED,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(
CUSTOM_AUDIENCE_UPDATED.getOwner(),
CUSTOM_AUDIENCE_UPDATED.getBuyer(),
CUSTOM_AUDIENCE_UPDATED.getName()));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_UPDATED,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
CUSTOM_AUDIENCE_UPDATED.getOwner(),
CUSTOM_AUDIENCE_UPDATED.getBuyer(),
CUSTOM_AUDIENCE_UPDATED.getName()));
assertEquals(
CUSTOM_AUDIENCE_EXPIRED,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(
CUSTOM_AUDIENCE_EXPIRED.getOwner(),
CUSTOM_AUDIENCE_EXPIRED.getBuyer(),
CUSTOM_AUDIENCE_EXPIRED.getName()));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_EXPIRED,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
CUSTOM_AUDIENCE_EXPIRED.getOwner(),
CUSTOM_AUDIENCE_EXPIRED.getBuyer(),
CUSTOM_AUDIENCE_EXPIRED.getName()));
assertEquals(
1,
mCustomAudienceDao.getNumActiveEligibleCustomAudienceBackgroundFetchData(
CURRENT_TIME));
assertThat(
mCustomAudienceDao.getActiveEligibleCustomAudienceBackgroundFetchData(
CURRENT_TIME, 10))
.containsExactly(CUSTOM_AUDIENCE_BGF_DATA_UPDATED);
}
@Test
public void testDeleteAllExpiredCustomAudienceData() {
doReturn(TEST_FLAGS).when(FlagsFactory::getFlags);
// Prepopulate with three CAs, only one of which is expired
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_1, DAILY_UPDATE_URL_1);
mCustomAudienceDao.insertOrOverwriteCustomAudience(CUSTOM_AUDIENCE_2, DAILY_UPDATE_URL_2);
mCustomAudienceDao.insertOrOverwriteCustomAudience(
CUSTOM_AUDIENCE_EXPIRED, DAILY_UPDATE_URL_2);
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(
CUSTOM_AUDIENCE_1.getOwner(),
CUSTOM_AUDIENCE_1.getBuyer(),
CUSTOM_AUDIENCE_1.getName()));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
CUSTOM_AUDIENCE_1.getOwner(),
CUSTOM_AUDIENCE_1.getBuyer(),
CUSTOM_AUDIENCE_1.getName()));
assertEquals(
CUSTOM_AUDIENCE_2,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(
CUSTOM_AUDIENCE_2.getOwner(),
CUSTOM_AUDIENCE_2.getBuyer(),
CUSTOM_AUDIENCE_2.getName()));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_2,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
CUSTOM_AUDIENCE_2.getOwner(),
CUSTOM_AUDIENCE_2.getBuyer(),
CUSTOM_AUDIENCE_2.getName()));
assertEquals(
CUSTOM_AUDIENCE_EXPIRED,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(
CUSTOM_AUDIENCE_EXPIRED.getOwner(),
CUSTOM_AUDIENCE_EXPIRED.getBuyer(),
CUSTOM_AUDIENCE_EXPIRED.getName()));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_EXPIRED,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
CUSTOM_AUDIENCE_EXPIRED.getOwner(),
CUSTOM_AUDIENCE_EXPIRED.getBuyer(),
CUSTOM_AUDIENCE_EXPIRED.getName()));
assertEquals(1, mCustomAudienceDao.deleteAllExpiredCustomAudienceData(CURRENT_TIME));
assertEquals(
CUSTOM_AUDIENCE_1,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(
CUSTOM_AUDIENCE_1.getOwner(),
CUSTOM_AUDIENCE_1.getBuyer(),
CUSTOM_AUDIENCE_1.getName()));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_1,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
CUSTOM_AUDIENCE_1.getOwner(),
CUSTOM_AUDIENCE_1.getBuyer(),
CUSTOM_AUDIENCE_1.getName()));
assertEquals(
CUSTOM_AUDIENCE_2,
mCustomAudienceDao.getCustomAudienceByPrimaryKey(
CUSTOM_AUDIENCE_2.getOwner(),
CUSTOM_AUDIENCE_2.getBuyer(),
CUSTOM_AUDIENCE_2.getName()));
assertEquals(
CUSTOM_AUDIENCE_BGF_DATA_2,
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
CUSTOM_AUDIENCE_2.getOwner(),
CUSTOM_AUDIENCE_2.getBuyer(),
CUSTOM_AUDIENCE_2.getName()));
assertNull(
mCustomAudienceDao.getCustomAudienceByPrimaryKey(
CUSTOM_AUDIENCE_EXPIRED.getOwner(),
CUSTOM_AUDIENCE_EXPIRED.getBuyer(),
CUSTOM_AUDIENCE_EXPIRED.getName()));
assertNull(
mCustomAudienceDao.getCustomAudienceBackgroundFetchDataByPrimaryKey(
CUSTOM_AUDIENCE_EXPIRED.getOwner(),
CUSTOM_AUDIENCE_EXPIRED.getBuyer(),
CUSTOM_AUDIENCE_EXPIRED.getName()));
}
private void verifyCustomAudienceStats(
CustomAudienceDao.CustomAudienceStats customAudienceStats,
String owner,
int totalCount,
int perOwnerCount,
int ownerCount) {
assertEquals(owner, customAudienceStats.getOwner());
assertEquals(totalCount, customAudienceStats.getTotalCount());
assertEquals(perOwnerCount, customAudienceStats.getPerOwnerCount());
assertEquals(ownerCount, customAudienceStats.getOwnerCount());
}
}