diff options
Diffstat (limited to 'adservices/tests/unittest/service-core')
177 files changed, 6527 insertions, 3556 deletions
diff --git a/adservices/tests/unittest/service-core/AndroidManifest.xml b/adservices/tests/unittest/service-core/AndroidManifest.xml index 44a4d197f7..7be4ea18e9 100644 --- a/adservices/tests/unittest/service-core/AndroidManifest.xml +++ b/adservices/tests/unittest/service-core/AndroidManifest.xml @@ -24,7 +24,6 @@ <uses-permission android:name="android.permission.ACCESS_ADSERVICES_AD_ID" /> <uses-permission android:name="android.permission.ACCESS_ADSERVICES_TOPICS" /> <uses-permission android:name="android.permission.ACCESS_ADSERVICES_CUSTOM_AUDIENCE" /> - <uses-permission android:name="android.permission.ACCESS_ADSERVICES_PROTECTED_SIGNALS" /> <!-- Needed to resolve Intent to ComponentName for measurement verifiedDestination --> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> diff --git a/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchConsentWorkerTest.java b/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchConsentWorkerTest.java index e7344abe15..2bf1221c7a 100644 --- a/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchConsentWorkerTest.java +++ b/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchConsentWorkerTest.java @@ -64,6 +64,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; import org.junit.Before; import org.junit.Test; @@ -73,6 +75,9 @@ import org.mockito.Mockito; import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; @SpyStatic(FlagsFactory.class) @RequiresSdkLevelAtLeastS @@ -87,6 +92,8 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT private static final Topic TOPIC1 = Topic.create(0, 1, 11); private static final Topic TOPIC2 = Topic.create(12, 2, 22); private static final Topic TOPIC3 = Topic.create(123, 3, 33); + private static final int APPSEARCH_WRITE_TIMEOUT_MS = 1000; + private final List<Topic> mTopics = Arrays.asList(TOPIC1, TOPIC2, TOPIC3); @Mock private Flags mMockFlags; @@ -97,6 +104,8 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT when(mMockFlags.getAdservicesApkShaCertificate()) .thenReturn(Flags.ADSERVICES_APK_SHA_CERTIFICATE); when(mMockFlags.getAppsearchWriterAllowListOverride()).thenReturn(""); + // Reduce AppSearch write timeout to speed up the tests. + when(mMockFlags.getAppSearchWriteTimeout()).thenReturn(APPSEARCH_WRITE_TIMEOUT_MS); } @Test @@ -144,6 +153,21 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @Test @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void testSetConsent_failure_timeout() { + initTimeoutResponse(); + + RuntimeException e = + assertThrows( + RuntimeException.class, + () -> AppSearchConsentWorker.getInstance().setConsent(API_TYPE, CONSENTED)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test + @SpyStatic(PlatformStorage.class) @MockStatic(UserHandle.class) public void testSetConsent() { initSuccessResponse(); @@ -285,6 +309,8 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT RuntimeException.class, () -> appSearchConsentWorker.clearAppsWithConsent(TEST)); assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(ExecutionException.class); } @Test @@ -408,6 +434,8 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT RuntimeException.class, () -> appSearchConsentWorker.removeAppWithConsent(consentType, TEST)); assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(ExecutionException.class); } @Test @@ -488,7 +516,7 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @Test @SpyStatic(PlatformStorage.class) - public void testRecordGaUxNotificationDisplayed_faiure() { + public void testRecordGaUxNotificationDisplayed_failure() { runRecordNotificationDisplayedTestFailure(/* isBetaUx= */ false); } @@ -511,6 +539,41 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT } @Test + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void testRecordNotificationDisplayed_failure_timeout() { + runRecordNotificationDisplayedTestFailureTimeout(/* isBetaUx= */ true); + } + + @Test + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void testRecordGaUxNotificationDisplayed_failure_timeout() { + runRecordNotificationDisplayedTestFailureTimeout(/* isBetaUx= */ false); + } + + private void runRecordNotificationDisplayedTestFailureTimeout(boolean isBetaUx) { + initTimeoutResponse(); + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + + RuntimeException e; + if (isBetaUx) { + e = + assertThrows( + RuntimeException.class, () -> worker.recordNotificationDisplayed(true)); + } else { + e = + assertThrows( + RuntimeException.class, + () -> worker.recordGaUxNotificationDisplayed(true)); + } + + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test @MockStatic(AppSearchNotificationDao.class) @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) @@ -574,6 +637,24 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @Test @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) + public void testSetCurrentPrivacySandboxFeature_failure_timeout() { + initTimeoutResponse(); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = + assertThrows( + RuntimeException.class, + () -> + worker.setCurrentPrivacySandboxFeature( + PrivacySandboxFeatureType.PRIVACY_SANDBOX_RECONSENT)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) public void testSetCurrentPrivacySandboxFeature() { initSuccessResponse(); @@ -616,6 +697,27 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @MockStatic(AppSearchInteractionsDao.class) @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) + public void testRecordUserManualInteractionWithConsent_failure_timeout() { + initTimeoutResponse(); + + when(AppSearchInteractionsDao.getRowId(any(), any())).thenReturn("" + UID); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + int interactions = ConsentManager.MANUAL_INTERACTIONS_RECORDED; + + RuntimeException e = + assertThrows( + RuntimeException.class, + () -> worker.recordUserManualInteractionWithConsent(interactions)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test + @MockStatic(AppSearchInteractionsDao.class) + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) public void testRecordUserManualInteractionWithConsent() { initSuccessResponse(); @@ -638,7 +740,7 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @Test @SpyStatic(PlatformStorage.class) - public void testRecordBlockedTopics_failure() { + public void testRecordBlockedTopic_failure() { initFailureResponse(); AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); @@ -651,7 +753,27 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @MockStatic(AppSearchTopicsConsentDao.class) @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) - public void testRecordBlockedTopics_new() { + public void testRecordBlockedTopic_failure_timeout() { + initTimeoutResponse(); + + String query = "" + UID; + ExtendedMockito.doReturn(query).when(() -> AppSearchTopicsConsentDao.getQuery(any())); + ExtendedMockito.doReturn(null) + .when(() -> AppSearchTopicsConsentDao.readConsentData(any(), any(), any(), any())); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = + assertThrows(RuntimeException.class, () -> worker.recordBlockedTopic(TOPIC1)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test + @MockStatic(AppSearchTopicsConsentDao.class) + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void testRecordBlockedTopic_new() { initSuccessResponse(); String query = "" + UID; @@ -667,7 +789,7 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @MockStatic(AppSearchTopicsConsentDao.class) @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) - public void testRecordBlockedTopics() throws Exception { + public void testRecordBlockedTopic() { String query = "" + UID; ExtendedMockito.doReturn(query).when(() -> AppSearchTopicsConsentDao.getQuery(any())); AppSearchTopicsConsentDao dao = Mockito.mock(AppSearchTopicsConsentDao.class); @@ -686,7 +808,7 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @Test @MockStatic(AppSearchTopicsConsentDao.class) @SpyStatic(PlatformStorage.class) - public void testRecordUnblockedTopics_failure() throws Exception { + public void testRecordUnblockedTopic_failure() throws Exception { AppSearchTopicsConsentDao dao = Mockito.mock(AppSearchTopicsConsentDao.class); ExtendedMockito.doReturn(dao) .when(() -> AppSearchTopicsConsentDao.readConsentData(any(), any(), any(), any())); @@ -702,13 +824,21 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT verify(dao).removeBlockedTopic(TOPIC1); verify(dao).writeData(any(), any(), any()); assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + + Throwable cause = e.getCause(); + assertThat(cause).isNotNull(); + assertThat(cause).isInstanceOf(ExecutionException.class); + + Throwable rootCause = cause.getCause(); + assertThat(rootCause).isNotNull(); + assertThat(rootCause).isInstanceOf(InterruptedException.class); } @Test @MockStatic(AppSearchTopicsConsentDao.class) @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) - public void testRecordUnblockedTopics_new() { + public void testRecordUnblockedTopic_new() { String query = "" + UID; ExtendedMockito.doReturn(query).when(() -> AppSearchTopicsConsentDao.getQuery(any())); ExtendedMockito.doReturn(null) @@ -722,7 +852,7 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @MockStatic(AppSearchTopicsConsentDao.class) @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) - public void testRecordUnblockedTopics() { + public void testRecordUnblockedTopic() { String query = "" + UID; ExtendedMockito.doReturn(query).when(() -> AppSearchTopicsConsentDao.getQuery(any())); AppSearchTopicsConsentDao dao = Mockito.mock(AppSearchTopicsConsentDao.class); @@ -753,6 +883,20 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @Test @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) + public void testClearBlockedTopics_failure_timeout() { + initTimeoutResponse(); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = + assertThrows(RuntimeException.class, () -> worker.clearBlockedTopics()); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) public void testClearBlockedTopics() { initSuccessResponse(); @@ -781,6 +925,26 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT when(mockResponse.getMigrationFailures()).thenReturn(List.of()); } + private void initTimeoutResponse() { + AppSearchSession mockSession = Mockito.mock(AppSearchSession.class); + UserHandle mockUserHandle = Mockito.mock(UserHandle.class); + Mockito.when(UserHandle.getUserHandleForUid(Binder.getCallingUid())) + .thenReturn(mockUserHandle); + Mockito.when(mockUserHandle.getIdentifier()).thenReturn(UID); + ExtendedMockito.doReturn(Futures.immediateFuture(mockSession)) + .when(() -> PlatformStorage.createSearchSessionAsync(any())); + verify(mockSession, atMost(1)).setSchemaAsync(any(SetSchemaRequest.class)); + + SetSchemaResponse mockResponse = Mockito.mock(SetSchemaResponse.class); + when(mockSession.setSchemaAsync(any(SetSchemaRequest.class))) + .thenReturn(Futures.immediateFuture(mockResponse)); + AppSearchBatchResult<String, Void> result = Mockito.mock(AppSearchBatchResult.class); + when(mockSession.putAsync(any())).thenReturn(getLongRunningOperation(result)); + + verify(mockResponse, atMost(1)).getMigrationFailures(); + when(mockResponse.getMigrationFailures()).thenReturn(List.of()); + } + private void initFailureResponse() { AppSearchSession mockSession = Mockito.mock(AppSearchSession.class); ExtendedMockito.doReturn(Futures.immediateFuture(mockSession)) @@ -801,6 +965,17 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT when(mockResponse.getMigrationFailures()).thenReturn(List.of(failure)); } + private <T> ListenableFuture<T> getLongRunningOperation(T result) { + // Wait for a time that's longer than the AppSearch write timeout, then return the result. + ListeningExecutorService ls = + MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor()); + return ls.submit( + () -> { + TimeUnit.MILLISECONDS.sleep(APPSEARCH_WRITE_TIMEOUT_MS + 500); + return result; + }); + } + @Test @SpyStatic(AppSearchUxStatesDao.class) public void isAdIdEnabledTest_trueBit() { @@ -826,8 +1001,6 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) public void setAdIdEnabledTest_success() { - initSuccessResponse(); - String query = "" + UID; ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); AppSearchUxStatesDao dao = Mockito.mock(AppSearchUxStatesDao.class); @@ -845,17 +1018,17 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @Test @SpyStatic(PlatformStorage.class) - public void setAdIdEnabledTest_trueBit() { - setAdIdEnabledTest(true); + public void setAdIdEnabledTest_failure_trueBit() { + setAdIdEnabledTestFailure(true); } @Test @SpyStatic(PlatformStorage.class) - public void setAdIdEnabledTest_falseBit() { - setAdIdEnabledTest(false); + public void setAdIdEnabledTest_failure_falseBit() { + setAdIdEnabledTestFailure(false); } - private void setAdIdEnabledTest(boolean isAdIdEnabled) { + private void setAdIdEnabledTestFailure(boolean isAdIdEnabled) { initFailureResponse(); AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); @@ -865,6 +1038,27 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT } @Test + @MockStatic(AppSearchUxStatesDao.class) + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void setAdIdEnabledTest_timeout() { + String query = "" + UID; + ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); + AppSearchUxStatesDao dao = Mockito.mock(AppSearchUxStatesDao.class); + ExtendedMockito.doReturn(dao) + .when(() -> AppSearchUxStatesDao.readData(any(), any(), any(), any())); + when(dao.writeData(any(), any(), any())) + .thenReturn(FluentFuture.from(getLongRunningOperation(null))); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = + assertThrows(RuntimeException.class, () -> worker.setAdIdEnabled(true)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test @SpyStatic(AppSearchUxStatesDao.class) public void isU18AccountTest_trueBit() { isU18AccountTest(true); @@ -889,8 +1083,6 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) public void setU18AccountTest_success() { - initSuccessResponse(); - String query = "" + UID; ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); AppSearchUxStatesDao dao = Mockito.mock(AppSearchUxStatesDao.class); @@ -928,6 +1120,28 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT } @Test + @MockStatic(AppSearchUxStatesDao.class) + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void setU18AccountTest_timeout() { + String query = "" + UID; + ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); + AppSearchUxStatesDao dao = Mockito.mock(AppSearchUxStatesDao.class); + ExtendedMockito.doReturn(dao) + .when(() -> AppSearchUxStatesDao.readData(any(), any(), any(), any())); + AppSearchBatchResult<String, Void> result = Mockito.mock(AppSearchBatchResult.class); + when(dao.writeData(any(), any(), any())) + .thenReturn(FluentFuture.from(getLongRunningOperation(result))); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = + assertThrows(RuntimeException.class, () -> worker.setU18Account(false)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test @SpyStatic(AppSearchUxStatesDao.class) public void isEntryPointEnabledTest_trueBit() { isEntryPointEnabledTest(true); @@ -996,6 +1210,30 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT } @Test + @MockStatic(AppSearchUxStatesDao.class) + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void setEntryPointEnabledTest_timeout() { + initSuccessResponse(); + + String query = "" + UID; + ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); + AppSearchUxStatesDao dao = Mockito.mock(AppSearchUxStatesDao.class); + ExtendedMockito.doReturn(dao) + .when(() -> AppSearchUxStatesDao.readData(any(), any(), any(), any())); + AppSearchBatchResult<String, Void> result = Mockito.mock(AppSearchBatchResult.class); + when(dao.writeData(any(), any(), any())) + .thenReturn(FluentFuture.from(getLongRunningOperation(result))); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = + assertThrows(RuntimeException.class, () -> worker.setEntryPointEnabled(true)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test @SpyStatic(AppSearchUxStatesDao.class) public void isAdultAccountTest_trueBit() { isAdultAccountTest(true); @@ -1040,7 +1278,7 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @MockStatic(AppSearchUxStatesDao.class) @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) - public void setU18AdultAccountTest_success() { + public void setAdultAccountTest_success() { initSuccessResponse(); String query = "" + UID; @@ -1059,6 +1297,30 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT } @Test + @MockStatic(AppSearchUxStatesDao.class) + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void setAdultAccountTest_timeout() { + initSuccessResponse(); + + String query = "" + UID; + ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); + AppSearchUxStatesDao dao = Mockito.mock(AppSearchUxStatesDao.class); + ExtendedMockito.doReturn(dao) + .when(() -> AppSearchUxStatesDao.readData(any(), any(), any(), any())); + AppSearchBatchResult<String, Void> result = Mockito.mock(AppSearchBatchResult.class); + when(dao.writeData(any(), any(), any())) + .thenReturn(FluentFuture.from(getLongRunningOperation(result))); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = + assertThrows(RuntimeException.class, () -> worker.setAdultAccount(true)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test @SpyStatic(AppSearchUxStatesDao.class) public void wasU18NotificationDisplayedTest_trueBit() { wasU18NotificationDisplayedTest(true); @@ -1128,6 +1390,31 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT } @Test + @MockStatic(AppSearchUxStatesDao.class) + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void setU18NotificationDisplayedTest_timeout() { + initSuccessResponse(); + + String query = "" + UID; + ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); + AppSearchUxStatesDao dao = Mockito.mock(AppSearchUxStatesDao.class); + ExtendedMockito.doReturn(dao) + .when(() -> AppSearchUxStatesDao.readData(any(), any(), any(), any())); + AppSearchBatchResult<String, Void> result = Mockito.mock(AppSearchBatchResult.class); + when(dao.writeData(any(), any(), any())) + .thenReturn(FluentFuture.from(getLongRunningOperation(result))); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = + assertThrows( + RuntimeException.class, () -> worker.setU18NotificationDisplayed(true)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + + @Test @SpyStatic(AppSearchUxStatesDao.class) public void getUxTest_allUxs() { for (PrivacySandboxUxCollection ux : PrivacySandboxUxCollection.values()) { @@ -1155,8 +1442,6 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) public void setUxTest_allUxsSuccess() { - initSuccessResponse(); - for (PrivacySandboxUxCollection ux : PrivacySandboxUxCollection.values()) { String query = "" + UID; ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); @@ -1175,6 +1460,29 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT } @Test + @MockStatic(AppSearchUxStatesDao.class) + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void setUxTest_allUxs_timeout() { + for (PrivacySandboxUxCollection ux : PrivacySandboxUxCollection.values()) { + String query = "" + UID; + ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); + AppSearchUxStatesDao dao = Mockito.mock(AppSearchUxStatesDao.class); + ExtendedMockito.doReturn(dao) + .when(() -> AppSearchUxStatesDao.readData(any(), any(), any(), any())); + AppSearchBatchResult<String, Void> result = Mockito.mock(AppSearchBatchResult.class); + when(dao.writeData(any(), any(), any())) + .thenReturn(FluentFuture.from(getLongRunningOperation(result))); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = assertThrows(RuntimeException.class, () -> worker.setUx(ux)); + assertThat(e.getMessage()).isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + } + + @Test @SpyStatic(AppSearchUxStatesDao.class) public void getEnrollmentChannelTest_allUxsAllEnrollmentChannels() { for (PrivacySandboxUxCollection ux : PrivacySandboxUxCollection.values()) { @@ -1217,8 +1525,6 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT @SpyStatic(PlatformStorage.class) @SpyStatic(UserHandle.class) public void setEnrollmentChannelTest_allUxsAllEnrollmentChannelsSuccess() { - initSuccessResponse(); - for (PrivacySandboxUxCollection ux : PrivacySandboxUxCollection.values()) { for (PrivacySandboxEnrollmentChannelCollection channel : ux.getEnrollmentChannelCollection()) { @@ -1240,4 +1546,35 @@ public final class AppSearchConsentWorkerTest extends AdServicesExtendedMockitoT } } } + + @Test + @MockStatic(AppSearchUxStatesDao.class) + @SpyStatic(PlatformStorage.class) + @SpyStatic(UserHandle.class) + public void setEnrollmentChannelTest_allUxsAllEnrollmentChannels_timeout() { + for (PrivacySandboxUxCollection ux : PrivacySandboxUxCollection.values()) { + for (PrivacySandboxEnrollmentChannelCollection channel : + ux.getEnrollmentChannelCollection()) { + String query = "" + UID; + ExtendedMockito.doReturn(query).when(() -> AppSearchUxStatesDao.getQuery(any())); + AppSearchUxStatesDao dao = Mockito.mock(AppSearchUxStatesDao.class); + ExtendedMockito.doReturn(dao) + .when(() -> AppSearchUxStatesDao.readData(any(), any(), any(), any())); + AppSearchBatchResult<String, Void> result = + Mockito.mock(AppSearchBatchResult.class); + when(dao.writeData(any(), any(), any())) + .thenReturn(FluentFuture.from(getLongRunningOperation(result))); + + AppSearchConsentWorker worker = AppSearchConsentWorker.getInstance(); + RuntimeException e = + assertThrows( + RuntimeException.class, + () -> worker.setEnrollmentChannel(ux, channel)); + assertThat(e.getMessage()) + .isEqualTo(ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + assertThat(e.getCause()).isNotNull(); + assertThat(e.getCause()).isInstanceOf(TimeoutException.class); + } + } + } } diff --git a/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchDaoTest.java b/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchDaoTest.java index 47bc186455..116891316c 100644 --- a/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchDaoTest.java +++ b/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchDaoTest.java @@ -52,6 +52,8 @@ import com.android.adservices.service.consent.ConsentConstants; import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; import org.junit.Before; import org.junit.Rule; @@ -63,6 +65,8 @@ import org.mockito.MockitoAnnotations; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; @SmallTest public class AppSearchDaoTest { @@ -87,6 +91,8 @@ public class AppSearchDaoTest { new PackageIdentifier( /* packageName= */ TEST, /* sha256= */ new Signature(SHA).toByteArray()); + private static final int APPSEARCH_READ_TIMEOUT_MS = 500; + @Rule public final AdServicesExtendedMockitoRule adServicesExtendedMockitoRule = new AdServicesExtendedMockitoRule.Builder(this).mockStatic(FlagsFactory.class).build(); @@ -95,6 +101,7 @@ public class AppSearchDaoTest { public void before() { MockitoAnnotations.initMocks(this); when(mFlags.getAppsearchWriterAllowListOverride()).thenReturn(""); + when(mFlags.getAppSearchReadTimeout()).thenReturn(APPSEARCH_READ_TIMEOUT_MS); doReturn(mFlags).when(FlagsFactory::getFlags); } @@ -205,6 +212,30 @@ public class AppSearchDaoTest { } @Test + public void testReadConsentData_timeout() { + AppSearchDao result = + AppSearchDao.readConsentData( + AppSearchConsentDao.class, + getLongRunningOperation(mGlobalSearchSession), + mExecutor, + NAMESPACE, + TEST, + mAdServicesPackageName); + assertThat(result).isNull(); + } + + private <T> ListenableFuture<T> getLongRunningOperation(T result) { + // Wait for a time that's longer than the AppSearch read timeout, then return the result. + ListeningExecutorService ls = + MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor()); + return ls.submit( + () -> { + TimeUnit.MILLISECONDS.sleep(APPSEARCH_READ_TIMEOUT_MS + 500); + return result; + }); + } + + @Test public void testReadAppSearchData_emptyQuery() { AppSearchDao dao = AppSearchDao.readAppSearchSessionData( @@ -262,7 +293,8 @@ public class AppSearchDaoTest { when(mockSession.setSchemaAsync(any(SetSchemaRequest.class))) .thenReturn(Futures.immediateFuture(mockResponse)); - AppSearchResult mockResult = Mockito.mock(AppSearchResult.class); + AppSearchResult<Void> mockResult = + AppSearchResult.newFailedResult(AppSearchResult.RESULT_INVALID_ARGUMENT, "test"); SetSchemaResponse.MigrationFailure failure = new SetSchemaResponse.MigrationFailure( /* namespace= */ TEST, @@ -278,11 +310,12 @@ public class AppSearchDaoTest { Futures.immediateFuture(mockSession), List.of(PACKAGE_IDENTIFIER), mExecutor); - ExecutionException e = assertThrows(ExecutionException.class, () -> result.get()); + ExecutionException e = assertThrows(ExecutionException.class, result::get); assertThat(e.getMessage()) .isEqualTo( "java.lang.RuntimeException: " - + ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE); + + ConsentConstants.ERROR_MESSAGE_APPSEARCH_FAILURE + + " Migration failure: [FAILURE(3)]: test"); } @Test @@ -337,7 +370,7 @@ public class AppSearchDaoTest { mExecutor, TEST, NAMESPACE); - ExecutionException e = assertThrows(ExecutionException.class, () -> result.get()); + ExecutionException e = assertThrows(ExecutionException.class, result::get); assertThat(e.getMessage()) .isEqualTo( "java.lang.RuntimeException: " diff --git a/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchMeasurementRollbackWorkerTest.java b/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchMeasurementRollbackWorkerTest.java index 0765ba5275..638ee67142 100644 --- a/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchMeasurementRollbackWorkerTest.java +++ b/adservices/tests/unittest/service-core/appsearch/src/com/android/adservices/service/appsearch/AppSearchMeasurementRollbackWorkerTest.java @@ -41,6 +41,8 @@ import androidx.test.filters.SmallTest; import com.android.adservices.concurrency.AdServicesExecutors; import com.android.adservices.mockito.AdServicesExtendedMockitoRule; +import com.android.adservices.service.Flags; +import com.android.adservices.service.FlagsFactory; import com.android.adservices.service.common.compat.FileCompatUtils; import com.android.adservices.service.consent.ConsentConstants; @@ -66,7 +68,7 @@ public class AppSearchMeasurementRollbackWorkerTest { FileCompatUtils.getAdservicesFilename("measurement_rollback"); private static final String USERID = "user1"; private static final long APEX_VERSION = 100L; - private static final int FUTURE_TIMEOUT_MILLISECONDS = 3000; + private static final int APPSEARCH_WRITE_TIMEOUT_MS = 1000; private final Context mContext = ApplicationProvider.getApplicationContext(); private final String mAdServicesPackageName = @@ -74,17 +76,22 @@ public class AppSearchMeasurementRollbackWorkerTest { private final Executor mExecutor = AdServicesExecutors.getBackgroundExecutor(); private AppSearchMeasurementRollbackWorker mWorker; @Mock private ListenableFuture<AppSearchSession> mAppSearchSession; + @Mock private Flags mMockFlags; @Rule public final AdServicesExtendedMockitoRule adServicesExtendedMockitoRule = new AdServicesExtendedMockitoRule.Builder(this) .mockStatic(PlatformStorage.class) .mockStatic(AppSearchDao.class) + .mockStatic(FlagsFactory.class) .setStrictness(Strictness.LENIENT) .build(); @Before public void setup() { + doReturn(mMockFlags).when(FlagsFactory::getFlags); + doReturn(APPSEARCH_WRITE_TIMEOUT_MS).when(mMockFlags).getAppSearchWriteTimeout(); + ArgumentCaptor<PlatformStorage.SearchContext> cap = ArgumentCaptor.forClass(PlatformStorage.SearchContext.class); doReturn(mAppSearchSession) @@ -107,7 +114,7 @@ public class AppSearchMeasurementRollbackWorkerTest { @SuppressWarnings("FutureReturnValueIgnored") @Test public void testClearAdServicesDeletionOccurred() { - FluentFuture mockResult = + FluentFuture<AppSearchBatchResult<String, Void>> mockResult = FluentFuture.from( Futures.immediateFuture( new AppSearchBatchResult.Builder<String, Void>().build())); @@ -128,13 +135,14 @@ public class AppSearchMeasurementRollbackWorkerTest { @Test public void testClearAdServicesDeletionOccurred_throwsChecked() { - Callable<Void> callable = + Callable<AppSearchBatchResult<String, Void>> callable = () -> { - TimeUnit.MILLISECONDS.sleep(FUTURE_TIMEOUT_MILLISECONDS); + TimeUnit.MILLISECONDS.sleep(APPSEARCH_WRITE_TIMEOUT_MS + 500); return null; }; - FluentFuture mockResult = FluentFuture.from(Futures.submit(callable, mExecutor)); + FluentFuture<AppSearchBatchResult<String, Void>> mockResult = + FluentFuture.from(Futures.submit(callable, mExecutor)); doReturn(mockResult).when(() -> AppSearchDao.deleteData(any(), any(), any(), any(), any())); RuntimeException e = @@ -234,17 +242,17 @@ public class AppSearchMeasurementRollbackWorkerTest { @Test public void testRecordAdServicesDeletionOccurred_throwsChecked() { - // The manager class waits for 2 seconds on the future.get() call before timing out. So - // creating a future that takes longer than 2 sec to resolve, in order to create a + // The manager class waits for a few seconds on the future.get() call before timing out. So + // creating a future that takes longer than the timeout to resolve, in order to create a // TimeoutException. - Callable<Void> callable = + Callable<AppSearchBatchResult<String, Void>> callable = () -> { - TimeUnit.MILLISECONDS.sleep(FUTURE_TIMEOUT_MILLISECONDS); + TimeUnit.MILLISECONDS.sleep(APPSEARCH_WRITE_TIMEOUT_MS + 500); return null; }; - ListenableFuture<Void> future = Futures.submit(callable, mExecutor); - FluentFuture mockFuture = FluentFuture.from(future); + FluentFuture<AppSearchBatchResult<String, Void>> mockFuture = + FluentFuture.from(Futures.submit(callable, mExecutor)); AppSearchMeasurementRollbackDao dao = mock(AppSearchMeasurementRollbackDao.class); doReturn(mockFuture).when(dao).writeData(any(), any(), any()); diff --git a/adservices/tests/unittest/service-core/assets/attribution_service_test.json b/adservices/tests/unittest/service-core/assets/attribution_service_test.json index 223e9cbf95..7612332a24 100644 --- a/adservices/tests/unittest/service-core/assets/attribution_service_test.json +++ b/adservices/tests/unittest/service-core/assets/attribution_service_test.json @@ -102,7 +102,7 @@ "reportTime": 8730000001, "triggerPriority": 101, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T1" }], @@ -244,7 +244,7 @@ "reportTime": 8730000001, "triggerPriority": 101, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T1" }], @@ -423,7 +423,7 @@ "reportTime": 8730000001, "triggerPriority": 101, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T1" }, @@ -438,7 +438,7 @@ "reportTime": 8730000001, "triggerPriority": 101, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T2" } @@ -805,7 +805,7 @@ "triggerPriority": 101, "status": 0, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S2", "triggerId": "T1" }], @@ -965,7 +965,7 @@ "triggerPriority": 101, "status": 0, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S2", "triggerId": "T1" }], @@ -1883,7 +1883,7 @@ "reportTime": 8730000001, "triggerPriority": 101, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T1" }], @@ -2580,7 +2580,7 @@ "reportTime": 8730000001, "triggerPriority": 102, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T2" }, @@ -2595,7 +2595,7 @@ "reportTime": 8730000001, "triggerPriority": 103, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T3" }, @@ -2610,7 +2610,7 @@ "reportTime": 8730000001, "triggerPriority": 104, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T4" } @@ -2875,7 +2875,7 @@ "reportTime": 8730000001, "triggerPriority": 101, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T1" }, @@ -2890,7 +2890,7 @@ "reportTime": 8730000001, "triggerPriority": 101, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T2" }, @@ -2905,7 +2905,7 @@ "reportTime": 8730000001, "triggerPriority": 102, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T4" } @@ -3765,7 +3765,7 @@ "reportTime": 8643600030, "triggerPriority": 0, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T2" } @@ -3928,7 +3928,7 @@ "reportTime": 8643600030, "triggerPriority": 0, "sourceType": "navigation", - "randomizedTriggerRate": 0.0024263, + "randomizedTriggerRate": 0.0001372, "sourceId": "S1", "triggerId": "T2" } @@ -5052,7 +5052,7 @@ "reportTime": 8730000001, "triggerPriority": 101, "sourceType": "navigation", - "randomizedTriggerRate": 0.0170218, + "randomizedTriggerRate": 0.0008051, "sourceId": "S1", "triggerId": "T1" }], @@ -5401,7 +5401,7 @@ "reportTime": 8730000002, "triggerPriority": 101, "sourceType": "navigation", - "randomizedTriggerRate": 0.0170218, + "randomizedTriggerRate": 0.0008051, "sourceId": "S1", "triggerId": "T1" }], diff --git a/adservices/tests/unittest/service-core/assets/measurement_app_uninstall_deletion_test.json b/adservices/tests/unittest/service-core/assets/measurement_app_uninstall_deletion_test.json index c9e8a4f5e4..ce426c9dd5 100644 --- a/adservices/tests/unittest/service-core/assets/measurement_app_uninstall_deletion_test.json +++ b/adservices/tests/unittest/service-core/assets/measurement_app_uninstall_deletion_test.json @@ -784,7 +784,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.test", "webDestination": "https://foo.test", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2-REMOVE", @@ -801,7 +802,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.test", "webDestination": "https://foo.test", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -822,7 +824,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.test", "webDestination": "https://foo.test", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -1192,7 +1195,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -1209,7 +1213,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -1365,7 +1370,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -1382,7 +1388,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/measurement_delete_expired_test.json b/adservices/tests/unittest/service-core/assets/measurement_delete_expired_test.json index b835aeda95..95bbb6199a 100644 --- a/adservices/tests/unittest/service-core/assets/measurement_delete_expired_test.json +++ b/adservices/tests/unittest/service-core/assets/measurement_delete_expired_test.json @@ -296,7 +296,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -313,7 +314,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR3", @@ -330,7 +332,8 @@ "retryCount": 5, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR4", @@ -347,7 +350,8 @@ "retryCount": 5, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -374,7 +378,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/flex_api_with_no_origin_multiple_domain.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/flex_api_with_no_origin_multiple_domain.json index 28000d86aa..d11dc54433 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/flex_api_with_no_origin_multiple_domain.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/flex_api_with_no_origin_multiple_domain.json @@ -332,7 +332,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -349,7 +350,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -420,7 +422,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/registrant_not_found.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/registrant_not_found.json index c5e9d4b564..0ee22ebf73 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/registrant_not_found.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/registrant_not_found.json @@ -143,7 +143,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -160,7 +161,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -307,7 +309,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -324,7 +327,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_multiple_origin_no_domain.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_multiple_origin_no_domain.json index c9b7e17e1a..5e63f9e8de 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_multiple_origin_no_domain.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_multiple_origin_no_domain.json @@ -312,7 +312,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -329,7 +330,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -488,7 +490,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_multiple_origin_no_domain_preserve.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_multiple_origin_no_domain_preserve.json index 533129bd50..008c0aa91d 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_multiple_origin_no_domain_preserve.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_multiple_origin_no_domain_preserve.json @@ -325,7 +325,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -342,7 +343,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -580,7 +582,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_multiple_domain.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_multiple_domain.json index abd601f823..d993967812 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_multiple_domain.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_multiple_domain.json @@ -325,7 +325,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -342,7 +343,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -500,7 +502,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_multiple_domain_preserve.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_multiple_domain_preserve.json index 802e383195..160e848137 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_multiple_domain_preserve.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_multiple_domain_preserve.json @@ -339,7 +339,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -356,7 +357,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -595,7 +597,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_nor_range.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_nor_range.json index 5ed787715e..58f75087dd 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_nor_range.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_no_origin_nor_range.json @@ -152,7 +152,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -169,7 +170,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -324,7 +326,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -341,7 +344,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_origin_but_no_range.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_origin_but_no_range.json index 0528d34e84..e6137bd08f 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_origin_but_no_range.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_origin_but_no_range.json @@ -178,7 +178,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -195,7 +196,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -288,7 +290,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_but_no_origin.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_but_no_origin.json index 2f08f9ea86..0abc4ceb01 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_but_no_origin.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_but_no_origin.json @@ -170,7 +170,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -187,7 +188,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -360,7 +362,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -377,7 +380,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_ending_edge_and_origin.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_ending_edge_and_origin.json index 74b7ca85a9..0994666c4c 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_ending_edge_and_origin.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_ending_edge_and_origin.json @@ -247,7 +247,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -264,7 +265,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -423,7 +425,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_ending_edge_no_origin.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_ending_edge_no_origin.json index 6aa23b0530..b7f45c81c5 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_ending_edge_no_origin.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_ending_edge_no_origin.json @@ -170,7 +170,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -187,7 +188,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -360,7 +362,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -377,7 +380,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_starting_edge_and_origin.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_starting_edge_and_origin.json index bf15f2fe8f..ec53542051 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_starting_edge_and_origin.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_starting_edge_and_origin.json @@ -234,7 +234,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -251,7 +252,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -397,7 +399,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_starting_edge_no_origin.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_starting_edge_no_origin.json index 96e63cfafe..4f0528007c 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_starting_edge_no_origin.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_range_on_starting_edge_no_origin.json @@ -170,7 +170,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -187,7 +188,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -360,7 +362,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -377,7 +380,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_start_equals_end_and_origin.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_start_equals_end_and_origin.json index 540f8cefda..4ff46fea48 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_start_equals_end_and_origin.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_start_equals_end_and_origin.json @@ -234,7 +234,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -251,7 +252,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -397,7 +399,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_start_equals_end_no_origin_preserve.json b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_start_equals_end_no_origin_preserve.json index 0a4c0a3692..e0775912c8 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_start_equals_end_no_origin_preserve.json +++ b/adservices/tests/unittest/service-core/assets/msmt_browser_deletion_tests/with_start_equals_end_no_origin_preserve.json @@ -169,7 +169,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" }, { "registrationId": "AR2", @@ -186,7 +187,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, @@ -281,7 +283,8 @@ "retryCount": 1, "verifiedDestination": "https://foo.com", "webDestination": "https://foo.com", - "sourceType": 1 + "sourceType": 1, + "redirectBehavior": "AS_IS" } ] }, diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_debug_source_storage_limit.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_debug_source_storage_limit.json index ff052bee42..b38a247233 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_debug_source_storage_limit.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_debug_source_storage_limit.json @@ -153,7 +153,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key": "347982378", "trigger_debug_key": "147982378" } @@ -181,7 +181,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key": "347982378", "trigger_debug_key": "147982378" } diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_large_keys.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_large_keys.json index 167693041b..c7bae560bb 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_large_keys.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_large_keys.json @@ -103,7 +103,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_many_trigger_data.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_many_trigger_data.json index 7210704bbb..5fad101445 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_many_trigger_data.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_many_trigger_data.json @@ -121,7 +121,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_over_contributions_limit.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_over_contributions_limit.json index c5e8b3cad3..20f7179f30 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_over_contributions_limit.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_over_contributions_limit.json @@ -160,7 +160,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -172,7 +172,7 @@ "source_event_id": "1", "trigger_data": "3", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_three_of_three_entries.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_three_of_three_entries.json index f228340d0e..bc5b4d132f 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_three_of_three_entries.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_three_of_three_entries.json @@ -105,7 +105,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions.json index 985a338edc..54739775a6 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions.json @@ -103,7 +103,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api.json index 11df48af0c..c619387a7e 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api.json @@ -107,7 +107,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key" : "347982378", "trigger_debug_key" : "8971346783" } @@ -135,7 +135,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key" : "347982378", "trigger_debug_key" : "8971346783" } diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api_source.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api_source.json index 13cbac1a22..bfd9f49a5c 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api_source.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api_source.json @@ -106,7 +106,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key" : "347982378" } }], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api_trigger.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api_trigger.json index 2d394041fd..77e5f09e98 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api_trigger.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_debug_api_trigger.json @@ -106,7 +106,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "trigger_debug_key" : "8971346783" } }], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api.json index a2e78e2098..6c4c776b26 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api.json @@ -107,7 +107,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api_source.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api_source.json index 9f0ad2801a..8bd9dd685c 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api_source.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api_source.json @@ -106,7 +106,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api_trigger.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api_trigger.json index 7cae580ac5..83516309f0 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api_trigger.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_no_adid_debug_api_trigger.json @@ -106,7 +106,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_null_reports.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_null_reports.json index ba0fae5d74..5b551ae953 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_null_reports.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/aggregatable/aggregatable_two_contributions_null_reports.json @@ -107,7 +107,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_3_conversions.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_3_conversions.json index 5e1ff2b5c5..b8d9fe1abb 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_3_conversions.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_3_conversions.json @@ -1,7 +1,6 @@ { "description": "Three reporting windows configured for CTC - 2h (w1), 2d (w2) and expiry (w3). Source (app) has T1 (web), T2(web) and T3(web) in W1, where T4 gets ignored due to equal priority", "phflags_override": { - "measurement_enable_configurable_event_reporting_windows": "true", "measurement_event_reports_ctc_early_reporting_windows": "7200,172800", "measurement_flex_api_max_information_gain_dual_destination_event": "9", "measurement_flex_api_max_information_gain_dual_destination_navigation": "14" diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_w2.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_w2.json index a6294ab4bd..3c6ad0eda6 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_w2.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_w2.json @@ -1,7 +1,6 @@ { "description": "Three reporting windows configured for CTC - 2h (w1), 2d (w2) and expiry (w3). Source has T1(app) in W1 and T2(app) in W2.", "phflags_override": { - "measurement_enable_configurable_event_reporting_windows": "true", "measurement_event_reports_ctc_early_reporting_windows": "7200,172800" }, "input": { diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_w2_w3.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_w2_w3.json index 98fdf514e9..670f89e0cb 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_w2_w3.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_ctc_w1_w2_w3.json @@ -1,7 +1,6 @@ { "description": "Three reporting windows configured for CTC - 2h (w1), 2d (w2) and expiry (w3). Source (web) source has T1(app) in W1, T2(web) in W2 and T4(app) in W3 where T3(web) gets replaced by T4 because T4 has higher priority.", "phflags_override": { - "measurement_enable_configurable_event_reporting_windows": "true", "measurement_event_reports_ctc_early_reporting_windows": "7200,172800", "measurement_flex_api_max_information_gain_dual_destination_event": "9", "measurement_flex_api_max_information_gain_dual_destination_navigation": "14" diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_install_attribution.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_install_attribution.json index 0bd0470df8..dc8e961a0d 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_install_attribution.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_install_attribution.json @@ -1,7 +1,7 @@ { "description": "Three reporting windows configured for VTC - 1h (w1), 1d (w2) and expiry (w3). Source has 2 app triggers due to install attribution in w1 and w2.", "phflags_override": { - "measurement_enable_configurable_event_reporting_windows": "true", + "measurement_vtc_configurable_max_event_reports_count": "2", "measurement_event_reports_vtc_early_reporting_windows": "3600,86400", "measurement_flex_api_max_information_gain_dual_destination_event": "9", "measurement_flex_api_max_information_gain_dual_destination_navigation": "14" diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w1.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w1.json index 3aa8dafc2f..4641d4e536 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w1.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w1.json @@ -1,7 +1,6 @@ { "description": "Three reporting windows configured for VTC - 1h (w1), 1d (w2) and expiry (w3). Source has trigger attributed in W1.", "phflags_override": { - "measurement_enable_configurable_event_reporting_windows": "true", "measurement_event_reports_vtc_early_reporting_windows": "3600,86400" }, "input": { diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w2.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w2.json index 9c6ec1539d..ff5af97ef7 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w2.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w2.json @@ -1,7 +1,6 @@ { "description": "Three reporting windows configured for VTC - 1h (w1), 1d (w2) and expiry (w3). Source has trigger attributed in W2 (also has another trigger which gets ignored due to lower priority).", "phflags_override": { - "measurement_enable_configurable_event_reporting_windows": "true", "measurement_event_reports_vtc_early_reporting_windows": "3600,86400" }, "input": { diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w3.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w3.json index bc775e3a48..224f52c57a 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w3.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/configurable_reporting/configurable_reporting_event_vtc_w3.json @@ -1,7 +1,6 @@ { "description": "Three reporting windows configured for VTC - 1h (w1), 1d (w2) and expiry (w3). Source(app) has web trigger attributed in W3.", "phflags_override": { - "measurement_enable_configurable_event_reporting_windows": "true", "measurement_event_reports_vtc_early_reporting_windows": "3600,86400" }, "input": { diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_aggregatable_two_contributions.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_aggregatable_two_contributions.json index ebd6ed6430..2338ff7f04 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_aggregatable_two_contributions.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_aggregatable_two_contributions.json @@ -151,7 +151,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key": "347982378" } }], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_register_web-app_source_destination_limit.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_register_web-app_source_destination_limit.json index a663f249a9..280c87b411 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_register_web-app_source_destination_limit.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_register_web-app_source_destination_limit.json @@ -111,7 +111,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_register_web-web_source_destination_limit.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_register_web-web_source_destination_limit.json index d3d1ca3344..2e8540beac 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_register_web-web_source_destination_limit.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_register_web-web_source_destination_limit.json @@ -98,7 +98,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger-reporting-origin-limit-app-app.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger-reporting-origin-limit-app-app.json index 39716916d1..f4498b61cf 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger-reporting-origin-limit-app-app.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger-reporting-origin-limit-app-app.json @@ -120,7 +120,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], @@ -136,7 +136,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_app-app.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_app-app.json index 459632d366..a4efff0cc9 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_app-app.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_app-app.json @@ -91,7 +91,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [], @@ -106,7 +106,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "debug_aggregatable_results": [], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_app-web.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_app-web.json index 4fdfa14c0c..77ff7530a7 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_app-web.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_app-web.json @@ -102,7 +102,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }], "debug_event_level_results": [{ @@ -116,7 +116,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-app.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-app.json index bc0de4ec04..6d43ca8344 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-app.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-app.json @@ -101,7 +101,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }], "debug_event_level_results": [{ @@ -115,7 +115,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-web-different-registrant.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-web-different-registrant.json index b11caa5333..42e17840da 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-web-different-registrant.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-web-different-registrant.json @@ -103,7 +103,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "debug_event_level_results": [{ @@ -117,7 +117,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-web-same-registrant.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-web-same-registrant.json index ee2b33f983..3e92414069 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-web-same-registrant.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_attributions_per_source_destination_limit_web-web-same-registrant.json @@ -99,7 +99,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "debug_event_level_results": [{ @@ -113,7 +113,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346783", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_app-app.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_app-app.json index 422d8a143c..4d91151dfd 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_app-app.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_app-app.json @@ -79,7 +79,7 @@ { "payload": { "attribution_destination": "android-app://example.2d1.test", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0001372, "scheduled_report_time": "1643325573", "source_event_id": "1", "source_type": "navigation", @@ -95,7 +95,7 @@ { "payload": { "attribution_destination": "android-app://example.2d1.test", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0001372, "scheduled_report_time": "1643325573", "source_event_id": "1", "source_type": "navigation", diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_app-web.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_app-web.json index a18be7506e..3182ac4ce0 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_app-web.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_app-web.json @@ -98,7 +98,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346781", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0008051 } }], "debug_event_level_results": [{ @@ -112,7 +112,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346781", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0008051 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-app.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-app.json index a425ba0f31..86e4d16d04 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-app.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-app.json @@ -97,7 +97,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346781", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0008051 } }], "debug_event_level_results": [{ @@ -111,7 +111,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346781", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0008051 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-web-different-registrant.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-web-different-registrant.json index ba15a27bd6..29e5241202 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-web-different-registrant.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-web-different-registrant.json @@ -101,7 +101,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346781", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0001372 } }], "debug_event_level_results": [{ @@ -115,7 +115,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346781", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0001372 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-web-same-registrant.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-web-same-registrant.json index b0c0aa01eb..9eb5b1b4bc 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-web-same-registrant.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/debug_report/debug_report_trigger_event_report_window_passed_web-web-same-registrant.json @@ -95,7 +95,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346781", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0001372 } }], "debug_event_level_results": [{ @@ -109,7 +109,7 @@ "source_type": "navigation", "source_debug_key": "347982378", "trigger_debug_key": "8971346781", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0001372 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/list_sources/list_sources_3_app_sources_3_web_triggers_3_reports.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/list_sources/list_sources_3_app_sources_3_web_triggers_3_reports.json index 1405c785d7..5eaa9d1ac8 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/list_sources/list_sources_3_app_sources_3_web_triggers_3_reports.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/list_sources/list_sources_3_app_sources_3_web_triggers_3_reports.json @@ -123,7 +123,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { "report_time": "800176400001", @@ -134,7 +134,7 @@ "source_event_id": "2", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { "report_time": "800176400001", @@ -145,7 +145,7 @@ "source_event_id": "3", "trigger_data": "3", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/list_sources/list_sources_cannot_redirect.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/list_sources/list_sources_cannot_redirect.json index 518fbf142e..7fabaaf824 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/list_sources/list_sources_cannot_redirect.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/list_sources/list_sources_cannot_redirect.json @@ -228,7 +228,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/basic_use_of_redirect.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/basic_use_of_redirect.json index 45fdc162cf..975bd064b9 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/basic_use_of_redirect.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/basic_use_of_redirect.json @@ -44,9 +44,7 @@ "Attribution-Reporting-Register-Source": { "source_event_id": "3", "destination": "android-app://example.2d1.test", - "priority": "100", - "expiry": "800172800002" - + "priority": "100" }, "Location": null, "Attribution-Reporting-Redirect": null @@ -124,7 +122,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -136,7 +134,7 @@ "source_event_id": "2", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/basic_use_of_redirect_to_well_known.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/basic_use_of_redirect_to_well_known.json new file mode 100644 index 0000000000..ceb8bd2ad9 --- /dev/null +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/basic_use_of_redirect_to_well_known.json @@ -0,0 +1,113 @@ +{ + "description": "Three sources with equal event-time, and three triggers that match. The second and third sources and triggers are obtained by redirect from the first HTTP fetch of each, using redirection to the .well-known path. Event report task within the expiry window sends the data corresponding to the three sources.", + "phflags_override": { + "measurement_enable_redirect_to_well_known_path": "true" + }, + "input": { + "sources": [{ + "registration_request": { + "attribution_src_url": "https://www.ad-tech1.test", + "source_type": "navigation", + "registrant": "example.1s1.test" + }, + "responses": [ + { + "url": "https://www.ad-tech1.test", + "response": { + "Attribution-Reporting-Register-Source": { + "source_event_id": "1", + "destination": "android-app://example.2d1.test", + "priority": "100", + "expiry": "172801" + }, + "Location": "https://www.ad-tech2.test", + "Attribution-Reporting-Redirect-Config": "redirect-302-to-well-known" + } + }, + { + "url": "https://www.ad-tech2.test/.well-known/attribution-reporting/register-redirect?302_url=https%3A%2F%2Fwww.ad-tech2.test", + "response": { + "Attribution-Reporting-Register-Source": { + "source_event_id": "2", + "destination": "android-app://example.2d1.test", + "priority": "100", + "expiry": "172801" + }, + + "Location": null, + "Attribution-Reporting-Redirect": null + } + } + ], + "timestamp": "800000000001" + }], + "triggers": [{ + "registration_request": { + "attribution_src_url": "https://www.ad-tech1.test", + "registrant": "example.2d1.test" + }, + "responses": [ + { + "url": "https://www.ad-tech1.test", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "1", + "priority": "101" + } + ] + }, + "Location": "https://www.ad-tech2.test", + "Attribution-Reporting-Redirect-Config": "redirect-302-to-well-known" + } + }, + { + "url": "https://www.ad-tech2.test/.well-known/attribution-reporting/register-redirect?302_url=https%3A%2F%2Fwww.ad-tech2.test", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "2", + "priority": "101" + } + ] + }, + "Location": null, + "Attribution-Reporting-Redirect": null + } + } + ], + "timestamp": "800000600001" + }] + }, + "output": { + "event_level_results": [ + { + "report_time": "800176400001", + "report_url": "https://www.ad-tech1.test/.well-known/attribution-reporting/report-event-attribution", + "payload": { + "attribution_destination": "android-app://example.2d1.test", + "scheduled_report_time": "800176400", + "source_event_id": "1", + "trigger_data": "1", + "source_type": "navigation", + "randomized_trigger_rate": 0.0008051 + } + }, + { + "report_time": "800176400001", + "report_url": "https://www.ad-tech2.test/.well-known/attribution-reporting/report-event-attribution", + "payload": { + "attribution_destination": "android-app://example.2d1.test", + "scheduled_report_time": "800176400", + "source_event_id": "2", + "trigger_data": "2", + "source_type": "navigation", + "randomized_trigger_rate": 0.0008051 + } + } + ], + "aggregatable_results": [] + } +} diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/complex_use_of_redirects.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/complex_use_of_redirects.json index 413283b348..2240b56614 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/complex_use_of_redirects.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/complex_use_of_redirects.json @@ -50,9 +50,7 @@ "Attribution-Reporting-Register-Source": { "source_event_id": "3", "destination": "android-app://example.2d1.test", - "priority": "100", - "expiry": "800172800002" - + "priority": "100" }, "Location": "https://www.unenrolled-non-registering2.test", "Attribution-Reporting-Redirect": [ @@ -66,9 +64,7 @@ "Attribution-Reporting-Register-Source": { "source_event_id": "4", "destination": "android-app://example.2d1.test", - "priority": "100", - "expiry": "800172800002" - + "priority": "100" }, "Location": null, "Attribution-Reporting-Redirect": null @@ -80,9 +76,7 @@ "Attribution-Reporting-Register-Source": { "source_event_id": "6", "destination": "android-app://example.2d1.test", - "priority": "100", - "expiry": "800172800002" - + "priority": "100" }, "Attribution-Reporting-Redirect": [ "https://www.ad-tech5.test" @@ -96,9 +90,7 @@ "Attribution-Reporting-Register-Source": { "source_event_id": "5", "destination": "android-app://example.2d1.test", - "priority": "100", - "expiry": "800172800002" - + "priority": "100" }, "Location": null, "Attribution-Reporting-Redirect": null @@ -231,7 +223,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -243,7 +235,7 @@ "source_event_id": "2", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/complex_use_of_redirects_to_well_known.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/complex_use_of_redirects_to_well_known.json new file mode 100644 index 0000000000..e9a811d4cc --- /dev/null +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/complex_use_of_redirects_to_well_known.json @@ -0,0 +1,287 @@ +{ + "description": "7 (5 registering & 2 non-registering) redirects each for source & triggers. Redirection to .well-known path is enabled intermediately, making all subsequent Location-type registrations redirect to the .well-known path, even without the header. All 5 sources and triggers match. Event report task within the expiry window sends the data corresponding to the 5 sources.", + "phflags_override": { + "measurement_enable_redirect_to_well_known_path": "true" + }, + "input": { + "sources": [{ + "registration_request": { + "attribution_src_url": "https://www.ad-tech1.test", + "source_type": "navigation", + "registrant": "example.1s1.test" + }, + "responses": [ + { + "url": "https://www.ad-tech1.test", + "response": { + "Attribution-Reporting-Register-Source": { + "source_event_id": "1", + "destination": "android-app://example.2d1.test", + "priority": "100", + "expiry": "172801" + }, + "Location": null, + "Attribution-Reporting-Redirect": [ + "https://www.ad-tech2.test", + "https://www.enrolled-non-registering1.test" + ] + } + }, + { + "url": "https://www.ad-tech2.test", + "response": { + "Attribution-Reporting-Register-Source": { + "source_event_id": "2", + "destination": "android-app://example.2d1.test", + "priority": "100", + "expiry": "172801" + }, + + "Location": null, + "Attribution-Reporting-Redirect": null + } + }, + { + "url": "https://www.enrolled-non-registering1.test", + "response": { + "Location": "https://www.ad-tech3.test", + "Attribution-Reporting-Redirect-Config": "redirect-302-to-well-known" + } + }, + { + "url": "https://www.ad-tech3.test/.well-known/attribution-reporting/register-redirect?302_url=https%3A%2F%2Fwww.ad-tech3.test", + "response": { + "Attribution-Reporting-Register-Source": { + "source_event_id": "3", + "destination": "android-app://example.2d1.test", + "priority": "100" + }, + "Location": "https://www.unenrolled-non-registering2.test", + "Attribution-Reporting-Redirect": [ + "https://www.ad-tech4.test" + ] + } + }, + { + "url": "https://www.ad-tech4.test", + "response": { + "Attribution-Reporting-Register-Source": { + "source_event_id": "4", + "destination": "android-app://example.2d1.test", + "priority": "100" + }, + "Location": null, + "Attribution-Reporting-Redirect": null + } + }, + { + "url": "https://www.unenrolled-non-registering2.test/.well-known/attribution-reporting/register-redirect?302_url=https%3A%2F%2Fwww.unenrolled-non-registering2.test", + "response": { + "Attribution-Reporting-Register-Source": { + "source_event_id": "6", + "destination": "android-app://example.2d1.test", + "priority": "100" + }, + "Attribution-Reporting-Redirect": [ + "https://www.ad-tech5.test" + ] + }, + "enroll": false + }, + { + "url": "https://www.ad-tech5.test", + "response": { + "Attribution-Reporting-Register-Source": { + "source_event_id": "5", + "destination": "android-app://example.2d1.test", + "priority": "100", + "expiry": "800172800002" + + }, + "Location": null, + "Attribution-Reporting-Redirect": null + } + } + ], + "timestamp": "800000000001" + }], + "triggers": [{ + "registration_request": { + "attribution_src_url": "https://www.ad-tech1.test", + "registrant": "example.2d1.test" + }, + "responses": [ + { + "url": "https://www.ad-tech1.test", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "1", + "priority": "101" + } + ] + }, + "Location": null, + "Attribution-Reporting-Redirect": [ + "https://www.ad-tech2.test", + "https://www.enrolled-non-registering1.test" + ] + } + }, + { + "url": "https://www.ad-tech2.test", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "2", + "priority": "101" + } + ] + }, + "Location": null, + "Attribution-Reporting-Redirect": null + } + }, + { + "url": "https://www.enrolled-non-registering1.test", + "response": { + "Location": "https://www.ad-tech3.test", + "Attribution-Reporting-Redirect-Config": "redirect-302-to-well-known" + } + }, + { + "url": "https://www.ad-tech3.test/.well-known/attribution-reporting/register-redirect?302_url=https%3A%2F%2Fwww.ad-tech3.test", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "3", + "priority": "101" + } + ] + }, + "Location": "https://www.unenrolled-non-registering2.test", + "Attribution-Reporting-Redirect": [ + "https://www.ad-tech4.test" + ] + } + }, + { + "url": "https://www.ad-tech4.test", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "4", + "priority": "101" + } + ] + }, + "Location": null, + "Attribution-Reporting-Redirect": null + } + }, + { + "url": "https://www.unenrolled-non-registering2.test/.well-known/attribution-reporting/register-redirect?302_url=https%3A%2F%2Fwww.unenrolled-non-registering2.test", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "6", + "priority": "101" + } + ] + }, + "Attribution-Reporting-Redirect": [ + "https://www.ad-tech5.test" + ] + }, + "enroll": false + }, + { + "url": "https://www.ad-tech5.test", + "response": { + "Attribution-Reporting-Register-Trigger": { + "event_trigger_data": [ + { + "trigger_data": "5", + "priority": "101" + } + ] + }, + "Location": null, + "Attribution-Reporting-Redirect": null + } + } + ], + "timestamp": "800000600001" + }] + }, + "output": { + "event_level_results": [ + { + "report_time": "800176400001", + "report_url": "https://www.ad-tech1.test/.well-known/attribution-reporting/report-event-attribution", + "payload": { + "attribution_destination": "android-app://example.2d1.test", + "scheduled_report_time": "800176400", + "source_event_id": "1", + "trigger_data": "1", + "source_type": "navigation", + "randomized_trigger_rate": 0.0008051 + } + }, + { + "report_time": "800176400001", + "report_url": "https://www.ad-tech2.test/.well-known/attribution-reporting/report-event-attribution", + "payload": { + "attribution_destination": "android-app://example.2d1.test", + "scheduled_report_time": "800176400", + "source_event_id": "2", + "trigger_data": "2", + "source_type": "navigation", + "randomized_trigger_rate": 0.0008051 + } + }, + { + "report_time": "800176400001", + "report_url": "https://www.ad-tech3.test/.well-known/attribution-reporting/report-event-attribution", + "payload": { + "attribution_destination": "android-app://example.2d1.test", + "scheduled_report_time": "800176400", + "source_event_id": "3", + "trigger_data": "3", + "source_type": "navigation", + "randomized_trigger_rate": 0.0024263 + } + }, + { + "report_time": "800176400001", + "report_url": "https://www.ad-tech4.test/.well-known/attribution-reporting/report-event-attribution", + "payload": { + "attribution_destination": "android-app://example.2d1.test", + "scheduled_report_time": "800176400", + "source_event_id": "4", + "trigger_data": "4", + "source_type": "navigation", + "randomized_trigger_rate": 0.0024263 + } + }, + { + "report_time": "800176400001", + "report_url": "https://www.ad-tech5.test/.well-known/attribution-reporting/report-event-attribution", + "payload": { + "attribution_destination": "android-app://example.2d1.test", + "scheduled_report_time": "800176400", + "source_event_id": "5", + "trigger_data": "5", + "source_type": "navigation", + "randomized_trigger_rate": 0.0024263 + } + } + ], + "aggregatable_results": [] + } +} diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_1_allowed.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_1_allowed.json index a86d676748..f6921321ac 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_1_allowed.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_1_allowed.json @@ -126,7 +126,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_2_allowed.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_2_allowed.json index 5877390240..e9228b9c42 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_2_allowed.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_2_allowed.json @@ -126,7 +126,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_disabled.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_disabled.json index a9752fec1d..2da69130d3 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_disabled.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/coordinator_origin_disabled.json @@ -126,7 +126,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/enrollment_flag_disabled.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/enrollment_flag_disabled.json index 0b966e24dd..4a17c0eb6a 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/enrollment_flag_disabled.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/enrollment_flag_disabled.json @@ -108,7 +108,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [{ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_debug_source_storage_limit.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_debug_source_storage_limit.json index 71b47b1040..1ba32b6d5a 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_debug_source_storage_limit.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_debug_source_storage_limit.json @@ -88,7 +88,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key": "347982378", "trigger_debug_key": "147982378" } @@ -102,7 +102,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key": "347982378", "trigger_debug_key": "147982378" } diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_report_window.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_report_window.json index 67ef2d38d1..615ab49316 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_report_window.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_report_window.json @@ -121,7 +121,7 @@ "payload": { "attribution_destination": "android-app://destination.test", "scheduled_report_time": "1643325573", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0001372, "source_event_id": "123", "source_type": "navigation", "trigger_data": "1" @@ -133,7 +133,7 @@ "payload": { "attribution_destination": "android-app://destination.test", "scheduled_report_time": "1643325573", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0001372, "source_event_id": "123", "source_type": "navigation", "trigger_data": "2" diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_time_based_source_selection.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_time_based_source_selection.json index 6d9b78f24d..b84aeab364 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_time_based_source_selection.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/event_time_based_source_selection.json @@ -78,7 +78,7 @@ "source_event_id": "2", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/limit_num_reports_for_click.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/limit_num_reports_for_click.json index 9adf76d188..71dd31cc7d 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/limit_num_reports_for_click.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/limit_num_reports_for_click.json @@ -124,7 +124,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -136,7 +136,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -148,7 +148,7 @@ "source_event_id": "1", "trigger_data": "3", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_as_reporting_origin.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_as_reporting_origin.json index f3944e4ebe..bef06b6e4c 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_as_reporting_origin.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_as_reporting_origin.json @@ -55,7 +55,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_basic_use_of_redirect.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_basic_use_of_redirect.json index 944d307227..b519eb9f5a 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_basic_use_of_redirect.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_basic_use_of_redirect.json @@ -93,7 +93,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -105,7 +105,7 @@ "source_event_id": "2", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_ip_as_reporting_origin.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_ip_as_reporting_origin.json index d7fad3f796..1e06979410 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_ip_as_reporting_origin.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/localhost_ip_as_reporting_origin.json @@ -55,7 +55,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/only_one_source_of_multiple_matches_can_be_attributed.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/only_one_source_of_multiple_matches_can_be_attributed.json index 4563f37988..7a5af3e5cd 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/only_one_source_of_multiple_matches_can_be_attributed.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/only_one_source_of_multiple_matches_can_be_attributed.json @@ -103,7 +103,7 @@ "source_event_id": "2", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -115,7 +115,7 @@ "source_event_id": "2", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/priority_based_source_selection.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/priority_based_source_selection.json index 41595f546a..fdc35df288 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/priority_based_source_selection.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/priority_based_source_selection.json @@ -78,7 +78,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWebSource_3_sources_3_triggers_3_reports.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWebSource_3_sources_3_triggers_3_reports.json index 8827e69b5a..2c000a83b0 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWebSource_3_sources_3_triggers_3_reports.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWebSource_3_sources_3_triggers_3_reports.json @@ -128,7 +128,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { "report_time": "800176400001", @@ -139,7 +139,7 @@ "source_event_id": "2", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { "report_time": "800176400001", @@ -150,7 +150,7 @@ "source_event_id": "3", "trigger_data": "3", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching.json index eac5f0a527..03fb47d115 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching.json @@ -64,7 +64,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_ar_debug_different_registrant.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_ar_debug_different_registrant.json index ddb67affd0..5ef74d0e62 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_ar_debug_different_registrant.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_ar_debug_different_registrant.json @@ -66,7 +66,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_ar_debug_same_registrant.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_ar_debug_same_registrant.json index b712042b89..f0c60f59e5 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_ar_debug_same_registrant.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_ar_debug_same_registrant.json @@ -66,7 +66,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key" : "347982378", "trigger_debug_key" : "8971346783" } @@ -80,7 +80,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key" : "347982378", "trigger_debug_key" : "8971346783" } diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_no_adid_no_ar_debug.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_no_adid_no_ar_debug.json index 15dbcae8f2..e43a0c4091 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_no_adid_no_ar_debug.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_api_no_adid_no_ar_debug.json @@ -64,7 +64,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_join_disabled_different_registrant.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_join_disabled_different_registrant.json index 061c0c7439..8142f2c57f 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_join_disabled_different_registrant.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_join_disabled_different_registrant.json @@ -69,7 +69,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_join_enabled_different_registrant.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_join_enabled_different_registrant.json index ac91e0adf7..0917d94348 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_join_enabled_different_registrant.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-1_web-web_matching_debug_join_enabled_different_registrant.json @@ -69,7 +69,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key" : "347982378", "trigger_debug_key" : "8971346783" } @@ -83,7 +83,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263, + "randomized_trigger_rate": 0.0008051, "source_debug_key" : "347982378", "trigger_debug_key" : "8971346783" } diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-2_app_and_web_matching.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-2_app_and_web_matching.json index 8be0277e02..dcf130f11c 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-2_app_and_web_matching.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-2_app_and_web_matching.json @@ -88,7 +88,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }, { "report_time": "800176400001", @@ -99,7 +99,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-2_web_only_matching.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-2_web_only_matching.json index faa4806674..ccb8f3fce2 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-2_web_only_matching.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_1-2_web_only_matching.json @@ -83,7 +83,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_adid_debug_api.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_adid_debug_api.json index da1aab976a..b047a48a8e 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_adid_debug_api.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_adid_debug_api.json @@ -83,7 +83,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }] } diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_ar_debug_adid_debug_api.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_ar_debug_adid_debug_api.json index b161cb42fb..681d1f66d6 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_ar_debug_adid_debug_api.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_ar_debug_adid_debug_api.json @@ -83,7 +83,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }] } diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_debug_api_ar_debug.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_debug_api_ar_debug.json index 9fb5654c93..57c247e4e9 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_debug_api_ar_debug.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_app-web_debug_api_ar_debug.json @@ -82,7 +82,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }] } diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_multiple_destinations.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_multiple_destinations.json index 93f63a51e4..ca316b7758 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_multiple_destinations.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_multiple_destinations.json @@ -89,7 +89,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -101,7 +101,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_redirects_ignored.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_redirects_ignored.json index 646b2e2b12..280fc41933 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_redirects_ignored.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_redirects_ignored.json @@ -106,7 +106,7 @@ "source_event_id": "1", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_web_app_matching_debug_api_adid_ar_debug.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_web_app_matching_debug_api_adid_ar_debug.json index 11d36313c8..5a229be9b6 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_web_app_matching_debug_api_adid_ar_debug.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/registerWeb_web_app_matching_debug_api_adid_ar_debug.json @@ -68,7 +68,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_1-1_app-app_matching.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_1-1_app-app_matching.json index 768d5f994c..080c62ca1a 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_1-1_app-app_matching.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_1-1_app-app_matching.json @@ -55,7 +55,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-app_empty_object_event_trigger_data.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-app_empty_object_event_trigger_data.json index d2be233191..9fd1eb9235 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-app_empty_object_event_trigger_data.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-app_empty_object_event_trigger_data.json @@ -50,7 +50,7 @@ "source_event_id": "0", "trigger_data": "0", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-app_null_trigger_data_null_source_event_id.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-app_null_trigger_data_null_source_event_id.json index c36147be60..670c8de80a 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-app_null_trigger_data_null_source_event_id.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-app_null_trigger_data_null_source_event_id.json @@ -55,7 +55,7 @@ "source_event_id": "0", "trigger_data": "0", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-web_dual_destination_source_storage_limit_debug_report.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-web_dual_destination_source_storage_limit_debug_report.json index 2041a9d2f0..22e7b538ab 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-web_dual_destination_source_storage_limit_debug_report.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-web_dual_destination_source_storage_limit_debug_report.json @@ -99,7 +99,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0170218 + "randomized_trigger_rate": 0.0054129 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-web_source_storage_limit_debug_report.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-web_source_storage_limit_debug_report.json index dad35eb619..9a88bf402b 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-web_source_storage_limit_debug_report.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_app-web_source_storage_limit_debug_report.json @@ -94,7 +94,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_web-web_source_storage_limit_debug_report.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_web-web_source_storage_limit_debug_report.json index be217c98c4..aaa2b6d4cc 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_web-web_source_storage_limit_debug_report.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/register_web-web_source_storage_limit_debug_report.json @@ -100,7 +100,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "verbose_debug_reports": [ diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/three_sources_one_trigger.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/three_sources_one_trigger.json index 443987f27f..9dec79b882 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/three_sources_one_trigger.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/three_sources_one_trigger.json @@ -99,7 +99,7 @@ "source_event_id": "2", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }], "aggregatable_results": [] diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/three_sources_three_triggers_one_dedup.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/three_sources_three_triggers_one_dedup.json index 17a8ecc366..0343b9bf38 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/three_sources_three_triggers_one_dedup.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/three_sources_three_triggers_one_dedup.json @@ -149,7 +149,7 @@ "source_event_id": "2", "trigger_data": "1", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -161,7 +161,7 @@ "source_event_id": "2", "trigger_data": "0", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/two_simple_matches_testing_multiplicity.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/two_simple_matches_testing_multiplicity.json index fa9c81136a..aaabe1703c 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/two_simple_matches_testing_multiplicity.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/misc/two_simple_matches_testing_multiplicity.json @@ -103,7 +103,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } }, { @@ -115,7 +115,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_disabled_basic.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_disabled_basic.json index d859f34139..8fcd67d555 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_disabled_basic.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_disabled_basic.json @@ -193,7 +193,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_original_source_wins_install_attribution.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_original_source_wins_install_attribution.json index ee188284d0..9956388e99 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_original_source_wins_install_attribution.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_original_source_wins_install_attribution.json @@ -373,7 +373,7 @@ "source_event_id": "1", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_reg_has_original_xna_source_avoids_creating_derived_source.json b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_reg_has_original_xna_source_avoids_creating_derived_source.json index 233e156c5a..bd792b74c5 100644 --- a/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_reg_has_original_xna_source_avoids_creating_derived_source.json +++ b/adservices/tests/unittest/service-core/assets/msmt_e2e_tests/xna/xna_reg_has_original_xna_source_avoids_creating_derived_source.json @@ -183,7 +183,7 @@ "source_event_id": "2", "trigger_data": "2", "source_type": "navigation", - "randomized_trigger_rate": 0.0024263 + "randomized_trigger_rate": 0.0008051 } } ], diff --git a/adservices/tests/unittest/service-core/assets/msmt_interop_tests/event_report_windows.json b/adservices/tests/unittest/service-core/assets/msmt_interop_tests/event_report_windows.json new file mode 100644 index 0000000000..e9a96f2fe7 --- /dev/null +++ b/adservices/tests/unittest/service-core/assets/msmt_interop_tests/event_report_windows.json @@ -0,0 +1,289 @@ +{ + "description": "Set report windows for navigation type event-level reporting", + "input": { + "registrations": [ + { + "timestamp": "0", + "registration_request": { + "context_origin": "https://source.test", + "attribution_src_url": "https://reporter.test/register-source", + "source_type": "navigation" + }, + "responses": [ + { + "url": "https://reporter.test/register-source", + "debug_permission": true, + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://destination.test", + "source_event_id": "123", + "expiry": "1296000", + "event_report_windows": { + "start_time": 3600, + // 2592000 s clamped down to expiry. + "end_times": [86400, 2592000] + } + } + } + } + ] + }, + { + "timestamp": "1000", + "registration_request": { + "context_origin": "https://source.test", + "attribution_src_url": "https://reporter2.test/register-source", + "source_type": "navigation" + }, + "responses": [ + { + "url": "https://reporter2.test/register-source", + "debug_permission": true, + "response": { + "Attribution-Reporting-Register-Source": { + "destination": "https://destination2.test", + "source_event_id": "456", + "event_report_windows": { + "start_time": 0, + // 1800 rounded to 3600 (1 hr). + "end_times": [1800] + } + } + } + } + ] + }, + { + // Should result in an event-level report in the first window + // rounded up to 1 hour (3600 s). + "timestamp": "1900000", + "registration_request": { + "attribution_src_url": "https://reporter2.test/register-trigger", + "context_origin": "https://destination2.test" + }, + "responses": [ + { + "url": "https://reporter2.test/register-trigger", + "debug_permission": true, + "response": { + "Attribution-Reporting-Register-Trigger": { + "debug_reporting": true, + "event_trigger_data": [ + { + "trigger_data": "4" + } + ] + } + } + } + ] + }, + // Should not result in an event-level report as the event report start + // time has passed, + { + // 3,600,000 ms = 1 hour = clamped event_report_window value. + "timestamp": "3590000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "context_origin": "https://destination.test" + }, + "responses": [ + { + "url": "https://reporter.test/register-trigger", + "debug_permission": true, + "response": { + "Attribution-Reporting-Register-Trigger": { + "debug_reporting": true, + "event_trigger_data": [ + { + "trigger_data": "1" + } + ] + } + } + } + ] + }, + { + // Should result in an event-level report in the first window. + "timestamp": "3600000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "context_origin": "https://destination.test" + }, + "responses": [ + { + "url": "https://reporter.test/register-trigger", + "debug_permission": true, + "response": { + "Attribution-Reporting-Register-Trigger": { + "debug_reporting": true, + "event_trigger_data": [ + { + "trigger_data": "1" + } + ] + } + } + } + ] + }, + { + // Should not result in an event-level report. + "timestamp": "3700000", + "registration_request": { + "attribution_src_url": "https://reporter2.test/register-trigger", + "context_origin": "https://destination2.test" + }, + "responses": [ + { + "url": "https://reporter2.test/register-trigger", + "debug_permission": true, + "response": { + "Attribution-Reporting-Register-Trigger": { + "debug_reporting": true, + "event_trigger_data": [ + { + "trigger_data": "5" + } + ] + } + } + } + ] + }, + { + // Should result in an event-level report in the last window. + "timestamp": "1209600000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "context_origin": "https://destination.test" + }, + "responses": [ + { + "url": "https://reporter.test/register-trigger", + "debug_permission": true, + "response": { + "Attribution-Reporting-Register-Trigger": { + "debug_reporting": true, + "event_trigger_data": [ + { + "trigger_data": "2" + } + ] + } + } + } + ] + }, + { + // Should not result in an event-level report as the last window was + // clamped to 1296000 s. + "timestamp": "1296000000", + "registration_request": { + "attribution_src_url": "https://reporter.test/register-trigger", + "context_origin": "https://destination.test" + }, + "responses": [ + { + "url": "https://reporter.test/register-trigger", + "debug_permission": true, + "response": { + "Attribution-Reporting-Register-Trigger": { + "debug_reporting": true, + "event_trigger_data": [ + { + "trigger_data": "3" + } + ] + } + } + } + ] + } + ] + }, + "output": { + "unparsable_registrations": [], + "reports": [ + { + "payload": [ + { + "body": { + "attribution_destination": "https://destination.test", + "source_event_id": "123", + "source_site": "https://source.test" + }, + "type": "trigger-event-report-window-not-started" + } + ], + "report_time": "3590000", + "report_url": "https://reporter.test/.well-known/attribution-reporting/debug/verbose" + }, + { + "payload": { + "attribution_destination": "https://destination2.test", + "randomized_trigger_rate": 0.0001372, + // 3601 s = 3600 s (rounded window) + 1 s (source timestamp). + "scheduled_report_time": "3601", + "source_event_id": "456", + "source_type": "navigation", + "trigger_data": "4" + }, + "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "3601000" + }, + { + "payload": [ + { + "body": { + "attribution_destination": "https://destination2.test", + "source_event_id": "456", + "source_site": "https://source.test" + }, + "type": "trigger-event-report-window-passed" + } + ], + "report_time": "3700000", + "report_url": "https://reporter2.test/.well-known/attribution-reporting/debug/verbose" + }, + { + "payload": { + "attribution_destination": "https://destination.test", + "randomized_trigger_rate": 0.0008051, + "scheduled_report_time": "86400", + "source_event_id": "123", + "source_type": "navigation", + "trigger_data": "1" + }, + "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "86400000" + }, + { + "payload": { + "attribution_destination": "https://destination.test", + "randomized_trigger_rate": 0.0008051, + "scheduled_report_time": "1296000", + "source_event_id": "123", + "source_type": "navigation", + "trigger_data": "2" + }, + "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", + "report_time": "1296000000" + }, + { + "payload": [ + { + "body": { + "attribution_destination": "https://destination.test" + }, + // Source has expired at this point. + "type": "trigger-no-matching-source" + } + ], + "report_time": "1296000000", + "report_url": "https://reporter.test/.well-known/attribution-reporting/debug/verbose" + } + ] + } +}
\ No newline at end of file diff --git a/adservices/tests/unittest/service-core/common/Android.bp b/adservices/tests/unittest/service-core/common/Android.bp new file mode 100644 index 0000000000..b128e30ec8 --- /dev/null +++ b/adservices/tests/unittest/service-core/common/Android.bp @@ -0,0 +1,33 @@ +// Copyright (C) 2024 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 { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +android_test { + name: "AdServicesServiceCoreCommonUnitTests", + srcs: [ + "src/**/*.java", + ], + defaults: ["AdServices-ServiceCoreUnitTest-Defaults"], +} + +android_test { + name: "AdExtServicesServiceCoreCommonUnitTests", + srcs: [ + "src/**/*.java", + ], + defaults: ["AdExtServices-ServiceCoreUnitTest-Defaults"], + test_config: "AndroidTest.ExtServices.xml", +} diff --git a/adservices/tests/unittest/service-core/common/AndroidManifest.xml b/adservices/tests/unittest/service-core/common/AndroidManifest.xml new file mode 100644 index 0000000000..cdbd758b50 --- /dev/null +++ b/adservices/tests/unittest/service-core/common/AndroidManifest.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2024 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. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.adservices.servicecorecommontest"> + <!-- android:debuggable="true" is needed. See b/228384531 --> + <application android:debuggable="true"> + <uses-library android:name="android.ext.adservices" android:required="false"/> + </application> + + <!-- Entries below are necessary so atest can work without specifying the project. --> + <instrumentation + android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.adservices.servicecorecommontest"> + </instrumentation> +</manifest> diff --git a/adservices/tests/unittest/service-core/common/AndroidTest.ExtServices.xml b/adservices/tests/unittest/service-core/common/AndroidTest.ExtServices.xml new file mode 100644 index 0000000000..900999fa6d --- /dev/null +++ b/adservices/tests/unittest/service-core/common/AndroidTest.ExtServices.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 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. + --> +<configuration + description="Config for AdServices Service-core common test cases in ExtServices"> + <object class="com.android.tradefed.testtype.suite.module.MaxSdkModuleController" + type="module_controller"> + <option name="max-sdk-level" value="32"/> + </object> + + <!-- Prevent test from running on Android T+ --> + <object class="com.android.tradefed.testtype.suite.module.Sdk30ModuleController" + type="module_controller"/> + + <!-- Prevent tests from running on Android Q- --> + <object class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController" + type="module_controller"> + <option name="mainline-module-package-name" value="com.google.android.extservices"/> + </object> + + <option name="test-tag" value="AdExtServicesServiceCoreCommonUnitTests"/> + <option name="config-descriptor:metadata" key="mainline-param" + value="com.google.android.extservices.apex"/> + <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> + <option name="cleanup-apks" value="true"/> + <option name="check-min-sdk" value="true"/> + <option name="test-file-name" value="AdExtServicesServiceCoreCommonUnitTests.apk"/> + </target_preparer> + <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"> + <option name="run-command" value="setprop log.tag.adservices VERBOSE"/> + </target_preparer> + <test class="com.android.tradefed.testtype.AndroidJUnitTest"> + <option name="package" value="com.android.adservices.servicecorecommontest"/> + </test> +</configuration> diff --git a/adservices/tests/unittest/service-core/common/AndroidTest.xml b/adservices/tests/unittest/service-core/common/AndroidTest.xml new file mode 100644 index 0000000000..f9a08c35bb --- /dev/null +++ b/adservices/tests/unittest/service-core/common/AndroidTest.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2024 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. + --> +<configuration description="Config for Ad Services Service-core common test cases"> + <object class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController" + type="module_controller"> + <option name="mainline-module-package-name" value="com.google.android.adservices"/> + </object> + + <option name="test-tag" value="AdServicesServiceCoreCommonUnitTests"/> + <option name="config-descriptor:metadata" key="mainline-param" + value="com.google.android.adservices.apex"/> + <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> + <option name="cleanup-apks" value="true"/> + <option name="check-min-sdk" value="true"/> + <option name="test-file-name" value="AdServicesServiceCoreCommonUnitTests.apk"/> + </target_preparer> + <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"> + <option name="run-command" value="setprop log.tag.adservices VERBOSE"/> + </target_preparer> + <test class="com.android.tradefed.testtype.AndroidJUnitTest"> + <option name="package" value="com.android.adservices.servicecorecommontest"/> + </test> +</configuration> diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/errorlogging/AdServicesErrorLoggerImplTest.java b/adservices/tests/unittest/service-core/common/src/com/android/adservices/errorlogging/AdServicesErrorLoggerImplTest.java index 847c08e52a..bdf20f56d5 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/errorlogging/AdServicesErrorLoggerImplTest.java +++ b/adservices/tests/unittest/service-core/common/src/com/android/adservices/errorlogging/AdServicesErrorLoggerImplTest.java @@ -21,10 +21,9 @@ import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICE import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__TOPICS; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.database.sqlite.SQLiteException; @@ -37,11 +36,10 @@ import com.google.common.collect.ImmutableList; import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCase { - private AdServicesErrorLoggerImpl mErrorLogger; - // Constants used for tests private static final String CLASS_NAME = "TopicsService"; private static final String METHOD_NAME = "getTopics"; @@ -50,17 +48,19 @@ public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCa private static final String SQ_LITE_EXCEPTION = "SQLiteException"; @Mock private Flags mFlags; - @Mock StatsdAdServicesErrorLogger mStatsdLoggerMock; + @Mock private StatsdAdServicesErrorLogger mStatsdLoggerMock; + + private AdServicesErrorLoggerImpl mErrorLogger; @Before public void setUp() { mErrorLogger = new AdServicesErrorLoggerImpl(mFlags, mStatsdLoggerMock); - doReturn(ImmutableList.of()).when(mFlags).getErrorCodeLoggingDenyList(); + mockErrorCodeLoggingDenyList(ImmutableList.of()); } @Test public void testLogError_errorLoggingFlagDisabled() { - doReturn(false).when(mFlags).getAdServicesErrorLoggingEnabled(); + mockAdServicesErrorLogging(/* enabled= */ false); mErrorLogger.logError( AD_SERVICES_ERROR_REPORTED__ERROR_CODE__CONSENT_REVOKED_ERROR, PPAPI_NAME); @@ -70,10 +70,9 @@ public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCa @Test public void testLogError_errorLoggingFlagEnabled_errorCodeLoggingDenied() { - doReturn(true).when(mFlags).getAdServicesErrorLoggingEnabled(); - doReturn(ImmutableList.of(AD_SERVICES_ERROR_REPORTED__ERROR_CODE__CONSENT_REVOKED_ERROR)) - .when(mFlags) - .getErrorCodeLoggingDenyList(); + mockAdServicesErrorLogging(/* enabled= */ true); + mockErrorCodeLoggingDenyList( + ImmutableList.of(AD_SERVICES_ERROR_REPORTED__ERROR_CODE__CONSENT_REVOKED_ERROR)); mErrorLogger.logError( AD_SERVICES_ERROR_REPORTED__ERROR_CODE__CONSENT_REVOKED_ERROR, PPAPI_NAME); @@ -83,16 +82,23 @@ public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCa @Test public void testLogError_errorLoggingFlagEnabled() { - doReturn(true).when(mFlags).getAdServicesErrorLoggingEnabled(); + mockAdServicesErrorLogging(/* enabled= */ true); + ArgumentCaptor<AdServicesErrorStats> adServicesErrorStatsArgumentCaptor = + ArgumentCaptor.forClass(AdServicesErrorStats.class); + mErrorLogger.logError( AD_SERVICES_ERROR_REPORTED__ERROR_CODE__CONSENT_REVOKED_ERROR, PPAPI_NAME); - verify(mStatsdLoggerMock).logAdServicesError(any()); + verify(mStatsdLoggerMock).logAdServicesError(adServicesErrorStatsArgumentCaptor.capture()); + AdServicesErrorStats adServicesErrorStats = adServicesErrorStatsArgumentCaptor.getValue(); + expect.that(adServicesErrorStats.getErrorCode()) + .isEqualTo(AD_SERVICES_ERROR_REPORTED__ERROR_CODE__CONSENT_REVOKED_ERROR); + expect.that(adServicesErrorStats.getPpapiName()).isEqualTo(PPAPI_NAME); } @Test public void testLogErrorWithExceptionInfo_errorLoggingFlagDisabled() { - doReturn(false).when(mFlags).getAdServicesErrorLoggingEnabled(); + mockAdServicesErrorLogging(/* enabled= */ false); mErrorLogger.logErrorWithExceptionInfo( new Exception(), @@ -104,10 +110,9 @@ public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCa @Test public void testLogErrorWithExceptionInfo_errorLoggingFlagEnabled_errorCodeLoggingDenied() { - doReturn(true).when(mFlags).getAdServicesErrorLoggingEnabled(); - doReturn(ImmutableList.of(AD_SERVICES_ERROR_REPORTED__ERROR_CODE__DATABASE_READ_EXCEPTION)) - .when(mFlags) - .getErrorCodeLoggingDenyList(); + mockAdServicesErrorLogging(/* enabled= */ true); + mockErrorCodeLoggingDenyList( + ImmutableList.of(AD_SERVICES_ERROR_REPORTED__ERROR_CODE__DATABASE_READ_EXCEPTION)); mErrorLogger.logErrorWithExceptionInfo( new Exception(), @@ -119,8 +124,7 @@ public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCa @Test public void testLogErrorWithExceptionInfo_errorLoggingFlagEnabled() { - doReturn(true).when(mFlags).getAdServicesErrorLoggingEnabled(); - + mockAdServicesErrorLogging(/* enabled= */ true); Exception exception = createSQLiteException(CLASS_NAME, METHOD_NAME, LINE_NUMBER); mErrorLogger.logErrorWithExceptionInfo( @@ -138,13 +142,12 @@ public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCa .setLineNumber(LINE_NUMBER) .setLastObservedExceptionName(SQ_LITE_EXCEPTION) .build(); - verify(mStatsdLoggerMock).logAdServicesError(eq(stats)); + verify(mStatsdLoggerMock).logAdServicesError(stats); } @Test public void testLogErrorWithExceptionInfo_fullyQualifiedClassName_errorLoggingFlagEnabled() { - doReturn(true).when(mFlags).getAdServicesErrorLoggingEnabled(); - + mockAdServicesErrorLogging(/* enabled= */ true); String fullClassName = "com.android.adservices.topics.TopicsService"; Exception exception = createSQLiteException(fullClassName, METHOD_NAME, LINE_NUMBER); @@ -163,12 +166,12 @@ public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCa .setLineNumber(LINE_NUMBER) .setLastObservedExceptionName(SQ_LITE_EXCEPTION) .build(); - verify(mStatsdLoggerMock).logAdServicesError(eq(stats)); + verify(mStatsdLoggerMock).logAdServicesError(stats); } @Test public void testLogErrorWithExceptionInfo_emptyClassName_errorLoggingFlagEnabled() { - doReturn(true).when(mFlags).getAdServicesErrorLoggingEnabled(); + mockAdServicesErrorLogging(/* enabled= */ true); Exception exception = createSQLiteException(/* className = */ "", METHOD_NAME, LINE_NUMBER); @@ -186,7 +189,7 @@ public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCa .setLineNumber(LINE_NUMBER) .setLastObservedExceptionName(SQ_LITE_EXCEPTION) .build(); - verify(mStatsdLoggerMock).logAdServicesError(eq(stats)); + verify(mStatsdLoggerMock).logAdServicesError(stats); } Exception createSQLiteException(String className, String methodName, int lineNumber) { @@ -200,17 +203,11 @@ public final class AdServicesErrorLoggerImplTest extends AdServicesMockitoTestCa return exception; } - Exception createSQLiteExceptionwith3StackTraceElements( - String className, String methodName, int lineNumber) { - StackTraceElement[] stackTraceElements = - new StackTraceElement[] { - new StackTraceElement("AdServicesErrorLoggerImpl", "logError", "file", 4), - new StackTraceElement("ErrorLogUtil", "e", "file", 4), - new StackTraceElement(className, methodName, "file", lineNumber) - }; + private void mockAdServicesErrorLogging(boolean enabled) { + when(mFlags.getAdServicesErrorLoggingEnabled()).thenReturn(enabled); + } - Exception exception = new SQLiteException(); - exception.setStackTrace(stackTraceElements); - return exception; + private void mockErrorCodeLoggingDenyList(ImmutableList<Integer> errorCodeLoggingDenyList) { + when(mFlags.getErrorCodeLoggingDenyList()).thenReturn(errorCodeLoggingDenyList); } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/customaudience/DBCustomAudienceBackgroundFetchDataTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/customaudience/DBCustomAudienceBackgroundFetchDataTest.java index e9574eca6b..a078f13c0e 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/customaudience/DBCustomAudienceBackgroundFetchDataTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/customaudience/DBCustomAudienceBackgroundFetchDataTest.java @@ -26,26 +26,21 @@ import static org.junit.Assert.assertThrows; import android.adservices.common.CommonFixture; import android.adservices.customaudience.CustomAudienceFixture; +import com.android.adservices.common.AdServicesExtendedMockitoTestCase; import com.android.adservices.customaudience.DBCustomAudienceBackgroundFetchDataFixture; import com.android.adservices.service.Flags; import com.android.adservices.service.FlagsFactory; -import com.android.adservices.service.PhFlagsFixture; import com.android.adservices.service.customaudience.BackgroundFetchRunner; import com.android.adservices.service.customaudience.CustomAudienceUpdatableData; import com.android.adservices.service.customaudience.CustomAudienceUpdatableDataFixture; -import com.android.modules.utils.testing.TestableDeviceConfig; +import com.android.modules.utils.testing.ExtendedMockitoRule.SpyStatic; -import org.json.JSONException; -import org.junit.Rule; import org.junit.Test; import java.time.Instant; -public class DBCustomAudienceBackgroundFetchDataTest { - // This rule is used for configuring P/H flags - @Rule - public final TestableDeviceConfig.TestableDeviceConfigRule mDeviceConfigRule = - new TestableDeviceConfig.TestableDeviceConfigRule(); +public final class DBCustomAudienceBackgroundFetchDataTest + extends AdServicesExtendedMockitoTestCase { @Test public void testBuildFetchDataSuccess() { @@ -179,22 +174,28 @@ public class DBCustomAudienceBackgroundFetchDataTest { @Test public void testComputeNextEligibleUpdateTimeWithPhFlags() { - long configuredBaseIntervalS = 100L; - PhFlagsFixture.configureFledgeBackgroundFetchEligibleUpdateBaseIntervalS( - configuredBaseIntervalS); + Flags flags = FlagsFactory.getFlagsForTest(); + long configuredBaseIntervalS = flags.getFledgeBackgroundFetchEligibleUpdateBaseIntervalS(); Instant expectedEligibleUpdateTime = CommonFixture.FIXED_NOW.plusSeconds(configuredBaseIntervalS); Instant actualEligibleUpdateTime = DBCustomAudienceBackgroundFetchData .computeNextEligibleUpdateTimeAfterSuccessfulUpdate( - CommonFixture.FIXED_NOW); + CommonFixture.FIXED_NOW, flags); assertEquals(expectedEligibleUpdateTime, actualEligibleUpdateTime); } @Test - public void testCopyWithFullSuccessfulUpdatableDataResetsFailureCounts() throws JSONException { + @SpyStatic(FlagsFactory.class) + public void testCopyWithFullSuccessfulUpdatableDataResetsFailureCounts() throws Exception { + // NOTE: copyWithUpdatableData() will eventually call the + // computeNextEligibleUpdateTimeAfterSuccessfulUpdate() method that calls + // FlagsFactory.getInstance(), so we need to mock that method (otherwise it would call + // DeviceConfig and fail due to lack of permissions) + extendedMockito.mockGetFlags(FlagsFactory.getFlagsForTest()); + DBCustomAudienceBackgroundFetchData originalFetchData = DBCustomAudienceBackgroundFetchDataFixture.getValidBuilderByBuyer( CommonFixture.VALID_BUYER_1) @@ -206,8 +207,7 @@ public class DBCustomAudienceBackgroundFetchDataTest { Instant attemptedUpdateTime = CommonFixture.FIXED_NOW.plusSeconds(10); Instant expectedEligibleUpdateTime = DBCustomAudienceBackgroundFetchData - .computeNextEligibleUpdateTimeAfterSuccessfulUpdate( - attemptedUpdateTime, FlagsFactory.getFlagsForTest()); + .computeNextEligibleUpdateTimeAfterSuccessfulUpdate(attemptedUpdateTime); CustomAudienceUpdatableData updatableData = CustomAudienceUpdatableDataFixture.getValidBuilderFullSuccessfulResponse() diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/enrollment/EnrollmentDaoTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/enrollment/EnrollmentDaoTest.java index 5c16e32d88..aa0ac3f7ca 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/enrollment/EnrollmentDaoTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/enrollment/EnrollmentDaoTest.java @@ -79,7 +79,7 @@ public class EnrollmentDaoTest { @Mock private EnrollmentUtil mEnrollmentUtil; @Mock private SharedDbHelper mMockDbHelper; - private static final EnrollmentData ENROLLMENT_DATA1 = + public static final EnrollmentData ENROLLMENT_DATA1 = new EnrollmentData.Builder() .setEnrollmentId("1") .setCompanyId("1001") diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/AbstractDbIntegrationTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/AbstractDbIntegrationTest.java index 3cea7026fe..b55f828555 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/AbstractDbIntegrationTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/AbstractDbIntegrationTest.java @@ -666,6 +666,9 @@ public abstract class AbstractDbIntegrationTest { values.put( MeasurementTables.AsyncRegistrationContract.PLATFORM_AD_ID, asyncRegistration.getPlatformAdId()); + values.put( + MeasurementTables.AsyncRegistrationContract.REDIRECT_BEHAVIOR, + asyncRegistration.getRedirectBehavior().name()); long rowId = db.insert( MeasurementTables.AsyncRegistrationContract.TABLE, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/DbState.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/DbState.java index 24139fe83c..f6c0712885 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/DbState.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/DbState.java @@ -30,6 +30,7 @@ import com.android.adservices.service.measurement.Source; import com.android.adservices.service.measurement.Trigger; import com.android.adservices.service.measurement.aggregation.AggregateEncryptionKey; import com.android.adservices.service.measurement.aggregation.AggregateReport; +import com.android.adservices.service.measurement.registration.AsyncRedirect; import com.android.adservices.service.measurement.registration.AsyncRegistration; import com.android.adservices.service.measurement.reporting.DebugReport; import com.android.adservices.service.measurement.util.UnsignedLong; @@ -609,6 +610,8 @@ public class DbState { .setVerifiedDestination(Uri.parse(aJSON.getString("verifiedDestination"))) .setWebDestination(Uri.parse(aJSON.getString("webDestination"))) .setSourceType(Source.SourceType.values()[aJSON.getInt("sourceType")]) + .setRedirectBehavior( + AsyncRedirect.RedirectBehavior.valueOf(aJSON.getString("redirectBehavior"))) .build(); } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/MeasurementDaoTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/MeasurementDaoTest.java index f12e36b93f..fec0f7ce1e 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/MeasurementDaoTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/MeasurementDaoTest.java @@ -4887,44 +4887,6 @@ public class MeasurementDaoTest { .getCount()); } - private static AsyncRegistration buildAsyncRegistration(String id) { - - return new AsyncRegistration.Builder() - .setId(id) - .setOsDestination(Uri.parse("android-app://installed-app-destination")) - .setRegistrant(INSTALLED_REGISTRANT) - .setTopOrigin(INSTALLED_REGISTRANT) - .setAdIdPermission(false) - .setType(AsyncRegistration.RegistrationType.APP_SOURCE) - .setRegistrationId(UUID.randomUUID().toString()) - .build(); - } - - private static AsyncRegistration buildAsyncRegistrationWithNotDestination(String id) { - return new AsyncRegistration.Builder() - .setId(id) - .setOsDestination(Uri.parse("android-app://not-installed-app-destination")) - .setRegistrant(INSTALLED_REGISTRANT) - .setTopOrigin(INSTALLED_REGISTRANT) - .setAdIdPermission(false) - .setType(AsyncRegistration.RegistrationType.APP_SOURCE) - .setRequestTime(Long.MAX_VALUE) - .setRegistrationId(UUID.randomUUID().toString()) - .build(); - } - - private static AsyncRegistration buildAsyncRegistrationWithNotRegistrant(String id) { - return new AsyncRegistration.Builder() - .setId(id) - .setOsDestination(Uri.parse("android-app://installed-app-destination")) - .setRegistrant(NOT_INSTALLED_REGISTRANT) - .setTopOrigin(NOT_INSTALLED_REGISTRANT) - .setAdIdPermission(false) - .setType(AsyncRegistration.RegistrationType.APP_SOURCE) - .setRegistrationId(UUID.randomUUID().toString()) - .build(); - } - @Test public void testDeleteDebugReport() { SQLiteDatabase db = MeasurementDbHelper.getInstance(sContext).safeGetWritableDatabase(); @@ -6163,6 +6125,9 @@ public class MeasurementDaoTest { assertEquals( asyncRegistration.getPlatformAdId(), validAsyncRegistration.getPlatformAdId()); assertEquals(asyncRegistration.getPostBody(), validAsyncRegistration.getPostBody()); + assertEquals( + asyncRegistration.getRedirectBehavior(), + validAsyncRegistration.getRedirectBehavior()); } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/MeasurementDbSchemaTrail.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/MeasurementDbSchemaTrail.java index 526eb95956..35d0321a26 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/MeasurementDbSchemaTrail.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/MeasurementDbSchemaTrail.java @@ -2036,6 +2036,46 @@ public class MeasurementDbSchemaTrail { + " TEXT " + ")"; + public static final String CREATE_TABLE_ASYNC_REGISTRATION_V31 = + "CREATE TABLE " + + AsyncRegistrationContract.TABLE + + " (" + + AsyncRegistrationContract.ID + + " TEXT PRIMARY KEY NOT NULL, " + + AsyncRegistrationContract.REGISTRATION_URI + + " TEXT, " + + AsyncRegistrationContract.WEB_DESTINATION + + " TEXT, " + + AsyncRegistrationContract.OS_DESTINATION + + " TEXT, " + + AsyncRegistrationContract.VERIFIED_DESTINATION + + " TEXT, " + + AsyncRegistrationContract.TOP_ORIGIN + + " TEXT, " + + AsyncRegistrationContract.SOURCE_TYPE + + " INTEGER, " + + AsyncRegistrationContract.REGISTRANT + + " TEXT, " + + AsyncRegistrationContract.REQUEST_TIME + + " INTEGER, " + + AsyncRegistrationContract.RETRY_COUNT + + " INTEGER, " + + AsyncRegistrationContract.TYPE + + " INTEGER, " + + AsyncRegistrationContract.DEBUG_KEY_ALLOWED + + " INTEGER, " + + AsyncRegistrationContract.AD_ID_PERMISSION + + " INTEGER, " + + AsyncRegistrationContract.REGISTRATION_ID + + " TEXT NOT NULL," + + AsyncRegistrationContract.PLATFORM_AD_ID + + " TEXT, " + + AsyncRegistrationContract.REQUEST_POST_BODY + + " TEXT, " + + AsyncRegistrationContract.REDIRECT_BEHAVIOR + + " TEXT " + + ")"; + private static final String CREATE_TABLE_DEBUG_REPORT_V6 = "CREATE TABLE IF NOT EXISTS " + DebugReportContract.TABLE @@ -2489,6 +2529,12 @@ public class MeasurementDbSchemaTrail { return createStatements; } + private static Map<String, String> getCreateStatementByTableV31() { + Map<String, String> createStatements = new HashMap<>(getCreateStatementByTableV30()); + createStatements.put(AsyncRegistrationContract.TABLE, CREATE_TABLE_ASYNC_REGISTRATION_V31); + return createStatements; + } + private static Map<String, String> getCreateIndexesV7() { Map<String, String> createIndexes = new HashMap<>(); createIndexes.putAll(CREATE_INDEXES_V6); @@ -2595,6 +2641,10 @@ public class MeasurementDbSchemaTrail { return getCreateIndexesV29(); } + private static Map<String, String> getCreateIndexesV31() { + return getCreateIndexesV30(); + } + private static final Map<Integer, Collection<String>> CREATE_TABLES_STATEMENTS_BY_VERSION = new ImmutableMap.Builder<Integer, Collection<String>>() .put(6, CREATE_STATEMENT_BY_TABLE_V6.values()) @@ -2622,6 +2672,7 @@ public class MeasurementDbSchemaTrail { .put(28, getCreateStatementByTableV28().values()) .put(29, getCreateStatementByTableV29().values()) .put(30, getCreateStatementByTableV30().values()) + .put(31, getCreateStatementByTableV31().values()) .build(); private static final Map<Integer, Collection<String>> CREATE_INDEXES_STATEMENTS_BY_VERSION = @@ -2651,6 +2702,7 @@ public class MeasurementDbSchemaTrail { .put(28, getCreateIndexesV28().values()) .put(29, getCreateIndexesV29().values()) .put(30, getCreateIndexesV30().values()) + .put(31, getCreateIndexesV31().values()) .build(); /** diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/ContentValueFixtures.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/ContentValueFixtures.java index a12ea65f96..0b3893126d 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/ContentValueFixtures.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/ContentValueFixtures.java @@ -536,6 +536,15 @@ public class ContentValueFixtures { return asyncRegistration; } + /** + * Get content values for V31 migration + * + * @return ContentValues for AsyncRegistration table + */ + public static ContentValues generateAsyncRegistrationContentValuesV31() { + return generateAsyncRegistrationContentValuesV24(); + } + public static ContentValues generateSourceContentValuesV1() { ContentValues source = new ContentValues(); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/MeasurementDbMigratorV30Test.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/MeasurementDbMigratorV30Test.java index ca859a4981..d076d277bd 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/MeasurementDbMigratorV30Test.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/MeasurementDbMigratorV30Test.java @@ -63,7 +63,6 @@ public class MeasurementDbMigratorV30Test extends MeasurementDbMigratorTestBase MeasurementTables.SourceContract.TABLE, Set.of(MeasurementTables.SourceContract.ID)); MigrationTestHelper.verifyDataInDb(db, fakeData, new HashMap<>(), columnsToBeSkipped); - // Check that new columns are initialized with empty string List<Pair<String, String>> tableAndNewColumnPairs = new ArrayList<>(); tableAndNewColumnPairs.add( new Pair<>( diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/MeasurementDbMigratorV31Test.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/MeasurementDbMigratorV31Test.java new file mode 100644 index 0000000000..d41fb695bb --- /dev/null +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/measurement/migration/MeasurementDbMigratorV31Test.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2023 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.measurement.migration; + +import static com.android.adservices.data.DbTestUtil.getDbHelperForTest; + +import static org.junit.Assert.assertEquals; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +import com.android.adservices.data.measurement.MeasurementDbHelper; +import com.android.adservices.data.measurement.MeasurementTables; +import com.android.adservices.service.measurement.registration.AsyncRedirect; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@RunWith(MockitoJUnitRunner.class) +public class MeasurementDbMigratorV31Test extends MeasurementDbMigratorTestBase { + @Test + public void performMigration_v30ToV31WithData_maintainsDataIntegrity() { + // Setup + MeasurementDbHelper dbHelper = + new MeasurementDbHelper( + sContext, + MEASUREMENT_DATABASE_NAME_FOR_MIGRATION, + 30, + getDbHelperForTest()); + SQLiteDatabase db = dbHelper.getWritableDatabase(); + Map<String, List<ContentValues>> testData = createFakeDataV30(); + MigrationTestHelper.populateDb(db, testData); + + // Execution + getTestSubject().performMigration(db, 30, 31); + + // Assertion + MigrationTestHelper.verifyDataInDb(db, testData); + + String[] columns = + new String[] { + MeasurementTables.AsyncRegistrationContract.REDIRECT_BEHAVIOR, + }; + try (Cursor cursor = + db.query( + MeasurementTables.AsyncRegistrationContract.TABLE, + columns, /* selection */ + null, /* selectionArgs */ + null, /* groupBy */ + null, /* having */ + null, /* orderBy */ + null)) { + assertEquals(1, cursor.getCount()); + while (cursor.moveToNext()) { + assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS.name(), + cursor.getString(cursor.getColumnIndex(columns[0]))); + } + } + } + + private Map<String, List<ContentValues>> createFakeDataV30() { + Map<String, List<ContentValues>> tableRowsMap = new LinkedHashMap<>(); + + // AsyncRegistration table + List<ContentValues> asyncRegistrationRows = new ArrayList<>(); + ContentValues asyncRegistration = + ContentValueFixtures.generateAsyncRegistrationContentValuesV24(); + asyncRegistration.put( + MeasurementTables.AsyncRegistrationContract.ID, UUID.randomUUID().toString()); + asyncRegistrationRows.add(asyncRegistration); + tableRowsMap.put(MeasurementTables.AsyncRegistrationContract.TABLE, asyncRegistrationRows); + + return tableRowsMap; + } + + @Override + int getTargetVersion() { + return 31; + } + + @Override + AbstractMeasurementDbMigrator getTestSubject() { + return new MeasurementDbMigratorV31(); + } +} diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/DBSignalsUpdateMetadataTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/DBSignalsUpdateMetadataTest.java new file mode 100644 index 0000000000..f188393594 --- /dev/null +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/DBSignalsUpdateMetadataTest.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2023 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.signals; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertThrows; + +import android.adservices.common.AdTechIdentifier; +import android.adservices.common.CommonFixture; + +import org.junit.Test; + +public class DBSignalsUpdateMetadataTest { + + @Test + public void testCreateSignalsUpdateMetadata() { + AdTechIdentifier buyer = CommonFixture.VALID_BUYER_1; + DBSignalsUpdateMetadata signalsUpdateMetadata = + DBSignalsUpdateMetadata.create(buyer, CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI); + assertEquals(buyer, signalsUpdateMetadata.getBuyer()); + assertEquals( + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, + signalsUpdateMetadata.getLastSignalsUpdatedTime()); + } + + @Test + public void testBuildSignalsUpdateMetadata() { + AdTechIdentifier buyer = CommonFixture.VALID_BUYER_1; + DBSignalsUpdateMetadata signalsUpdatedTime = + DBSignalsUpdateMetadata.builder() + .setBuyer(buyer) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + assertEquals(buyer, signalsUpdatedTime.getBuyer()); + assertEquals( + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, + signalsUpdatedTime.getLastSignalsUpdatedTime()); + } + + @Test + public void testNullFails() { + assertThrows( + IllegalStateException.class, + () -> { + DBSignalsUpdateMetadata.builder().build(); + }); + } + + @Test + public void testEquals() { + AdTechIdentifier buyer = CommonFixture.VALID_BUYER_1; + DBSignalsUpdateMetadata signalsUpdateMetadata1 = + DBSignalsUpdateMetadata.builder() + .setBuyer(buyer) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + DBSignalsUpdateMetadata signalsUpdateMetadata2 = + DBSignalsUpdateMetadata.builder() + .setBuyer(buyer) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + assertEquals(signalsUpdateMetadata1, signalsUpdateMetadata2); + } + + @Test + public void testNotEquals() { + AdTechIdentifier buyer1 = CommonFixture.VALID_BUYER_1; + AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2; + DBSignalsUpdateMetadata signalsUpdateMetadata1 = + DBSignalsUpdateMetadata.builder() + .setBuyer(buyer1) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + DBSignalsUpdateMetadata signalsUpdateMetadata2 = + DBSignalsUpdateMetadata.builder() + .setBuyer(buyer2) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + assertNotEquals(signalsUpdateMetadata1, signalsUpdateMetadata2); + } + + @Test + public void testHashCode() { + AdTechIdentifier buyer = CommonFixture.VALID_BUYER_1; + DBSignalsUpdateMetadata signalsUpdateMetadata1 = + DBSignalsUpdateMetadata.builder() + .setBuyer(buyer) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + DBSignalsUpdateMetadata signalsUpdateMetadata2 = + DBSignalsUpdateMetadata.builder() + .setBuyer(buyer) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + assertEquals(signalsUpdateMetadata1.hashCode(), signalsUpdateMetadata2.hashCode()); + } +} diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/EncoderLogicHandlerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/EncoderLogicHandlerTest.java index f27a31a7f1..98b5af3054 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/EncoderLogicHandlerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/EncoderLogicHandlerTest.java @@ -76,6 +76,8 @@ public class EncoderLogicHandlerTest { @Mock private AdServicesHttpsClient mAdServicesHttpsClient; + @Mock private ProtectedSignalsDao mProtectedSignalsDao; + @Captor ArgumentCaptor<DBEncoderLogicMetadata> mDBEncoderLogicArgumentCaptor; private ListeningExecutorService mExecutorService = MoreExecutors.newDirectExecutorService(); @@ -90,6 +92,7 @@ public class EncoderLogicHandlerTest { mEncoderPersistenceDao, mEncoderEndpointsDao, mEncoderLogicMetadataDao, + mProtectedSignalsDao, mAdServicesHttpsClient, mExecutorService); } @@ -273,6 +276,7 @@ public class EncoderLogicHandlerTest { verify(mEncoderLogicMetadataDao).deleteEncoder(buyer); verify(mEncoderPersistenceDao).deleteEncoder(buyer); verify(mEncoderEndpointsDao).deleteEncoderEndpoint(buyer); + verify(mProtectedSignalsDao).deleteSignalsUpdateMetadata(buyer); } @Test @@ -290,6 +294,9 @@ public class EncoderLogicHandlerTest { verify(mEncoderEndpointsDao).deleteEncoderEndpoint(buyer1); verify(mEncoderEndpointsDao).deleteEncoderEndpoint(buyer2); + + verify(mProtectedSignalsDao).deleteSignalsUpdateMetadata(buyer1); + verify(mProtectedSignalsDao).deleteSignalsUpdateMetadata(buyer2); } @SuppressWarnings("FutureReturnValueIgnored") diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/ProtectedSignalsDaoTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/ProtectedSignalsDaoTest.java index fbf9546086..c7668d4d34 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/ProtectedSignalsDaoTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/ProtectedSignalsDaoTest.java @@ -20,7 +20,9 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -48,6 +50,7 @@ import org.mockito.Mock; import org.mockito.MockitoSession; import java.time.Duration; +import java.time.temporal.ChronoUnit; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -176,16 +179,27 @@ public class ProtectedSignalsDaoTest { public void testInsertAndDelete() { // Insert two signals mProtectedSignalsDao.insertAndDelete( + BUYER_1, + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, Arrays.asList(DBProtectedSignalFixture.SIGNAL, DBProtectedSignalFixture.SIGNAL), Collections.emptyList()); // Get all the signals for the test buyer List<DBProtectedSignal> readResult = mProtectedSignalsDao.getSignalsByBuyer(BUYER_1); + assertEquals( + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1).getLastSignalsUpdatedTime()); // Delete one of the signals and insert two more mProtectedSignalsDao.insertAndDelete( + BUYER_1, + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, Arrays.asList(DBProtectedSignalFixture.SIGNAL, DBProtectedSignalFixture.SIGNAL), readResult.subList(0, 1)); // Check that the deletions and insertion occurred readResult = mProtectedSignalsDao.getSignalsByBuyer(BUYER_1); + assertEquals( + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1).getLastSignalsUpdatedTime()); + assertEquals(3, readResult.size()); assertNotNull(readResult.get(0).getId()); assertEqualsExceptId(DBProtectedSignalFixture.SIGNAL, readResult.get(0)); @@ -197,17 +211,32 @@ public class ProtectedSignalsDaoTest { public void testDeleteSignalsBeforeTime() { // Insert two signals mProtectedSignalsDao.insertAndDelete( + BUYER_1, + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, Arrays.asList( DBProtectedSignalFixture.SIGNAL, DBProtectedSignalFixture.LATER_TIME_SIGNAL), Collections.emptyList()); + assertEquals( + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER_1) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(), + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); // Delete the older signal assertEquals( 1, - mProtectedSignalsDao.deleteSignalsBeforeTime( + mProtectedSignalsDao.deleteExpiredSignalsAndUpdateSignalsUpdateMetadata( DBProtectedSignalFixture.SIGNAL .getCreationTime() - .plus(Duration.ofMillis(1)))); + .plus(Duration.ofMillis(1)), + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI)); + assertEquals( + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER_1) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(), + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); // Check that the deletions and insertion occurred List<DBProtectedSignal> readResult = mProtectedSignalsDao.getSignalsByBuyer(BUYER_1); assertEquals(1, readResult.size()); @@ -226,7 +255,10 @@ public class ProtectedSignalsDaoTest { DBProtectedSignal signal2 = DBProtectedSignalFixture.getBuilder().setBuyer(BUYER_2).build(); // Insert two signals mProtectedSignalsDao.insertAndDelete( - Arrays.asList(signal1, signal2), Collections.emptyList()); + BUYER_1, + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, + Arrays.asList(signal1, signal2), + Collections.emptyList()); when(mEnrollmentDaoMock.getAllFledgeEnrolledAdTechs()) .thenReturn(new HashSet<>(Arrays.asList(BUYER_1, BUYER_2))); assertEquals(0, mProtectedSignalsDao.deleteDisallowedBuyerSignals(mEnrollmentDaoMock)); @@ -235,10 +267,17 @@ public class ProtectedSignalsDaoTest { assertEquals(1, readResult.size()); assertNotNull(readResult.get(0).getId()); assertEqualsExceptId(signal1, readResult.get(0)); + assertEquals( + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER_1) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(), + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); readResult = mProtectedSignalsDao.getSignalsByBuyer(BUYER_2); assertEquals(1, readResult.size()); assertNotNull(readResult.get(0).getId()); assertEqualsExceptId(signal2, readResult.get(0)); + assertNull(mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_2)); } @Test @@ -249,10 +288,37 @@ public class ProtectedSignalsDaoTest { DBProtectedSignalFixture.getBuilder().setBuyer(CommonFixture.VALID_BUYER_2).build(); // Insert two signals mProtectedSignalsDao.insertAndDelete( - Arrays.asList(signal1, signal2), Collections.emptyList()); + BUYER_1, + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, + List.of(signal1), + Collections.emptyList()); + mProtectedSignalsDao.insertAndDelete( + BUYER_2, + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI, + List.of(signal2), + Collections.emptyList()); + assertEquals( + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER_1) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(), + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); + assertEquals( + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER_2) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(), + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_2)); when(mEnrollmentDaoMock.getAllFledgeEnrolledAdTechs()) .thenReturn(Collections.singleton(CommonFixture.VALID_BUYER_1)); assertEquals(1, mProtectedSignalsDao.deleteDisallowedBuyerSignals(mEnrollmentDaoMock)); + assertEquals( + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER_1) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(), + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); + assertNull(mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_2)); // Check that the correct deletion occurred List<DBProtectedSignal> readResult = mProtectedSignalsDao.getSignalsByBuyer(BUYER_1); assertEquals(1, readResult.size()); @@ -264,8 +330,10 @@ public class ProtectedSignalsDaoTest { public void testDeleteDisallowedPackageSignalsNoSignals() { assertEquals( 0, - mProtectedSignalsDao.deleteAllDisallowedPackageSignals( - mPackageManagerMock, mFlagsMock)); + mProtectedSignalsDao.deleteAllDisallowedPackageSignalsAndUpdateSignalUpdateMetadata( + mPackageManagerMock, + mFlagsMock, + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI)); } @Test @@ -292,8 +360,10 @@ public class ProtectedSignalsDaoTest { assertEquals(2, readResult1.size()); assertEquals( 0, - mProtectedSignalsDao.deleteAllDisallowedPackageSignals( - mPackageManagerMock, new FlagsWithAllAppsAllowed())); + mProtectedSignalsDao.deleteAllDisallowedPackageSignalsAndUpdateSignalUpdateMetadata( + mPackageManagerMock, + new FlagsWithAllAppsAllowed(), + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI)); // Check that no deletion occurred List<DBProtectedSignal> readResult2 = mProtectedSignalsDao.getSignalsByBuyer(BUYER_1); assertEquals(2, readResult2.size()); @@ -322,13 +392,107 @@ public class ProtectedSignalsDaoTest { assertEquals(2, readResult1.size()); assertEquals( 1, - mProtectedSignalsDao.deleteAllDisallowedPackageSignals( - CONTEXT.getPackageManager(), new FlagsThatAllowOneApp())); + mProtectedSignalsDao.deleteAllDisallowedPackageSignalsAndUpdateSignalUpdateMetadata( + CONTEXT.getPackageManager(), + new FlagsThatAllowOneApp(), + CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI)); List<DBProtectedSignal> readResult2 = mProtectedSignalsDao.getSignalsByBuyer(BUYER_1); assertEquals(1, readResult2.size()); assertEquals(PACKAGE_1, readResult2.get(0).getPackageName()); } + @Test + public void testPersistMetadata() { + assertNull( + "Initial state of the table should be empty", + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); + + DBSignalsUpdateMetadata signalsUpdateMetadata = + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER_1) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + assertEquals( + "One entry should have been inserted", + 1, + mProtectedSignalsDao.persistSignalsUpdateMetadata(signalsUpdateMetadata)); + } + + @Test + public void testDeleteMetadata() { + assertNull( + "Initial state of the table should be empty", + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); + + DBSignalsUpdateMetadata signalsUpdateMetadata = + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER_1) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + assertEquals( + "One entry should have been inserted", + 1, + mProtectedSignalsDao.persistSignalsUpdateMetadata(signalsUpdateMetadata)); + + mProtectedSignalsDao.deleteSignalsUpdateMetadata(BUYER_1); + assertNull( + "Metadata should have been deleted", + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); + } + + @Test + public void testQuerySignalsUpdateMetadata() { + assertNull( + "Initial state of the table should be empty", + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); + + DBSignalsUpdateMetadata signalsUpdateMetadata = + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER_1) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + assertEquals( + "One entry should have been inserted", + 1, + mProtectedSignalsDao.persistSignalsUpdateMetadata(signalsUpdateMetadata)); + DBSignalsUpdateMetadata retrieved = mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1); + + assertEquals(signalsUpdateMetadata.getBuyer(), retrieved.getBuyer()); + assertEquals( + signalsUpdateMetadata.getLastSignalsUpdatedTime(), + retrieved.getLastSignalsUpdatedTime()); + } + + @Test + public void testPersistMetadataReplacesExisting() { + assertNull( + "Initial state of the table should be empty", + mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1)); + + DBSignalsUpdateMetadata.Builder anBuilder = + DBSignalsUpdateMetadata.builder().setBuyer(BUYER_1); + DBSignalsUpdateMetadata previous = + anBuilder + .setLastSignalsUpdatedTime(CommonFixture.FIXED_NOW_TRUNCATED_TO_MILLI) + .build(); + mProtectedSignalsDao.persistSignalsUpdateMetadata(previous); + + DBSignalsUpdateMetadata retrieved = mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1); + assertEquals(previous.getLastSignalsUpdatedTime(), retrieved.getLastSignalsUpdatedTime()); + + DBSignalsUpdateMetadata updated = + anBuilder + .setLastSignalsUpdatedTime( + CommonFixture.FIXED_NEXT_ONE_DAY.truncatedTo(ChronoUnit.MILLIS)) + .build(); + + mProtectedSignalsDao.persistSignalsUpdateMetadata(updated); + retrieved = mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER_1); + assertNotEquals( + previous.getLastSignalsUpdatedTime(), retrieved.getLastSignalsUpdatedTime()); + assertEquals(updated.getLastSignalsUpdatedTime(), retrieved.getLastSignalsUpdatedTime()); + } + private void assertEqualsExceptId(DBProtectedSignal expected, DBProtectedSignal actual) { assertEquals(expected.getBuyer(), actual.getBuyer()); assertArrayEquals(expected.getKey(), actual.getKey()); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/ProtectedSignalsDatabaseMigrationTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/ProtectedSignalsDatabaseMigrationTest.java index 2c668cca7a..82fa411ef3 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/ProtectedSignalsDatabaseMigrationTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/data/signals/ProtectedSignalsDatabaseMigrationTest.java @@ -57,7 +57,7 @@ public class ProtectedSignalsDatabaseMigrationTest { assertFalse(tables.contains(DBEncodedPayload.TABLE_NAME)); assertFalse(tables.contains(DBEncoderEndpoint.TABLE_NAME)); } - // Re-open the database with version 3. + // Re-open the database with version 2. try (SupportSQLiteDatabase db = helper.runMigrationsAndValidate(TEST_DB, 2, true)) { List<String> tables = listTables(db); assertTrue(tables.contains(DBProtectedSignal.TABLE_NAME)); @@ -119,4 +119,25 @@ public class ProtectedSignalsDatabaseMigrationTest { CommonFixture.VALID_BUYER_2.toString(), c.getString(c.getColumnIndex("buyer"))); } } + + @Test + public void testMigration3To4() throws IOException { + try (SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 3)) { + List<String> tables = listTables(db); + assertTrue(tables.contains(DBProtectedSignal.TABLE_NAME)); + assertTrue(tables.contains(DBEncoderLogicMetadata.TABLE_NAME)); + assertTrue(tables.contains(DBEncodedPayload.TABLE_NAME)); + assertTrue(tables.contains(DBEncoderEndpoint.TABLE_NAME)); + assertFalse(tables.contains(DBSignalsUpdateMetadata.TABLE_NAME)); + } + // Re-open the database with version 4. + try (SupportSQLiteDatabase db = helper.runMigrationsAndValidate(TEST_DB, 4, true)) { + List<String> tables = listTables(db); + assertTrue(tables.contains(DBProtectedSignal.TABLE_NAME)); + assertTrue(tables.contains(DBEncoderLogicMetadata.TABLE_NAME)); + assertTrue(tables.contains(DBEncodedPayload.TABLE_NAME)); + assertTrue(tables.contains(DBEncoderEndpoint.TABLE_NAME)); + assertTrue(tables.contains(DBSignalsUpdateMetadata.TABLE_NAME)); + } + } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/PhFlagsTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/PhFlagsTest.java index c5e9716b3d..f86269555f 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/PhFlagsTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/PhFlagsTest.java @@ -50,17 +50,19 @@ import static com.android.adservices.service.Flags.DEFAULT_ADSERVICES_CONSENT_MI import static com.android.adservices.service.Flags.DEFAULT_ADSERVICES_ENABLEMENT_CHECK_ENABLED; import static com.android.adservices.service.Flags.DEFAULT_ADSERVICES_VERSION_MAPPINGS; import static com.android.adservices.service.Flags.DEFAULT_AD_ID_FETCHER_TIMEOUT_MS; +import static com.android.adservices.service.Flags.DEFAULT_APPSEARCH_READ_TIMEOUT_MS; +import static com.android.adservices.service.Flags.DEFAULT_APPSEARCH_WRITE_TIMEOUT_MS; import static com.android.adservices.service.Flags.DEFAULT_AUCTION_SERVER_AD_ID_FETCHER_TIMEOUT_MS; import static com.android.adservices.service.Flags.DEFAULT_BACKGROUND_JOB_SAMPLING_LOGGING_RATE; import static com.android.adservices.service.Flags.DEFAULT_BLOCKED_TOPICS_SOURCE_OF_TRUTH; import static com.android.adservices.service.Flags.DEFAULT_CLASSIFIER_TYPE; import static com.android.adservices.service.Flags.DEFAULT_COMPUTE_VERSION_FROM_MAPPINGS_ENABLED; +import static com.android.adservices.service.Flags.DEFAULT_CONSENT_MANAGER_OTA_DEBUG_MODE; import static com.android.adservices.service.Flags.DEFAULT_CONSENT_SOURCE_OF_TRUTH; import static com.android.adservices.service.Flags.DEFAULT_ENABLE_ADEXT_DATA_SERVICE_APIS; import static com.android.adservices.service.Flags.DEFAULT_ENABLE_ADEXT_SERVICE_DEBUG_PROXY; import static com.android.adservices.service.Flags.DEFAULT_ENABLE_ADSERVICES_API_ENABLED; import static com.android.adservices.service.Flags.DEFAULT_ENABLE_AD_SERVICES_SYSTEM_API; -import static com.android.adservices.service.Flags.DEFAULT_EU_NOTIF_FLOW_CHANGE_ENABLED; import static com.android.adservices.service.Flags.DEFAULT_MAINLINE_TRAIN_VERSION; import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_ASYNC_REGISTRATION_JOB_TRIGGER_MAX_DELAY_MS; import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_ASYNC_REGISTRATION_JOB_TRIGGER_MIN_DELAY_MS; @@ -68,7 +70,6 @@ import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_ATTRIBUTI import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_DEBUG_JOIN_KEY_ENROLLMENT_ALLOWLIST; import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_DEBUG_JOIN_KEY_HASH_LIMIT; import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_ENABLE_COARSE_EVENT_REPORT_DESTINATIONS; -import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_ENABLE_VTC_CONFIGURABLE_MAX_EVENT_REPORTS; import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_MAX_AGGREGATE_DEDUPLICATION_KEYS_PER_REGISTRATION; import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_MAX_AGGREGATE_REPORT_UPLOAD_RETRY_WINDOW_MS; import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_MAX_ATTRIBUTIONS_PER_INVOCATION; @@ -83,9 +84,8 @@ import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_PLATFORM_ import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_PLATFORM_DEBUG_AD_ID_MATCHING_LIMIT; import static com.android.adservices.service.Flags.DEFAULT_MEASUREMENT_VTC_CONFIGURABLE_MAX_EVENT_REPORTS_COUNT; import static com.android.adservices.service.Flags.DEFAULT_NOTIFICATION_DISMISSED_ON_CLICK; -import static com.android.adservices.service.Flags.DEFAULT_RVC_NOTIFICATION_ENABLED; +import static com.android.adservices.service.Flags.DEFAULT_RVC_POST_OTA_NOTIFICATION_ENABLED; import static com.android.adservices.service.Flags.DEFAULT_RVC_POST_OTA_NOTIF_AGE_CHECK; -import static com.android.adservices.service.Flags.DEFAULT_CONSENT_MANAGER_OTA_DEBUG_MODE; import static com.android.adservices.service.Flags.DEFAULT_U18_UX_ENABLED; import static com.android.adservices.service.Flags.DISABLE_FLEDGE_ENROLLMENT_CHECK; import static com.android.adservices.service.Flags.DISABLE_MEASUREMENT_ENROLLMENT_CHECK; @@ -283,15 +283,12 @@ import static com.android.adservices.service.Flags.MEASUREMENT_DELETE_EXPIRED_JO import static com.android.adservices.service.Flags.MEASUREMENT_DELETE_UNINSTALLED_JOB_PERIOD_MS; import static com.android.adservices.service.Flags.MEASUREMENT_DELETE_UNINSTALLED_JOB_PERSISTED; import static com.android.adservices.service.Flags.MEASUREMENT_DESTINATION_RATE_LIMIT_WINDOW; -import static com.android.adservices.service.Flags.MEASUREMENT_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_AGGREGATABLE_REPORT_PAYLOAD_PADDING; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_API_STATUS_ALLOW_LIST_CHECK; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_APP_PACKAGE_NAME_LOGGING; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_ARA_DEDUPLICATION_ALIGNMENT_V1; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_ARA_PARSING_ALIGNMENT_V1; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_CONFIGURABLE_AGGREGATE_REPORT_DELAY; -import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_CONFIGURABLE_EVENT_REPORTING_WINDOWS; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_DATASTORE_MANAGER_THROW_DATASTORE_EXCEPTION; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_DEBUG_REPORT; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_DELETE_REPORTS_ON_UNRECOVERABLE_EXCEPTION; @@ -299,6 +296,7 @@ import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_DESTINATIO import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_LOOKBACK_WINDOW_FILTER; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_MAX_AGGREGATE_REPORTS_PER_SOURCE; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_PREINSTALL_CHECK; +import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_REDIRECT_TO_WELL_KNOWN_PATH; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_REPORTING_JOBS_THROW_JSON_EXCEPTION; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_REPORTING_JOBS_THROW_UNACCOUNTED_EXCEPTION; import static com.android.adservices.service.Flags.MEASUREMENT_ENABLE_SCOPED_ATTRIBUTION_RATE_LIMIT; @@ -323,7 +321,6 @@ import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_FALLBACK_RE import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_FALLBACK_REPORTING_JOB_REQUIRED_BATTERY_NOT_LOW; import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_FALLBACK_REPORTING_JOB_REQUIRED_NETWORK_TYPE; import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_MAIN_REPORTING_JOB_PERIOD_MS; -import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_NOISE_PROBABILITY; import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_REPORTING_JOB_PERSISTED; import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_REPORTING_JOB_REQUIRED_BATTERY_NOT_LOW; import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_REPORTING_JOB_REQUIRED_NETWORK_TYPE; @@ -338,10 +335,6 @@ import static com.android.adservices.service.Flags.MEASUREMENT_FLEX_API_MAX_INFO import static com.android.adservices.service.Flags.MEASUREMENT_FLEX_API_MAX_INFORMATION_GAIN_NAVIGATION; import static com.android.adservices.service.Flags.MEASUREMENT_FLEX_API_MAX_TRIGGER_DATA_CARDINALITY; import static com.android.adservices.service.Flags.MEASUREMENT_FLEX_LITE_API_ENABLED; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY; import static com.android.adservices.service.Flags.MEASUREMENT_IS_CLICK_VERIFICATION_ENABLED; import static com.android.adservices.service.Flags.MEASUREMENT_IS_CLICK_VERIFIED_BY_INPUT_EVENT; import static com.android.adservices.service.Flags.MEASUREMENT_JOB_AGGREGATE_FALLBACK_REPORTING_KILL_SWITCH; @@ -386,7 +379,6 @@ import static com.android.adservices.service.Flags.MEASUREMENT_MIN_INSTALL_ATTRI import static com.android.adservices.service.Flags.MEASUREMENT_MIN_POST_INSTALL_EXCLUSIVITY_WINDOW; import static com.android.adservices.service.Flags.MEASUREMENT_MIN_REPORTING_ORIGIN_UPDATE_WINDOW; import static com.android.adservices.service.Flags.MEASUREMENT_MIN_REPORTING_REGISTER_SOURCE_EXPIRATION_IN_SECONDS; -import static com.android.adservices.service.Flags.MEASUREMENT_NAVIGATION_NOISE_PROBABILITY; import static com.android.adservices.service.Flags.MEASUREMENT_NETWORK_CONNECT_TIMEOUT_MS; import static com.android.adservices.service.Flags.MEASUREMENT_NETWORK_READ_TIMEOUT_MS; import static com.android.adservices.service.Flags.MEASUREMENT_RATE_LIMIT_WINDOW_MILLISECONDS; @@ -442,6 +434,7 @@ import static com.android.adservices.service.Flags.TOPICS_NUMBER_OF_TOP_TOPICS; import static com.android.adservices.service.Flags.TOPICS_ON_DEVICE_CLASSIFIER_KILL_SWITCH; import static com.android.adservices.service.Flags.TOPICS_PERCENTAGE_FOR_RANDOM_TOPIC; import static com.android.adservices.service.Flags.TOPICS_PRIVACY_BUDGET_FOR_TOPIC_ID_DISTRIBUTION; +import static com.android.adservices.service.Flags.TOPICS_TEST_ENCRYPTION_PUBLIC_KEY; import static com.android.adservices.service.Flags.UI_DIALOG_FRAGMENT; import static com.android.adservices.service.Flags.UI_EEA_COUNTRIES; import static com.android.adservices.service.Flags.UI_FEATURE_TYPE_LOGGING_ENABLED; @@ -474,8 +467,8 @@ import static com.android.adservices.service.FlagsConstants.KEY_COBALT_LOGGING_E import static com.android.adservices.service.FlagsConstants.KEY_COBALT_LOGGING_JOB_PERIOD_MS; import static com.android.adservices.service.FlagsConstants.KEY_COBALT_UPLOAD_SERVICE_UNBIND_DELAY_MS; import static com.android.adservices.service.FlagsConstants.KEY_COMPAT_LOGGING_KILL_SWITCH; -import static com.android.adservices.service.FlagsConstants.KEY_CONSENT_MANAGER_OTA_DEBUG_MODE; import static com.android.adservices.service.FlagsConstants.KEY_CONSENT_ALREADY_INTERACTED_FIX_ENABLE; +import static com.android.adservices.service.FlagsConstants.KEY_CONSENT_MANAGER_OTA_DEBUG_MODE; import static com.android.adservices.service.FlagsConstants.KEY_CONSENT_NOTIFICATION_ACTIVITY_DEBUG_MODE; import static com.android.adservices.service.FlagsConstants.KEY_CONSENT_NOTIFICATION_RESET_TOKEN; import static com.android.adservices.service.FlagsConstants.KEY_CONSENT_NOTIFIED_DEBUG_MODE; @@ -513,7 +506,6 @@ import static com.android.adservices.service.FlagsConstants.KEY_ENROLLMENT_BLOCK import static com.android.adservices.service.FlagsConstants.KEY_ENROLLMENT_ENABLE_LIMITED_LOGGING; import static com.android.adservices.service.FlagsConstants.KEY_ENROLLMENT_MDD_RECORD_DELETION_ENABLED; import static com.android.adservices.service.FlagsConstants.KEY_ERROR_CODE_LOGGING_DENY_LIST; -import static com.android.adservices.service.FlagsConstants.KEY_EU_NOTIF_FLOW_CHANGE_ENABLED; import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_AD_COUNTER_HISTOGRAM_ABSOLUTE_MAX_PER_BUYER_EVENT_COUNT; import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_AD_COUNTER_HISTOGRAM_ABSOLUTE_MAX_TOTAL_EVENT_COUNT; import static com.android.adservices.service.FlagsConstants.KEY_FLEDGE_AD_COUNTER_HISTOGRAM_LOWER_MAX_PER_BUYER_EVENT_COUNT; @@ -676,8 +668,6 @@ import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_DELE import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_DELETE_UNINSTALLED_JOB_PERIOD_MS; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_DELETE_UNINSTALLED_JOB_PERSISTED; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_DESTINATION_RATE_LIMIT_WINDOW; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_AGGREGATABLE_REPORT_PAYLOAD_PADDING; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_API_STATUS_ALLOW_LIST_CHECK; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_APP_PACKAGE_NAME_LOGGING; @@ -685,7 +675,6 @@ import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENAB import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_ARA_PARSING_ALIGNMENT_V1; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_COARSE_EVENT_REPORT_DESTINATIONS; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_CONFIGURABLE_AGGREGATE_REPORT_DELAY; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_CONFIGURABLE_EVENT_REPORTING_WINDOWS; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_DATASTORE_MANAGER_THROW_DATASTORE_EXCEPTION; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_DEBUG_REPORT; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_DELETE_REPORTS_ON_UNRECOVERABLE_EXCEPTION; @@ -693,6 +682,7 @@ import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENAB import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_LOOKBACK_WINDOW_FILTER; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_MAX_AGGREGATE_REPORTS_PER_SOURCE; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_PREINSTALL_CHECK; +import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_REDIRECT_TO_WELL_KNOWN_PATH; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_REPORTING_JOBS_THROW_CRYPTO_EXCEPTION; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_REPORTING_JOBS_THROW_JSON_EXCEPTION; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_REPORTING_JOBS_THROW_UNACCOUNTED_EXCEPTION; @@ -703,7 +693,6 @@ import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENAB import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_SOURCE_DEBUG_REPORT; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_TRIGGER_DATA_MATCHING; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_TRIGGER_DEBUG_REPORT; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_VTC_CONFIGURABLE_MAX_EVENT_REPORTS; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENABLE_XNA; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENFORCE_ENROLLMENT_ORIGIN_MATCH; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_ENFORCE_FOREGROUND_STATUS_DELETE_REGISTRATIONS; @@ -718,7 +707,6 @@ import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_EVEN import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_EVENT_FALLBACK_REPORTING_JOB_REQUIRED_BATTERY_NOT_LOW; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_EVENT_FALLBACK_REPORTING_JOB_REQUIRED_NETWORK_TYPE; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_EVENT_MAIN_REPORTING_JOB_PERIOD_MS; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_EVENT_NOISE_PROBABILITY; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_EVENT_REPORTING_JOB_PERSISTED; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_EVENT_REPORTING_JOB_REQUIRED_BATTERY_NOT_LOW; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_EVENT_REPORTING_JOB_REQUIRED_NETWORK_TYPE; @@ -733,10 +721,6 @@ import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_FLEX import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_FLEX_API_MAX_INFORMATION_GAIN_NAVIGATION; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_FLEX_API_MAX_TRIGGER_DATA_CARDINALITY; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_FLEX_LITE_API_ENABLED; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_IS_CLICK_VERIFICATION_ENABLED; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_IS_CLICK_VERIFIED_BY_INPUT_EVENT; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_JOB_AGGREGATE_FALLBACK_REPORTING_KILL_SWITCH; @@ -791,7 +775,6 @@ import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_MIN_ import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_MIN_POST_INSTALL_EXCLUSIVITY_WINDOW; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_MIN_REPORTING_ORIGIN_UPDATE_WINDOW; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_MIN_REPORTING_REGISTER_SOURCE_EXPIRATION_IN_SECONDS; -import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_NAVIGATION_NOISE_PROBABILITY; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_NETWORK_CONNECT_TIMEOUT_MS; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_NETWORK_READ_TIMEOUT_MS; import static com.android.adservices.service.FlagsConstants.KEY_MEASUREMENT_RATE_LIMIT_WINDOW_MILLISECONDS; @@ -828,7 +811,7 @@ import static com.android.adservices.service.FlagsConstants.KEY_PROTECTED_SIGNAL import static com.android.adservices.service.FlagsConstants.KEY_PROTECTED_SIGNALS_PERIODIC_ENCODING_JOB_PERIOD_MS; import static com.android.adservices.service.FlagsConstants.KEY_PROTECTED_SIGNALS_SERVICE_KILL_SWITCH; import static com.android.adservices.service.FlagsConstants.KEY_RECORD_MANUAL_INTERACTION_ENABLED; -import static com.android.adservices.service.FlagsConstants.KEY_RVC_NOTIFICATION_ENABLED; +import static com.android.adservices.service.FlagsConstants.KEY_RVC_POST_OTA_NOTIFICATION_ENABLED; import static com.android.adservices.service.FlagsConstants.KEY_RVC_POST_OTA_NOTIF_AGE_CHECK; import static com.android.adservices.service.FlagsConstants.KEY_RVC_UX_ENABLED; import static com.android.adservices.service.FlagsConstants.KEY_SDK_REQUEST_PERMITS_PER_SECOND; @@ -847,6 +830,7 @@ import static com.android.adservices.service.FlagsConstants.KEY_TOPICS_NUMBER_OF import static com.android.adservices.service.FlagsConstants.KEY_TOPICS_ON_DEVICE_CLASSIFIER_KILL_SWITCH; import static com.android.adservices.service.FlagsConstants.KEY_TOPICS_PERCENTAGE_FOR_RANDOM_TOPIC; import static com.android.adservices.service.FlagsConstants.KEY_TOPICS_PRIVACY_BUDGET_FOR_TOPIC_ID_DISTRIBUTION; +import static com.android.adservices.service.FlagsConstants.KEY_TOPICS_TEST_ENCRYPTION_PUBLIC_KEY; import static com.android.adservices.service.FlagsConstants.KEY_U18_UX_ENABLED; import static com.android.adservices.service.FlagsConstants.KEY_UI_DIALOG_FRAGMENT_ENABLED; import static com.android.adservices.service.FlagsConstants.KEY_UI_EEA_COUNTRIES; @@ -854,7 +838,6 @@ import static com.android.adservices.service.FlagsConstants.KEY_UI_FEATURE_TYPE_ import static com.android.adservices.service.FlagsConstants.KEY_UI_OTA_STRINGS_MANIFEST_FILE_URL; import static com.android.adservices.service.FlagsConstants.KEY_UI_TOGGLE_SPEED_BUMP_ENABLED; - import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; @@ -1125,6 +1108,23 @@ public class PhFlagsTest { } @Test + public void testGetTopicsTestEncryptionPublicKey() { + assertThat(mPhFlags.getTopicsTestEncryptionPublicKey()) + .isEqualTo(TOPICS_TEST_ENCRYPTION_PUBLIC_KEY); + assertThat(mPhFlags.getTopicsTestEncryptionPublicKey()).isEmpty(); + + // Now overriding with the value from PH. + String phOverridingValue = "NewKey"; + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_ADSERVICES, + KEY_TOPICS_TEST_ENCRYPTION_PUBLIC_KEY, + phOverridingValue, + /* makeDefault */ false); + + assertThat(mPhFlags.getTopicsTestEncryptionPublicKey()).isEqualTo(phOverridingValue); + } + + @Test public void testClassifierType() { // Without any overriding, the value is the hard coded constant. assertThat(mPhFlags.getClassifierType()).isEqualTo(DEFAULT_CLASSIFIER_TYPE); @@ -5284,24 +5284,6 @@ public class PhFlagsTest { } @Test - public void testGetMeasurementEnableConfigurableEventReportingWindows() { - // Without any overriding, the value is the hard coded constant. - assertThat(mPhFlags.getMeasurementEnableConfigurableEventReportingWindows()) - .isEqualTo(MEASUREMENT_ENABLE_CONFIGURABLE_EVENT_REPORTING_WINDOWS); - - boolean phOverridingValue = !MEASUREMENT_ENABLE_CONFIGURABLE_EVENT_REPORTING_WINDOWS; - - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_ENABLE_CONFIGURABLE_EVENT_REPORTING_WINDOWS, - Boolean.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementEnableConfigurableEventReportingWindows()) - .isEqualTo(phOverridingValue); - } - - @Test public void testGetMeasurementEventReportsVtcEarlyReportingWindows() { // Without any overriding, the value is the hard coded constant. assertThat(mPhFlags.getMeasurementEventReportsVtcEarlyReportingWindows()) @@ -7351,22 +7333,6 @@ public class PhFlagsTest { } @Test - public void testEuNotifFlowChangeEnabled() { - // Without any overriding, the value is the hard coded constant. - assertThat(mPhFlags.getEuNotifFlowChangeEnabled()) - .isEqualTo(DEFAULT_EU_NOTIF_FLOW_CHANGE_ENABLED); - - boolean phOverridingValue = !DEFAULT_EU_NOTIF_FLOW_CHANGE_ENABLED; - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_EU_NOTIF_FLOW_CHANGE_ENABLED, - Boolean.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getEuNotifFlowChangeEnabled()).isEqualTo(phOverridingValue); - } - - @Test public void testGetRecordManualInteractionEnabled() { // Without any overriding, the value is the hard coded constant. assertThat(mPhFlags.getRecordManualInteractionEnabled()) @@ -7677,7 +7643,8 @@ public class PhFlagsTest { boolean adServicesSystemApi, boolean phOverridingValue, boolean expected) { // Without any overriding, the value is the hard coded constant. - assertThat(mPhFlags.getEnableRvcNotification()).isEqualTo(DEFAULT_RVC_NOTIFICATION_ENABLED); + assertThat(mPhFlags.getEnableRvcPostOtaNotification()) + .isEqualTo(DEFAULT_RVC_POST_OTA_NOTIFICATION_ENABLED); DeviceConfig.setProperty( DeviceConfig.NAMESPACE_ADSERVICES, @@ -7686,11 +7653,11 @@ public class PhFlagsTest { /* makeDefault */ false); DeviceConfig.setProperty( DeviceConfig.NAMESPACE_ADSERVICES, - KEY_RVC_NOTIFICATION_ENABLED, + KEY_RVC_POST_OTA_NOTIFICATION_ENABLED, Boolean.toString(phOverridingValue), /* makeDefault */ false); - assertThat(mPhFlags.getEnableRvcNotification()).isEqualTo(expected); + assertThat(mPhFlags.getEnableRvcPostOtaNotification()).isEqualTo(expected); } @Test @@ -7919,144 +7886,6 @@ public class PhFlagsTest { } @Test - public void testGetMeasurementInstallAttrDualDestinationEventNoiseProbability() { - assertThat(mPhFlags.getMeasurementInstallAttrDualDestinationEventNoiseProbability()) - .isEqualTo(MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY); - - // Now overriding with the value from PH. - float phOverridingValue = - MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY + .0001f; - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY, - Float.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementInstallAttrDualDestinationEventNoiseProbability()) - .isEqualTo(phOverridingValue); - } - - @Test - public void testGetMeasurementDualDestinationNavigationNoiseProbability() { - assertThat(mPhFlags.getMeasurementDualDestinationNavigationNoiseProbability()) - .isEqualTo(MEASUREMENT_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY); - - // Now overriding with the value from PH. - float phOverridingValue = - MEASUREMENT_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY + .0001f; - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY, - Float.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementDualDestinationNavigationNoiseProbability()) - .isEqualTo(phOverridingValue); - } - - @Test - public void testGetMeasurementInstallAttrDualDestinationNavigationNoiseProbability() { - assertThat(mPhFlags.getMeasurementInstallAttrDualDestinationNavigationNoiseProbability()) - .isEqualTo(MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY); - - // Now overriding with the value from PH. - float phOverridingValue = - MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY + .0001f; - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY, - Float.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementInstallAttrDualDestinationNavigationNoiseProbability()) - .isEqualTo(phOverridingValue); - } - - @Test - public void testGetMeasurementDualDestinationEventNoiseProbability() { - assertThat(mPhFlags.getMeasurementDualDestinationEventNoiseProbability()) - .isEqualTo(MEASUREMENT_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY); - - // Now overriding with the value from PH. - float phOverridingValue = MEASUREMENT_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY + .0001f; - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY, - Float.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementDualDestinationEventNoiseProbability()) - .isEqualTo(phOverridingValue); - } - - @Test - public void testGetMeasurementInstallAttrEventNoiseProbability() { - assertThat(mPhFlags.getMeasurementInstallAttrEventNoiseProbability()) - .isEqualTo(MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY); - - // Now overriding with the value from PH. - float phOverridingValue = MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY + .0001f; - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY, - Float.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementInstallAttrEventNoiseProbability()) - .isEqualTo(phOverridingValue); - } - - @Test - public void testGetMeasurementInstallAttrNavigationNoiseProbability() { - assertThat(mPhFlags.getMeasurementInstallAttrNavigationNoiseProbability()) - .isEqualTo(MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY); - - // Now overriding with the value from PH. - float phOverridingValue = MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY + .0001f; - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY, - Float.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementInstallAttrNavigationNoiseProbability()) - .isEqualTo(phOverridingValue); - } - - @Test - public void testGetMeasurementEventNoiseProbability() { - assertThat(mPhFlags.getMeasurementEventNoiseProbability()) - .isEqualTo(MEASUREMENT_EVENT_NOISE_PROBABILITY); - - // Now overriding with the value from PH. - float phOverridingValue = MEASUREMENT_EVENT_NOISE_PROBABILITY + .0001f; - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_EVENT_NOISE_PROBABILITY, - Float.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementEventNoiseProbability()).isEqualTo(phOverridingValue); - } - - @Test - public void testGetMeasurementNavigationNoiseProbability() { - assertThat(mPhFlags.getMeasurementNavigationNoiseProbability()) - .isEqualTo(MEASUREMENT_NAVIGATION_NOISE_PROBABILITY); - - // Now overriding with the value from PH. - float phOverridingValue = MEASUREMENT_NAVIGATION_NOISE_PROBABILITY + .0001f; - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, - Float.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementNavigationNoiseProbability()) - .isEqualTo(phOverridingValue); - } - - @Test public void testGetMeasurementEnablePreinstallCheck() { // The priority of applying the flag values: PH (DeviceConfig) and then hard-coded value. assertThat(mPhFlags.getMeasurementEnablePreinstallCheck()) @@ -8182,24 +8011,6 @@ public class PhFlagsTest { } @Test - public void testGetMeasurementEnableVtcConfigurableMaxEventReports() { - // Without any overriding, the value is the hard coded constant. - assertThat(mPhFlags.getMeasurementEnableVtcConfigurableMaxEventReports()) - .isEqualTo(DEFAULT_MEASUREMENT_ENABLE_VTC_CONFIGURABLE_MAX_EVENT_REPORTS); - - boolean phOverridingValue = !DEFAULT_MEASUREMENT_ENABLE_VTC_CONFIGURABLE_MAX_EVENT_REPORTS; - - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - KEY_MEASUREMENT_ENABLE_VTC_CONFIGURABLE_MAX_EVENT_REPORTS, - Boolean.toString(phOverridingValue), - /* makeDefault */ false); - - assertThat(mPhFlags.getMeasurementEnableVtcConfigurableMaxEventReports()) - .isEqualTo(phOverridingValue); - } - - @Test public void testGetMeasurementVtcConfigurableMaxEventReportsCount() { // Without any overriding, the value is the hard coded constant. assertThat(mPhFlags.getMeasurementVtcConfigurableMaxEventReportsCount()) @@ -9710,6 +9521,22 @@ public class PhFlagsTest { } @Test + public void testGetMeasurementEnableRedirectToWellKnownPath() { + assertThat(mPhFlags.getMeasurementEnableRedirectToWellKnownPath()) + .isEqualTo(MEASUREMENT_ENABLE_REDIRECT_TO_WELL_KNOWN_PATH); + + boolean phOverridingValue = !MEASUREMENT_ENABLE_REDIRECT_TO_WELL_KNOWN_PATH; + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_ADSERVICES, + KEY_MEASUREMENT_ENABLE_REDIRECT_TO_WELL_KNOWN_PATH, + Boolean.toString(phOverridingValue), + /* makeDefault */ false); + + assertThat(mPhFlags.getMeasurementEnableRedirectToWellKnownPath()) + .isEqualTo(phOverridingValue); + } + + @Test public void testGetMeasurementEnableMaxAggregateReportsPerSource() { assertThat(mPhFlags.getMeasurementEnableMaxAggregateReportsPerSource()) .isEqualTo(MEASUREMENT_ENABLE_MAX_AGGREGATE_REPORTS_PER_SOURCE); @@ -10140,6 +9967,37 @@ public class PhFlagsTest { assertThrows(IllegalArgumentException.class, mPhFlags::getBackgroundJobSamplingLoggingRate); } + @Test + public void testGetAppSearchWriteTimeout() { + // Without any overriding, the value is the hard coded constant. + assertThat(mPhFlags.getAppSearchWriteTimeout()) + .isEqualTo(DEFAULT_APPSEARCH_WRITE_TIMEOUT_MS); + + int phOverridingValue = DEFAULT_APPSEARCH_WRITE_TIMEOUT_MS + 1000; + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_ADSERVICES, + FlagsConstants.KEY_APPSEARCH_WRITE_TIMEOUT_MS, + Integer.toString(phOverridingValue), + /* makeDefault */ false); + + assertThat(mPhFlags.getAppSearchWriteTimeout()).isEqualTo(phOverridingValue); + } + + @Test + public void testGetAppSearchReadTimeout() { + // Without any overriding, the value is the hard coded constant. + assertThat(mPhFlags.getAppSearchReadTimeout()).isEqualTo(DEFAULT_APPSEARCH_READ_TIMEOUT_MS); + + int phOverridingValue = DEFAULT_APPSEARCH_READ_TIMEOUT_MS + 500; + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_ADSERVICES, + FlagsConstants.KEY_APPSEARCH_READ_TIMEOUT_MS, + Integer.toString(phOverridingValue), + /* makeDefault */ false); + + assertThat(mPhFlags.getAppSearchReadTimeout()).isEqualTo(phOverridingValue); + } + private void overrideBackgroundJobSamplingLoggingRate(int phOverridingValue) { DeviceConfig.setProperty( DeviceConfig.NAMESPACE_ADSERVICES, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java index 490e585d42..ef9ba9f170 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java @@ -92,7 +92,7 @@ public class AdFiltererImplTest { .build(); private static final SignedContextualAds.Builder CONTEXTUAL_ADS_BUILDER = - SignedContextualAdsFixture.aSignedContextualAdBuilder() + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder() .setAdsWithBid(ImmutableList.of(new AdWithBid(AD_DATA, 1.0))) .setBuyer(CommonFixture.VALID_BUYER_1) .setDecisionLogicUri( diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java index 7e3e358d9e..cc7aed1ef0 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java @@ -48,7 +48,7 @@ public class AdFiltererNoOpImplTest { AdDataFixture.getValidFilterAdDataBuilderByBuyer(CommonFixture.VALID_BUYER_1, 0); private static final SignedContextualAds.Builder CONTEXTUAL_ADS_BUILDER = - SignedContextualAdsFixture.aSignedContextualAdBuilder() + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder() .setAdsWithBid(ImmutableList.of(new AdWithBid(AD_DATA_BUILDER.build(), 1.0))) .setBuyer(CommonFixture.VALID_BUYER_1) .setDecisionLogicUri( diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java index a66caecaf2..074da6b503 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java @@ -16,8 +16,6 @@ package com.android.adservices.service.adselection; -import static android.adservices.adselection.SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE; - import static com.android.adservices.service.adselection.AdSelectionConfigValidator.DECISION_LOGIC_URI_TYPE; import static com.android.adservices.service.adselection.AdSelectionConfigValidator.TRUSTED_SCORING_SIGNALS_URI_TYPE; @@ -351,7 +349,7 @@ public class AdSelectionConfigValidatorTest { Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>(); AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2; SignedContextualAds contextualAds2 = - SignedContextualAdsFixture.generateSignedContextualAds( + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder( buyer2, ImmutableList.of(100.0, 200.0)) .setDecisionLogicUri( CommonFixture.getUri( @@ -380,7 +378,7 @@ public class AdSelectionConfigValidatorTest { AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2; ImmutableList<Double> bids = ImmutableList.of(100.0, 200.0); SignedContextualAds contextualAds2 = - SignedContextualAdsFixture.generateSignedContextualAds(buyer2, bids) + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder(buyer2, bids) .setDecisionLogicUri( CommonFixture.getUri(buyer2, BUYER_BIDDING_LOGIC_URI_PATH)) .setAdsWithBid( @@ -446,14 +444,9 @@ public class AdSelectionConfigValidatorTest { Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>(); buyerContextualAds.put( CommonFixture.VALID_BUYER_1, - new SignedContextualAds.Builder() - .setBuyer(CommonFixture.VALID_BUYER_1) - .setDecisionLogicUri( - CommonFixture.getUri( - CommonFixture.VALID_BUYER_1, - SignedContextualAdsFixture.DECISION_LOGIC_FRAGMENT)) + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder( + CommonFixture.VALID_BUYER_1) .setAdsWithBid(adsWithBids) - .setSignature(PLACEHOLDER_SIGNATURE) .build()); AdSelectionConfig adSelectionConfig = diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java index 229eca16b6..bbef9eb674 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java @@ -28,6 +28,8 @@ import static android.adservices.common.AdServicesStatusUtils.STATUS_UNAUTHORIZE import static android.adservices.common.AdServicesStatusUtils.STATUS_USER_CONSENT_REVOKED; import static com.android.adservices.data.adselection.AdSelectionDatabase.DATABASE_NAME; +import static com.android.adservices.data.encryptionkey.EncryptionKeyDaoTest.ENCRYPTION_KEY1; +import static com.android.adservices.data.enrollment.EnrollmentDaoTest.ENROLLMENT_DATA1; import static com.android.adservices.service.PhFlagsFixture.EXTENDED_FLEDGE_AD_SELECTION_BIDDING_TIMEOUT_PER_CA_MS; import static com.android.adservices.service.PhFlagsFixture.EXTENDED_FLEDGE_AD_SELECTION_FROM_OUTCOMES_OVERALL_TIMEOUT_MS; import static com.android.adservices.service.PhFlagsFixture.EXTENDED_FLEDGE_AD_SELECTION_OVERALL_TIMEOUT_MS; @@ -51,6 +53,7 @@ import static com.android.adservices.service.adselection.PrebuiltLogicGenerator. import static com.android.adservices.service.adselection.PrebuiltLogicGenerator.AD_SELECTION_PREBUILT_SCHEMA; import static com.android.adservices.service.adselection.PrebuiltLogicGenerator.AD_SELECTION_USE_CASE; import static com.android.adservices.service.adselection.PrebuiltLogicGenerator.PREBUILT_FEATURE_IS_DISABLED; +import static com.android.adservices.service.adselection.signature.ProtectedAudienceSignatureManager.PUBLIC_TEST_KEY_STRING; import static com.android.adservices.service.stats.AdSelectionExecutionLoggerTest.DB_AD_SELECTION_FILE_SIZE; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__SELECT_ADS; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; @@ -119,12 +122,9 @@ import com.android.adservices.data.adselection.AdSelectionDatabase; import com.android.adservices.data.adselection.AdSelectionDebugReportDao; import com.android.adservices.data.adselection.AdSelectionDebugReportingDatabase; import com.android.adservices.data.adselection.AdSelectionEntryDao; -import com.android.adservices.data.adselection.AdSelectionServerDatabase; import com.android.adservices.data.adselection.AppInstallDao; import com.android.adservices.data.adselection.DBAdSelectionOverride; import com.android.adservices.data.adselection.DBBuyerDecisionOverride; -import com.android.adservices.data.adselection.EncryptionContextDao; -import com.android.adservices.data.adselection.EncryptionKeyDao; import com.android.adservices.data.adselection.FrequencyCapDao; import com.android.adservices.data.adselection.SharedStorageDatabase; import com.android.adservices.data.common.DBAdData; @@ -133,6 +133,7 @@ import com.android.adservices.data.customaudience.CustomAudienceDatabase; import com.android.adservices.data.customaudience.DBCustomAudience; import com.android.adservices.data.customaudience.DBCustomAudienceOverride; import com.android.adservices.data.customaudience.DBTrustedBiddingData; +import com.android.adservices.data.encryptionkey.EncryptionKeyDao; import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.data.signals.EncodedPayloadDao; import com.android.adservices.data.signals.ProtectedSignalsDatabase; @@ -151,6 +152,7 @@ import com.android.adservices.service.consent.ConsentManager; import com.android.adservices.service.devapi.AdSelectionDevOverridesHelper; import com.android.adservices.service.devapi.DevContext; import com.android.adservices.service.devapi.DevContextFilter; +import com.android.adservices.service.encryptionkey.EncryptionKey; import com.android.adservices.service.exception.FilterException; import com.android.adservices.service.js.JSScriptEngine; import com.android.adservices.service.stats.AdServicesLogger; @@ -636,8 +638,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase private EncodedPayloadDao mEncodedPayloadDao; private AppInstallDao mAppInstallDao; private FrequencyCapDao mFrequencyCapDao; + private EnrollmentDao mEnrollmentDao; private EncryptionKeyDao mEncryptionKeyDao; - private EncryptionContextDao mEncryptionContextDao; @Spy private AdSelectionEntryDao mAdSelectionEntryDaoSpy; private AdServicesHttpsClient mAdServicesHttpsClient; private AdSelectionConfig mAdSelectionConfig; @@ -655,6 +657,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Before public void setUp() throws Exception { + doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); + mAdSelectionEntryDaoSpy = Room.inMemoryDatabaseBuilder(mContext, AdSelectionDatabase.class) .build() @@ -667,10 +671,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase Room.inMemoryDatabaseBuilder(mContext, SharedStorageDatabase.class) .build() .frequencyCapDao(); - AdSelectionServerDatabase serverDb = - Room.inMemoryDatabaseBuilder(mContext, AdSelectionServerDatabase.class).build(); - mEncryptionContextDao = serverDb.encryptionContextDao(); - mEncryptionKeyDao = serverDb.encryptionKeyDao(); + mEncryptionKeyDao = EncryptionKeyDao.getInstance(mContext); + mEnrollmentDao = EnrollmentDao.getInstance(mContext); mAdFilteringFeatureFactory = new AdFilteringFeatureFactory(mAppInstallDao, mFrequencyCapDao, mFlags); @@ -711,8 +713,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -867,7 +869,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionSuccess_preV3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -963,8 +964,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -1089,8 +1090,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -1235,8 +1236,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -1377,8 +1378,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -1500,8 +1501,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -1607,7 +1608,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionSuccess_prebuiltScoringLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -1703,7 +1703,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionSuccess_prebuiltFeatureDisabled_failure() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); Flags prebuiltDisabledFlags = new AdSelectionE2ETestFlags() { @Override @@ -1719,8 +1718,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -1818,8 +1817,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -1913,7 +1912,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionSuccess_v3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -2007,8 +2005,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -2131,8 +2129,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -2276,8 +2274,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -2417,8 +2415,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -2539,8 +2537,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -2645,7 +2643,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionSuccess_preV3BiddingLogicWithV3Header_scriptFail() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -2714,7 +2711,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelection_getTooHighHeader_failWithError() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -2783,7 +2779,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionWithOverride_getTooHighHeader_failWithError() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -2879,7 +2874,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionContextualAds_Success() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -2905,7 +2899,7 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase .logRunAdSelectionProcessReportedStats(any()); AdSelectionConfig adSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setCustomAudienceBuyers(ImmutableList.of(BUYER_1, BUYER_2, BUYER_3)) .setSeller(mSeller) .setDecisionLogicUri( @@ -2976,7 +2970,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @FlakyTest(bugId = 304764127) @Test public void testRunAdSelectionContextualAds_UseOverrides_Success() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -3002,7 +2995,7 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase .logRunAdSelectionProcessReportedStats(any()); AdSelectionConfig adSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setCustomAudienceBuyers(ImmutableList.of(BUYER_1, BUYER_2, BUYER_3)) .setSeller(mSeller) .setDecisionLogicUri( @@ -3091,8 +3084,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -3152,7 +3145,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionContextualAds_Disabled_Success() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -3178,7 +3170,7 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase .logRunAdSelectionProcessReportedStats(any()); AdSelectionConfig adSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setCustomAudienceBuyers(ImmutableList.of(BUYER_1, BUYER_2, BUYER_3)) .setSeller(mSeller) .setDecisionLogicUri( @@ -3230,8 +3222,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -3277,7 +3269,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionOnlyContextualAds_NoBuyers_Success() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -3296,7 +3287,7 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase .logRunAdSelectionProcessReportedStats(any()); AdSelectionConfig adSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setCustomAudienceBuyers(ImmutableList.of()) .setSeller(mSeller) .setDecisionLogicUri( @@ -3338,8 +3329,45 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase } @Test + public void testRunAdSelectionOnlyContextualAds_unauthenticatedContextualAdsRemoved_Success() + throws Exception { + // Logger calls come after the callback is returned + CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(1); + doAnswer( + unusedInvocation -> { + runAdSelectionProcessLoggerLatch.countDown(); + return null; + }) + .when(mAdServicesLoggerMock) + .logRunAdSelectionProcessReportedStats(any()); + + AdSelectionConfig adSelectionConfig = + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() + .setCustomAudienceBuyers(ImmutableList.of()) + .setSeller(mSeller) + .setDecisionLogicUri( + mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH)) + .setTrustedScoringSignalsUri( + mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH)) + .setBuyerSignedContextualAds(createUnauthenticatedContextualAds()) + .build(); + + mMockWebServerRule.startMockWebServer(mDispatcher); + + AdSelectionTestCallback resultsCallback = + invokeSelectAds(mAdSelectionService, adSelectionConfig, CALLER_PACKAGE_NAME); + runAdSelectionProcessLoggerLatch.await(); + assertCallbackFailed(resultsCallback); + assertTrue( + resultsCallback + .mFledgeErrorResponse + .getErrorMessage() + .contains(ERROR_NO_BUYERS_OR_CONTEXTUAL_ADS_AVAILABLE)); + assertEquals(STATUS_INVALID_ARGUMENT, resultsCallback.mFledgeErrorResponse.getStatusCode()); + } + + @Test public void testRunAdSelectionOnlyContextualAds_NoCAs_Success() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -3365,7 +3393,7 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase .logRunAdSelectionProcessReportedStats(any()); AdSelectionConfig adSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setCustomAudienceBuyers(ImmutableList.of(BUYER_1, BUYER_2, BUYER_3)) .setSeller(mSeller) .setDecisionLogicUri( @@ -3417,7 +3445,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test @FlakyTest(bugId = 304764127) public void testRunAdSelectionOnlyContextualAds_NoCAsNoNetworkCall_Success() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -3457,7 +3484,7 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase paramKey, paramValue)); AdSelectionConfig adSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setCustomAudienceBuyers(Collections.emptyList()) .setSeller(mSeller) .setDecisionLogicUri(prebuiltUri) @@ -3508,7 +3535,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test @FlakyTest(bugId = 315521295) public void testRunAdSelectionNoContextualAds_NoCAs_Failure() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -3534,7 +3560,7 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase .logRunAdSelectionProcessReportedStats(any()); AdSelectionConfig adSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setCustomAudienceBuyers(ImmutableList.of(BUYER_1, BUYER_2, BUYER_3)) .setSeller(mSeller) .setDecisionLogicUri( @@ -3577,8 +3603,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionWithRevokedUserConsentSuccess() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); - doThrow(new FilterException(new ConsentManager.RevokedConsentException())) .when(mAdSelectionServiceFilter) .filterRequest( @@ -3653,7 +3677,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionMultipleCAsSuccess_preV3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -3767,7 +3790,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionMultipleCAsSuccess_v3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -3881,8 +3903,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionMultipleCAsNoCachingSuccess_preV3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); - MockWebServer server = mMockWebServerRule.startMockWebServer(mDispatcher); List<Double> bidsForBuyer1 = ImmutableList.of(1.1, 2.2); List<Double> bidsForBuyer2 = ImmutableList.of(4.5, 6.7, 10.0); @@ -3962,8 +3982,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, httpClientWithNoCaching, mDevContextFilter, mLightweightExecutorService, @@ -4002,8 +4022,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test @FlakyTest(bugId = 304764127) public void testRunAdSelectionMultipleCAsNoCachingSuccess_v3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); - MockWebServer server = mMockWebServerRule.startMockWebServer(DISPATCHER_V3_BIDDING_LOGIC); List<Double> bidsForBuyer1 = ImmutableList.of(1.1, 2.2); List<Double> bidsForBuyer2 = ImmutableList.of(4.5, 6.7, 10.0); @@ -4083,8 +4101,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, httpClientWithNoCaching, mDevContextFilter, mLightweightExecutorService, @@ -4122,8 +4140,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionMultipleCAsJSCachedSuccess_preV3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); - MockWebServer server = mMockWebServerRule.startMockWebServer(mDispatcher); List<Double> bidsForBuyer1 = ImmutableList.of(1.1, 2.2); List<Double> bidsForBuyer2 = ImmutableList.of(4.5, 6.7, 10.0); @@ -4205,8 +4221,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, httpClientWithCaching, mDevContextFilter, mLightweightExecutorService, @@ -4247,8 +4263,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionMultipleCAsJSCachedSuccess_v3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); - MockWebServer server = mMockWebServerRule.startMockWebServer(DISPATCHER_V3_BIDDING_LOGIC); List<Double> bidsForBuyer1 = ImmutableList.of(1.1, 2.2); List<Double> bidsForBuyer2 = ImmutableList.of(4.5, 6.7, 10.0); @@ -4330,8 +4344,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, httpClientWithCaching, mDevContextFilter, mLightweightExecutorService, @@ -4373,7 +4387,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test @FlakyTest(bugId = 304764127) public void testRunAdSelectionSucceedsWithOverride_preV3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -4455,8 +4468,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -4511,7 +4524,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test @FlakyTest(bugId = 304764127) public void testRunAdSelectionSucceedsWithOverride_v3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -4595,8 +4607,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -4650,7 +4662,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionActiveCAs() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -4743,7 +4754,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionNoCAsActive() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -4926,7 +4936,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionPartialAdsExcludedBidding() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -5034,7 +5043,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionMissingBiddingLogicFailure() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -5140,7 +5148,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionMissingScoringLogicFailure() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -5254,7 +5261,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionErrorFetchingScoringLogicFailure() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -5367,7 +5373,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionPartialMissingBiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -5485,7 +5490,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionPartialNonPositiveScoring() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -5608,7 +5612,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionNonPositiveScoringFailure() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -5728,7 +5731,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionBiddingTimesOutForCA() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -5786,8 +5788,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -5907,7 +5909,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionImposesPerBuyerBiddingTimeout_preV3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(6); doAnswer( @@ -6039,8 +6040,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -6115,8 +6116,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -6177,7 +6178,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @FlakyTest(bugId = 304764127) @Test public void testRunAdSelectionImposesPerBuyerBiddingTimeout_v3BiddingLogic() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(6); doAnswer( @@ -6309,8 +6309,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -6385,8 +6385,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -6446,7 +6446,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionScoringTimesOut() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -6504,8 +6503,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -6677,7 +6676,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionMissingBiddingSignalsFailure() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(2); doAnswer( @@ -6770,7 +6768,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test @FlakyTest(bugId = 315521295) public void testRunAdSelectionMissingScoringSignalsFailure() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -6872,7 +6869,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionMissingPartialBiddingSignalsSuccess() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); // Logger calls come after the callback is returned CountDownLatch runAdSelectionProcessLoggerLatch = new CountDownLatch(3); doAnswer( @@ -6988,8 +6984,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase @Test public void testRunAdSelectionFailsWithInvalidPackageName() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); - String invalidPackageName = CALLER_PACKAGE_NAME + "invalidPackageName"; doThrow(new FilterException(new FledgeAuthorizationFilter.CallerMismatchException())) @@ -7007,7 +7001,7 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase // Bypass the permission check since it's enforced before the package name check doNothing() .when(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( mContext, invalidPackageName, AD_SERVICES_API_CALLED__API_NAME__SELECT_ADS); // Logger calls come after the callback is returned @@ -7075,13 +7069,12 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase geq(0)); verify(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( mContext, invalidPackageName, AD_SERVICES_API_CALLED__API_NAME__SELECT_ADS); } @Test public void testRunAdSelectionFailsWhenAppCannotUsePPApi() throws Exception { - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); doThrow(new FilterException(new FledgeAuthorizationFilter.AdTechNotAllowedException())) .when(mAdSelectionServiceFilter) .filterRequest( @@ -7193,8 +7186,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -7327,8 +7320,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -7462,8 +7455,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -7561,8 +7554,6 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase // A null package means WebView is not installed doReturn(null).when(WebView::getCurrentWebViewPackage); - doReturn(new AdSelectionE2ETestFlags()).when(FlagsFactory::getFlags); - // Shut down any running JSScriptEngine to ensure the new singleton gets picked up JSScriptEngine.getInstance(mContext, LoggerFactory.getFledgeLogger()).shutdown(); @@ -7575,8 +7566,8 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -7803,6 +7794,21 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase adCost); } + private Map<AdTechIdentifier, SignedContextualAds> createUnauthenticatedContextualAds() { + Map<AdTechIdentifier, SignedContextualAds> authenticatedContextualAds = + createContextualAds(); + Map<AdTechIdentifier, SignedContextualAds> unauthenticatedContextualAds = new HashMap<>(); + byte[] invalidSignatures = new byte[] {1, 2, 3}; + for (Map.Entry<AdTechIdentifier, SignedContextualAds> buyersBundle : + authenticatedContextualAds.entrySet()) { + AdTechIdentifier buyer = buyersBundle.getKey(); + SignedContextualAds ads = buyersBundle.getValue(); + unauthenticatedContextualAds.put( + buyer, ads.cloneToBuilder().setSignature(invalidSignatures).build()); + } + return unauthenticatedContextualAds; + } + private Map<AdTechIdentifier, SignedContextualAds> createContextualAds() { Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>(); @@ -7813,17 +7819,50 @@ public final class AdSelectionE2ETest extends AdServicesExtendedMockitoTestCase .uriForPath(BUYER_BIDDING_LOGIC_URI_PATH + BUYER_2) .getHost()); SignedContextualAds contextualAds2 = - SignedContextualAdsFixture.generateSignedContextualAds( - buyer2, ImmutableList.of(100.0, 200.0, 300.0, 400.0, 500.0)) - .setDecisionLogicUri( - mMockWebServerRule.uriForPath( - BUYER_BIDDING_LOGIC_URI_PATH + BUYER_2)) - .build(); + SignedContextualAdsFixture.signContextualAds( + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder( + buyer2, ImmutableList.of(100.0, 200.0, 300.0, 400.0, 500.0)) + .setDecisionLogicUri( + mMockWebServerRule.uriForPath( + BUYER_BIDDING_LOGIC_URI_PATH + BUYER_2))); buyerContextualAds.put(buyer2, contextualAds2); - + persistEncryptionKeyInDb(buyerContextualAds); return buyerContextualAds; } + private void persistEncryptionKeyInDb( + Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds) { + for (AdTechIdentifier adTech : buyerContextualAds.keySet()) { + String enrollmentId = adTech + "-enrollment-id"; + String sourceRegistration = CommonFixture.getUri(adTech, "/source").toString(); + String triggerRegistration = CommonFixture.getUri(adTech, "/trigger").toString(); + String attributionReporting = CommonFixture.getUri(adTech, "/attrReport").toString(); + String responseBasedRegistration = CommonFixture.getUri(adTech, "/response").toString(); + String encryptionKeyUrl = CommonFixture.getUri(adTech, "/keys").toString(); + mEnrollmentDao.insert( + ENROLLMENT_DATA1 + .cloneToBuilder() + .setEnrollmentId(enrollmentId) + .setAttributionSourceRegistrationUrl(sourceRegistration) + .setAttributionTriggerRegistrationUrl(triggerRegistration) + .setAttributionReportingUrl(attributionReporting) + .setRemarketingResponseBasedRegistrationUrl(responseBasedRegistration) + .setEncryptionKeyUrl(encryptionKeyUrl) + .build()); + Uri reportingOriginUrl = CommonFixture.getUri(adTech, "/reportingOriginUrl"); + mEncryptionKeyDao.insert( + ENCRYPTION_KEY1 + .cloneToBuilder() + .setEnrollmentId(enrollmentId) + .setKeyType(EncryptionKey.KeyType.SIGNING) + .setEncryptionKeyUrl(encryptionKeyUrl) + .setProtocolType(EncryptionKey.ProtocolType.ECDSA) + .setBody(PUBLIC_TEST_KEY_STRING) + .setReportingOrigin(reportingOriginUrl) + .build()); + } + } + private void verifyErrorMessageIsCorrect( final String actualErrorMassage, final String expectedErrorReason) { assertTrue( diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionFromOutcomesE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionFromOutcomesE2ETest.java index 47e2550af8..b82d2b0a2d 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionFromOutcomesE2ETest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionFromOutcomesE2ETest.java @@ -76,8 +76,6 @@ import com.android.adservices.data.adselection.AdSelectionServerDatabase; import com.android.adservices.data.adselection.AppInstallDao; import com.android.adservices.data.adselection.CustomAudienceSignals; import com.android.adservices.data.adselection.DBAdSelection; -import com.android.adservices.data.adselection.EncryptionContextDao; -import com.android.adservices.data.adselection.EncryptionKeyDao; import com.android.adservices.data.adselection.FrequencyCapDao; import com.android.adservices.data.adselection.SharedStorageDatabase; import com.android.adservices.data.adselection.datahandlers.AdSelectionInitialization; @@ -86,6 +84,7 @@ import com.android.adservices.data.adselection.datahandlers.WinningCustomAudienc import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.data.customaudience.CustomAudienceDatabase; import com.android.adservices.data.customaudience.DBCustomAudience; +import com.android.adservices.data.encryptionkey.EncryptionKeyDao; import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.data.signals.EncodedPayloadDao; import com.android.adservices.data.signals.ProtectedSignalsDatabase; @@ -212,9 +211,9 @@ public class AdSelectionFromOutcomesE2ETest { private EncodedPayloadDao mEncodedPayloadDao; private AppInstallDao mAppInstallDao; private FrequencyCapDao mFrequencyCapDao; - private EncryptionKeyDao mEncryptionKeyDao; - private EncryptionContextDao mEncryptionContextDao; @Spy private AdSelectionEntryDao mAdSelectionEntryDaoSpy; + private EnrollmentDao mEnrollmentDao; + private EncryptionKeyDao mEncryptionKeyDao; private AdServicesHttpsClient mAdServicesHttpsClient; private AdSelectionService mAdSelectionService; private Dispatcher mDispatcher; @@ -259,8 +258,8 @@ public class AdSelectionFromOutcomesE2ETest { mFrequencyCapDao = sharedDb.frequencyCapDao(); AdSelectionServerDatabase serverDb = Room.inMemoryDatabaseBuilder(mContextSpy, AdSelectionServerDatabase.class).build(); - mEncryptionContextDao = serverDb.encryptionContextDao(); - mEncryptionKeyDao = serverDb.encryptionKeyDao(); + mEnrollmentDao = EnrollmentDao.getInstance(mContextSpy); + mEncryptionKeyDao = EncryptionKeyDao.getInstance(mContextSpy); mAdFilteringFeatureFactory = new AdFilteringFeatureFactory(mAppInstallDao, mFrequencyCapDao, mFlags); mAdServicesHttpsClient = @@ -280,8 +279,8 @@ public class AdSelectionFromOutcomesE2ETest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -411,8 +410,8 @@ public class AdSelectionFromOutcomesE2ETest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, @@ -468,8 +467,8 @@ public class AdSelectionFromOutcomesE2ETest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilter, mLightweightExecutorService, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java index 48cd9327dd..b3ceaa5bed 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java @@ -114,7 +114,6 @@ import com.android.adservices.concurrency.AdServicesExecutors; import com.android.adservices.data.adselection.AdSelectionDatabase; import com.android.adservices.data.adselection.AdSelectionDebugReportDao; import com.android.adservices.data.adselection.AdSelectionEntryDao; -import com.android.adservices.data.adselection.AdSelectionServerDatabase; import com.android.adservices.data.adselection.AppInstallDao; import com.android.adservices.data.adselection.CustomAudienceSignals; import com.android.adservices.data.adselection.DBAdSelection; @@ -122,17 +121,18 @@ import com.android.adservices.data.adselection.DBAdSelectionFromOutcomesOverride import com.android.adservices.data.adselection.DBAdSelectionOverride; import com.android.adservices.data.adselection.DBBuyerDecisionLogic; import com.android.adservices.data.adselection.DBReportingComputationInfo; -import com.android.adservices.data.adselection.EncryptionContextDao; -import com.android.adservices.data.adselection.EncryptionKeyDao; import com.android.adservices.data.adselection.FrequencyCapDao; import com.android.adservices.data.adselection.SharedStorageDatabase; import com.android.adservices.data.adselection.datahandlers.AdSelectionInitialization; import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.data.customaudience.CustomAudienceDatabase; import com.android.adservices.data.customaudience.DBCustomAudience; +import com.android.adservices.data.encryptionkey.EncryptionKeyDao; +import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.data.signals.EncodedPayloadDao; import com.android.adservices.data.signals.ProtectedSignalsDatabase; import com.android.adservices.service.Flags; +import com.android.adservices.service.FlagsFactory; import com.android.adservices.service.adselection.AppInstallAdvertisersSetterTest.SetAppInstallAdvertisersTestCallback; import com.android.adservices.service.adselection.encryption.ObliviousHttpEncryptor; import com.android.adservices.service.common.AdSelectionServiceFilter; @@ -300,7 +300,7 @@ public class AdSelectionServiceImplTest { private AppInstallDao mAppInstallDao; private FrequencyCapDao mFrequencyCapDao; private EncryptionKeyDao mEncryptionKeyDao; - private EncryptionContextDao mEncryptionContextDao; + private EnrollmentDao mEnrollmentDao; private AdSelectionConfig.Builder mAdSelectionConfigBuilder; private Uri mBiddingLogicUri; private CustomAudienceSignals mCustomAudienceSignals; @@ -323,13 +323,14 @@ public class AdSelectionServiceImplTest { .spyStatic(JSScriptEngine.class) .spyStatic(WebView.class) .mockStatic(ConsentManager.class) + .mockStatic(FlagsFactory.class) .mockStatic(MeasurementImpl.class) .mockStatic(AppImportanceFilter.class) // mAdServicesLoggerMock is not referenced in many tests .strictness(Strictness.LENIENT) .initMocks(this) .startMocking(); - + doReturn(mFlags).when(FlagsFactory::getFlags); mCustomAudienceDao = Room.inMemoryDatabaseBuilder(CONTEXT, CustomAudienceDatabase.class) .addTypeConverter(new DBCustomAudience.Converters(true, true)) @@ -354,13 +355,8 @@ public class AdSelectionServiceImplTest { mAppInstallDao = sharedDb.appInstallDao(); mFrequencyCapDao = sharedDb.frequencyCapDao(); - AdSelectionServerDatabase serverDb = - Room.inMemoryDatabaseBuilder( - ApplicationProvider.getApplicationContext(), - AdSelectionServerDatabase.class) - .build(); - mEncryptionContextDao = serverDb.encryptionContextDao(); - mEncryptionKeyDao = serverDb.encryptionKeyDao(); + mEncryptionKeyDao = EncryptionKeyDao.getInstance(CONTEXT); + mEnrollmentDao = EnrollmentDao.getInstance(CONTEXT); mAdFilteringFeatureFactory = new AdFilteringFeatureFactory(mAppInstallDao, mFrequencyCapDao, mFlags); @@ -498,8 +494,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -619,8 +615,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -750,8 +746,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -882,8 +878,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1002,8 +998,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1125,8 +1121,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1240,8 +1236,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1341,8 +1337,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1449,8 +1445,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1572,8 +1568,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1693,8 +1689,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1819,8 +1815,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1993,8 +1989,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -2137,8 +2133,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -2299,8 +2295,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -2467,8 +2463,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -2626,8 +2622,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -2774,8 +2770,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -2926,8 +2922,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -3094,8 +3090,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -3269,8 +3265,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -3413,8 +3409,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -3520,8 +3516,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -3626,8 +3622,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -3738,8 +3734,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -3845,8 +3841,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -3947,8 +3943,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4048,8 +4044,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4150,8 +4146,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4272,8 +4268,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4419,8 +4415,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4516,8 +4512,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4578,8 +4574,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4635,8 +4631,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4697,8 +4693,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4770,8 +4766,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4839,8 +4835,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4912,8 +4908,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -4986,8 +4982,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5101,8 +5097,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5218,8 +5214,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5331,8 +5327,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5439,8 +5435,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5476,8 +5472,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5527,8 +5523,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5594,8 +5590,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5662,8 +5658,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5721,8 +5717,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5782,8 +5778,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5837,8 +5833,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5896,8 +5892,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -5996,8 +5992,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -6112,8 +6108,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -6230,8 +6226,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -6354,8 +6350,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -6459,8 +6455,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -6565,8 +6561,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -6699,8 +6695,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -6813,8 +6809,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -6929,8 +6925,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7067,8 +7063,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7198,8 +7194,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7314,8 +7310,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7443,8 +7439,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7510,8 +7506,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7575,8 +7571,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7634,8 +7630,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7699,8 +7695,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7776,8 +7772,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7847,8 +7843,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7922,8 +7918,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -7996,8 +7992,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -8119,8 +8115,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -8236,8 +8232,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -8358,8 +8354,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -8498,8 +8494,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -9172,8 +9168,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -9234,8 +9230,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -9277,8 +9273,8 @@ public class AdSelectionServiceImplTest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mClientSpy, mDevContextFilterMock, mLightweightExecutorService, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java index 7a4088a376..342db92c06 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java @@ -817,7 +817,7 @@ public class AdsScoreGeneratorImplTest { Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds(); mAdSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setDecisionLogicUri(decisionLogicUri) .setTrustedScoringSignalsUri( mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath)) @@ -938,7 +938,7 @@ public class AdsScoreGeneratorImplTest { Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds(); mAdSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setDecisionLogicUri(decisionLogicUri) .setTrustedScoringSignalsUri( mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath)) @@ -1086,7 +1086,7 @@ public class AdsScoreGeneratorImplTest { Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds(); mAdSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setDecisionLogicUri(decisionLogicUri) .setTrustedScoringSignalsUri( mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath)) @@ -1257,7 +1257,7 @@ public class AdsScoreGeneratorImplTest { Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds(); mAdSelectionConfig = - AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder() + AdSelectionConfigFixture.anAdSelectionConfigWithSignedContextualAdsBuilder() .setDecisionLogicUri(decisionLogicUri) .setTrustedScoringSignalsUri( mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath)) @@ -1904,13 +1904,13 @@ public class AdsScoreGeneratorImplTest { AdTechIdentifier buyer1 = BUYER_1; SignedContextualAds contextualAds1 = - SignedContextualAdsFixture.generateSignedContextualAds( + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder( buyer1, ImmutableList.of(100.0, 200.0, 300.0)) .build(); AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2; SignedContextualAds contextualAds2 = - SignedContextualAdsFixture.generateSignedContextualAds( + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder( buyer2, ImmutableList.of(400.0, 500.0)) .build(); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AuctionServerE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AuctionServerE2ETest.java index 8a36e3ee42..f29355fdaa 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AuctionServerE2ETest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AuctionServerE2ETest.java @@ -104,6 +104,7 @@ import com.android.adservices.data.common.DBAdData; import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.data.customaudience.CustomAudienceDatabase; import com.android.adservices.data.customaudience.DBCustomAudience; +import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.data.signals.EncodedPayloadDao; import com.android.adservices.data.signals.ProtectedSignalsDatabase; import com.android.adservices.service.Flags; @@ -254,7 +255,9 @@ public class AuctionServerE2ETest { private AdSelectionEntryDao mAdSelectionEntryDao; private AppInstallDao mAppInstallDao; private FrequencyCapDao mFrequencyCapDaoSpy; - private EncryptionKeyDao mEncryptionKeyDao; + private com.android.adservices.data.encryptionkey.EncryptionKeyDao mEncryptionKeyDao; + private EncryptionKeyDao mAuctionServerEncryptionKeyDao; + private EnrollmentDao mEnrollmentDao; private EncryptionContextDao mEncryptionContextDao; @Mock private ObliviousHttpEncryptor mObliviousHttpEncryptorMock; @Mock private AdSelectionServiceFilter mAdSelectionServiceFilterMock; @@ -305,8 +308,11 @@ public class AuctionServerE2ETest { mFrequencyCapDaoSpy = spy(sharedDb.frequencyCapDao()); AdSelectionServerDatabase serverDb = Room.inMemoryDatabaseBuilder(mContext, AdSelectionServerDatabase.class).build(); + mEncryptionKeyDao = + com.android.adservices.data.encryptionkey.EncryptionKeyDao.getInstance(mContext); + mEnrollmentDao = EnrollmentDao.getInstance(mContext); + mAuctionServerEncryptionKeyDao = serverDb.encryptionKeyDao(); mEncryptionContextDao = serverDb.encryptionContextDao(); - mEncryptionKeyDao = serverDb.encryptionKeyDao(); mAdFilteringFeatureFactory = new AdFilteringFeatureFactory(mAppInstallDao, mFrequencyCapDaoSpy, mFlags); when(ConsentManager.getInstance(mContext)).thenReturn(mConsentManagerMock); @@ -820,7 +826,7 @@ public class AuctionServerE2ETest { .setEncryptionKeyType(ENCRYPTION_KEY_TYPE_AUCTION) .setExpiryTtlSeconds(TimeUnit.DAYS.toSeconds(7)) .build(); - mEncryptionKeyDao.insertAllKeys(ImmutableList.of(dbEncryptionKey)); + mAuctionServerEncryptionKeyDao.insertAllKeys(ImmutableList.of(dbEncryptionKey)); String seed = "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww"; byte[] seedBytes = seed.getBytes(StandardCharsets.US_ASCII); @@ -831,8 +837,8 @@ public class AuctionServerE2ETest { mCustomAudienceDaoSpy, mEncodedPayloadDaoSpy, mFrequencyCapDaoSpy, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -848,7 +854,7 @@ public class AuctionServerE2ETest { mConsentManagerMock, new ObliviousHttpEncryptorWithSeedImpl( new AdSelectionEncryptionKeyManager( - mEncryptionKeyDao, + mAuctionServerEncryptionKeyDao, mFlags, mAdServicesHttpsClientSpy, mLightweightExecutorService), @@ -1455,7 +1461,7 @@ public class AuctionServerE2ETest { .setEncryptionKeyType(ENCRYPTION_KEY_TYPE_AUCTION) .setExpiryTtlSeconds(TimeUnit.DAYS.toSeconds(7)) .build(); - mEncryptionKeyDao.insertAllKeys(ImmutableList.of(dbEncryptionKey)); + mAuctionServerEncryptionKeyDao.insertAllKeys(ImmutableList.of(dbEncryptionKey)); String seed = "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww"; byte[] seedBytes = seed.getBytes(StandardCharsets.US_ASCII); @@ -1466,8 +1472,8 @@ public class AuctionServerE2ETest { mCustomAudienceDaoSpy, mEncodedPayloadDaoSpy, mFrequencyCapDaoSpy, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClientSpy, mDevContextFilterMock, mLightweightExecutorService, @@ -1483,7 +1489,7 @@ public class AuctionServerE2ETest { mConsentManagerMock, new ObliviousHttpEncryptorWithSeedImpl( new AdSelectionEncryptionKeyManager( - mEncryptionKeyDao, + mAuctionServerEncryptionKeyDao, mFlags, mAdServicesHttpsClientSpy, mLightweightExecutorService), @@ -1537,8 +1543,8 @@ public class AuctionServerE2ETest { mCustomAudienceDaoSpy, mEncodedPayloadDaoSpy, mFrequencyCapDaoSpy, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClientSpy, mDevContextFilterMock, mLightweightExecutorService, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/FrequencyCapFilteringE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/FrequencyCapFilteringE2ETest.java index a18905bbed..76d93ab08a 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/FrequencyCapFilteringE2ETest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/FrequencyCapFilteringE2ETest.java @@ -57,18 +57,16 @@ import com.android.adservices.data.DbTestUtil; import com.android.adservices.data.adselection.AdSelectionDatabase; import com.android.adservices.data.adselection.AdSelectionDebugReportDao; import com.android.adservices.data.adselection.AdSelectionEntryDao; -import com.android.adservices.data.adselection.AdSelectionServerDatabase; import com.android.adservices.data.adselection.AppInstallDao; import com.android.adservices.data.adselection.DBAdSelection; import com.android.adservices.data.adselection.DBAdSelectionHistogramInfo; -import com.android.adservices.data.adselection.EncryptionContextDao; -import com.android.adservices.data.adselection.EncryptionKeyDao; import com.android.adservices.data.adselection.FrequencyCapDao; import com.android.adservices.data.adselection.SharedStorageDatabase; import com.android.adservices.data.common.DBAdData; import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.data.customaudience.CustomAudienceDatabase; import com.android.adservices.data.customaudience.DBCustomAudience; +import com.android.adservices.data.encryptionkey.EncryptionKeyDao; import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.data.signals.EncodedPayloadDao; import com.android.adservices.data.signals.ProtectedSignalsDatabase; @@ -118,7 +116,6 @@ import java.util.concurrent.TimeUnit; @SpyStatic(FlagsFactory.class) public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockitoTestCase { - private static final int CALLBACK_WAIT_MS = 500; private static final int SELECT_ADS_CALLBACK_WAIT_MS = 10_000; private static final long AD_SELECTION_ID_BUYER_1 = 20; @@ -196,7 +193,7 @@ public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockit private AppInstallDao mAppInstallDao; private FrequencyCapDao mFrequencyCapDaoSpy; private EncryptionKeyDao mEncryptionKeyDao; - private EncryptionContextDao mEncryptionContextDao; + private EnrollmentDao mEnrollmentDao; private ExecutorService mLightweightExecutorService; private ExecutorService mBackgroundExecutorService; private ScheduledThreadPoolExecutor mScheduledExecutor; @@ -234,16 +231,16 @@ public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockit Room.inMemoryDatabaseBuilder(mContextSpy, SharedStorageDatabase.class) .build() .frequencyCapDao()); - AdSelectionServerDatabase serverDb = - Room.inMemoryDatabaseBuilder(mContextSpy, AdSelectionServerDatabase.class).build(); - mEncryptionContextDao = serverDb.encryptionContextDao(); - mEncryptionKeyDao = serverDb.encryptionKeyDao(); + + Flags flagsEnablingAdFiltering = new FlagsOverridingAdFiltering(true); + doReturn(flagsEnablingAdFiltering).when(FlagsFactory::getFlags); + + mEncryptionKeyDao = EncryptionKeyDao.getInstance(mContextSpy); + mEnrollmentDao = EnrollmentDao.getInstance(mContextSpy); mLightweightExecutorService = AdServicesExecutors.getLightWeightExecutor(); mBackgroundExecutorService = AdServicesExecutors.getBackgroundExecutor(); mScheduledExecutor = AdServicesExecutors.getScheduler(); - Flags flagsEnablingAdFiltering = new FlagsOverridingAdFiltering(true); - mFledgeAuthorizationFilterSpy = ExtendedMockito.spy( new FledgeAuthorizationFilter( @@ -265,8 +262,8 @@ public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockit mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDaoSpy, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClientMock, mDevContextFilterMock, mLightweightExecutorService, @@ -380,7 +377,7 @@ public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockit // Bypass the permission check since it's enforced before the package name check doNothing() .when(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( mContextSpy, CommonFixture.TEST_PACKAGE_NAME_1, AD_SERVICES_API_CALLED__API_NAME__UPDATE_AD_COUNTER_HISTOGRAM); @@ -404,7 +401,7 @@ public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockit verifyNoMoreInteractions(mFrequencyCapDaoSpy); verify(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( mContextSpy, CommonFixture.TEST_PACKAGE_NAME_1, AD_SERVICES_API_CALLED__API_NAME__UPDATE_AD_COUNTER_HISTOGRAM); @@ -425,8 +422,8 @@ public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockit mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDaoSpy, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClientMock, mDevContextFilterMock, mLightweightExecutorService, @@ -488,8 +485,8 @@ public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockit mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDaoSpy, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClientMock, mDevContextFilterMock, mLightweightExecutorService, @@ -746,8 +743,8 @@ public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockit mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDaoSpy, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClientMock, mDevContextFilterMock, mLightweightExecutorService, @@ -862,8 +859,8 @@ public final class FrequencyCapFilteringE2ETest extends AdServicesExtendedMockit mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDaoSpy, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClientMock, mDevContextFilterMock, mLightweightExecutorService, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java index 56f4e55ae3..ce83b09c84 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java @@ -18,6 +18,7 @@ package com.android.adservices.service.adselection; import static android.adservices.adselection.CustomAudienceBiddingInfoFixture.DATA_VERSION_1; import static android.adservices.adselection.CustomAudienceBiddingInfoFixture.DATA_VERSION_2; +import static android.adservices.adselection.SignedContextualAdsFixture.signContextualAds; import static android.adservices.common.AdServicesStatusUtils.ILLEGAL_STATE_BACKGROUND_CALLER_ERROR_MESSAGE; import static android.adservices.common.AdServicesStatusUtils.RATE_LIMIT_REACHED_ERROR_MESSAGE; import static android.adservices.common.AdServicesStatusUtils.STATUS_BACKGROUND_CALLER; @@ -44,6 +45,7 @@ import static com.android.adservices.service.adselection.AdSelectionRunner.ERROR import static com.android.adservices.service.adselection.AdSelectionRunner.ERROR_NO_WINNING_AD_FOUND; import static com.android.adservices.service.adselection.AdSelectionRunner.ON_DEVICE_AUCTION_KILL_SWITCH_ENABLED; import static com.android.adservices.service.adselection.AdSelectionScriptEngine.NUM_BITS_STOCHASTIC_ROUNDING; +import static com.android.adservices.service.adselection.signature.ProtectedAudienceSignatureManager.PUBLIC_TEST_KEY_STRING; import static com.android.adservices.service.stats.AdSelectionExecutionLoggerTest.BIDDING_STAGE_END_TIMESTAMP; import static com.android.adservices.service.stats.AdSelectionExecutionLoggerTest.BIDDING_STAGE_START_TIMESTAMP; import static com.android.adservices.service.stats.AdSelectionExecutionLoggerTest.DB_AD_SELECTION_FILE_SIZE; @@ -128,6 +130,8 @@ import com.android.adservices.data.common.DBAdData; import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.data.customaudience.CustomAudienceDatabase; import com.android.adservices.data.customaudience.DBCustomAudience; +import com.android.adservices.data.encryptionkey.EncryptionKeyDao; +import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.service.Flags; import com.android.adservices.service.FlagsFactory; import com.android.adservices.service.common.AdSelectionServiceFilter; @@ -141,6 +145,8 @@ import com.android.adservices.service.common.httpclient.AdServicesHttpClientResp import com.android.adservices.service.common.httpclient.AdServicesHttpsClient; import com.android.adservices.service.consent.ConsentManager; import com.android.adservices.service.devapi.DevContext; +import com.android.adservices.service.encryptionkey.EncryptionKey; +import com.android.adservices.service.enrollment.EnrollmentData; import com.android.adservices.service.exception.FilterException; import com.android.adservices.service.stats.AdSelectionExecutionLogger; import com.android.adservices.service.stats.AdServicesLogger; @@ -194,8 +200,6 @@ import java.util.stream.Collectors; * mocked and provide expected mock responses when invoked with desired input */ public class OnDeviceAdSelectionRunnerTest { - private static final String TAG = OnDeviceAdSelectionRunnerTest.class.getName(); - private static final AdTechIdentifier BUYER_1 = AdSelectionConfigFixture.BUYER_1; private static final AdTechIdentifier BUYER_2 = AdSelectionConfigFixture.BUYER_2; private static final Long AD_SELECTION_ID = 1234L; @@ -234,6 +238,8 @@ public class OnDeviceAdSelectionRunnerTest { @Mock private AdCounterHistogramUpdater mAdCounterHistogramUpdaterMock; @Mock private DebugReporting mDebugReportingMock; @Mock private DebugReportSenderStrategy mDebugReportSenderMock; + @Mock private EnrollmentDao mEnrollmentDaoMock; + @Mock private EncryptionKeyDao mEncryptionKeyDaoMock; @Captor ArgumentCaptor<RunAdSelectionProcessReportedStats> @@ -396,6 +402,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -501,6 +509,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -673,6 +683,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -798,6 +810,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -945,6 +959,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1145,6 +1161,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1245,6 +1263,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1359,6 +1379,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1434,6 +1456,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1500,6 +1524,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1563,6 +1589,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1617,6 +1645,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1767,6 +1797,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1886,6 +1918,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -1974,7 +2008,7 @@ public class OnDeviceAdSelectionRunnerTest { // Getting ScoringOutcome-ForBuyerX corresponding to each BiddingOutcome-forBuyerX // In this case assuming we get an empty result when(mMockAdsScoreGenerator.runAdScoring(mAdBiddingOutcomeList, adSelectionConfig)) - .thenReturn((FluentFuture.from(Futures.immediateFuture(Collections.EMPTY_LIST)))); + .thenReturn((FluentFuture.from(Futures.immediateFuture(Collections.emptyList())))); mockAdSelectionExecutionLoggerSpyWithFailedAdSelectionDuringScoring(); @@ -1983,6 +2017,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2085,6 +2121,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2190,6 +2228,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2317,6 +2357,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2387,6 +2429,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2482,6 +2526,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2628,6 +2674,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2715,6 +2763,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2765,6 +2815,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2849,6 +2901,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2926,6 +2980,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -2981,6 +3037,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mMockHttpClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -3022,7 +3080,7 @@ public class OnDeviceAdSelectionRunnerTest { mAdSelectionConfigBuilder .build() .cloneToBuilder() - .setCustomAudienceBuyers(Collections.EMPTY_LIST) + .setCustomAudienceBuyers(Collections.emptyList()) .setBuyerSignedContextualAds(signedContextualAdsMap) .build(); @@ -3055,6 +3113,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -3093,7 +3153,7 @@ public class OnDeviceAdSelectionRunnerTest { mAdSelectionConfigBuilder .build() .cloneToBuilder() - .setCustomAudienceBuyers(Collections.EMPTY_LIST) + .setCustomAudienceBuyers(Collections.emptyList()) // Despite populating Contextual Ads, they will be removed .setBuyerSignedContextualAds(createContextualAds()) .build(); @@ -3121,6 +3181,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -3163,7 +3225,7 @@ public class OnDeviceAdSelectionRunnerTest { mAdSelectionConfigBuilder .build() .cloneToBuilder() - .setCustomAudienceBuyers(Collections.EMPTY_LIST) + .setCustomAudienceBuyers(Collections.emptyList()) .setBuyerSignedContextualAds(contextualAdsMap) .build(); @@ -3191,6 +3253,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -3215,14 +3279,14 @@ public class OnDeviceAdSelectionRunnerTest { .thenReturn(contextualAdsMap.get(CommonFixture.VALID_BUYER_1)); when(mMockAdFilterer.filterContextualAds(contextualAdsMap.get(CommonFixture.VALID_BUYER_2))) .thenReturn( - SignedContextualAdsFixture.aSignedContextualAdBuilder() - .setBuyer(CommonFixture.VALID_BUYER_2) - .setDecisionLogicUri( - contextualAdsMap - .get(CommonFixture.VALID_BUYER_2) - .getDecisionLogicUri()) - .setAdsWithBid(Collections.EMPTY_LIST) - .build()); + signContextualAds( + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder() + .setBuyer(CommonFixture.VALID_BUYER_2) + .setDecisionLogicUri( + contextualAdsMap + .get(CommonFixture.VALID_BUYER_2) + .getDecisionLogicUri()) + .setAdsWithBid(Collections.emptyList()))); invokeRunAdSelection(mAdSelectionRunner, adSelectionConfig, MY_APP_PACKAGE_NAME); verify(mMockAdsScoreGenerator) .runAdScoring( @@ -3237,7 +3301,7 @@ public class OnDeviceAdSelectionRunnerTest { .getAdsWithBid()); assertEquals( "The contextual ads should have been filtered for Buyer 2", - Collections.EMPTY_LIST, + Collections.emptyList(), mAdSelectionConfigArgumentCaptor .getValue() .getBuyerSignedContextualAds() @@ -3254,6 +3318,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -3343,6 +3409,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -3425,6 +3493,8 @@ public class OnDeviceAdSelectionRunnerTest { mContextSpy, mCustomAudienceDao, mAdSelectionEntryDaoSpy, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, mAdServicesHttpsClient, mLightweightExecutorService, mBackgroundExecutorService, @@ -3881,23 +3951,39 @@ public class OnDeviceAdSelectionRunnerTest { AdTechIdentifier buyer1 = CommonFixture.VALID_BUYER_1; SignedContextualAds contextualAds1 = - SignedContextualAdsFixture.generateSignedContextualAds( - buyer1, ImmutableList.of(100.0, 200.0, 300.0)) - .setDecisionLogicUri( - CommonFixture.getUri(BUYER_1, BUYER_BIDDING_LOGIC_URI_PATH)) - .build(); + signContextualAds( + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder( + buyer1, ImmutableList.of(100.0, 200.0, 300.0)) + .setDecisionLogicUri( + CommonFixture.getUri( + BUYER_1, BUYER_BIDDING_LOGIC_URI_PATH))); AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2; SignedContextualAds contextualAds2 = - SignedContextualAdsFixture.generateSignedContextualAds( - buyer2, ImmutableList.of(400.0, 500.0)) - .setDecisionLogicUri( - CommonFixture.getUri(BUYER_2, BUYER_BIDDING_LOGIC_URI_PATH)) - .build(); + signContextualAds( + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder( + buyer2, ImmutableList.of(400.0, 500.0)) + .setDecisionLogicUri( + CommonFixture.getUri( + BUYER_2, BUYER_BIDDING_LOGIC_URI_PATH))); buyerContextualAds.put(buyer1, contextualAds1); buyerContextualAds.put(buyer2, contextualAds2); + for (AdTechIdentifier adTech : buyerContextualAds.keySet()) { + doReturn(new EnrollmentData.Builder().setEnrollmentId(adTech.toString()).build()) + .when(mEnrollmentDaoMock) + .getEnrollmentDataForFledgeByAdTechIdentifier(adTech); + doReturn( + Collections.singletonList( + new EncryptionKey.Builder() + .setBody(PUBLIC_TEST_KEY_STRING) + .build())) + .when(mEncryptionKeyDaoMock) + .getEncryptionKeyFromEnrollmentIdAndKeyType( + adTech.toString(), EncryptionKey.KeyType.SIGNING); + } + return buyerContextualAds; } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/ReportAndRegisterEventE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/ReportAndRegisterEventE2ETest.java index f564af8ec1..d1b3cd9dc0 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/ReportAndRegisterEventE2ETest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/ReportAndRegisterEventE2ETest.java @@ -66,18 +66,16 @@ import com.android.adservices.data.DbTestUtil; import com.android.adservices.data.adselection.AdSelectionDatabase; import com.android.adservices.data.adselection.AdSelectionDebugReportDao; import com.android.adservices.data.adselection.AdSelectionEntryDao; -import com.android.adservices.data.adselection.AdSelectionServerDatabase; import com.android.adservices.data.adselection.AppInstallDao; import com.android.adservices.data.adselection.CustomAudienceSignals; import com.android.adservices.data.adselection.DBAdSelection; import com.android.adservices.data.adselection.DBRegisteredAdInteraction; -import com.android.adservices.data.adselection.EncryptionContextDao; -import com.android.adservices.data.adselection.EncryptionKeyDao; import com.android.adservices.data.adselection.FrequencyCapDao; import com.android.adservices.data.adselection.SharedStorageDatabase; import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.data.customaudience.CustomAudienceDatabase; import com.android.adservices.data.customaudience.DBCustomAudience; +import com.android.adservices.data.encryptionkey.EncryptionKeyDao; import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.data.measurement.DatastoreException; import com.android.adservices.data.measurement.DatastoreManager; @@ -163,7 +161,7 @@ public class ReportAndRegisterEventE2ETest { private AppInstallDao mAppInstallDao; private FrequencyCapDao mFrequencyCapDao; private EncryptionKeyDao mEncryptionKeyDao; - private EncryptionContextDao mEncryptionContextDao; + private EnrollmentDao mEnrollmentDao; private AdFilteringFeatureFactory mAdFilteringFeatureFactory; @Mock private AdSelectionServiceFilter mAdSelectionServiceFilterMock; @Mock private ObliviousHttpEncryptor mObliviousHttpEncryptorMock; @@ -284,13 +282,8 @@ public class ReportAndRegisterEventE2ETest { mAppInstallDao = sharedDb.appInstallDao(); mFrequencyCapDao = sharedDb.frequencyCapDao(); - AdSelectionServerDatabase serverDb = - Room.inMemoryDatabaseBuilder( - ApplicationProvider.getApplicationContext(), - AdSelectionServerDatabase.class) - .build(); - mEncryptionContextDao = serverDb.encryptionContextDao(); - mEncryptionKeyDao = serverDb.encryptionKeyDao(); + mEncryptionKeyDao = EncryptionKeyDao.getInstance(CONTEXT); + mEnrollmentDao = EnrollmentDao.getInstance(CONTEXT); mAdFilteringFeatureFactory = new AdFilteringFeatureFactory(mAppInstallDao, mFrequencyCapDao, mFlags); @@ -986,8 +979,8 @@ public class ReportAndRegisterEventE2ETest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mHttpsClientSpy, mDevContextFilterMock, mLightweightExecutorService, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/ReportImpressionScriptEngineTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/ReportImpressionScriptEngineTest.java index 9e2771e105..9ebccfd105 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/ReportImpressionScriptEngineTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/ReportImpressionScriptEngineTest.java @@ -267,6 +267,7 @@ public class ReportImpressionScriptEngineTest { } @Test + @FlakyTest(bugId = 317817375) public void testReportResultSuccessfulCaseWithCallingRegisterAdBeacon() throws Exception { String jsScript = "function reportResult(ad_selection_config, render_uri, bid, contextual_signals) " diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/TrustedServerAdSelectionRunnerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/TrustedServerAdSelectionRunnerTest.java index f0cfbaa601..d3385c13e0 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/TrustedServerAdSelectionRunnerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/TrustedServerAdSelectionRunnerTest.java @@ -50,6 +50,8 @@ import com.android.adservices.data.adselection.AdSelectionEntryDao; import com.android.adservices.data.adselection.DBAdSelection; import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.data.customaudience.DBCustomAudience; +import com.android.adservices.data.encryptionkey.EncryptionKeyDao; +import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.service.Flags; import com.android.adservices.service.FlagsFactory; import com.android.adservices.service.adselection.AdSelectionRunner.AdSelectionOrchestrationResult; @@ -150,6 +152,8 @@ public class TrustedServerAdSelectionRunnerTest { @Mock private AdServicesLogger mAdServicesLoggerSpy; @Mock private CustomAudienceDao mCustomAudienceDao; @Mock private AdSelectionEntryDao mAdSelectionEntryDao; + @Mock private EnrollmentDao mEnrollmentDaoMock; + @Mock private EncryptionKeyDao mEncryptionKeyDaoMock; @Mock private JsFetcher mJsFetcher; @Mock private CustomAudienceDevOverridesHelper mCustomAudienceDevOverridesHelper; @Mock private AdSelectionIdGenerator mMockAdSelectionIdGenerator; @@ -215,6 +219,8 @@ public class TrustedServerAdSelectionRunnerTest { mContext, mCustomAudienceDao, mAdSelectionEntryDao, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, sLightweightExecutorService, sBackgroundExecutorService, sScheduledExecutor, @@ -276,6 +282,8 @@ public class TrustedServerAdSelectionRunnerTest { mContext, mCustomAudienceDao, mAdSelectionEntryDao, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, sLightweightExecutorService, sBackgroundExecutorService, sScheduledExecutor, @@ -339,6 +347,8 @@ public class TrustedServerAdSelectionRunnerTest { mContext, mCustomAudienceDao, mAdSelectionEntryDao, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, sLightweightExecutorService, sBackgroundExecutorService, sScheduledExecutor, @@ -408,6 +418,8 @@ public class TrustedServerAdSelectionRunnerTest { mContext, mCustomAudienceDao, mAdSelectionEntryDao, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, sLightweightExecutorService, sBackgroundExecutorService, sScheduledExecutor, @@ -461,6 +473,8 @@ public class TrustedServerAdSelectionRunnerTest { mContext, mCustomAudienceDao, mAdSelectionEntryDao, + mEncryptionKeyDaoMock, + mEnrollmentDaoMock, sLightweightExecutorService, sBackgroundExecutorService, sScheduledExecutor, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/BinarySerializerSignedContextualAdsTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/BinarySerializerSignedContextualAdsTest.java index ad751d71d7..1533ff53a1 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/BinarySerializerSignedContextualAdsTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/BinarySerializerSignedContextualAdsTest.java @@ -16,8 +16,6 @@ package com.android.adservices.service.adselection.signature; -import static android.adservices.adselection.SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE; - import static com.google.common.truth.Truth.assertThat; import android.adservices.adselection.AdWithBid; @@ -42,6 +40,8 @@ import java.util.Set; import java.util.stream.Collectors; public class BinarySerializerSignedContextualAdsTest { + public static final byte[] TEST_SIGNATURE = new byte[] {0, 1, 2}; + private SignedContextualAdsHashUtil mSerializer; @Before @@ -131,7 +131,7 @@ public class BinarySerializerSignedContextualAdsTest { .setRenderUri(Uri.parse(adRenderUri)) .build(), Double.parseDouble(bid)))) - .setSignature(PLACEHOLDER_SIGNATURE) + .setSignature(TEST_SIGNATURE) .build(); byte[] serialized = new SignedContextualAdsHashUtil().serialize(contextualAds); @@ -203,7 +203,7 @@ public class BinarySerializerSignedContextualAdsTest { .setRenderUri(Uri.parse(adRenderUri)) .build(), Double.parseDouble(bid)))) - .setSignature(PLACEHOLDER_SIGNATURE) + .setSignature(TEST_SIGNATURE) .build(); byte[] serialized = new SignedContextualAdsHashUtil().serialize(contextualAds); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/ProtectedAudienceSignatureManagerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/ProtectedAudienceSignatureManagerTest.java index 774da48a82..a44359664e 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/ProtectedAudienceSignatureManagerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/ProtectedAudienceSignatureManagerTest.java @@ -16,14 +16,17 @@ package com.android.adservices.service.adselection.signature; +import static android.adservices.adselection.SignedContextualAdsFixture.aSignedContextualAds; + +import static com.android.adservices.service.adselection.signature.ProtectedAudienceSignatureManager.PUBLIC_TEST_KEY_STRING; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; +import android.adservices.adselection.SignedContextualAds; import android.adservices.common.AdTechIdentifier; -import android.content.Context; -import androidx.test.core.app.ApplicationProvider; import com.android.adservices.data.encryptionkey.EncryptionKeyDao; import com.android.adservices.data.enrollment.EnrollmentDao; @@ -35,39 +38,102 @@ import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.Base64; import java.util.Collections; import java.util.List; public class ProtectedAudienceSignatureManagerTest { - private Context mContext = ApplicationProvider.getApplicationContext(); - @Mock private EnrollmentDao mEnrollmentDao; - @Mock private EncryptionKeyDao mEncryptionKeyDao; + @Mock private EnrollmentDao mEnrollmentDaoMock; + @Mock private EncryptionKeyDao mEncryptionKeyDaoMock; + private ProtectedAudienceSignatureManager mNoOpSignatureManager; + private ProtectedAudienceSignatureManager mSignatureManager; @Before public void setup() { MockitoAnnotations.initMocks(this); + SignatureVerifier noOpSignatureVerifier = + new SignatureVerifier() { + @Override + public boolean verify(byte[] publicKey, byte[] data, byte[] signature) { + return true; + } + }; + boolean enrollmentEnabled = false; + mSignatureManager = + new ProtectedAudienceSignatureManager( + mEnrollmentDaoMock, mEncryptionKeyDaoMock, enrollmentEnabled); + mNoOpSignatureManager = + new ProtectedAudienceSignatureManager( + mEnrollmentDaoMock, mEncryptionKeyDaoMock, noOpSignatureVerifier); + } + + @Test + public void testVerifySignature_validSignature_returnTrue() { + SignedContextualAds signedContextualAds = aSignedContextualAds(); + String enrollmentId = "enrollment1"; + AdTechIdentifier buyer = signedContextualAds.getBuyer(); + + doReturn(new EnrollmentData.Builder().setEnrollmentId(enrollmentId).build()) + .when(mEnrollmentDaoMock) + .getEnrollmentDataForFledgeByAdTechIdentifier(buyer); + doReturn( + Collections.singletonList( + new EncryptionKey.Builder() + .setBody(PUBLIC_TEST_KEY_STRING) + .build())) + .when(mEncryptionKeyDaoMock) + .getEncryptionKeyFromEnrollmentIdAndKeyType( + enrollmentId, EncryptionKey.KeyType.SIGNING); + + boolean isVerified = mSignatureManager.isVerified(buyer, signedContextualAds); + + assertThat(isVerified).isTrue(); + } + + @Test + public void testVerifySignature_invalidSignature_returnFalse() { + byte[] invalidSignature = new byte[] {1, 2, 3}; + SignedContextualAds signedContextualAds = + aSignedContextualAds().cloneToBuilder().setSignature(invalidSignature).build(); + String enrollmentId = "enrollment1"; + AdTechIdentifier buyer = signedContextualAds.getBuyer(); + + doReturn(new EnrollmentData.Builder().setEnrollmentId(enrollmentId).build()) + .when(mEnrollmentDaoMock) + .getEnrollmentDataForFledgeByAdTechIdentifier(buyer); + doReturn( + Collections.singletonList( + new EncryptionKey.Builder() + .setBody(PUBLIC_TEST_KEY_STRING) + .build())) + .when(mEncryptionKeyDaoMock) + .getEncryptionKeyFromEnrollmentIdAndKeyType( + enrollmentId, EncryptionKey.KeyType.SIGNING); + + boolean isVerified = mSignatureManager.isVerified(buyer, signedContextualAds); + + assertThat(isVerified).isFalse(); } @Test public void testFetchKeys_validAdTech_success() { AdTechIdentifier adTech = AdTechIdentifier.fromString("example.com"); - String publicKey = "test-key"; + byte[] publicKeyBytes = new byte[] {1, 2, 3, 4, 5}; + String publicKey = Base64.getEncoder().encodeToString(publicKeyBytes); String enrollmentId = "enrollment1"; doReturn(new EnrollmentData.Builder().setEnrollmentId(enrollmentId).build()) - .when(mEnrollmentDao) + .when(mEnrollmentDaoMock) .getEnrollmentDataForFledgeByAdTechIdentifier(adTech); doReturn(Collections.singletonList(new EncryptionKey.Builder().setBody(publicKey).build())) - .when(mEncryptionKeyDao) + .when(mEncryptionKeyDaoMock) .getEncryptionKeyFromEnrollmentIdAndKeyType( enrollmentId, EncryptionKey.KeyType.SIGNING); - ProtectedAudienceSignatureManager signatureManager = - new ProtectedAudienceSignatureManager(mContext, mEnrollmentDao, mEncryptionKeyDao); - - List<String> signingKeys = signatureManager.fetchPublicKeyForAdTech(adTech); + List<byte[]> signingKeys = mNoOpSignatureManager.fetchPublicKeyForAdTech(adTech); - assertThat(signingKeys).isEqualTo(Collections.singletonList(publicKey)); + assertThat(signingKeys.size()).isEqualTo(1); + assertThat(signingKeys.get(0)).isEqualTo(publicKeyBytes); } @Test @@ -77,8 +143,10 @@ public class ProtectedAudienceSignatureManagerTest { EnrollmentData enrollment = new EnrollmentData.Builder().setEnrollmentId(enrollmentId).build(); - String publicKey1 = "test-key1"; - String publicKey2 = "test-key2"; + byte[] publicKeyBytes1 = new byte[] {1, 2, 3, 4, 5}; + String publicKey1 = Base64.getEncoder().encodeToString(publicKeyBytes1); + byte[] publicKeyBytes2 = new byte[] {6, 7, 8, 9, 10}; + String publicKey2 = Base64.getEncoder().encodeToString(publicKeyBytes2); long expiration1 = 0L; long expiration2 = 1L; EncryptionKey encKey1 = @@ -88,32 +156,28 @@ public class ProtectedAudienceSignatureManagerTest { List<EncryptionKey> encKeysToPersistInReverseOrder = List.of(encKey2, encKey1); doReturn(enrollment) - .when(mEnrollmentDao) + .when(mEnrollmentDaoMock) .getEnrollmentDataForFledgeByAdTechIdentifier(adTech); doReturn(encKeysToPersistInReverseOrder) - .when(mEncryptionKeyDao) + .when(mEncryptionKeyDaoMock) .getEncryptionKeyFromEnrollmentIdAndKeyType( enrollmentId, EncryptionKey.KeyType.SIGNING); - ProtectedAudienceSignatureManager signatureManager = - new ProtectedAudienceSignatureManager(mContext, mEnrollmentDao, mEncryptionKeyDao); - - List<String> signingKeys = signatureManager.fetchPublicKeyForAdTech(adTech); + List<byte[]> signingKeys = mNoOpSignatureManager.fetchPublicKeyForAdTech(adTech); assertThat(signingKeys.size()).isEqualTo(2); - assertThat(signingKeys.get(0)).isEqualTo(publicKey1); - assertThat(signingKeys.get(1)).isEqualTo(publicKey2); + assertThat(signingKeys.get(0)).isEqualTo(publicKeyBytes1); + assertThat(signingKeys.get(1)).isEqualTo(publicKeyBytes2); } @Test public void testFetchKeys_notEnrolledAdTech_returnsEmptyList() { AdTechIdentifier adTech = AdTechIdentifier.fromString("example.com"); - doReturn(null).when(mEnrollmentDao).getEnrollmentDataForFledgeByAdTechIdentifier(adTech); - - ProtectedAudienceSignatureManager signatureManager = - new ProtectedAudienceSignatureManager(mContext, mEnrollmentDao, mEncryptionKeyDao); + doReturn(null) + .when(mEnrollmentDaoMock) + .getEnrollmentDataForFledgeByAdTechIdentifier(adTech); - List<String> signingKeys = signatureManager.fetchPublicKeyForAdTech(adTech); + List<byte[]> signingKeys = mNoOpSignatureManager.fetchPublicKeyForAdTech(adTech); assertThat(signingKeys).isEqualTo(Collections.emptyList()); } @@ -122,13 +186,10 @@ public class ProtectedAudienceSignatureManagerTest { public void testFetchKeys_enrolledAdTechWithNullId_returnsEmptyList() { AdTechIdentifier adTech = AdTechIdentifier.fromString("example.com"); doReturn(new EnrollmentData.Builder().build()) - .when(mEnrollmentDao) + .when(mEnrollmentDaoMock) .getEnrollmentDataForFledgeByAdTechIdentifier(adTech); - ProtectedAudienceSignatureManager signatureManager = - new ProtectedAudienceSignatureManager(mContext, mEnrollmentDao, mEncryptionKeyDao); - - List<String> signingKeys = signatureManager.fetchPublicKeyForAdTech(adTech); + List<byte[]> signingKeys = mNoOpSignatureManager.fetchPublicKeyForAdTech(adTech); assertThat(signingKeys).isEqualTo(Collections.emptyList()); } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/SafeNoCopyByteArrayOutputStreamTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/ThreadUnsafeByteArrayOutputStreamTest.java index 2c10dbb665..8f7622fced 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/SafeNoCopyByteArrayOutputStreamTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/signature/ThreadUnsafeByteArrayOutputStreamTest.java @@ -21,7 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import org.junit.Before; import org.junit.Test; -public class SafeNoCopyByteArrayOutputStreamTest { +public class ThreadUnsafeByteArrayOutputStreamTest { private ThreadUnsafeByteArrayOutputStream mOutputStream; @Before diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigCallTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigCallTest.java new file mode 100644 index 0000000000..495b5c3c83 --- /dev/null +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigCallTest.java @@ -0,0 +1,250 @@ +/* + * Copyright (C) 2023 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.service.common; + +import static com.android.adservices.service.common.AppManifestConfigCall.API_ATTRIBUTION; +import static com.android.adservices.service.common.AppManifestConfigCall.API_CUSTOM_AUDIENCES; +import static com.android.adservices.service.common.AppManifestConfigCall.API_TOPICS; +import static com.android.adservices.service.common.AppManifestConfigCall.API_UNSPECIFIED; +import static com.android.adservices.service.common.AppManifestConfigCall.INVALID_API_TEMPLATE; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_APP_ALLOWS_ALL; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_APP_DOES_NOT_EXIST; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_APP_DOES_NOT_HAVE_CONFIG; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_BY_APP; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_GENERIC_ERROR; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_UNSPECIFIED; +import static com.android.adservices.service.common.AppManifestConfigCall.isAllowed; +import static com.android.adservices.service.common.AppManifestConfigCall.resultToString; +import static com.android.adservices.service.common.AppManifestConfigCall.apiToString; + +import static org.junit.Assert.assertThrows; + +import com.android.adservices.common.AdServicesUnitTestCase; + +import org.junit.Test; + +public final class AppManifestConfigCallTest extends AdServicesUnitTestCase { + + private static final String PKG_NAME = "pkg.I.am"; + private static final String PKG_NAME2 = "or.not"; + + @Test + public void testInvalidConstructor() { + assertThrows( + NullPointerException.class, + () -> new AppManifestConfigCall(/* packageName= */ null, API_TOPICS)); + + IllegalArgumentException e = + assertThrows( + IllegalArgumentException.class, + () -> new AppManifestConfigCall(PKG_NAME, API_UNSPECIFIED)); + expect.withMessage("e.getMessage()") + .that(e) + .hasMessageThat() + .isEqualTo(String.format(INVALID_API_TEMPLATE, API_UNSPECIFIED)); + + e = + assertThrows( + IllegalArgumentException.class, + () -> new AppManifestConfigCall(PKG_NAME, -42)); + expect.withMessage("e.getMessage()") + .that(e) + .hasMessageThat() + .isEqualTo(String.format(INVALID_API_TEMPLATE, -42)); + } + + @Test + public void testValidConstructors() { + AppManifestConfigCall topics = new AppManifestConfigCall(PKG_NAME, API_TOPICS); + expect.withMessage("pkg on %s", topics).that(topics.packageName).isEqualTo(PKG_NAME); + expect.withMessage("api on %s", topics).that(topics.api).isEqualTo(API_TOPICS); + + AppManifestConfigCall customAudience = + new AppManifestConfigCall(PKG_NAME, API_CUSTOM_AUDIENCES); + expect.withMessage("pkg on %s", customAudience) + .that(customAudience.packageName) + .isEqualTo(PKG_NAME); + expect.withMessage("api on %s", customAudience) + .that(customAudience.api) + .isEqualTo(API_CUSTOM_AUDIENCES); + + AppManifestConfigCall attribution = new AppManifestConfigCall(PKG_NAME, API_ATTRIBUTION); + expect.withMessage("pkg on %s", attribution) + .that(attribution.packageName) + .isEqualTo(PKG_NAME); + expect.withMessage("api on %s", attribution) + .that(attribution.api) + .isEqualTo(API_ATTRIBUTION); + } + + @Test + public void testEqualsHashCode() { + AppManifestConfigCall pkg1api1 = new AppManifestConfigCall(PKG_NAME, API_TOPICS); + AppManifestConfigCall pkg1api2 = new AppManifestConfigCall(PKG_NAME, API_ATTRIBUTION); + AppManifestConfigCall pkg2api1 = new AppManifestConfigCall(PKG_NAME2, API_TOPICS); + AppManifestConfigCall pkg2api2 = new AppManifestConfigCall(PKG_NAME2, API_ATTRIBUTION); + + AppManifestConfigCall otherPkg1api1 = new AppManifestConfigCall(PKG_NAME, API_TOPICS); + AppManifestConfigCall otherPkg1api2 = new AppManifestConfigCall(PKG_NAME, API_ATTRIBUTION); + AppManifestConfigCall otherPkg2api1 = new AppManifestConfigCall(PKG_NAME2, API_TOPICS); + AppManifestConfigCall otherPkg2api2 = new AppManifestConfigCall(PKG_NAME2, API_ATTRIBUTION); + + expectEquals(pkg1api1, pkg1api1); + expectEquals(pkg1api1, otherPkg1api1); + expectEquals(pkg1api2, pkg1api2); + expectEquals(pkg1api2, otherPkg1api2); + expectEquals(pkg2api1, pkg2api1); + expectEquals(pkg2api1, otherPkg2api1); + expectEquals(pkg2api2, pkg2api2); + expectEquals(pkg2api2, otherPkg2api2); + + expectNotEquals(pkg1api1, pkg1api2); + expectNotEquals(pkg1api1, pkg2api1); + expectNotEquals(pkg1api1, pkg2api2); + + // Adds result + otherPkg1api1.result = RESULT_ALLOWED_APP_ALLOWS_ALL; + expectNotEquals(pkg1api1, otherPkg1api1); + pkg1api1.result = RESULT_ALLOWED_APP_ALLOWS_ALL; + expectEquals(pkg1api1, otherPkg1api1); + } + + private void expectEquals(AppManifestConfigCall call1, AppManifestConfigCall call2) { + expect.withMessage("equals()").that(call1).isEqualTo(call2); + expect.withMessage("equals()").that(call2).isEqualTo(call1); + expect.withMessage("hashcode(%s, %s)", call1, call2) + .that(call1.hashCode()) + .isEqualTo(call2.hashCode()); + } + + private void expectNotEquals(AppManifestConfigCall call1, AppManifestConfigCall call2) { + expect.withMessage("equals()").that(call1).isNotEqualTo(call2); + expect.withMessage("equals()").that(call2).isNotEqualTo(call1); + expect.withMessage("hashcode(%s, %s)", call1, call2) + .that(call1.hashCode()) + .isNotEqualTo(call2.hashCode()); + } + + @Test + public void testResultToString() { + expect.withMessage("resultToString(%s)", RESULT_UNSPECIFIED) + .that(resultToString(RESULT_UNSPECIFIED)) + .isEqualTo("UNSPECIFIED"); + expect.withMessage("resultToString(%s)", RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG) + .that(resultToString(RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG)) + .isEqualTo("ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG"); + expect.withMessage( + "resultToString(%s)", + RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION) + .that(resultToString(RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION)) + .isEqualTo("ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION"); + expect.withMessage("resultToString(%s)", RESULT_ALLOWED_APP_ALLOWS_ALL) + .that(resultToString(RESULT_ALLOWED_APP_ALLOWS_ALL)) + .isEqualTo("ALLOWED_APP_ALLOWS_ALL"); + expect.withMessage("resultToString(%s)", RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID) + .that(resultToString(RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID)) + .isEqualTo("ALLOWED_APP_ALLOWS_SPECIFIC_ID"); + expect.withMessage("resultToString(%s)", RESULT_DISALLOWED_APP_DOES_NOT_EXIST) + .that(resultToString(RESULT_DISALLOWED_APP_DOES_NOT_EXIST)) + .isEqualTo("DISALLOWED_APP_DOES_NOT_EXIST"); + expect.withMessage("resultToString(%s)", RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR) + .that(resultToString(RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR)) + .isEqualTo("DISALLOWED_APP_CONFIG_PARSING_ERROR"); + expect.withMessage("resultToString(%s)", RESULT_DISALLOWED_APP_DOES_NOT_HAVE_CONFIG) + .that(resultToString(RESULT_DISALLOWED_APP_DOES_NOT_HAVE_CONFIG)) + .isEqualTo("DISALLOWED_APP_DOES_NOT_HAVE_CONFIG"); + expect.withMessage( + "resultToString(%s)", RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION) + .that(resultToString(RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION)) + .isEqualTo("DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION"); + expect.withMessage("resultToString(%s)", RESULT_DISALLOWED_BY_APP) + .that(resultToString(RESULT_DISALLOWED_BY_APP)) + .isEqualTo("DISALLOWED_BY_APP"); + expect.withMessage("resultToString(%s)", RESULT_DISALLOWED_GENERIC_ERROR) + .that(resultToString(RESULT_DISALLOWED_GENERIC_ERROR)) + .isEqualTo("DISALLOWED_GENERIC_ERROR"); + expect.withMessage("resultToString(42)").that(resultToString(42)).isEqualTo("INVALID-42"); + } + + @Test + public void testApiToString() { + expect.withMessage("apiToString(%s)", API_UNSPECIFIED) + .that(apiToString(API_UNSPECIFIED)) + .isEqualTo("UNSPECIFIED"); + expect.withMessage("apiToString(%s)", API_TOPICS) + .that(apiToString(API_TOPICS)) + .isEqualTo("TOPICS"); + expect.withMessage("apiToString(%s)", API_CUSTOM_AUDIENCES) + .that(apiToString(API_CUSTOM_AUDIENCES)) + .isEqualTo("CUSTOM_AUDIENCES"); + expect.withMessage("apiToString(%s)", API_ATTRIBUTION) + .that(apiToString(API_ATTRIBUTION)) + .isEqualTo("ATTRIBUTION"); + expect.withMessage("apiToString(42)").that(apiToString(42)).isEqualTo("INVALID-42"); + } + + @Test + public void testIsAllowed() { + expect.withMessage("isAllowed(%s)", resultToString(RESULT_UNSPECIFIED)) + .that(isAllowed(RESULT_UNSPECIFIED)) + .isFalse(); + expect.withMessage( + "isAllowed(%s)", + resultToString(RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG)) + .that(isAllowed(RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG)) + .isTrue(); + expect.withMessage( + "isAllowed(%s)", + resultToString( + RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION)) + .that(isAllowed(RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION)) + .isTrue(); + expect.withMessage("isAllowed(%s)", resultToString(RESULT_ALLOWED_APP_ALLOWS_ALL)) + .that(isAllowed(RESULT_ALLOWED_APP_ALLOWS_ALL)) + .isTrue(); + expect.withMessage("isAllowed(%s)", resultToString(RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID)) + .that(isAllowed(RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID)) + .isTrue(); + expect.withMessage("isAllowed(%s)", resultToString(RESULT_DISALLOWED_APP_DOES_NOT_EXIST)) + .that(isAllowed(RESULT_DISALLOWED_APP_DOES_NOT_EXIST)) + .isFalse(); + expect.withMessage( + "isAllowed(%s)", resultToString(RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR)) + .that(isAllowed(RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR)) + .isFalse(); + expect.withMessage( + "isAllowed(%s)", resultToString(RESULT_DISALLOWED_APP_DOES_NOT_HAVE_CONFIG)) + .that(isAllowed(RESULT_DISALLOWED_APP_DOES_NOT_HAVE_CONFIG)) + .isFalse(); + expect.withMessage( + "isAllowed(%s)", + resultToString(RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION)) + .that(isAllowed(RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION)) + .isFalse(); + expect.withMessage("isAllowed(%s)", resultToString(RESULT_DISALLOWED_BY_APP)) + .that(isAllowed(RESULT_DISALLOWED_BY_APP)) + .isFalse(); + expect.withMessage("isAllowed(%s)", resultToString(RESULT_DISALLOWED_GENERIC_ERROR)) + .that(isAllowed(RESULT_DISALLOWED_GENERIC_ERROR)) + .isFalse(); + } +} diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigHelperTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigHelperTest.java index b9adf151e1..592635a9fd 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigHelperTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigHelperTest.java @@ -19,13 +19,16 @@ package com.android.adservices.service.common; import static com.android.adservices.mockito.ExtendedMockitoExpectations.mockIsAtLeastS; import static com.android.adservices.mockito.ExtendedMockitoExpectations.doNothingOnErrorLogUtilError; import static com.android.adservices.mockito.ExtendedMockitoExpectations.verifyErrorLogUtilError; -import static com.android.adservices.service.common.AppManifestConfigMetricsLoggerTest.appManifestConfigCall; -import static com.android.adservices.service.common.AppManifestConfigMetricsLoggerTest.APP_DOES_NOT_EXIST; -import static com.android.adservices.service.common.AppManifestConfigMetricsLoggerTest.APP_DOES_NOT_HAVE_CONFIG; -import static com.android.adservices.service.common.AppManifestConfigMetricsLoggerTest.APP_EXISTS; -import static com.android.adservices.service.common.AppManifestConfigMetricsLoggerTest.APP_HAS_CONFIG; -import static com.android.adservices.service.common.AppManifestConfigMetricsLoggerTest.ENABLED_BY_DEFAULT; -import static com.android.adservices.service.common.AppManifestConfigMetricsLoggerTest.NOT_ENABLED_BY_DEFAULT; +import static com.android.adservices.service.common.AppManifestConfigCall.API_ATTRIBUTION; +import static com.android.adservices.service.common.AppManifestConfigCall.API_CUSTOM_AUDIENCES; +import static com.android.adservices.service.common.AppManifestConfigCall.API_TOPICS; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_APP_ALLOWS_ALL; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_APP_DOES_NOT_EXIST; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_APP_DOES_NOT_HAVE_CONFIG; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_BY_APP; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__ERROR_CODE__APP_MANIFEST_CONFIG_PARSING_ERROR; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__COMMON; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; @@ -82,6 +85,9 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito private static final String PACKAGE_NAME = "TEST_PACKAGE"; private static final String ENROLLMENT_ID = "ENROLLMENT_ID"; + // Constants for generic allowed / disallowed calls - the "type" doesn't matter + private static final int RESULT_ALLOWED = RESULT_ALLOWED_APP_ALLOWS_ALL; + @Mock private AppManifestConfig mMockAppManifestConfig; @Mock private AppManifestIncludesSdkLibraryConfig mMockSdkLibraryConfig; @Mock private Context mMockContext; @@ -106,14 +112,14 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito public void testIsAllowedAttributionAccess_sPlus() throws Exception { mockGetPropertySucceeds(PACKAGE_NAME, AD_SERVICES_CONFIG_PROPERTY, RESOURCE_ID); mockAppManifestConfigParserGetConfigSucceeds(); - mockIsAllowedAttributionAccess(ENROLLMENT_ID, true); + mockIsAllowedAttributionAccess(ENROLLMENT_ID, RESULT_ALLOWED); assertWithMessage("isAllowedAttributionAccess(ctx, %s, %s)", PACKAGE_NAME, ENROLLMENT_ID) .that( AppManifestConfigHelper.isAllowedAttributionAccess( PACKAGE_NAME, ENROLLMENT_ID)) .isTrue(); - verifyLogUsage(APP_EXISTS, APP_HAS_CONFIG, NOT_ENABLED_BY_DEFAULT); + verifyLogUsage(API_ATTRIBUTION, RESULT_ALLOWED); } @Test @@ -121,14 +127,14 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito mockSdkLevelR(); mockGetAssetSucceeds(PACKAGE_NAME, RESOURCE_ID); mockAppManifestConfigParserGetConfigSucceeds(); - mockIsAllowedAttributionAccess(ENROLLMENT_ID, true); + mockIsAllowedAttributionAccess(ENROLLMENT_ID, RESULT_ALLOWED); assertWithMessage("isAllowedAttributionAccess(ctx, %s, %s)", PACKAGE_NAME, ENROLLMENT_ID) .that( AppManifestConfigHelper.isAllowedAttributionAccess( PACKAGE_NAME, ENROLLMENT_ID)) .isTrue(); - verifyLogUsage(APP_EXISTS, APP_HAS_CONFIG, NOT_ENABLED_BY_DEFAULT); + verifyLogUsage(API_ATTRIBUTION, RESULT_ALLOWED); } @Test @@ -136,7 +142,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito public void testIsAllowedCustomAudiencesAccess_sPlus() throws Exception { mockGetPropertySucceeds(PACKAGE_NAME, AD_SERVICES_CONFIG_PROPERTY, RESOURCE_ID); mockAppManifestConfigParserGetConfigSucceeds(); - mockIsAllowedCustomAudiencesAccess(ENROLLMENT_ID, true); + mockIsAllowedCustomAudiencesAccess(ENROLLMENT_ID, RESULT_ALLOWED); assertWithMessage( "isAllowedCustomAudiencesAccess(ctx, %s, %s)", PACKAGE_NAME, ENROLLMENT_ID) .that( @@ -144,7 +150,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito PACKAGE_NAME, ENROLLMENT_ID)) .isTrue(); - verifyLogUsage(APP_EXISTS, APP_HAS_CONFIG, NOT_ENABLED_BY_DEFAULT); + verifyLogUsage(API_CUSTOM_AUDIENCES, RESULT_ALLOWED); } @Test @@ -152,7 +158,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito mockSdkLevelR(); mockGetAssetSucceeds(PACKAGE_NAME, RESOURCE_ID); mockAppManifestConfigParserGetConfigSucceeds(); - mockIsAllowedCustomAudiencesAccess(ENROLLMENT_ID, true); + mockIsAllowedCustomAudiencesAccess(ENROLLMENT_ID, RESULT_ALLOWED); assertWithMessage( "isAllowedCustomAudiencesAccess(ctx, %s, %s)", PACKAGE_NAME, ENROLLMENT_ID) .that( @@ -160,7 +166,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito PACKAGE_NAME, ENROLLMENT_ID)) .isTrue(); - verifyLogUsage(APP_EXISTS, APP_HAS_CONFIG, NOT_ENABLED_BY_DEFAULT); + verifyLogUsage(API_CUSTOM_AUDIENCES, RESULT_ALLOWED); } @Test @@ -285,7 +291,9 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito } mockAppManifestConfigParserGetConfigSucceeds(); mockContainsSdk(ENROLLMENT_ID, containsSdk); - mockIsAllowedTopicsAccess(ENROLLMENT_ID, topicsAllowed); + int result = + expectedAllowed ? RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID : RESULT_DISALLOWED_BY_APP; + mockIsAllowedTopicsAccess(ENROLLMENT_ID, result); assertWithMessage("isAllowedTopicsAccess(ctx, %s, %s)", PACKAGE_NAME, ENROLLMENT_ID) .that( AppManifestConfigHelper.isAllowedTopicsAccess( @@ -294,7 +302,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito ENROLLMENT_ID)) .isEqualTo(expectedAllowed); - verifyLogUsage(APP_EXISTS, APP_HAS_CONFIG, NOT_ENABLED_BY_DEFAULT); + verifyLogUsage(API_TOPICS, result); } @Test @@ -306,7 +314,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertNoAccessAllowed(); verifyErrorLogUtilErrorLogged(e, times(4)); // Called once for each API - verifyLogUsage(APP_EXISTS, APP_HAS_CONFIG, NOT_ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR); } @Test @@ -318,7 +326,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertNoAccessAllowed(); verifyErrorLogUtilErrorLogged(e, times(4)); // Called once for each API - verifyLogUsage(APP_EXISTS, APP_HAS_CONFIG, NOT_ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR); } @Test @@ -332,7 +340,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertNoAccessAllowed(); verifyErrorLogUtilErrorLogged(e, times(4)); // Called once for each API - verifyLogUsage(APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR); } @Test @@ -346,7 +354,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertNoAccessAllowed(); verifyErrorLogUtilErrorLogged(e, times(4)); // Called once for each API - verifyLogUsage(APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_DISALLOWED_APP_CONFIG_PARSING_ERROR); } @Test @@ -355,8 +363,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertNoAccessAllowed(); - verifyLogUsage( - APP_DOES_NOT_EXIST, APP_DOES_NOT_HAVE_CONFIG, NOT_ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_DISALLOWED_APP_DOES_NOT_EXIST); } @Test @@ -366,7 +373,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertNoAccessAllowed(); - verifyLogUsage(APP_DOES_NOT_EXIST, APP_DOES_NOT_HAVE_CONFIG, ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_DISALLOWED_APP_DOES_NOT_EXIST); } @Test @@ -377,7 +384,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertNoAccessAllowed(); - verifyLogUsage(APP_EXISTS, APP_DOES_NOT_HAVE_CONFIG, NOT_ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_DISALLOWED_APP_DOES_NOT_HAVE_CONFIG); } @Test @@ -388,7 +395,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertNoAccessAllowed(); - verifyLogUsage(APP_EXISTS, APP_DOES_NOT_HAVE_CONFIG, NOT_ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_DISALLOWED_APP_DOES_NOT_HAVE_CONFIG); } @Test @@ -401,7 +408,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertAllAccessAllowed(); - verifyLogUsage(APP_EXISTS, APP_DOES_NOT_HAVE_CONFIG, ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG); } @Test @@ -414,7 +421,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito assertAllAccessAllowed(); - verifyLogUsage(APP_EXISTS, APP_DOES_NOT_HAVE_CONFIG, ENABLED_BY_DEFAULT, times(4)); + verifyLogUsageForAllApis(RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG); } private void mockSdkLevelR() { @@ -485,16 +492,16 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito return e; } - private void mockIsAllowedAttributionAccess(String partnerId, boolean value) { - when(mMockAppManifestConfig.isAllowedAttributionAccess(partnerId)).thenReturn(value); + private void mockIsAllowedAttributionAccess(String partnerId, int result) { + when(mMockAppManifestConfig.isAllowedAttributionAccess(partnerId)).thenReturn(result); } - private void mockIsAllowedCustomAudiencesAccess(String partnerId, boolean value) { - when(mMockAppManifestConfig.isAllowedCustomAudiencesAccess(partnerId)).thenReturn(value); + private void mockIsAllowedCustomAudiencesAccess(String partnerId, int result) { + when(mMockAppManifestConfig.isAllowedCustomAudiencesAccess(partnerId)).thenReturn(result); } - private void mockIsAllowedTopicsAccess(String partnerId, boolean value) { - when(mMockAppManifestConfig.isAllowedTopicsAccess(partnerId)).thenReturn(value); + private void mockIsAllowedTopicsAccess(String partnerId, int result) { + when(mMockAppManifestConfig.isAllowedTopicsAccess(partnerId)).thenReturn(result); } private void mockContainsSdk(String partnerId, boolean value) { @@ -549,9 +556,7 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito expect.withMessage("isAllowedTopicsAccess(ctx, %s, %s)", PACKAGE_NAME, ENROLLMENT_ID) .that( AppManifestConfigHelper.isAllowedTopicsAccess( - /* useSandboxCheck= */ false, - PACKAGE_NAME, - ENROLLMENT_ID)) + /* useSandboxCheck= */ false, PACKAGE_NAME, ENROLLMENT_ID)) .isTrue(); verifyErrorLogUtilErrorLogged(any(), never()); @@ -567,21 +572,23 @@ public final class AppManifestConfigHelperTest extends AdServicesExtendedMockito mode); } - private void verifyLogUsage(boolean appExists, boolean appHasConfig, boolean enabledByDefault) { - verifyLogUsage(appExists, appHasConfig, enabledByDefault, times(1)); + private void verifyLogUsage(int api, int result) { + verifyLogUsage(api, result, times(1)); } - private void verifyLogUsage( - boolean appExists, - boolean appHasConfig, - boolean enabledByDefault, - VerificationMode mode) { - verify( - () -> - AppManifestConfigMetricsLogger.logUsage( - appManifestConfigCall( - PACKAGE_NAME, appExists, appHasConfig, enabledByDefault)), - mode); + private void verifyLogUsage(int api, int result, VerificationMode mode) { + AppManifestConfigCall call = new AppManifestConfigCall(PACKAGE_NAME, api); + call.result = result; + + verify(() -> AppManifestConfigMetricsLogger.logUsage(call), mode); + } + + private void verifyLogUsageForAllApis(int result) { + // Cannot use anyInt() for the APIs as logUsage() uses a custom object / matcher - it would + // be too coplicate to create a generic one for it + verifyLogUsage(API_TOPICS, result, times(2)); + verifyLogUsage(API_ATTRIBUTION, result); + verifyLogUsage(API_CUSTOM_AUDIENCES, result); } private void setEnabledByDefault(boolean value) { diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigMetricsLoggerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigMetricsLoggerTest.java index 0f4b2795af..800027b5d5 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigMetricsLoggerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigMetricsLoggerTest.java @@ -18,8 +18,20 @@ package com.android.adservices.service.common; import static com.android.adservices.mockito.ExtendedMockitoExpectations.mockErrorLogUtilWithThrowable; import static com.android.adservices.mockito.ExtendedMockitoExpectations.mockErrorLogUtilWithoutThrowable; +import static com.android.adservices.mockito.ExtendedMockitoExpectations.verifyErrorLogUtilError; +import static com.android.adservices.mockito.ExtendedMockitoExpectations.verifyErrorLogUtilErrorWithAnyException; +import static com.android.adservices.service.common.AppManifestConfigCall.API_ATTRIBUTION; +import static com.android.adservices.service.common.AppManifestConfigCall.API_TOPICS; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_APP_ALLOWS_ALL; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_BY_APP; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_UNSPECIFIED; +import static com.android.adservices.service.common.AppManifestConfigCall.apiToString; +import static com.android.adservices.service.common.AppManifestConfigCall.resultToString; import static com.android.adservices.service.common.AppManifestConfigMetricsLogger.dump; +import static com.android.adservices.service.common.AppManifestConfigMetricsLogger.PREFS_KEY_TEMPLATE; import static com.android.adservices.service.common.AppManifestConfigMetricsLogger.PREFS_NAME; +import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__ERROR_CODE__APP_MANIFEST_CONFIG_LOGGING_ERROR; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__ERROR_CODE__SHARED_PREF_UPDATE_FAILURE; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__ERROR_CODE__SHARED_PREF_EXCEPTION; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__COMMON; @@ -29,7 +41,7 @@ import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.when; import android.content.Context; @@ -37,8 +49,6 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.util.Log; -import androidx.test.filters.FlakyTest; - import com.android.adservices.common.AdServicesExtendedMockitoTestCase; import com.android.adservices.common.Nullable; import com.android.adservices.common.SyncCallback; @@ -46,12 +56,13 @@ import com.android.adservices.errorlogging.ErrorLogUtil; import com.android.adservices.mockito.ExtendedMockitoExpectations.ErrorLogUtilCallback; import com.android.adservices.service.Flags; import com.android.adservices.service.FlagsFactory; +import com.android.adservices.service.common.AppManifestConfigCall.ApiType; +import com.android.adservices.service.common.AppManifestConfigCall.Result; import com.android.adservices.shared.testing.common.DumpHelper; import com.android.modules.utils.testing.ExtendedMockitoRule.SpyStatic; import org.junit.Before; import org.junit.Test; -import org.mockito.ArgumentMatcher; import org.mockito.Mock; import java.io.File; @@ -59,6 +70,7 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; @@ -71,14 +83,11 @@ public final class AppManifestConfigMetricsLoggerTest extends AdServicesExtended private static final String PKG_NAME = "pkg.I.am"; private static final String PKG_NAME2 = "or.not"; - static final boolean APP_EXISTS = true; - static final boolean APP_DOES_NOT_EXIST = false; - - static final boolean APP_HAS_CONFIG = true; - static final boolean APP_DOES_NOT_HAVE_CONFIG = false; + // Generic API - exact value doesn't matter + private static final @ApiType int API = API_TOPICS; - static final boolean ENABLED_BY_DEFAULT = true; - static final boolean NOT_ENABLED_BY_DEFAULT = false; + private static final String KEY_PKG_NAME_API = + String.format(Locale.US, PREFS_KEY_TEMPLATE, PKG_NAME, API); @Mock private Context mMockContext; @Mock private Flags mMockFlags; @@ -101,119 +110,79 @@ public final class AppManifestConfigMetricsLoggerTest extends AdServicesExtended public void testLogUsage_nullArgs() throws Exception { assertThrows( NullPointerException.class, - () -> - logUsageAndDontWait( - /* packageName= */ null, - APP_EXISTS, - APP_HAS_CONFIG, - ENABLED_BY_DEFAULT)); + () -> logUsageAndDontWait(/* packageName= */ null, RESULT_ALLOWED_APP_ALLOWS_ALL)); + } + + @Test + public void testLogUsage_callWithInvalidResult() throws Exception { + AppManifestConfigCall call = new AppManifestConfigCall(PKG_NAME, API); + call.result = RESULT_UNSPECIFIED; + mPrefs.onEditThrows(); // will throw if edit() is called + + AppManifestConfigMetricsLogger.logUsage(call); + + verifyErrorLogUtilError( + AD_SERVICES_ERROR_REPORTED__ERROR_CODE__APP_MANIFEST_CONFIG_LOGGING_ERROR, + AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__COMMON); + assertEditNotCalled(); } @Test public void testLogUsage_firstTime() throws Exception { - logUsageAndWait(APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT); + logUsageAndWait(PKG_NAME, RESULT_ALLOWED_APP_ALLOWS_ALL); Map<String, ?> allProps = mPrefs.getAll(); assertWithMessage("allProps").that(allProps).hasSize(1); - assertWithMessage("properties keys").that(allProps.keySet()).containsExactly(PKG_NAME); + assertWithMessage("properties keys") + .that(allProps.keySet()) + .containsExactly(KEY_PKG_NAME_API); } @Test - public void testLogUsage_secondTimeSameArgs() throws Exception { + public void testLogUsage_secondTimeSameResult() throws Exception { // 1st time is fine - logUsageAndWait(APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT); + logUsageAndWait(PKG_NAME, RESULT_ALLOWED_APP_ALLOWS_ALL); // 2nd time should not call edit mPrefs.onEditThrows(); // will throw if edit() is called - logUsageAndDontWait(PKG_NAME, APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT); + logUsageAndDontWait(PKG_NAME, RESULT_ALLOWED_APP_ALLOWS_ALL); Map<String, ?> allProps = mPrefs.getAll(); assertWithMessage("allProps").that(allProps).hasSize(1); - assertWithMessage("properties keys").that(allProps.keySet()).containsExactly(PKG_NAME); - } + assertWithMessage("properties keys") + .that(allProps.keySet()) + .containsExactly(KEY_PKG_NAME_API); - @FlakyTest(bugId = 315979774, detail = "Might need to split it into multiple tests") - @Test - public void testLogUsage_secondTimeDifferentArgs() throws Exception { - callOnceWithAllTrueThenSecondWith(APP_EXISTS, APP_HAS_CONFIG, NOT_ENABLED_BY_DEFAULT); - callOnceWithAllTrueThenSecondWith(APP_EXISTS, APP_DOES_NOT_HAVE_CONFIG, ENABLED_BY_DEFAULT); - callOnceWithAllTrueThenSecondWith( - APP_EXISTS, APP_DOES_NOT_HAVE_CONFIG, NOT_ENABLED_BY_DEFAULT); - callOnceWithAllTrueThenSecondWith(APP_DOES_NOT_EXIST, APP_HAS_CONFIG, ENABLED_BY_DEFAULT); - callOnceWithAllTrueThenSecondWith( - APP_DOES_NOT_EXIST, APP_HAS_CONFIG, NOT_ENABLED_BY_DEFAULT); - callOnceWithAllTrueThenSecondWith( - APP_DOES_NOT_EXIST, APP_DOES_NOT_HAVE_CONFIG, ENABLED_BY_DEFAULT); - callOnceWithAllTrueThenSecondWith( - APP_DOES_NOT_EXIST, APP_DOES_NOT_HAVE_CONFIG, NOT_ENABLED_BY_DEFAULT); + assertEditNotCalled(); } - private void callOnceWithAllTrueThenSecondWith( - boolean appExists, boolean appHasConfig, boolean enabledByDefault) throws Exception { - Log.i( - mTag, - "callOnceWithAllTrueThenSecondWith(appExists=" - + appExists - + ", appHasConfig=" - + appHasConfig - + ", enabledByDefault=" - + enabledByDefault - + ")"); - // Need to use a new prefs because it's called multiple times (so it starts in a clean - // state) - life would be so much easier if JUnit provided an easy way to run parameterized - // tests per method (not class) - FakeSharedPreferences prefs = new FakeSharedPreferences(); - when(mMockContext.getSharedPreferences(any(String.class), anyInt())).thenReturn(prefs); - + @Test + public void testLogUsage_secondTimeDifferentResult() throws Exception { + int result = RESULT_ALLOWED_APP_ALLOWS_ALL; // 1st call - Log.d( - mTag, - "1st call: appExists=" - + APP_EXISTS - + ", appHasConfig=" - + APP_HAS_CONFIG - + ", enabledByDefault=" - + ENABLED_BY_DEFAULT - + ")"); - logUsageAndWait(prefs, PKG_NAME, APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT); - - int valueBefore = prefs.getInt(PKG_NAME, -1); - expect.withMessage( - "stored value of %s after 1st call (appExists=%s, appHasConfig=%s," - + " enabledByDefault=%s)", - PKG_NAME, APP_EXISTS, APP_EXISTS, ENABLED_BY_DEFAULT) + Log.d(mTag, "1st call: result=" + result); + logUsageAndWait(PKG_NAME, result); + + int valueBefore = mPrefs.getInt(KEY_PKG_NAME_API, RESULT_UNSPECIFIED); + expect.withMessage("stored value of %s after 1st call (result=%s)", PKG_NAME, result) .that(valueBefore) - .isNotEqualTo(-1); + .isEqualTo(RESULT_ALLOWED_APP_ALLOWS_ALL); // 2nd call - Log.d( - mTag, - "2nd call: appExists=" - + appExists - + ", appHasConfig=" - + appHasConfig - + ", enabledByDefault=" - + enabledByDefault - + ")"); - logUsageAndWait(prefs, PKG_NAME, appExists, appHasConfig, enabledByDefault); - - Map<String, ?> allProps = prefs.getAll(); + result = RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG; + Log.d(mTag, "2nd call: result=" + result); + logUsageAndWait(PKG_NAME, result); + + Map<String, ?> allProps = mPrefs.getAll(); expect.withMessage("allProps").that(allProps).hasSize(1); - expect.withMessage("properties keys").that(allProps.keySet()).containsExactly(PKG_NAME); + expect.withMessage("properties keys") + .that(allProps.keySet()) + .containsExactly(KEY_PKG_NAME_API); - int valueAfter = prefs.getInt(PKG_NAME, -1); - expect.withMessage( - "stored value of %s after 2nd call (appExists=%s, appHasConfig=%s," - + " enabledByDefault=%s)", - PKG_NAME, appExists, appHasConfig, enabledByDefault) + int valueAfter = mPrefs.getInt(KEY_PKG_NAME_API, RESULT_UNSPECIFIED); + expect.withMessage("stored value of %s after 2nd call (result=%s)", PKG_NAME, result) .that(valueAfter) - .isNotEqualTo(-1); - expect.withMessage( - "stored value of %s after 2nd call (appExists=%s, appHasConfig=%s," - + " enabledByDefault=%s)", - PKG_NAME, appExists, appHasConfig, enabledByDefault) - .that(valueAfter) - .isNotEqualTo(valueBefore); + .isEqualTo(RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG); } @Test @@ -222,7 +191,7 @@ public final class AppManifestConfigMetricsLoggerTest extends AdServicesExtended when(mMockContext.getSharedPreferences(any(String.class), anyInt())).thenThrow(exception); - logUsageAndDontWait(PKG_NAME, APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT); + logUsageAndDontWait(PKG_NAME, RESULT_ALLOWED_APP_ALLOWS_ALL); mErrorLogUtilWithThrowableCallback.assertReceived( expect, @@ -235,7 +204,7 @@ public final class AppManifestConfigMetricsLoggerTest extends AdServicesExtended public void testLogUsage_commitFailed() throws Exception { mPrefs.onCommitReturns(/* result= */ false); - logUsageAndDontWait(PKG_NAME, APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT); + logUsageAndDontWait(PKG_NAME, RESULT_ALLOWED_APP_ALLOWS_ALL); Map<String, ?> allProps = mPrefs.getAll(); assertWithMessage("allProps").that(allProps).isEmpty(); @@ -258,7 +227,7 @@ public final class AppManifestConfigMetricsLoggerTest extends AdServicesExtended return mPrefs; }); - logUsageAndWait(mPrefs, PKG_NAME, APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT); + logUsageAndWait(PKG_NAME, RESULT_ALLOWED_APP_ALLOWS_ALL); assertWithMessage("execution thread") .that(executionThread.get()) @@ -288,63 +257,58 @@ public final class AppManifestConfigMetricsLoggerTest extends AdServicesExtended @Test public void testDump_multipleEntries() throws Exception { - logUsageAndWait(mPrefs, PKG_NAME, APP_EXISTS, APP_HAS_CONFIG, ENABLED_BY_DEFAULT); + logUsageAndWait(PKG_NAME, API_TOPICS, RESULT_ALLOWED_APP_ALLOWS_ALL); + logUsageAndWait(PKG_NAME, API_ATTRIBUTION, RESULT_DISALLOWED_BY_APP); logUsageAndWait( - mPrefs, - PKG_NAME2, - APP_DOES_NOT_EXIST, - APP_DOES_NOT_HAVE_CONFIG, - NOT_ENABLED_BY_DEFAULT); + PKG_NAME2, API_ATTRIBUTION, RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG); String dump = DumpHelper.dump(pw -> AppManifestConfigMetricsLogger.dump(mMockContext, pw)); + String entry1 = + ".*" + + PKG_NAME + + "-" + + apiToString(API_TOPICS) + + ": " + + resultToString(RESULT_ALLOWED_APP_ALLOWS_ALL) + + ".*\n"; + String entry2 = + ".*" + + PKG_NAME + + "-" + + apiToString(API_ATTRIBUTION) + + ": " + + resultToString(RESULT_DISALLOWED_BY_APP) + + ".*\n"; + String entry3 = + ".*" + + PKG_NAME2 + + "-" + + apiToString(API_ATTRIBUTION) + + ": " + + resultToString(RESULT_ALLOWED_BY_DEFAULT_APP_DOES_NOT_HAVE_CONFIG) + + ".*\n"; expect.withMessage("dump") .that(dump) .matches( Pattern.compile( - ".*2 entries.*\n" - + ".*" - + PKG_NAME - + ":.*appExists=" - + APP_EXISTS - + ".*appHasConfig=" - + APP_HAS_CONFIG - + ".*enabledByDefault=" - + ENABLED_BY_DEFAULT - + "\n" - + ".*" - + PKG_NAME2 - + ":.*appExists=" - + APP_DOES_NOT_EXIST - + ".*appHasConfig=" - + APP_DOES_NOT_HAVE_CONFIG - + ".*enabledByDefault=" - + NOT_ENABLED_BY_DEFAULT - + "\n", - Pattern.DOTALL)); + ".*3 entries.*\n" + entry1 + entry2 + entry3, Pattern.DOTALL)); } // Needs to wait until the shared prefs is committed() as it happens in a separated thread - private void logUsageAndWait(boolean appExists, boolean appHasConfig, boolean enabledByDefault) + private void logUsageAndWait(String appName, @Result int callResult) throws InterruptedException { - logUsageAndWait(mPrefs, PKG_NAME, appExists, appHasConfig, enabledByDefault); + logUsageAndWait(appName, API, callResult); } // Needs to wait until the shared prefs is committed() as it happens in a separated thread - private void logUsageAndWait( - SharedPreferences prefs, - String appName, - boolean appExists, - boolean appHasConfig, - boolean enabledByDefault) + private void logUsageAndWait(String appName, @ApiType int api, @Result int callResult) throws InterruptedException { SyncOnSharedPreferenceChangeListener listener = new SyncOnSharedPreferenceChangeListener(); - prefs.registerOnSharedPreferenceChangeListener(listener); + mPrefs.registerOnSharedPreferenceChangeListener(listener); try { - AppManifestConfigCall call = new AppManifestConfigCall(appName); - call.appExists = appExists; - call.appHasConfig = appHasConfig; - call.enabledByDefault = enabledByDefault; + AppManifestConfigCall call = new AppManifestConfigCall(appName, api); + call.result = callResult; Log.v(mTag, "logUsageAndWait(call=" + call + ", listener=" + listener + ")"); AppManifestConfigMetricsLogger.logUsage(call); @@ -357,61 +321,24 @@ public final class AppManifestConfigMetricsLoggerTest extends AdServicesExtended // Should only be used in cases where the call is expect to not change the shared preferences // (in which case a listener would not be called) - private void logUsageAndDontWait( - String appName, boolean appExists, boolean appHasConfig, boolean enabledByDefault) { - AppManifestConfigCall call = new AppManifestConfigCall(appName); - call.appExists = appExists; - call.appHasConfig = appHasConfig; - call.enabledByDefault = enabledByDefault; + private void logUsageAndDontWait(String appName, @Result int callResult) { + AppManifestConfigCall call = new AppManifestConfigCall(appName, API); + call.result = callResult; Log.v(mTag, "logUsageAndDontWait(call=" + call + ")"); AppManifestConfigMetricsLogger.logUsage(call); } - /** Gets a custom Mockito matcher for a {@link AppManifestConfigCall}, without the result. */ - static AppManifestConfigCall appManifestConfigCall( - String packageName, boolean appExists, boolean appHasConfig, boolean enabledByDefault) { - return argThat( - new AppManifestConfigCallMatcher( - packageName, appExists, appHasConfig, enabledByDefault)); - } - - private static final class AppManifestConfigCallMatcher - implements ArgumentMatcher<AppManifestConfigCall> { - - private final String mPackageName; - private final boolean mAppExists; - private final boolean mAppHasConfig; - private final boolean mEnabledByDefault; - - private AppManifestConfigCallMatcher( - String packageName, - boolean appExists, - boolean appHasConfig, - boolean enabledByDefault) { - mPackageName = packageName; - mAppExists = appExists; - mAppHasConfig = appHasConfig; - mEnabledByDefault = enabledByDefault; - } - - @Override - public boolean matches(AppManifestConfigCall arg) { - return arg != null - && arg.packageName.equals(mPackageName) - && arg.appExists == mAppExists - && arg.appHasConfig == mAppHasConfig - && arg.enabledByDefault == mEnabledByDefault; - } + // Must call mPrefs.onEditThrows() first + private void assertEditNotCalled() { + sleep( + 1_000, + "waiting to make sure edit() was not called in the background (which would " + + "have thrown an exception)"); - @Override - public String toString() { - AppManifestConfigCall call = new AppManifestConfigCall(mPackageName); - call.appExists = mAppExists; - call.appHasConfig = mAppHasConfig; - call.enabledByDefault = mEnabledByDefault; - - return call.toString() + " {NOT CHECING RESULT}"; - } + verifyErrorLogUtilErrorWithAnyException( + AD_SERVICES_ERROR_REPORTED__ERROR_CODE__SHARED_PREF_EXCEPTION, + AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__COMMON, + never()); } // TODO(b/309857141): move to its own class / common package (it will be done in a later CL so diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigParserTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigParserTest.java index 10fd81c8aa..724b1087c2 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigParserTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/AppManifestConfigParserTest.java @@ -16,6 +16,12 @@ package com.android.adservices.service.common; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION; +import static com.android.adservices.service.common.AppManifestConfigCall.RESULT_DISALLOWED_BY_APP; +import static com.android.adservices.service.common.AppManifestConfigCall.resultToString; + import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; @@ -82,10 +88,10 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { // Verify Attribution tags. expect.withMessage("getAttributionConfig().getAllowAdPartnersToAccess()") .that(appManifestConfig.isAllowedAttributionAccess("1234")) - .isTrue(); + .isEqualTo(RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID); expect.withMessage("isAllowedAttributionAccess()") .that(appManifestConfig.isAllowedAttributionAccess("108")) - .isFalse(); + .isEqualTo(RESULT_DISALLOWED_BY_APP); AppManifestAttributionConfig attributionConfig = appManifestConfig.getAttributionConfig(); expect.withMessage("getAttributionConfig()").that(attributionConfig).isNotNull(); if (attributionConfig != null) { @@ -100,7 +106,7 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { // Verify Custom Audience tags. expect.withMessage("isAllowedCustomAudiencesAccess()") .that(appManifestConfig.isAllowedCustomAudiencesAccess("108")) - .isFalse(); + .isEqualTo(RESULT_DISALLOWED_BY_APP); AppManifestCustomAudiencesConfig customAudiencesConfig = appManifestConfig.getCustomAudiencesConfig(); expect.withMessage("getCustomAudiencesConfig()").that(customAudiencesConfig).isNotNull(); @@ -119,10 +125,10 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { // Verify Topics tags. expect.withMessage("1234567()") .that(appManifestConfig.isAllowedTopicsAccess("1234567")) - .isTrue(); + .isEqualTo(RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID); expect.withMessage("isAllowedTopicsAccess()") .that(appManifestConfig.isAllowedTopicsAccess("108")) - .isFalse(); + .isEqualTo(RESULT_DISALLOWED_BY_APP); AppManifestTopicsConfig topicsConfig = appManifestConfig.getTopicsConfig(); expect.withMessage("getTopicsConfig()").that(topicsConfig).isNotNull(); if (topicsConfig != null) { @@ -137,10 +143,10 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { // Verify AppId tags. expect.withMessage("isAllowedAdIdAccess()") .that(appManifestConfig.isAllowedAdIdAccess("42")) - .isTrue(); + .isEqualTo(RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID); expect.withMessage("isAllowedAdIdAccess()") .that(appManifestConfig.isAllowedAdIdAccess("108")) - .isFalse(); + .isEqualTo(RESULT_DISALLOWED_BY_APP); AppManifestAdIdConfig adIdConfig = appManifestConfig.getAdIdConfig(); expect.withMessage("getAdIdConfig()").that(adIdConfig).isNotNull(); if (adIdConfig != null) { @@ -155,10 +161,10 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { // Verify AppSetId tags. expect.withMessage("isAllowedAppSetIdAccess()") .that(appManifestConfig.isAllowedAppSetIdAccess("42")) - .isTrue(); + .isEqualTo(RESULT_ALLOWED_APP_ALLOWS_SPECIFIC_ID); expect.withMessage("isAllowedAppSetIdAccess()") .that(appManifestConfig.isAllowedAppSetIdAccess("108")) - .isFalse(); + .isEqualTo(RESULT_DISALLOWED_BY_APP); AppManifestAppSetIdConfig appSetIdConfig = appManifestConfig.getAppSetIdConfig(); expect.withMessage("getAppSetIdConfig()").that(appSetIdConfig).isNotNull(); if (appSetIdConfig != null) { @@ -216,34 +222,39 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { AppManifestAttributionConfig attributionConfig = appManifestConfig.getAttributionConfig(); expect.withMessage("getAttributionConfig()").that(attributionConfig).isNull(); - expect.withMessage("isAllowedAttributionAccess()") - .that(appManifestConfig.isAllowedAttributionAccess("not actually there")) - .isFalse(); + assertResult( + "isAllowedAttributionAccess()", + appManifestConfig.isAllowedAttributionAccess("not actually there"), + RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION); AppManifestCustomAudiencesConfig customAudiencesConfig = appManifestConfig.getCustomAudiencesConfig(); expect.withMessage("getCustomAudiencesConfig()").that(attributionConfig).isNull(); - expect.withMessage("isAllowedCustomAudiencesAccess()") - .that(appManifestConfig.isAllowedCustomAudiencesAccess("not actually there")) - .isFalse(); + assertResult( + "isAllowedCustomAudiencesAccess()", + appManifestConfig.isAllowedCustomAudiencesAccess("not actually there"), + RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION); AppManifestTopicsConfig topicsConfig = appManifestConfig.getTopicsConfig(); expect.withMessage("getTopicsConfig()").that(topicsConfig).isNull(); - expect.withMessage("isAllowedTopicsAccess()") - .that(appManifestConfig.isAllowedTopicsAccess("not actually there")) - .isFalse(); + assertResult( + "isAllowedTopicsAccess()", + appManifestConfig.isAllowedTopicsAccess("not actually there"), + RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION); AppManifestAdIdConfig adIdConfig = appManifestConfig.getAdIdConfig(); expect.withMessage("getAdIdConfig()").that(adIdConfig).isNull(); - expect.withMessage("isAllowedAdIdAccess()") - .that(appManifestConfig.isAllowedAdIdAccess("not actually there")) - .isFalse(); + assertResult( + "isAllowedAdIdAccess()", + appManifestConfig.isAllowedTopicsAccess("not actually there"), + RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION); AppManifestAppSetIdConfig appSetIdConfig = appManifestConfig.getAppSetIdConfig(); expect.withMessage("getAppSetIdConfig()").that(appSetIdConfig).isNull(); - expect.withMessage("isAllowedAppSetIdAccess()") - .that(appManifestConfig.isAllowedAppSetIdAccess("not actually there")) - .isFalse(); + assertResult( + "isAllowedAppSetIdAccess()", + appManifestConfig.isAllowedAppSetIdAccess("not actually there"), + RESULT_DISALLOWED_APP_HAS_CONFIG_WITHOUT_API_SECTION); } @Test @@ -254,16 +265,21 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { .getXml(R.xml.ad_services_config_missing_tags); AppManifestConfig appManifestConfig = AppManifestConfigParser.getConfig(parser, /* enabledByDefault= */ true); - assertWithMessage("manifest for ad_services_config_all_false_missing_attribution") + assertWithMessage("manifest for ad_services_config_missing_tags") .that(appManifestConfig) .isNotNull(); assertSdkLibraryConfigIsEmpty(appManifestConfig, /* containsByDefault= */ true); - assertAttributionConfigIsDefault(appManifestConfig); - assertCustomAudiencesConfigIsDefault(appManifestConfig); - assertTopicsConfigIsDefault(appManifestConfig); - assertAdIdConfigIsDefault(appManifestConfig); - assertAppSetIdConfigIsDefault(appManifestConfig); + assertAttributionConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); + assertCustomAudienceConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); + assertTopicsConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); + assertAdIdConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); + assertAppSetIdConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); } @Test @@ -279,11 +295,12 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { .isNotNull(); assertSdkLibraryConfigIsEmpty(appManifestConfig, /* containsByDefault= */ true); - assertAttributionConfigIsDefault(appManifestConfig); - assertCustomAudiencesConfigIsFalse(appManifestConfig); - assertTopicsConfigIsFalse(appManifestConfig); - assertAdIdConfigIsFalse(appManifestConfig); - assertAppSetIdConfigIsFalse(appManifestConfig); + assertAttributionConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); + assertCustomAudienceConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertTopicsConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAdIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAppSetIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); } @Test @@ -299,11 +316,12 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { .isNotNull(); assertSdkLibraryConfigIsEmpty(appManifestConfig, /* containsByDefault= */ true); - assertAttributionConfigIsFalse(appManifestConfig); - assertCustomAudiencesConfigIsDefault(appManifestConfig); - assertTopicsConfigIsFalse(appManifestConfig); - assertAdIdConfigIsFalse(appManifestConfig); - assertAppSetIdConfigIsFalse(appManifestConfig); + assertAttributionConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertCustomAudienceConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); + assertTopicsConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAdIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAppSetIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); } @Test @@ -319,11 +337,12 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { .isNotNull(); assertSdkLibraryConfigIsEmpty(appManifestConfig, /* containsByDefault= */ true); - assertAttributionConfigIsFalse(appManifestConfig); - assertCustomAudiencesConfigIsFalse(appManifestConfig); - assertTopicsConfigIsDefault(appManifestConfig); - assertAdIdConfigIsFalse(appManifestConfig); - assertAppSetIdConfigIsFalse(appManifestConfig); + assertAttributionConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertCustomAudienceConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertTopicsConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); + assertAdIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAppSetIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); } @Test @@ -339,11 +358,13 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { .isNotNull(); assertSdkLibraryConfigIsEmpty(appManifestConfig, /* containsByDefault= */ true); - assertAttributionConfigIsFalse(appManifestConfig); - assertCustomAudiencesConfigIsFalse(appManifestConfig); - assertTopicsConfigIsFalse(appManifestConfig); - assertAdIdConfigIsDefault(appManifestConfig); - assertAppSetIdConfigIsFalse(appManifestConfig); + assertAttributionConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertCustomAudienceConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertTopicsConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertTopicsConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAdIdConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); + assertAppSetIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); } @Test @@ -359,11 +380,12 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { .isNotNull(); assertSdkLibraryConfigIsEmpty(appManifestConfig, /* containsByDefault= */ true); - assertAttributionConfigIsFalse(appManifestConfig); - assertCustomAudiencesConfigIsFalse(appManifestConfig); - assertTopicsConfigIsFalse(appManifestConfig); - assertAdIdConfigIsFalse(appManifestConfig); - assertAppSetIdConfigIsDefault(appManifestConfig); + assertAttributionConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertCustomAudienceConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertTopicsConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAdIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAppSetIdConfigIsAllowed( + appManifestConfig, RESULT_ALLOWED_BY_DEFAULT_APP_HAS_CONFIG_WITHOUT_API_SECTION); } @Test @@ -379,11 +401,11 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { .isNotNull(); assertSdkLibraryConfigIsEmpty(appManifestConfig, /* containsByDefault= */ true); - assertAttributionConfigIsFalse(appManifestConfig); - assertCustomAudiencesConfigIsFalse(appManifestConfig); - assertTopicsConfigIsFalse(appManifestConfig); - assertAdIdConfigIsFalse(appManifestConfig); - assertAppSetIdConfigIsFalse(appManifestConfig); + assertAttributionConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertCustomAudienceConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertTopicsConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAdIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAppSetIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); } @Test @@ -415,11 +437,11 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { .that(sdkLibrary.contains("4815162342")) .isFalse(); - assertAttributionConfigIsFalse(appManifestConfig); - assertCustomAudiencesConfigIsFalse(appManifestConfig); - assertTopicsConfigIsFalse(appManifestConfig); - assertAdIdConfigIsFalse(appManifestConfig); - assertAppSetIdConfigIsFalse(appManifestConfig); + assertAttributionConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertCustomAudienceConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertTopicsConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAdIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAppSetIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); } @Test @@ -434,11 +456,11 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { .isNotNull(); assertSdkLibraryConfigIsEmpty(appManifestConfig, /* containsByDefault= */ false); - assertAttributionConfigIsFalse(appManifestConfig); - assertCustomAudiencesConfigIsFalse(appManifestConfig); - assertTopicsConfigIsFalse(appManifestConfig); - assertAdIdConfigIsFalse(appManifestConfig); - assertAppSetIdConfigIsFalse(appManifestConfig); + assertAttributionConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertCustomAudienceConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertTopicsConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAdIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); + assertAppSetIdConfigIsAllowed(appManifestConfig, RESULT_DISALLOWED_BY_APP); } @Test @@ -517,86 +539,46 @@ public final class AppManifestConfigParserTest extends AdServicesUnitTestCase { } } - private void assertAttributionConfigIsDefault(AppManifestConfig appManifestConfig) { - AppManifestAttributionConfig attributionConfig = appManifestConfig.getAttributionConfig(); - assertApiConfigIsDefault("getAttributionConfig()", attributionConfig); - expect.withMessage("isAllowedAttributionAccess()") - .that(appManifestConfig.isAllowedAttributionAccess("not actually there")) - .isTrue(); - } - - private void assertAttributionConfigIsFalse(AppManifestConfig appManifestConfig) { - AppManifestAttributionConfig attributionConfig = appManifestConfig.getAttributionConfig(); - assertApiConfigIsFalse("getAttributionConfig()", attributionConfig); - expect.withMessage("isAllowedAttributionAccess()") - .that(appManifestConfig.isAllowedAttributionAccess("not actually there")) - .isFalse(); - } - - private void assertCustomAudiencesConfigIsDefault(AppManifestConfig appManifestConfig) { - AppManifestCustomAudiencesConfig customAudiencesConfig = - appManifestConfig.getCustomAudiencesConfig(); - assertApiConfigIsDefault("getCustomAudiencesConfig()", customAudiencesConfig); - expect.withMessage("isAllowedCustomAudiencesAccess()") - .that(appManifestConfig.isAllowedCustomAudiencesAccess("not actually there")) - .isTrue(); + private void assertResult(String method, int actualResult, int expectedResult) { + expect.withMessage( + "%s (where %s=%s and %s=%s)", + method, + actualResult, + resultToString(actualResult), + expectedResult, + resultToString(expectedResult)) + .that(actualResult) + .isEqualTo(expectedResult); } - private void assertCustomAudiencesConfigIsFalse(AppManifestConfig appManifestConfig) { - AppManifestCustomAudiencesConfig customAudiencesConfig = - appManifestConfig.getCustomAudiencesConfig(); - assertApiConfigIsFalse("getCustomAudiencesConfig()", customAudiencesConfig); - expect.withMessage("isAllowedCustomAudiencesAccess()") - .that(appManifestConfig.isAllowedCustomAudiencesAccess("not actually there")) - .isFalse(); + private void assertAttributionConfigIsAllowed( + AppManifestConfig appManifestConfig, int expectedResult) { + int actualResult = appManifestConfig.isAllowedAttributionAccess("not actually there"); + assertResult("getAttributionConfig()", actualResult, expectedResult); } - private void assertTopicsConfigIsDefault(AppManifestConfig appManifestConfig) { - AppManifestTopicsConfig topicsConfig = appManifestConfig.getTopicsConfig(); - assertApiConfigIsDefault("getTopicsConfig()", topicsConfig); - expect.withMessage("isAllowedTopicsAccess()") - .that(appManifestConfig.isAllowedTopicsAccess("not actually there")) - .isTrue(); + private void assertCustomAudienceConfigIsAllowed( + AppManifestConfig appManifestConfig, int expectedResult) { + int actualResult = appManifestConfig.isAllowedCustomAudiencesAccess("not actually there"); + assertResult("getCustomAudiencesConfig()", actualResult, expectedResult); } - private void assertTopicsConfigIsFalse(AppManifestConfig appManifestConfig) { - AppManifestTopicsConfig topicsConfig = appManifestConfig.getTopicsConfig(); - assertApiConfigIsFalse("getTopicsConfig()", topicsConfig); - expect.withMessage("isAllowedTopicsAccess()") - .that(appManifestConfig.isAllowedTopicsAccess("not actually there")) - .isFalse(); + private void assertTopicsConfigIsAllowed( + AppManifestConfig appManifestConfig, int expectedResult) { + int actualResult = appManifestConfig.isAllowedTopicsAccess("not actually there"); + assertResult("getTopicsConfig()", actualResult, expectedResult); } - private void assertAdIdConfigIsDefault(AppManifestConfig appManifestConfig) { - AppManifestAdIdConfig adIdConfig = appManifestConfig.getAdIdConfig(); - assertApiConfigIsDefault("getAdIdConfig()", adIdConfig); - expect.withMessage("isAllowedAdIdAccess()") - .that(appManifestConfig.isAllowedAdIdAccess("not actually there")) - .isTrue(); - } - - private void assertAdIdConfigIsFalse(AppManifestConfig appManifestConfig) { - AppManifestAdIdConfig adIdConfig = appManifestConfig.getAdIdConfig(); - assertApiConfigIsFalse("getAdIdConfig()", adIdConfig); - expect.withMessage("isAllowedAdIdAccess()") - .that(appManifestConfig.isAllowedAdIdAccess("not actually there")) - .isFalse(); + private void assertAdIdConfigIsAllowed( + AppManifestConfig appManifestConfig, int expectedResult) { + int actualResult = appManifestConfig.isAllowedAdIdAccess("not actually there"); + assertResult("getAdIdConfig()", actualResult, expectedResult); } - private void assertAppSetIdConfigIsDefault(AppManifestConfig appManifestConfig) { - AppManifestAppSetIdConfig appSetIdConfig = appManifestConfig.getAppSetIdConfig(); - assertApiConfigIsDefault("getAppSetIdConfig()", appSetIdConfig); - expect.withMessage("isAllowedAppSetIdAccess()") - .that(appManifestConfig.isAllowedAppSetIdAccess("not actually there")) - .isTrue(); - } - - private void assertAppSetIdConfigIsFalse(AppManifestConfig appManifestConfig) { - AppManifestAppSetIdConfig appSetIdConfig = appManifestConfig.getAppSetIdConfig(); - assertApiConfigIsFalse("getAppSetIdConfig()", appSetIdConfig); - expect.withMessage("isAllowedAppSetIdAccess()") - .that(appManifestConfig.isAllowedAppSetIdAccess("not actually there")) - .isFalse(); + private void assertAppSetIdConfigIsAllowed( + AppManifestConfig appManifestConfig, int expectedResult) { + int actualResult = appManifestConfig.isAllowedAppSetIdAccess("not actually there"); + assertResult("getAppSetIdConfig()", actualResult, expectedResult); } private void assertApiConfigIsDefault(String name, AppManifestApiConfig config) { diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeAuthorizationFilterTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeAuthorizationFilterTest.java index c4c187946e..5460b2273e 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeAuthorizationFilterTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeAuthorizationFilterTest.java @@ -17,7 +17,6 @@ package com.android.adservices.service.common; import static android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE; -import static android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_PROTECTED_SIGNALS; import static android.adservices.common.AdServicesStatusUtils.STATUS_CALLER_NOT_ALLOWED; import static android.adservices.common.AdServicesStatusUtils.STATUS_PERMISSION_NOT_REQUESTED; import static android.adservices.common.AdServicesStatusUtils.STATUS_UNAUTHORIZED; @@ -165,7 +164,7 @@ public final class FledgeAuthorizationFilterTest extends AdServicesExtendedMocki } @Test - public void testAssertAppHasCaPermission_appHasPermission() + public void testAssertAppHasPermission_appHasPermission() throws PackageManager.NameNotFoundException { PackageInfo packageInfoGrant = new PackageInfo(); packageInfoGrant.requestedPermissions = new String[] {ACCESS_ADSERVICES_CUSTOM_AUDIENCE}; @@ -177,26 +176,7 @@ public final class FledgeAuthorizationFilterTest extends AdServicesExtendedMocki when(PermissionHelper.hasCustomAudiencesPermission(CONTEXT, CONTEXT.getPackageName())) .thenReturn(true); - mChecker.assertAppDeclaredCustomAudiencePermission( - CONTEXT, CustomAudienceFixture.VALID_OWNER, API_NAME_LOGGING_ID); - - verifyZeroInteractions(mPackageManagerMock, mEnrollmentDaoMock, mAdServicesLoggerMock); - } - - @Test - public void testAssertAppHasPasPermission_appHasPermission() - throws PackageManager.NameNotFoundException { - PackageInfo packageInfoGrant = new PackageInfo(); - packageInfoGrant.requestedPermissions = new String[] {ACCESS_ADSERVICES_PROTECTED_SIGNALS}; - doReturn(packageInfoGrant) - .when(mPackageManagerMock) - .getPackageInfo( - eq(CustomAudienceFixture.VALID_OWNER), eq(PackageManager.GET_PERMISSIONS)); - - when(PermissionHelper.hasProtectedSignalsPermission(CONTEXT, CONTEXT.getPackageName())) - .thenReturn(true); - - mChecker.assertAppDeclaredProtectedSignalsPermission( + mChecker.assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, API_NAME_LOGGING_ID); verifyZeroInteractions(mPackageManagerMock, mEnrollmentDaoMock, mAdServicesLoggerMock); @@ -216,7 +196,7 @@ public final class FledgeAuthorizationFilterTest extends AdServicesExtendedMocki assertThrows( SecurityException.class, () -> - mChecker.assertAppDeclaredCustomAudiencePermission( + mChecker.assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, API_NAME_LOGGING_ID)); @@ -232,7 +212,7 @@ public final class FledgeAuthorizationFilterTest extends AdServicesExtendedMocki } @Test - public void testAssertAppHasCaPermission_mismatchedAppPackageName_throwSecurityException() + public void testAssertAppHasPermission_mismatchedAppPackageName_throwSecurityException() throws PackageManager.NameNotFoundException { doReturn(new PackageInfo()) .when(mPackageManagerMock) @@ -245,34 +225,7 @@ public final class FledgeAuthorizationFilterTest extends AdServicesExtendedMocki assertThrows( SecurityException.class, () -> - mChecker.assertAppDeclaredCustomAudiencePermission( - CONTEXT, "mismatchedAppPackageName", API_NAME_LOGGING_ID)); - - assertEquals( - AdServicesStatusUtils.SECURITY_EXCEPTION_PERMISSION_NOT_REQUESTED_ERROR_MESSAGE, - exception.getMessage()); - verify(mAdServicesLoggerMock) - .logFledgeApiCallStats( - eq(API_NAME_LOGGING_ID), eq(STATUS_PERMISSION_NOT_REQUESTED), anyInt()); - verifyNoMoreInteractions(mAdServicesLoggerMock); - verifyZeroInteractions(mPackageManagerMock, mEnrollmentDaoMock); - } - - @Test - public void testAssertAppHasPasPermission_mismatchedAppPackageName_throwSecurityException() - throws PackageManager.NameNotFoundException { - doReturn(new PackageInfo()) - .when(mPackageManagerMock) - .getPackageInfo( - eq(CustomAudienceFixture.VALID_OWNER), eq(PackageManager.GET_PERMISSIONS)); - when(PermissionHelper.hasProtectedSignalsPermission(CONTEXT, CONTEXT.getPackageName())) - .thenReturn(false); - - SecurityException exception = - assertThrows( - SecurityException.class, - () -> - mChecker.assertAppDeclaredProtectedSignalsPermission( + mChecker.assertAppDeclaredPermission( CONTEXT, "mismatchedAppPackageName", API_NAME_LOGGING_ID)); assertEquals( @@ -286,22 +239,11 @@ public final class FledgeAuthorizationFilterTest extends AdServicesExtendedMocki } @Test - public void testAssertAppHasCaPermission_nullContext_throwNpe() { - assertThrows( - NullPointerException.class, - () -> - mChecker.assertAppDeclaredCustomAudiencePermission( - null, CustomAudienceFixture.VALID_OWNER, API_NAME_LOGGING_ID)); - - verifyZeroInteractions(mPackageManagerMock, mEnrollmentDaoMock, mAdServicesLoggerMock); - } - - @Test - public void testAssertAppHasPasPermission_nullContext_throwNpe() { + public void testAssertAppHasPermission_nullContext_throwNpe() { assertThrows( NullPointerException.class, () -> - mChecker.assertAppDeclaredProtectedSignalsPermission( + mChecker.assertAppDeclaredPermission( null, CustomAudienceFixture.VALID_OWNER, API_NAME_LOGGING_ID)); verifyZeroInteractions(mPackageManagerMock, mEnrollmentDaoMock, mAdServicesLoggerMock); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java index e0cd178463..8e77cfdc3d 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java @@ -122,7 +122,6 @@ import com.android.adservices.data.adselection.AdSelectionServerDatabase; import com.android.adservices.data.adselection.AppInstallDao; import com.android.adservices.data.adselection.DBAdSelectionDebugReport; import com.android.adservices.data.adselection.EncryptionContextDao; -import com.android.adservices.data.adselection.EncryptionKeyDao; import com.android.adservices.data.adselection.FrequencyCapDao; import com.android.adservices.data.adselection.SharedStorageDatabase; import com.android.adservices.data.common.DBAdData; @@ -132,6 +131,8 @@ import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.data.customaudience.CustomAudienceDatabase; import com.android.adservices.data.customaudience.DBCustomAudience; import com.android.adservices.data.customaudience.DBTrustedBiddingData; +import com.android.adservices.data.encryptionkey.EncryptionKeyDao; +import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.data.signals.EncodedPayloadDao; import com.android.adservices.data.signals.ProtectedSignalsDatabase; import com.android.adservices.service.Flags; @@ -323,6 +324,7 @@ public class FledgeE2ETest { private AppInstallDao mAppInstallDao; private FrequencyCapDao mFrequencyCapDao; private EncryptionKeyDao mEncryptionKeyDao; + private EnrollmentDao mEnrollmentDao; private EncryptionContextDao mEncryptionContextDao; private ExecutorService mLightweightExecutorService; private ExecutorService mBackgroundExecutorService; @@ -389,8 +391,8 @@ public class FledgeE2ETest { mFrequencyCapDao = sharedDb.frequencyCapDao(); AdSelectionServerDatabase serverDb = Room.inMemoryDatabaseBuilder(CONTEXT_SPY, AdSelectionServerDatabase.class).build(); - mEncryptionContextDao = serverDb.encryptionContextDao(); - mEncryptionKeyDao = serverDb.encryptionKeyDao(); + mEncryptionKeyDao = EncryptionKeyDao.getInstance(CONTEXT_SPY); + mEnrollmentDao = EnrollmentDao.getInstance(CONTEXT_SPY); mAdFilteringFeatureFactory = new AdFilteringFeatureFactory(mAppInstallDao, mFrequencyCapDao, DEFAULT_FLAGS); @@ -1232,8 +1234,8 @@ public class FledgeE2ETest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilterMock, mLightweightExecutorService, @@ -1393,8 +1395,8 @@ public class FledgeE2ETest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilterMock, mLightweightExecutorService, @@ -2990,6 +2992,35 @@ public class FledgeE2ETest { @Test public void testFledgeFlowSuccessWithMockServer_ContextualAdsFlow() throws Exception { + // Reinitializing service so default flags are used + // Create an instance of AdSelection Service with real dependencies + mAdSelectionService = + new AdSelectionServiceImpl( + mAdSelectionEntryDao, + mAppInstallDao, + mCustomAudienceDao, + mEncodedPayloadDao, + mFrequencyCapDao, + mEncryptionKeyDao, + mEnrollmentDao, + mAdServicesHttpsClient, + mDevContextFilterMock, + mLightweightExecutorService, + mBackgroundExecutorService, + mScheduledExecutor, + CONTEXT_SPY, + mAdServicesLogger, + DEFAULT_FLAGS, + CallingAppUidSupplierProcessImpl.create(), + mFledgeAuthorizationFilterMock, + mAdSelectionServiceFilterMock, + mAdFilteringFeatureFactory, + mConsentManagerMock, + mObliviousHttpEncryptorMock, + mAdSelectionDebugReportDao, + mAdIdFetcher, + false); + doReturn(AdServicesApiConsent.GIVEN) .when(mConsentManagerMock) .getConsent(AdServicesApiType.FLEDGE); @@ -4335,8 +4366,8 @@ public class FledgeE2ETest { mCustomAudienceDao, mEncodedPayloadDao, mFrequencyCapDao, - mEncryptionContextDao, mEncryptionKeyDao, + mEnrollmentDao, mAdServicesHttpsClient, mDevContextFilterMock, mLightweightExecutorService, @@ -4955,11 +4986,12 @@ public class FledgeE2ETest { AdTechIdentifier.fromString( mockWebServerRule.uriForPath(BUYER_BIDDING_LOGIC_URI_PATH).getHost()); SignedContextualAds contextualAds = - SignedContextualAdsFixture.generateSignedContextualAds( - buyer, ImmutableList.of(100.0, 200.0, 300.0, 400.0, 500.0)) - .setDecisionLogicUri( - mockWebServerRule.uriForPath(BUYER_BIDDING_LOGIC_URI_PATH)) - .build(); + SignedContextualAdsFixture.signContextualAds( + SignedContextualAdsFixture.aContextualAdsWithEmptySignatureBuilder( + buyer, ImmutableList.of(100.0, 200.0, 300.0, 400.0, 500.0)) + .setDecisionLogicUri( + mockWebServerRule.uriForPath( + BUYER_BIDDING_LOGIC_URI_PATH))); buyerContextualAds.put(buyer, contextualAds); return buyerContextualAds; } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/PackageChangedReceiverTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/PackageChangedReceiverTest.java index 03635db388..7c4f4297c4 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/PackageChangedReceiverTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/PackageChangedReceiverTest.java @@ -16,6 +16,8 @@ package com.android.adservices.service.common; +import static android.adservices.common.CommonFixture.doSleep; + import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt; import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyLong; @@ -64,6 +66,7 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.modules.utils.build.SdkLevel; import org.junit.After; +import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -326,6 +329,7 @@ public class PackageChangedReceiverTest { @Test public void testReceivePackageFullyRemoved_consent_noPackageUid() throws InterruptedException, IOException { + Assume.assumeTrue(SdkLevel.isAtLeastS()); Intent intent = createIntentSentByAdServiceSystemService( PackageChangedReceiver.PACKAGE_FULLY_REMOVED); @@ -342,6 +346,7 @@ public class PackageChangedReceiverTest { @Test public void testReceivePackageFullyRemoved_consent_packageUidIsExplicitlyDefault() throws InterruptedException, IOException { + Assume.assumeTrue(SdkLevel.isAtLeastS()); Intent intent = createIntentSentByAdServiceSystemService( PackageChangedReceiver.PACKAGE_FULLY_REMOVED); @@ -354,6 +359,7 @@ public class PackageChangedReceiverTest { @Test public void testReceivePackageFullyRemoved_consent_noPackageUid_backCompat() throws InterruptedException, IOException { + Assume.assumeTrue(SdkLevel.isAtLeastS()); Intent intent = createIntentSentBySystem(Intent.ACTION_PACKAGE_FULLY_REMOVED); intent.removeExtra(Intent.EXTRA_UID); @@ -364,6 +370,7 @@ public class PackageChangedReceiverTest { @Test public void testReceivePackageFullyRemoved_consent_packageUidIsExplicitlyDefault_backCompat() throws InterruptedException, IOException { + Assume.assumeTrue(SdkLevel.isAtLeastS()); Intent intent = createIntentSentBySystem(Intent.ACTION_PACKAGE_FULLY_REMOVED); intent.putExtra(Intent.EXTRA_UID, DEFAULT_PACKAGE_UID); @@ -711,6 +718,7 @@ public class PackageChangedReceiverTest { } private void runPackageFullyRemovedForConsent(Intent intent) throws Exception { + Assume.assumeTrue(SdkLevel.isAtLeastS()); // Start a mockitoSession to mock static method // Lenient added to allow easy disabling of other APIs' methods MockitoSession session = @@ -1159,4 +1167,35 @@ public class PackageChangedReceiverTest { mMockitoSession.finishMocking(); } } + + @Test + public void testAppConsentDeletion_onR() throws Exception { + MockitoSession mMockitoSession = + ExtendedMockito.mockitoSession() + .mockStatic(SdkLevel.class) + .mockStatic(ConsentManager.class) + .strictness(Strictness.LENIENT) + .initMocks(this) + .startMocking(); + try { + ExtendedMockito.doReturn(false).when(SdkLevel::isAtLeastS); + doReturn(mConsentManager).when(() -> ConsentManager.getInstance(any())); + PackageChangedReceiver spyReceiver = createSpyPackageReceiverForConsent(); + Intent intent = + createIntentSentByAdServiceSystemService( + PackageChangedReceiver.PACKAGE_FULLY_REMOVED); + doReturn(false).when(spyReceiver).isPackageStillInstalled(any(), anyString()); + + // Invoke the onReceive method to test the behavior + spyReceiver.onReceive(sContext, intent); + + verify(spyReceiver).consentOnPackageFullyRemoved(any(), any(), anyInt()); + doSleep(BACKGROUND_THREAD_TIMEOUT_MS); + + // On R App consent clear should not be called as it is not supported + verify(mConsentManager, never()).clearConsentForUninstalledApp(any(), anyInt()); + } finally { + mMockitoSession.finishMocking(); + } + } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/PermissionHelperTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/PermissionHelperTest.java index e723d48ab8..652ba36e6b 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/PermissionHelperTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/PermissionHelperTest.java @@ -19,7 +19,6 @@ package com.android.adservices.service.common; import static android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_AD_ID; import static android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_ATTRIBUTION; import static android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_CUSTOM_AUDIENCE; -import static android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_PROTECTED_SIGNALS; import static android.adservices.common.AdServicesPermissions.ACCESS_ADSERVICES_TOPICS; import static com.google.common.truth.Truth.assertThat; @@ -67,8 +66,7 @@ public class PermissionHelperTest { ACCESS_ADSERVICES_TOPICS, ACCESS_ADSERVICES_AD_ID, ACCESS_ADSERVICES_ATTRIBUTION, - ACCESS_ADSERVICES_CUSTOM_AUDIENCE, - ACCESS_ADSERVICES_PROTECTED_SIGNALS + ACCESS_ADSERVICES_CUSTOM_AUDIENCE }; doReturn(packageInfoGrant) .when(mMockPackageManagerGrant) @@ -170,10 +168,6 @@ public class PermissionHelperTest { getMockContext(ACCESS_ADSERVICES_CUSTOM_AUDIENCE, mMockPackageManagerGrant); assertThat(PermissionHelper.hasCustomAudiencesPermission(mockContext3, APP_PACKAGE_NAME)) .isTrue(); - Context mockContext4 = - getMockContext(ACCESS_ADSERVICES_PROTECTED_SIGNALS, mMockPackageManagerGrant); - assertThat(PermissionHelper.hasProtectedSignalsPermission(mockContext4, APP_PACKAGE_NAME)) - .isTrue(); } @Test @@ -191,8 +185,6 @@ public class PermissionHelperTest { .isFalse(); assertThat(PermissionHelper.hasCustomAudiencesPermission(mockContext, APP_PACKAGE_NAME)) .isFalse(); - assertThat(PermissionHelper.hasProtectedSignalsPermission(mockContext, APP_PACKAGE_NAME)) - .isFalse(); assertThat(PermissionHelper.hasAccessAdServicesStatePermission(mockContext)).isFalse(); assertThat(PermissionHelper.hasModifyAdServicesStatePermission(mockContext)).isFalse(); } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/consent/ConsentMigrationUtilsTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/consent/ConsentMigrationUtilsTest.java index 3525f21ad4..fd4e96d756 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/consent/ConsentMigrationUtilsTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/consent/ConsentMigrationUtilsTest.java @@ -24,6 +24,7 @@ import static android.adservices.extdata.AdServicesExtDataParams.STATE_UNKNOWN; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.never; @@ -42,6 +43,8 @@ import com.android.adservices.data.common.BooleanFileDatastore; import com.android.adservices.mockito.AdServicesExtendedMockitoRule; import com.android.adservices.service.appsearch.AppSearchConsentManager; import com.android.adservices.service.extdata.AdServicesExtDataStorageServiceManager; +import com.android.adservices.service.stats.ConsentMigrationStats; +import com.android.adservices.service.stats.StatsdAdServicesLogger; import com.android.modules.utils.build.SdkLevel; import org.junit.Rule; @@ -68,9 +71,14 @@ public class ConsentMigrationUtilsTest { .setManualInteractionWithConsentStatus(STATE_UNKNOWN) .build(); + private static final int REGION_ROW_CODE = 2; + @Rule public final AdServicesExtendedMockitoRule mExtendedMockitoRule = - new AdServicesExtendedMockitoRule.Builder(this).spyStatic(SdkLevel.class).build(); + new AdServicesExtendedMockitoRule.Builder(this) + .spyStatic(SdkLevel.class) + .spyStatic(DeviceRegionProvider.class) + .build(); @Spy private final Context mContextSpy = ApplicationProvider.getApplicationContext(); @Mock private BooleanFileDatastore mDatastoreMock; @@ -79,6 +87,7 @@ public class ConsentMigrationUtilsTest { @Mock private SharedPreferences mSharedPreferencesMock; @Mock private SharedPreferences.Editor mSharedPreferencesEditorMock; @Mock private AdServicesExtDataParams mAdServicesExtDataParamsMock; + @Mock private StatsdAdServicesLogger mStatsdAdServicesLoggerMock; @Test public void testHandleConsentMigrationToAppSearchIfNeeded_onR_skipsMigration() { @@ -89,10 +98,12 @@ public class ConsentMigrationUtilsTest { mContextSpy, mDatastoreMock, mAppSearchConsentManagerMock, - mAdServicesExtDataManagerMock); + mAdServicesExtDataManagerMock, + mStatsdAdServicesLoggerMock); verifyZeroInteractions(mAppSearchConsentManagerMock); verifyZeroInteractions(mAdServicesExtDataManagerMock); + verifyZeroInteractions(mStatsdAdServicesLoggerMock); } @Test @@ -103,10 +114,12 @@ public class ConsentMigrationUtilsTest { mContextSpy, mDatastoreMock, mAppSearchConsentManagerMock, - mAdServicesExtDataManagerMock); + mAdServicesExtDataManagerMock, + mStatsdAdServicesLoggerMock); verifyZeroInteractions(mAppSearchConsentManagerMock); verifyZeroInteractions(mAdServicesExtDataManagerMock); + verifyZeroInteractions(mStatsdAdServicesLoggerMock); } @Test @@ -115,10 +128,15 @@ public class ConsentMigrationUtilsTest { mockSDevice(); ConsentMigrationUtils.handleConsentMigrationToAppSearchIfNeeded( - mContextSpy, mDatastoreMock, mAppSearchConsentManagerMock, null); + mContextSpy, + mDatastoreMock, + mAppSearchConsentManagerMock, + null, + mStatsdAdServicesLoggerMock); verifyZeroInteractions(mAdServicesExtDataManagerMock); verifyZeroInteractions(mAppSearchConsentManagerMock); + verifyZeroInteractions(mStatsdAdServicesLoggerMock); } @Test @@ -136,10 +154,12 @@ public class ConsentMigrationUtilsTest { mContextSpy, mDatastoreMock, mAppSearchConsentManagerMock, - mAdServicesExtDataManagerMock); + mAdServicesExtDataManagerMock, + mStatsdAdServicesLoggerMock); verifyZeroInteractions(mAppSearchConsentManagerMock); verifyZeroInteractions(mAdServicesExtDataManagerMock); + verifyZeroInteractions(mStatsdAdServicesLoggerMock); } @Test @@ -157,12 +177,14 @@ public class ConsentMigrationUtilsTest { mContextSpy, mDatastoreMock, mAppSearchConsentManagerMock, - mAdServicesExtDataManagerMock); + mAdServicesExtDataManagerMock, + mStatsdAdServicesLoggerMock); verify(mAppSearchConsentManagerMock).wasU18NotificationDisplayed(); verifyNoMoreInteractions(mAppSearchConsentManagerMock); verifyZeroInteractions(mAdServicesExtDataManagerMock); + verifyZeroInteractions(mStatsdAdServicesLoggerMock); } @Test @@ -183,7 +205,8 @@ public class ConsentMigrationUtilsTest { mContextSpy, mDatastoreMock, mAppSearchConsentManagerMock, - mAdServicesExtDataManagerMock); + mAdServicesExtDataManagerMock, + mStatsdAdServicesLoggerMock); verify(mAppSearchConsentManagerMock).wasU18NotificationDisplayed(); verify(mAppSearchConsentManagerMock).wasGaUxNotificationDisplayed(); @@ -192,6 +215,7 @@ public class ConsentMigrationUtilsTest { verify(mAdServicesExtDataManagerMock).getAdServicesExtData(); verifyNoMoreInteractions(mAdServicesExtDataManagerMock); + verifyZeroInteractions(mStatsdAdServicesLoggerMock); } @Test @@ -211,11 +235,14 @@ public class ConsentMigrationUtilsTest { when(mSharedPreferencesMock.edit()).thenReturn(mSharedPreferencesEditorMock); when(mSharedPreferencesEditorMock.commit()).thenReturn(true); + doReturn(false).when(() -> DeviceRegionProvider.isEuDevice(any())); + ConsentMigrationUtils.handleConsentMigrationToAppSearchIfNeeded( mContextSpy, mDatastoreMock, mAppSearchConsentManagerMock, - mAdServicesExtDataManagerMock); + mAdServicesExtDataManagerMock, + mStatsdAdServicesLoggerMock); verify(mAppSearchConsentManagerMock).wasU18NotificationDisplayed(); verify(mAppSearchConsentManagerMock).wasGaUxNotificationDisplayed(); @@ -241,6 +268,21 @@ public class ConsentMigrationUtilsTest { verify(mAdServicesExtDataManagerMock).getAdServicesExtData(); verify(mAdServicesExtDataManagerMock).clearDataOnOtaAsync(); verifyNoMoreInteractions(mAdServicesExtDataManagerMock); + + ConsentMigrationStats consentMigrationStats = + ConsentMigrationStats.builder() + .setTopicsConsent(false) + .setFledgeConsent(false) + .setMsmtConsent(false) + .setDefaultConsent(true) + .setMigrationStatus( + ConsentMigrationStats.MigrationStatus + .SUCCESS_WITH_SHARED_PREF_UPDATED) + .setMigrationType( + ConsentMigrationStats.MigrationType.ADEXT_SERVICE_TO_APPSEARCH) + .setRegion(REGION_ROW_CODE) + .build(); + verify(mStatsdAdServicesLoggerMock).logConsentMigrationStats(consentMigrationStats); } @Test @@ -260,11 +302,14 @@ public class ConsentMigrationUtilsTest { when(mSharedPreferencesMock.edit()).thenReturn(mSharedPreferencesEditorMock); when(mSharedPreferencesEditorMock.commit()).thenReturn(false); + doReturn(false).when(() -> DeviceRegionProvider.isEuDevice(any())); + ConsentMigrationUtils.handleConsentMigrationToAppSearchIfNeeded( mContextSpy, mDatastoreMock, mAppSearchConsentManagerMock, - mAdServicesExtDataManagerMock); + mAdServicesExtDataManagerMock, + mStatsdAdServicesLoggerMock); verify(mAppSearchConsentManagerMock).wasU18NotificationDisplayed(); verify(mAppSearchConsentManagerMock).wasGaUxNotificationDisplayed(); @@ -291,6 +336,21 @@ public class ConsentMigrationUtilsTest { verify(mAdServicesExtDataManagerMock).getAdServicesExtData(); verify(mAdServicesExtDataManagerMock).clearDataOnOtaAsync(); verifyNoMoreInteractions(mAdServicesExtDataManagerMock); + + ConsentMigrationStats consentMigrationStats = + ConsentMigrationStats.builder() + .setTopicsConsent(false) + .setFledgeConsent(false) + .setMsmtConsent(true) + .setDefaultConsent(false) + .setMigrationStatus( + ConsentMigrationStats.MigrationStatus + .SUCCESS_WITH_SHARED_PREF_NOT_UPDATED) + .setMigrationType( + ConsentMigrationStats.MigrationType.ADEXT_SERVICE_TO_APPSEARCH) + .setRegion(REGION_ROW_CODE) + .build(); + verify(mStatsdAdServicesLoggerMock).logConsentMigrationStats(consentMigrationStats); } private void mockNoNotifOnS() { diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/customaudience/CustomAudienceServiceEndToEndTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/customaudience/CustomAudienceServiceEndToEndTest.java index a6b65749a6..6652bb25fe 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/customaudience/CustomAudienceServiceEndToEndTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/customaudience/CustomAudienceServiceEndToEndTest.java @@ -359,7 +359,7 @@ public class CustomAudienceServiceEndToEndTest { // Bypass the permission check since it's enforced before the package name check doNothing() .when(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, otherOwnerPackageName, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -381,7 +381,7 @@ public class CustomAudienceServiceEndToEndTest { CommonFixture.VALID_BUYER_1, VALID_NAME)); verify(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, otherOwnerPackageName, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -752,7 +752,7 @@ public class CustomAudienceServiceEndToEndTest { // Bypass the permission check since it's enforced before the package name check doNothing() .when(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, otherOwnerPackageName, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE); @@ -766,7 +766,7 @@ public class CustomAudienceServiceEndToEndTest { AdServicesStatusUtils.SECURITY_EXCEPTION_CALLER_NOT_ALLOWED_ON_BEHALF_ERROR_MESSAGE, callback.getException().getMessage()); verify(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, otherOwnerPackageName, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE); @@ -971,7 +971,7 @@ public class CustomAudienceServiceEndToEndTest { // Bypass the permission check since it's enforced before the package name check doNothing() .when(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, MY_APP_PACKAGE_NAME, AD_SERVICES_API_CALLED__API_NAME__OVERRIDE_CUSTOM_AUDIENCE_REMOTE_INFO); @@ -995,7 +995,7 @@ public class CustomAudienceServiceEndToEndTest { mCustomAudienceDao.doesCustomAudienceOverrideExist(otherOwner, BUYER_1, NAME_1)); verify(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, MY_APP_PACKAGE_NAME, AD_SERVICES_API_CALLED__API_NAME__OVERRIDE_CUSTOM_AUDIENCE_REMOTE_INFO); @@ -1107,7 +1107,7 @@ public class CustomAudienceServiceEndToEndTest { // Bypass the permission check since it's enforced before the package name check doNothing() .when(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, incorrectPackageName, AD_SERVICES_API_CALLED__API_NAME__REMOVE_CUSTOM_AUDIENCE_REMOTE_INFO_OVERRIDE); @@ -1135,7 +1135,7 @@ public class CustomAudienceServiceEndToEndTest { mCustomAudienceDao.doesCustomAudienceOverrideExist( MY_APP_PACKAGE_NAME, BUYER_1, NAME_1)); verify(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, incorrectPackageName, AD_SERVICES_API_CALLED__API_NAME__REMOVE_CUSTOM_AUDIENCE_REMOTE_INFO_OVERRIDE); @@ -1289,7 +1289,7 @@ public class CustomAudienceServiceEndToEndTest { // Bypass the permission check since it's enforced before the package name check doNothing() .when(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, incorrectPackageName, AD_SERVICES_API_CALLED__API_NAME__RESET_ALL_CUSTOM_AUDIENCE_OVERRIDES); @@ -1334,7 +1334,7 @@ public class CustomAudienceServiceEndToEndTest { mCustomAudienceDao.doesCustomAudienceOverrideExist( MY_APP_PACKAGE_NAME, BUYER_2, NAME_2)); verify(mFledgeAuthorizationFilterSpy) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, incorrectPackageName, AD_SERVICES_API_CALLED__API_NAME__RESET_ALL_CUSTOM_AUDIENCE_OVERRIDES); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/customaudience/CustomAudienceServiceImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/customaudience/CustomAudienceServiceImplTest.java index 1073c08dac..709c6bd741 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/customaudience/CustomAudienceServiceImplTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/customaudience/CustomAudienceServiceImplTest.java @@ -212,7 +212,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki CustomAudienceFixture.VALID_OWNER, mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -260,7 +260,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki CustomAudienceFixture.VALID_OWNER, mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( any(), eq(CustomAudienceFixture.VALID_OWNER), eq(AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE)); @@ -326,7 +326,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock)); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -349,7 +349,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -416,7 +416,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -464,7 +464,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -513,7 +513,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki CustomAudienceFixture.VALID_OWNER, mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -620,7 +620,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mFetchAndJoinCustomAudienceCallbackMock)); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__FETCH_AND_JOIN_CUSTOM_AUDIENCE); @@ -638,7 +638,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( any(), eq(CustomAudienceFixture.VALID_OWNER), eq(AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE)); @@ -682,7 +682,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( any(), eq(CustomAudienceFixture.VALID_OWNER), eq(AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE)); @@ -749,7 +749,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock)); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( any(), eq(CustomAudienceFixture.VALID_OWNER), eq(AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE)); @@ -773,7 +773,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( any(), eq(CustomAudienceFixture.VALID_OWNER), eq(AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE)); @@ -862,7 +862,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( any(), eq(CustomAudienceFixture.VALID_OWNER), eq(AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE)); @@ -910,7 +910,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki .assertCallerIsInForeground( MY_UID, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE, null); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( any(), eq(CustomAudienceFixture.VALID_OWNER), eq(AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE)); @@ -954,7 +954,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -1003,7 +1003,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki CustomAudienceFixture.VALID_OWNER, mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -1050,7 +1050,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE); @@ -1102,7 +1102,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE); @@ -1158,7 +1158,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mCustomAudienceOverrideCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, "", AD_SERVICES_API_CALLED__API_NAME__OVERRIDE_CUSTOM_AUDIENCE_REMOTE_INFO); @@ -1222,7 +1222,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mCustomAudienceOverrideCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__OVERRIDE_CUSTOM_AUDIENCE_REMOTE_INFO); @@ -1268,8 +1268,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki CustomAudienceFixture.VALID_NAME, mCustomAudienceOverrideCallbackMock); - verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission(CONTEXT, "", apiName); + verify(mFledgeAuthorizationFilterMock).assertAppDeclaredPermission(CONTEXT, "", apiName); verify(mDevContextFilterMock).createDevContext(); verify(mCustomAudienceImplMock).getCustomAudienceDao(); verify(mAppImportanceFilterMock) @@ -1322,8 +1321,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mCustomAudienceOverrideCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( - CONTEXT, CustomAudienceFixture.VALID_OWNER, apiName); + .assertAppDeclaredPermission(CONTEXT, CustomAudienceFixture.VALID_OWNER, apiName); verify(mDevContextFilterMock).createDevContext(); verify(mCustomAudienceImplMock).getCustomAudienceDao(); verify(mConsentManagerMock).isFledgeConsentRevokedForApp(CustomAudienceFixture.VALID_OWNER); @@ -1352,8 +1350,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mService.resetAllCustomAudienceOverrides(mCustomAudienceOverrideCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( - CONTEXT, CustomAudienceFixture.VALID_OWNER, apiName); + .assertAppDeclaredPermission(CONTEXT, CustomAudienceFixture.VALID_OWNER, apiName); verify(mDevContextFilterMock).createDevContext(); verify(mCustomAudienceImplMock).getCustomAudienceDao(); verify(mAppImportanceFilterMock).assertCallerIsInForeground(Process.myUid(), apiName, null); @@ -1400,7 +1397,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mService.resetAllCustomAudienceOverrides(mCustomAudienceOverrideCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__RESET_ALL_CUSTOM_AUDIENCE_OVERRIDES); @@ -1419,7 +1416,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki public void testAppManifestPermissionNotRequested_joinCustomAudience_fails() { doThrow(SecurityException.class) .when(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -1437,7 +1434,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki public void testAppManifestPermissionNotRequested_fetchCustomAudience_fails() { doThrow(SecurityException.class) .when(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__FETCH_AND_JOIN_CUSTOM_AUDIENCE); @@ -1458,7 +1455,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki public void testAppManifestPermissionNotRequested_leaveCustomAudience_fails() { doThrow(SecurityException.class) .when(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE); @@ -1483,7 +1480,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki .build()); doThrow(SecurityException.class) .when(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__OVERRIDE_CUSTOM_AUDIENCE_REMOTE_INFO); @@ -1513,8 +1510,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki int apiName = AD_SERVICES_API_CALLED__API_NAME__REMOVE_CUSTOM_AUDIENCE_REMOTE_INFO_OVERRIDE; doThrow(SecurityException.class) .when(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( - CONTEXT, CustomAudienceFixture.VALID_OWNER, apiName); + .assertAppDeclaredPermission(CONTEXT, CustomAudienceFixture.VALID_OWNER, apiName); assertThrows( SecurityException.class, @@ -1536,7 +1532,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki .build()); doThrow(SecurityException.class) .when(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__RESET_ALL_CUSTOM_AUDIENCE_OVERRIDES); @@ -1565,7 +1561,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -1621,7 +1617,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki CustomAudienceFixture.VALID_OWNER, mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -1667,7 +1663,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE); @@ -1725,7 +1721,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki mICustomAudienceCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( any(), eq(CustomAudienceFixture.VALID_OWNER), eq(AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE)); @@ -1771,7 +1767,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki CommonFixture.VALID_BUYER_1, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -1811,7 +1807,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki CommonFixture.VALID_BUYER_1, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE); @@ -1850,7 +1846,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki RATE_LIMIT_REACHED_ERROR_MESSAGE, actualResponseCaptor.getValue().getErrorMessage()); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__JOIN_CUSTOM_AUDIENCE); @@ -1881,7 +1877,7 @@ public final class CustomAudienceServiceImplTest extends AdServicesExtendedMocki RATE_LIMIT_REACHED_ERROR_MESSAGE, actualResponseCaptor.getValue().getErrorMessage()); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredCustomAudiencePermission( + .assertAppDeclaredPermission( CONTEXT, CustomAudienceFixture.VALID_OWNER, AD_SERVICES_API_CALLED__API_NAME__LEAVE_CUSTOM_AUDIENCE); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/E2EInteropMockTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/E2EInteropMockTest.java index 0e5544e830..74f8761d6d 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/E2EInteropMockTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/E2EInteropMockTest.java @@ -21,7 +21,6 @@ import static java.util.Map.entry; import android.adservices.measurement.RegistrationRequest; import android.net.Uri; import android.os.RemoteException; -import android.provider.DeviceConfig; import com.android.adservices.service.measurement.actions.Action; import com.android.adservices.service.measurement.actions.RegisterSource; @@ -35,7 +34,6 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.junit.Assert; -import org.junit.Before; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -160,17 +158,6 @@ public class E2EInteropMockTest extends E2EMockTest { mFlags); } - @Before - public void setup() { - // Chromium does not have a flag at dynamic noising based on expiry but Android does, so it - // needs to be enabled. - DeviceConfig.setProperty( - DeviceConfig.NAMESPACE_ADSERVICES, - "measurement_enable_configurable_event_reporting_windows", - "true", - false); - } - @Override void processAction(RegisterSource sourceRegistration) throws JSONException, IOException { RegistrationRequest request = sourceRegistration.mRegistrationRequest; diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/EventReportTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/EventReportTest.java index f0be0f6766..ca528c9a38 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/EventReportTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/EventReportTest.java @@ -15,11 +15,7 @@ */ package com.android.adservices.service.measurement; -import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY; import static com.android.adservices.service.Flags.MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS; -import static com.android.adservices.service.Flags.MEASUREMENT_NAVIGATION_NOISE_PROBABILITY; import static com.android.adservices.service.measurement.PrivacyParams.INSTALL_ATTR_NAVIGATION_EARLY_REPORTING_WINDOW_MILLISECONDS; import static com.android.adservices.service.measurement.PrivacyParams.NAVIGATION_EARLY_REPORTING_WINDOW_MILLISECONDS; import static com.android.adservices.service.measurement.SourceFixture.ValidSourceParams; @@ -67,6 +63,11 @@ public final class EventReportTest { public final TestableDeviceConfig.TestableDeviceConfigRule mDeviceConfigRule = new TestableDeviceConfig.TestableDeviceConfigRule(); + private static final double EVENT_NOISE_PROBABILITY = 0.0000025D; + private static final double INSTALL_ATTR_EVENT_NOISE_PROBABILITY = 0.0000125D; + private static final double INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY = 0.0024263D; + private static final double NAVIGATION_NOISE_PROBABILITY = 0.0024263D; + private static final double DOUBLE_MAX_DELTA = 0.0000001D; private static final long TRIGGER_PRIORITY = 345678L; @@ -288,7 +289,7 @@ public final class EventReportTest { assertEquals(source.getEventReportWindow() + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, report.getReportTime()); assertEquals(source.getSourceType(), report.getSourceType()); - assertEquals(MEASUREMENT_EVENT_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); + assertEquals(EVENT_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); assertEquals(TRIGGER_ID, report.getTriggerId()); assertEquals(REGISTRATION_ORIGIN, report.getRegistrationOrigin()); @@ -297,7 +298,6 @@ public final class EventReportTest { @Test public void populate_eventSourceAppDestWithoutInstallConfigured() throws JSONException { long baseTime = System.currentTimeMillis(); - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); String earlyReportingWindows1h1d = String.join( ",", @@ -306,7 +306,6 @@ public final class EventReportTest { doReturn(earlyReportingWindows1h1d) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(true).when(mFlags).getMeasurementEnableVtcConfigurableMaxEventReports(); doReturn(3).when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); Source source = createSourceForTest( @@ -390,7 +389,7 @@ public final class EventReportTest { report.getReportTime()); assertEquals(Source.SourceType.NAVIGATION, report.getSourceType()); assertEquals( - MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); + NAVIGATION_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); assertEquals(TRIGGER_ID, report.getTriggerId()); assertEquals(REGISTRATION_ORIGIN, report.getRegistrationOrigin()); @@ -430,7 +429,7 @@ public final class EventReportTest { assertEquals(source.getEventReportWindow() + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, report.getReportTime()); assertEquals(Source.SourceType.EVENT, report.getSourceType()); - assertEquals(MEASUREMENT_EVENT_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); + assertEquals(EVENT_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); assertEquals(TRIGGER_ID, report.getTriggerId()); assertEquals(REGISTRATION_ORIGIN, report.getRegistrationOrigin()); @@ -468,7 +467,7 @@ public final class EventReportTest { report.getReportTime()); assertEquals(Source.SourceType.EVENT, report.getSourceType()); assertEquals( - MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY, + INSTALL_ATTR_EVENT_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); @@ -507,7 +506,7 @@ public final class EventReportTest { assertEquals(source.getEventReportWindow() + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, report.getReportTime()); assertEquals(Source.SourceType.EVENT, report.getSourceType()); - assertEquals(MEASUREMENT_EVENT_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); + assertEquals(EVENT_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); assertEquals(TRIGGER_ID, report.getTriggerId()); assertEquals(REGISTRATION_ORIGIN, report.getRegistrationOrigin()); @@ -548,7 +547,7 @@ public final class EventReportTest { report.getReportTime()); assertEquals(Source.SourceType.NAVIGATION, report.getSourceType()); assertEquals( - MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); + NAVIGATION_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); assertEquals(TRIGGER_ID, report.getTriggerId()); assertEquals(REGISTRATION_ORIGIN, report.getRegistrationOrigin()); @@ -589,7 +588,7 @@ public final class EventReportTest { report.getReportTime()); assertEquals(source.getSourceType(), report.getSourceType()); assertEquals( - MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); + NAVIGATION_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); assertEquals(TRIGGER_ID, report.getTriggerId()); assertEquals(REGISTRATION_ORIGIN, report.getRegistrationOrigin()); @@ -633,7 +632,7 @@ public final class EventReportTest { report.getReportTime()); assertEquals(Source.SourceType.NAVIGATION, report.getSourceType()); assertEquals( - MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY, + INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); @@ -679,7 +678,7 @@ public final class EventReportTest { report.getReportTime()); assertEquals(source.getSourceType(), report.getSourceType()); assertEquals( - MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); + NAVIGATION_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); assertEquals(TRIGGER_ID, report.getTriggerId()); assertEquals(REGISTRATION_ORIGIN, report.getRegistrationOrigin()); @@ -698,6 +697,7 @@ public final class EventReportTest { .setEnrollmentId("enrollment-id") .setAppDestinations(Collections.singletonList(APP_DESTINATION)) .setWebDestinations(Collections.singletonList(WEB_DESTINATION)) + .setExpiryTime(baseTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(baseTime + TimeUnit.DAYS.toMillis(10)) .setCoarseEventReportDestinations(true) .build(); @@ -738,7 +738,7 @@ public final class EventReportTest { assertEquals(source.getEventReportWindow() + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, report.getReportTime()); assertEquals(Source.SourceType.EVENT, report.getSourceType()); - assertEquals(MEASUREMENT_EVENT_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); + assertEquals(EVENT_NOISE_PROBABILITY, report.getRandomizedTriggerRate(), DOUBLE_MAX_DELTA); assertEquals(SOURCE_ID, report.getSourceId()); assertEquals(TRIGGER_ID, report.getTriggerId()); assertEquals(REGISTRATION_ORIGIN, report.getRegistrationOrigin()); @@ -855,6 +855,7 @@ public final class EventReportTest { .setEnrollmentId("enrollment-id") .setAppDestinations(getNullableUriList(appDestination)) .setWebDestinations(getNullableUriList(webDestination)) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(10)) .build(); } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/SourceTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/SourceTest.java index 458efd4f06..f75c65e24a 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/SourceTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/SourceTest.java @@ -1521,13 +1521,13 @@ public class SourceTest { } @Test - public void getOrDefaultEventReportWindows() throws JSONException { + public void getOrDefaultEventReportWindowsForFlex() throws JSONException { Flags flags = mock(Flags.class); JSONObject windowsObj = new JSONObject("{'start_time': '2000000', 'end_times': " + "[3600000, 86400000, 172000000]}"); // Provided Windows List<Pair<Long, Long>> eventReportWindows = - Source.getOrDefaultEventReportWindows( + Source.getOrDefaultEventReportWindowsForFlex( windowsObj, Source.SourceType.EVENT, 8640000, @@ -1543,7 +1543,7 @@ public class SourceTest { when(flags.getMeasurementEventReportsCtcEarlyReportingWindows()) .thenReturn("172800,604800"); eventReportWindows = - Source.getOrDefaultEventReportWindows( + Source.getOrDefaultEventReportWindowsForFlex( null, Source.SourceType.EVENT, TimeUnit.DAYS.toMillis(15), flags); assertNotNull(eventReportWindows); assertEquals(2, eventReportWindows.size()); @@ -1552,7 +1552,7 @@ public class SourceTest { // Default Windows - Navigation eventReportWindows = - Source.getOrDefaultEventReportWindows( + Source.getOrDefaultEventReportWindowsForFlex( null, Source.SourceType.NAVIGATION, TimeUnit.DAYS.toMillis(15), flags); assertNotNull(eventReportWindows); assertEquals(3, eventReportWindows.size()); @@ -1608,29 +1608,31 @@ public class SourceTest { } @Test - public void getProcessedEventReportWindow() { + public void getEffectiveEventReportWindow() { + long expiryTime = 7654321L; // null eventReportWindow Source sourceNullEventReportWindow = SourceFixture.getMinimalValidSourceBuilder() .setEventTime(10) + .setExpiryTime(expiryTime) .setEventReportWindow(null) .build(); - assertNull(sourceNullEventReportWindow.getProcessedEventReportWindow()); + assertEquals(expiryTime, sourceNullEventReportWindow.getEffectiveEventReportWindow()); // eventReportWindow Value < eventTime Source sourceNewEventReportWindow = SourceFixture.getMinimalValidSourceBuilder() - .setEventTime(10) + .setEventTime(10L) .setEventReportWindow(4L) .build(); - assertEquals(Long.valueOf(14L), sourceNewEventReportWindow.getProcessedEventReportWindow()); + assertEquals(14L, sourceNewEventReportWindow.getEffectiveEventReportWindow()); // eventReportWindow Value > eventTime Source sourceOldEventReportWindow = SourceFixture.getMinimalValidSourceBuilder() - .setEventTime(10) + .setEventTime(10L) .setEventReportWindow(15L) .build(); - assertEquals(Long.valueOf(15L), sourceOldEventReportWindow.getProcessedEventReportWindow()); + assertEquals(15L, sourceOldEventReportWindow.getEffectiveEventReportWindow()); } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/attribution/AttributionJobHandlerIntegrationTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/attribution/AttributionJobHandlerIntegrationTest.java index 6b8e4567a9..39f46f31e3 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/attribution/AttributionJobHandlerIntegrationTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/attribution/AttributionJobHandlerIntegrationTest.java @@ -77,7 +77,7 @@ public class AttributionJobHandlerIntegrationTest extends AbstractDbIntegrationT (new AttributionJobHandler( datastoreManager, FlagsFactory.getFlags(), - new DebugReportApi(sContext, FlagsFactory.getFlagsForTest()), + new DebugReportApi(sContext, FlagsFactory.getFlags()), new EventReportWindowCalcDelegate(FlagsFactory.getFlags()), new SourceNoiseHandler(FlagsFactory.getFlags()), mLogger, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/attribution/AttributionJobHandlerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/attribution/AttributionJobHandlerTest.java index b34950e84c..c1cbe2ba85 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/attribution/AttributionJobHandlerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/attribution/AttributionJobHandlerTest.java @@ -218,6 +218,12 @@ public class AttributionJobHandlerTest { when(mFlags.getMeasurementNullAggReportRateInclSourceRegistrationTime()).thenReturn(0f); when(mFlags.getMeasurementMinEventReportDelayMillis()) .thenReturn(Flags.MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS); + when(mFlags.getMeasurementVtcConfigurableMaxEventReportsCount()) + .thenReturn(Flags.DEFAULT_MEASUREMENT_VTC_CONFIGURABLE_MAX_EVENT_REPORTS_COUNT); + when(mFlags.getMeasurementEventReportsVtcEarlyReportingWindows()) + .thenReturn(Flags.MEASUREMENT_EVENT_REPORTS_VTC_EARLY_REPORTING_WINDOWS); + when(mFlags.getMeasurementEventReportsCtcEarlyReportingWindows()) + .thenReturn(Flags.MEASUREMENT_EVENT_REPORTS_CTC_EARLY_REPORTING_WINDOWS); } @Test @@ -659,7 +665,6 @@ public class AttributionJobHandlerTest { public void performPendingAttributions_vtcWithConfiguredReportsCount_attributeUptoConfigLimit() throws DatastoreException { // Setup - doReturn(true).when(mFlags).getMeasurementEnableVtcConfigurableMaxEventReports(); doReturn(3).when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); Source source = SourceFixture.getMinimalValidSourceBuilder() @@ -1385,6 +1390,9 @@ public class AttributionJobHandlerTest { doReturn(5L) .when(mEventReportWindowCalcDelegate) .getReportingTime(any(Source.class), anyLong(), anyInt()); + doReturn(EventReportWindowCalcDelegate.MomentPlacement.WITHIN) + .when(mEventReportWindowCalcDelegate) + .fallsWithinWindow(any(Source.class), anyLong(), anyInt()); when(mMeasurementDao.getPendingTriggerIds()) .thenReturn(Collections.singletonList(trigger.getId())); when(mMeasurementDao.getTrigger(trigger.getId())).thenReturn(trigger); @@ -1658,6 +1666,7 @@ public class AttributionJobHandlerTest { .setAttributionMode(Source.AttributionMode.TRUTHFULLY) .setInstallAttributed(true) .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(10)) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(28)) .setEventTime(eventTime - TimeUnit.DAYS.toMillis(2)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) @@ -1737,6 +1746,7 @@ public class AttributionJobHandlerTest { .setInstallAttributed(true) .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(3)) .setEventTime(eventTime - TimeUnit.DAYS.toMillis(2)) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -1747,6 +1757,7 @@ public class AttributionJobHandlerTest { .setPriority(200L) .setAttributionMode(Source.AttributionMode.TRUTHFULLY) .setEventTime(eventTime) + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .build(); when(mMeasurementDao.getPendingTriggerIds()) @@ -3341,6 +3352,7 @@ public class AttributionJobHandlerTest { + " \"key_2\": [\"value_1\", \"value_2\"]\n" + "}\n") .setId("sourceId") + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -3436,6 +3448,7 @@ public class AttributionJobHandlerTest { + " \"key_2\": [\"value_1\", \"value_2\"]\n" + "}\n") .setId("sourceId") + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -3533,6 +3546,7 @@ public class AttributionJobHandlerTest { + " \"key_2\": [\"value_1\", \"value_2\"]\n" + "}\n") .setId("sourceId") + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -3628,6 +3642,7 @@ public class AttributionJobHandlerTest { + " \"key_2\": [\"value_1\", \"value_2\"]\n" + "}\n") .setId("sourceId") + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -3726,6 +3741,7 @@ public class AttributionJobHandlerTest { + "}\n") .setId("sourceId") .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -3961,6 +3977,7 @@ public class AttributionJobHandlerTest { + " \"key_1\": [\"value_1\", \"value_2\"],\n" + " \"key_2\": [\"value_1\", \"value_2\"]\n" + "}\n") + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -4039,6 +4056,7 @@ public class AttributionJobHandlerTest { + " \"key_1\": [\"value_1\", \"value_2\"],\n" + " \"key_2\": [\"value_1\", \"value_2\"]\n" + "}\n") + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -4116,6 +4134,7 @@ public class AttributionJobHandlerTest { + " \"key_1\": [\"value_1\", \"value_2\"],\n" + " \"key_2\": [\"value_1\", \"value_2\"]\n" + "}\n") + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -4338,6 +4357,7 @@ public class AttributionJobHandlerTest { + " \"key_1\": [\"value_1\", \"value_2\"],\n" + " \"key_2\": [\"value_1\", \"value_2\"]\n" + "}\n") + .setExpiryTime(triggerTime + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(triggerTime + 1L) .setAggregatableReportWindow(triggerTime + 1L) .build(); @@ -6129,6 +6149,7 @@ public class AttributionJobHandlerTest { .setId("sourceId") .setEventTime(TRIGGER_TIME - TimeUnit.SECONDS.toMillis(LOOKBACK_WINDOW - 1)) .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(TRIGGER_TIME + TimeUnit.DAYS.toMillis(28)) .setEventReportWindow(TRIGGER_TIME + 1) .setAggregatableReportWindow(TRIGGER_TIME + 1) .build(); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/noising/SourceNoiseHandlerAttributionProbabilityTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/noising/SourceNoiseHandlerAttributionProbabilityTest.java index ef24154acd..a9fa269095 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/noising/SourceNoiseHandlerAttributionProbabilityTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/noising/SourceNoiseHandlerAttributionProbabilityTest.java @@ -16,14 +16,6 @@ package com.android.adservices.service.measurement.noising; -import static com.android.adservices.service.Flags.MEASUREMENT_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY; -import static com.android.adservices.service.Flags.MEASUREMENT_NAVIGATION_NOISE_PROBABILITY; import static com.android.adservices.service.measurement.SourceFixture.ValidSourceParams.ATTRIBUTION_DESTINATIONS; import static com.android.adservices.service.measurement.SourceFixture.ValidSourceParams.WEB_DESTINATIONS; @@ -61,18 +53,22 @@ public class SourceNoiseHandlerAttributionProbabilityTest { private static final String DELIMITER = ","; private static final long CURRENT_TIME = System.currentTimeMillis(); + private static final double INSTALL_ATTR_EVENT_NOISE_PROBABILITY = 0.0000125D; + private static final double INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY = 0.0024263D; + private static final double EVENT_NOISE_PROBABILITY = 0.0000025D; + private static final double NAVIGATION_NOISE_PROBABILITY = 0.0024263D; + private static final double INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY = + 0.0170218D; + private final String mDescription; - private final boolean mIsEnableConfigurableEventReportingWindows; private final Source mSource; private final Long[] mEarlyReportingWindows; private final double mExpectedProbability; - private final boolean mEnableConfiguredMaxEventReports; private final int mConfiguredMaxEventReportsCount; /** - * The data format is measurement_enable_configurable_event_reporting_windows flag, sourceType, - * sourceEventReportWindow (limit), cooldown window, appDestination, webDestination - * configuredEarlyReportingWindows, coarse destination, enable configured conversions, + * The data format is sourceType, sourceEventReportWindow (limit), cooldown window, + * appDestination, webDestination, configuredEarlyReportingWindows, coarse destination, * configured conversions and expectedProbability. Each test description has numbers like 1-1-1, * 2-1-2, 3-3-3 etc. These signify max reports, trigger data bits and reporting windows count * respectively. For e.g., 2-1-2 stands for 2 maximum conversions, 1 trigger data bit (0 or 1) @@ -85,7 +81,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { { "non-configured reporting windows, EVENT, 1-1-1, app, fine " + "destinations", - false, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -93,15 +88,13 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configured max reports 1, // configured max reports - MEASUREMENT_EVENT_NOISE_PROBABILITY, // probability + EVENT_NOISE_PROBABILITY, // probability }, { "non-configured reporting windows, EVENT, 2-1-2, app, install " + "detection, fine " + "destinations", - false, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -109,14 +102,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configured max reports 1, // configured max reports - MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY, // probability + INSTALL_ATTR_EVENT_NOISE_PROBABILITY, // probability }, { "non-configured reporting windows, EVENT, 1-1-1, web, fine " + "destinations", - false, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -124,14 +115,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configured max reports 1, // configured max reports - MEASUREMENT_EVENT_NOISE_PROBABILITY, // probability + EVENT_NOISE_PROBABILITY, // probability }, { "non-configured reporting windows, EVENT, 1-1-1, app and web, " + "fine destinations", - false, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -139,155 +128,56 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configured max reports 1, // configured max reports - MEASUREMENT_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY, // probability + 0.0000042, // probability }, { - "non-configured reporting windows, EVENT, 2-1-2, app & web, " + "non-configured reporting windows, EVENT, 2-1-2, app, " + "install " + "detection, fine" + " destinations", - false, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window ATTRIBUTION_DESTINATIONS, // app destination - WEB_DESTINATIONS, // app destination + null, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configured max reports 1, // configured max reports - MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY, + 0.0000125, }, { - "non-configured reporting windows, EVENT, 2-1-2, app & web, " + "non-configured reporting windows, EVENT, 2-1-1, app, " + "install " - + "detection, coarse" + + "detection, fine" + " destinations", - false, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type - DAYS.toMillis(10), // source event report window + DAYS.toMillis(1), // source event report window DAYS.toMillis(1), // install cooldown window ATTRIBUTION_DESTINATIONS, // app destination - WEB_DESTINATIONS, // app destination - new Long[] {}, // early reporting windows - true, // coarse destinations - false, // enable configurable max reports - 1, // configured max reports - MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY, - }, - { - "non-configured reporting windows, NAVIGATION, 3-3-3, app, fine " - + "destinations", - false, // measurement_enable_configurable_event_reporting_windows - Source.SourceType.NAVIGATION, // source type - DAYS.toMillis(10), // source event report window - 0, // install cooldown window - ATTRIBUTION_DESTINATIONS, // app destination null, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configured max reports - 3, // configured max reports - MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, // probability + 1, // configured max reports + 0.000005, }, { - "non-configured reporting windows, NAVIGATION, 3-3-3, app, install " - + "detection, fine " - + "destinations", - false, // measurement_enable_configurable_event_reporting_windows - Source.SourceType.NAVIGATION, // source type + "non-configured reporting windows, EVENT, 2-1-2, app, " + + "install " + + "detection, coarse" + + " destinations", + Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window ATTRIBUTION_DESTINATIONS, // app destination null, // web destination new Long[] {}, // early reporting windows - false, // coarse destinations - false, // enable configured max reports - 3, // configured max reports - MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY, // probability - }, - { - "non-configured reporting windows, NAVIGATION, 3-3-3, web, fine " - + "destinations", - false, // measurement_enable_configurable_event_reporting_windows - Source.SourceType.NAVIGATION, // source type - DAYS.toMillis(10), // source event report window - 0, // install cooldown window - null, - WEB_DESTINATIONS, // web destination - new Long[] {}, // early reporting windows - false, // coarse destinations - false, // enable configurable max reports - 3, // configured max reports - MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, // probability - }, - { - "non-configured reporting windows, NAVIGATION, 3-3-3, app & web, " - + "fine destinations", - false, // measurement_enable_configurable_event_reporting_windows - Source.SourceType.NAVIGATION, // source type - DAYS.toMillis(10), // source event report window - 0, // install cooldown window - ATTRIBUTION_DESTINATIONS, // app destination - WEB_DESTINATIONS, // web destination - new Long[] {}, // early reporting windows - false, // coarse destinations - false, // enable configurable max reports - 3, // configured max reports - MEASUREMENT_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY, // probability - }, - { - "non-configured reporting windows, NAVIGATION, 3-3-3, app & web, " - + "coarse destinations", - false, // measurement_enable_configurable_event_reporting_windows - Source.SourceType.NAVIGATION, // source type - DAYS.toMillis(10), // source event report window - 0, // install cooldown window - ATTRIBUTION_DESTINATIONS, // app destination - WEB_DESTINATIONS, // web destination - new Long[] {}, // early reporting windows true, // coarse destinations - false, // enable configurable max reports - 3, // configured max reports - MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, // probability - }, - { - "non-configured reporting windows, NAVIGATION, 3-3-3, app & web, " - + "install detection," - + " fine destinations", - false, // measurement_enable_configurable_event_reporting_windows - Source.SourceType.NAVIGATION, // source type - DAYS.toMillis(10), // source event report window - DAYS.toMillis(1), // install cooldown window - ATTRIBUTION_DESTINATIONS, // app destination - WEB_DESTINATIONS, // web destination - new Long[] {}, // early reporting windows - false, // coarse destinations - false, // enable configurable max reports - 3, // configured max reports - MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY, - }, - { - "non-configured reporting windows, NAVIGATION, 3-3-3, app & web, " - + "install detection," - + " coarse destinations", - false, // measurement_enable_configurable_event_reporting_windows - Source.SourceType.NAVIGATION, // source type - DAYS.toMillis(10), // source event report window - DAYS.toMillis(1), // install cooldown window - ATTRIBUTION_DESTINATIONS, // app destination - WEB_DESTINATIONS, // web destination - new Long[] {}, // early reporting windows - true, // coarse destinations - false, // enable configurable max reports - 3, // configured max reports - MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY, + 1, // configured max reports + INSTALL_ATTR_EVENT_NOISE_PROBABILITY, }, { "configured reporting windows, EVENT, 1-1-1, app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -295,13 +185,11 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - MEASUREMENT_EVENT_NOISE_PROBABILITY, // probability + EVENT_NOISE_PROBABILITY, // probability }, { "configured reporting windows, EVENT, 1-1-2, app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -309,13 +197,11 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(1)}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports 0.0000042, }, { "configured reporting windows, EVENT, 1-1-3, app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -323,7 +209,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(1), DAYS.toSeconds(1)}, false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports 0.0000058, // probability }, @@ -331,7 +216,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { "configured reporting windows, EVENT, 1-1-2(1 effective window), " + "app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -339,15 +223,13 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {DAYS.toSeconds(15)}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - MEASUREMENT_EVENT_NOISE_PROBABILITY, // probability + EVENT_NOISE_PROBABILITY, // probability }, { "configured reporting windows, EVENT, 1-1-3(2 effective window), " + "app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type HOURS.toMillis(6), // source event report window 0, // install cooldown window @@ -355,15 +237,13 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(1), DAYS.toSeconds(1)}, false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports 0.0000042, }, { - "configured reporting windows, EVENT, 2-1-3(2 effective windows), " + "configured reporting windows, EVENT, 1-1-2 (2 effective window), " + "app, install " + "detection, fine destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type HOURS.toMillis(6), // source event report window DAYS.toMillis(1), // install cooldown window @@ -373,15 +253,13 @@ public class SourceNoiseHandlerAttributionProbabilityTest { HOURS.toSeconds(1), DAYS.toSeconds(1) }, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY, // probability + 0.0000042, // probability }, { - "configured reporting windows, EVENT, 2-1-3, app, install " + "configured reporting windows, EVENT, 1-1-3, app, install " + "detection, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(6), // source event report window DAYS.toMillis(1), // install cooldown window @@ -391,15 +269,13 @@ public class SourceNoiseHandlerAttributionProbabilityTest { HOURS.toSeconds(1), DAYS.toSeconds(1) }, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - 0.0000233, // probability + 0.0000058, // probability }, { - "configured reporting windows, EVENT, 2-1-3, app & web, install " + "configured reporting windows, EVENT, 1-1-3, app & web, install " + "detection, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(6), // source event report window DAYS.toMillis(1), // install cooldown window @@ -409,15 +285,13 @@ public class SourceNoiseHandlerAttributionProbabilityTest { HOURS.toSeconds(1), DAYS.toSeconds(1) }, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - 0.0000757, // probability + 0.0000108, // probability }, { - "configured reporting windows, EVENT, 2-1-3, app & web, install " + "configured reporting windows, EVENT, 1-1-3, app & web, install " + "detection, coarse " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(6), // source event report window DAYS.toMillis(1), // install cooldown window @@ -427,16 +301,14 @@ public class SourceNoiseHandlerAttributionProbabilityTest { HOURS.toSeconds(1), DAYS.toSeconds(1) }, // early reporting windows true, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - 0.0000233, // probability + 0.0000058, // probability }, { "configured reporting windows, EVENT, 1-1-1, web, (install " + "cooldown -" + " unused), fine" + " destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -444,21 +316,13 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - MEASUREMENT_EVENT_NOISE_PROBABILITY, // probability + EVENT_NOISE_PROBABILITY, // probability }, { - // It is different from "non-configured reporting windows, 2-1-2, - // app - // & web, install - // detection" because we reject 20 states resulting into only 25 - // states in - // that case. Here we assume all 45 states to be valid. - "configured reporting windows, EVENT, 2-1-2, app & web, install " + "configured reporting windows, EVENT, 1-1-2, app & web, install " + "detection, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -466,21 +330,13 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // web destination new Long[] {HOURS.toSeconds(1)}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - 0.0000374, // probability + 0.0000075, // probability }, { - // It is different from "non-configured reporting windows, 2-1-2, - // app - // & web, install - // detection, coarse destinations" because we reject 20 states - // resulting into only 25 states in that case. Here we assume all - // 45 states to be valid. - "configured reporting windows, EVENT, 2-1-2, app & web, install " + "configured reporting windows, EVENT, 1-1-2, app & web, install " + "detection, coarse " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -488,14 +344,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // web destination new Long[] {HOURS.toSeconds(1)}, // early reporting windows true, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - 0.0000125, // probability + 0.0000042, // probability }, { "configured (ignored due to empty), EVENT, 2-1-2, app, install " + "detection, fine destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -503,14 +357,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY, // probability + INSTALL_ATTR_EVENT_NOISE_PROBABILITY, // probability }, { "configured reporting windows, EVENT, 1-1-1, app & web, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -518,14 +370,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // app destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - MEASUREMENT_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY, // probability + 0.0000042, // probability }, { "configured reporting windows, EVENT, 1-1-1, app & web, coarse " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -533,14 +383,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // app destination new Long[] {}, // early reporting windows true, // coarse destinations - false, // enable configurable max reports 1, // configured max reports - MEASUREMENT_EVENT_NOISE_PROBABILITY, // probability + EVENT_NOISE_PROBABILITY, // probability }, { "configured reporting windows, NAVIGATION, 3-3-1, app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -548,14 +396,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0001372, // probability }, { "configured reporting windows, NAVIGATION, 3-3-2, app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -563,14 +409,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(1)}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0008051, // probability }, { "configured reporting windows, NAVIGATION, 3-3-3, app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -578,16 +422,14 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(1), DAYS.toSeconds(1)}, false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports - MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, // probability + NAVIGATION_NOISE_PROBABILITY, // probability }, { "configured reporting windows, NAVIGATION, 3-3-2 (1 effective " + "window)" + ", app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(2), // source event report window 0, // install cooldown window @@ -595,7 +437,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {DAYS.toMillis(3)}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0001372, // probability }, @@ -603,7 +444,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { "configured reporting windows, NAVIGATION, 3-3-3 (2 effective " + "windows), app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type HOURS.toMillis(6), // source event report window 0, // install cooldown window @@ -611,7 +451,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(1), DAYS.toSeconds(1)}, false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0008051, // probability }, @@ -619,7 +458,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { "configured reporting windows, NAVIGATION, 3-3-1, app, install " + "detection, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -627,7 +465,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0001372, // probability }, @@ -635,7 +472,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { "configured reporting windows, NAVIGATION, 3-3-1, web, install " + "detection, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -643,14 +479,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // app destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0001372, // probability }, { "configured reporting windows, NAVIGATION, 3-3-1, app & web, fine" + " destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -658,14 +492,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // app destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0008051, // probability }, { "configured reporting windows, NAVIGATION, 3-3-1, app & web, " + "coarse destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -673,7 +505,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // app destination new Long[] {}, // early reporting windows true, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0001372, // probability }, @@ -682,7 +513,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { + "install " + "detection, " + "fine destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -690,7 +520,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // app destination new Long[] {}, // early reporting windows false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0008051, // probability }, @@ -699,7 +528,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { + "install " + "detection, " + "coarse destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -707,7 +535,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // app destination new Long[] {}, // early reporting windows true, // coarse destinations - false, // enable configurable max reports 3, // configured max reports 0.0001372, // probability }, @@ -716,7 +543,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { + "install " + "detection, fine" + " destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -724,16 +550,14 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // web destination new Long[] {HOURS.toSeconds(2), DAYS.toSeconds(2)}, false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports - MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY, + INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY, }, { "configured reporting windows, NAVIGATION, 3-3-3, app & web, " + "install " + "detection, " + "coarse destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -741,14 +565,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // web destination new Long[] {HOURS.toSeconds(2), DAYS.toSeconds(2)}, true, // coarse destinations - false, // enable configurable max reports 3, // configured max reports - MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY, + INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY, }, { "configured reporting windows, NAVIGATION, 3-3-3, app, install " + "detection, fine destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window DAYS.toMillis(1), // install cooldown window @@ -756,14 +578,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(2), DAYS.toSeconds(2)}, false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports - MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY, // probability + INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY, // probability }, { "configured reporting windows, NAVIGATION, 3-3-3, app & web, fine" + " destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -771,14 +591,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // web destination new Long[] {HOURS.toSeconds(2), DAYS.toSeconds(2)}, false, // coarse destinations - false, // enable configurable max reports 3, // configured max reports - MEASUREMENT_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY, // probability + 0.0170218, // probability }, { "configured reporting windows, NAVIGATION, 3-3-3, app & web, " + "coarse destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.NAVIGATION, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -786,14 +604,12 @@ public class SourceNoiseHandlerAttributionProbabilityTest { WEB_DESTINATIONS, // web destination new Long[] {HOURS.toSeconds(2), DAYS.toSeconds(2)}, true, // coarse destinations - false, // enable configurable max reports 3, // configured max reports - MEASUREMENT_NAVIGATION_NOISE_PROBABILITY, // probability + NAVIGATION_NOISE_PROBABILITY, // probability }, { "non-configured reporting windows, EVENT, 3-1-1, app, fine " + "destinations", - false, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -801,13 +617,11 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {}, // early reporting windows false, // coarse destinations - true, // enable configured max reports 3, // configured max reports 0.0000083, // probability }, { "configured reporting windows, EVENT, 3-1-3, app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -815,13 +629,11 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(1), DAYS.toSeconds(1)}, false, // coarse destinations - true, // enable configurable max reports 3, // configured max reports 0.0000698, // probability }, { "configured reporting windows, EVENT, 2-1-3, app, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -829,7 +641,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(1), DAYS.toSeconds(1)}, false, // coarse destinations - true, // enable configurable max reports 2, // configured max reports 0.0000233, // probability }, @@ -837,7 +648,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { "configured reporting windows, EVENT, 3-1-3, app, install " + "detection, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(6), // source event report window // not honored because conversions and windows are overridden @@ -848,7 +658,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { HOURS.toSeconds(1), DAYS.toSeconds(1) }, // early reporting windows false, // coarse destinations - true, // enable configurable max reports 3, // configured max reports 0.0000698, // probability }, @@ -856,7 +665,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { "configured reporting windows, EVENT, 3-1-3, app & web, install " + "detection, fine " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(6), // source event report window DAYS.toMillis(1), // install cooldown window @@ -866,7 +674,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { HOURS.toSeconds(1), DAYS.toSeconds(1) }, // early reporting windows false, // coarse destinations - true, // enable configurable max reports 3, // configured max reports 0.0003782, // probability }, @@ -874,7 +681,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { "configured reporting windows, EVENT, 3-1-3, app & web, install " + "detection, coarse " + "destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(6), // source event report window DAYS.toMillis(1), // install cooldown window @@ -884,13 +690,11 @@ public class SourceNoiseHandlerAttributionProbabilityTest { HOURS.toSeconds(1), DAYS.toSeconds(1) }, // early reporting windows true, // coarse destinations - true, // enable configurable max reports 3, // configured max reports 0.0000698, // probability }, { "configured reporting windows, EVENT, 1-1-3, app, fine" + " destinations", - true, // measurement_enable_configurable_event_reporting_windows Source.SourceType.EVENT, // source type DAYS.toMillis(10), // source event report window 0, // install cooldown window @@ -898,7 +702,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { null, // web destination new Long[] {HOURS.toSeconds(1), DAYS.toSeconds(1)}, false, // coarse destinations - true, // enable configurable max reports 1, // configured max reports 0.0000058, // probability }, @@ -907,7 +710,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { public SourceNoiseHandlerAttributionProbabilityTest( String description, - boolean isEnableConfigurableEventReportingWindows, Source.SourceType sourceType, long sourceEventReportWindow, long coolDownWindow, @@ -915,11 +717,9 @@ public class SourceNoiseHandlerAttributionProbabilityTest { List<Uri> webDestinations, Long[] earlyReportingWindows, boolean coarseDestination, - boolean isEnableConfigurableMaxEventReports, int configuredMaxEventReportsCount, double expectedProbability) { mDescription = description; - mIsEnableConfigurableEventReportingWindows = isEnableConfigurableEventReportingWindows; mSource = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(sourceType) @@ -936,7 +736,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { BigDecimal.valueOf(expectedProbability) .setScale(7, RoundingMode.HALF_UP) .doubleValue(); - mEnableConfiguredMaxEventReports = isEnableConfigurableMaxEventReports; mConfiguredMaxEventReportsCount = configuredMaxEventReportsCount; } @@ -944,9 +743,6 @@ public class SourceNoiseHandlerAttributionProbabilityTest { public void getRandomAttributionProbability_withParameterizedData() { // Setup Flags flags = mock(Flags.class); - doReturn(mIsEnableConfigurableEventReportingWindows) - .when(flags) - .getMeasurementEnableConfigurableEventReportingWindows(); doReturn(convertEarlyReportingWindowFlagString(mEarlyReportingWindows)) .when(flags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -954,36 +750,9 @@ public class SourceNoiseHandlerAttributionProbabilityTest { .when(flags) .getMeasurementEventReportsCtcEarlyReportingWindows(); doReturn(true).when(flags).getMeasurementEnableCoarseEventReportDestinations(); - doReturn(mEnableConfiguredMaxEventReports) - .when(flags) - .getMeasurementEnableVtcConfigurableMaxEventReports(); doReturn(mConfiguredMaxEventReportsCount) .when(flags) .getMeasurementVtcConfigurableMaxEventReportsCount(); - doReturn(MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY) - .when(flags) - .getMeasurementInstallAttrDualDestinationEventNoiseProbability(); - doReturn(MEASUREMENT_INSTALL_ATTR_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY) - .when(flags) - .getMeasurementInstallAttrDualDestinationNavigationNoiseProbability(); - doReturn(MEASUREMENT_DUAL_DESTINATION_NAVIGATION_NOISE_PROBABILITY) - .when(flags) - .getMeasurementDualDestinationNavigationNoiseProbability(); - doReturn(MEASUREMENT_DUAL_DESTINATION_EVENT_NOISE_PROBABILITY) - .when(flags) - .getMeasurementDualDestinationEventNoiseProbability(); - doReturn(MEASUREMENT_INSTALL_ATTR_EVENT_NOISE_PROBABILITY) - .when(flags) - .getMeasurementInstallAttrEventNoiseProbability(); - doReturn(MEASUREMENT_INSTALL_ATTR_NAVIGATION_NOISE_PROBABILITY) - .when(flags) - .getMeasurementInstallAttrNavigationNoiseProbability(); - doReturn(MEASUREMENT_EVENT_NOISE_PROBABILITY) - .when(flags) - .getMeasurementEventNoiseProbability(); - doReturn(MEASUREMENT_NAVIGATION_NOISE_PROBABILITY) - .when(flags) - .getMeasurementNavigationNoiseProbability(); // Execution double actualProbability = diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/noising/SourceNoiseHandlerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/noising/SourceNoiseHandlerTest.java index 06a3dc6ae7..c9d0cf23a7 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/noising/SourceNoiseHandlerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/noising/SourceNoiseHandlerTest.java @@ -50,49 +50,17 @@ public class SourceNoiseHandlerTest { @Before public void setup() { mFlags = mock(Flags.class); - doReturn(false).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); + doReturn(Flags.DEFAULT_MEASUREMENT_VTC_CONFIGURABLE_MAX_EVENT_REPORTS_COUNT) + .when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); + doReturn(Flags.MEASUREMENT_EVENT_REPORTS_VTC_EARLY_REPORTING_WINDOWS) + .when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); + doReturn(Flags.MEASUREMENT_EVENT_REPORTS_CTC_EARLY_REPORTING_WINDOWS) + .when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); mSourceNoiseHandler = spy(new SourceNoiseHandler(mFlags, new EventReportWindowCalcDelegate(mFlags))); } @Test - public void fakeReports_eventSourceDualDestPostInstallMode_generatesFromStaticReportStates() { - long expiry = System.currentTimeMillis(); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.EVENT) - .setWebDestinations(SourceFixture.ValidSourceParams.WEB_DESTINATIONS) - .setEventReportWindow(expiry) - .setInstallCooldownWindow( - SourceFixture.ValidSourceParams.INSTALL_COOLDOWN_WINDOW) - .build(); - // Force increase the probability of random attribution. - doReturn(0.50D).when(mSourceNoiseHandler).getRandomAttributionProbability(source); - int falseCount = 0; - int neverCount = 0; - int truthCount = 0; - for (int i = 0; i < 500; i++) { - List<Source.FakeReport> fakeReports = - mSourceNoiseHandler.assignAttributionModeAndGenerateFakeReports(source); - if (source.getAttributionMode() == Source.AttributionMode.FALSELY) { - falseCount++; - assertNotEquals(0, fakeReports.size()); - assertTrue( - isValidEventSourceDualDestPostInstallModeFakeReportState( - source, fakeReports)); - } else if (source.getAttributionMode() == Source.AttributionMode.NEVER) { - neverCount++; - assertEquals(0, fakeReports.size()); - } else { - truthCount++; - } - } - assertNotEquals(0, falseCount); - assertNotEquals(0, neverCount); - assertNotEquals(0, truthCount); - } - - @Test public void fakeReports_flexEventReport_generatesFromStaticReportStates() { Source source = SourceFixture.getValidSourceWithFlexEventReportWithFewerState(); // Force increase the probability of random attribution. @@ -167,6 +135,7 @@ public class SourceNoiseHandlerTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(30)) .build(); assertEquals( @@ -181,6 +150,7 @@ public class SourceNoiseHandlerTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(7)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(7)) .build(); assertEquals( @@ -195,6 +165,7 @@ public class SourceNoiseHandlerTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(2)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(2)) .build(); assertEquals( @@ -302,6 +273,7 @@ public class SourceNoiseHandlerTest { .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(2)) .setInstallAttributionWindow(TimeUnit.DAYS.toMillis(10)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(30)) .build(); assertEquals( @@ -318,6 +290,7 @@ public class SourceNoiseHandlerTest { .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(2)) .setInstallAttributionWindow(TimeUnit.DAYS.toMillis(10)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(7)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(7)) .build(); assertEquals( @@ -334,6 +307,7 @@ public class SourceNoiseHandlerTest { .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(2)) .setInstallAttributionWindow(TimeUnit.DAYS.toMillis(10)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(2)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(2)) .build(); assertEquals( @@ -350,6 +324,7 @@ public class SourceNoiseHandlerTest { .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(2)) .setInstallAttributionWindow(TimeUnit.DAYS.toMillis(10)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(30)) .build(); assertEquals( @@ -366,6 +341,7 @@ public class SourceNoiseHandlerTest { .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(2)) .setInstallAttributionWindow(TimeUnit.DAYS.toMillis(10)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(7)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(7)) .build(); assertEquals( @@ -382,6 +358,7 @@ public class SourceNoiseHandlerTest { .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(2)) .setInstallAttributionWindow(TimeUnit.DAYS.toMillis(10)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(2)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(2)) .build(); assertEquals( @@ -393,11 +370,11 @@ public class SourceNoiseHandlerTest { mSourceNoiseHandler.getImpressionNoiseParams(navigationSource2dExpiry)); Source eventSourceWith2Destinations30dExpiry = SourceFixture.getMinimalValidSourceBuilder() - .setWebDestinations(SourceFixture.ValidSourceParams.WEB_DESTINATIONS) .setSourceType(Source.SourceType.EVENT) .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(2)) .setInstallAttributionWindow(TimeUnit.DAYS.toMillis(10)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(30)) .build(); assertEquals( @@ -405,7 +382,7 @@ public class SourceNoiseHandlerTest { /* reportCount= */ 2, /* triggerDataCardinality= */ 2, /* reportingWindowCount= */ 2, - /* destinationMultiplier */ 2), + /* destinationMultiplier */ 1), mSourceNoiseHandler.getImpressionNoiseParams( eventSourceWith2Destinations30dExpiry)); } @@ -491,14 +468,6 @@ public class SourceNoiseHandlerTest { PrivacyParams.EVENT_TRIGGER_DATA_CARDINALITY); } - private boolean isValidEventSourceDualDestPostInstallModeFakeReportState( - Source source, List<Source.FakeReport> fakeReportsState) { - // Generated fake reports state matches one of the states - return Arrays.stream(ImpressionNoiseUtil.DUAL_DESTINATION_POST_INSTALL_FAKE_REPORT_CONFIG) - .map(reportsState -> convertToReportsState(reportsState, source)) - .anyMatch(fakeReportsState::equals); - } - private List<Source.FakeReport> convertToReportsState(int[][] reportsState, Source source) { return Arrays.stream(reportsState) .map( @@ -507,7 +476,7 @@ public class SourceNoiseHandlerTest { new UnsignedLong(Long.valueOf(reportState[0])), new EventReportWindowCalcDelegate(mFlags) .getReportingTimeForNoising( - source, reportState[1], true), + source, reportState[1]), reportState[2] == 0 ? source.getAppDestinations() : source.getWebDestinations())) diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncRegistrationQueueJobServiceTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncRegistrationQueueJobServiceTest.java index ee87776c5e..632838e411 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncRegistrationQueueJobServiceTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncRegistrationQueueJobServiceTest.java @@ -20,7 +20,6 @@ import static com.android.adservices.mockito.ExtendedMockitoExpectations.mockGet import static com.android.adservices.mockito.ExtendedMockitoExpectations.mockGetFlags; import static com.android.adservices.mockito.MockitoExpectations.mockBackgroundJobsLoggingKillSwitch; import static com.android.adservices.mockito.MockitoExpectations.syncLogExecutionStats; -import static com.android.adservices.mockito.MockitoExpectations.syncPersistJobExecutionData; import static com.android.adservices.mockito.MockitoExpectations.verifyBackgroundJobsSkipLogged; import static com.android.adservices.mockito.MockitoExpectations.verifyLoggingNotHappened; import static com.android.adservices.spe.AdservicesJobInfo.MEASUREMENT_ASYNC_REGISTRATION_JOB; @@ -33,7 +32,6 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; @@ -79,7 +77,6 @@ import org.mockito.internal.stubbing.answers.CallsRealMethods; import org.mockito.quality.Strictness; import java.util.Optional; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class AsyncRegistrationQueueJobServiceTest { @@ -168,9 +165,6 @@ public class AsyncRegistrationQueueJobServiceTest { runWithMocks( () -> { mockBackgroundJobsLoggingKillSwitch(mMockFlags, /* overrideValue= */ false); - JobServiceLoggingCallback onStartJobCallback = - syncPersistJobExecutionData(mSpyLogger); - JobServiceLoggingCallback onJobDoneCallback = syncLogExecutionStats(mSpyLogger); doReturn( AsyncRegistrationQueueRunner.ProcessingResult .SUCCESS_ALL_RECORDS_PROCESSED) @@ -179,8 +173,7 @@ public class AsyncRegistrationQueueJobServiceTest { onStartJob_killSwitchOff(); - verify(mSpyLogger).recordOnStartJob(anyInt()); - verify(mSpyLogger).persistJobExecutionData(anyInt(), anyLong()); + verify(mSpyLogger, timeout(WAIT_IN_MILLIS)).recordOnStartJob(anyInt()); }); } @@ -364,7 +357,7 @@ public class AsyncRegistrationQueueJobServiceTest { // Validate jobInfo params to run immediately ArgumentCaptor<JobInfo> captorJobInfo = ArgumentCaptor.forClass(JobInfo.class); - verify(jobScheduler, times(1)).schedule(captorJobInfo.capture()); + verify(jobScheduler, timeout(WAIT_IN_MILLIS).times(1)).schedule(captorJobInfo.capture()); JobInfo jobInfo = captorJobInfo.getValue(); assertNotNull(jobInfo); assertNull(jobInfo.getTriggerContentUris()); @@ -559,8 +552,8 @@ public class AsyncRegistrationQueueJobServiceTest { // Validate ExtendedMockito.verify( () -> AsyncRegistrationQueueJobService.schedule(any(), any()), - times(1)); - verify(mMockJobScheduler, times(1)) + timeout(WAIT_IN_MILLIS).times(1)); + verify(mMockJobScheduler, timeout(WAIT_IN_MILLIS).times(1)) .getPendingJob(eq(MEASUREMENT_ASYNC_REGISTRATION_JOB_ID)); }); } @@ -589,7 +582,8 @@ public class AsyncRegistrationQueueJobServiceTest { times(1)); ArgumentCaptor<JobInfo> jobInfoArgumentCaptor = ArgumentCaptor.forClass(JobInfo.class); - verify(mMockJobScheduler, times(1)).schedule(jobInfoArgumentCaptor.capture()); + verify(mMockJobScheduler, timeout(WAIT_IN_MILLIS).times(1)) + .schedule(jobInfoArgumentCaptor.capture()); JobInfo job = jobInfoArgumentCaptor.getValue(); assertEquals(JOB_TRIGGER_MIN_DELAY_MS, job.getTriggerContentUpdateDelay()); assertEquals(JOB_TRIGGER_MAX_DELAY_MS, job.getTriggerContentMaxDelay()); @@ -612,7 +606,8 @@ public class AsyncRegistrationQueueJobServiceTest { boolean onStopJobResult = mSpyService.onStopJob(Mockito.mock(JobParameters.class)); - verify(mSpyService, times(0)).jobFinished(any(), anyBoolean()); + verify(mSpyService, timeout(WAIT_IN_MILLIS).times(0)) + .jobFinished(any(), anyBoolean()); assertTrue(onStopJobResult); assertTrue(mSpyService.getFutureForTesting().isCancelled()); }); @@ -633,8 +628,9 @@ public class AsyncRegistrationQueueJobServiceTest { assertFalse(result); // Allow background thread to execute Thread.sleep(WAIT_IN_MILLIS); - verify(mSpyService, times(1)).jobFinished(any(), eq(false)); - verify(mMockJobScheduler, times(1)).cancel(eq(MEASUREMENT_ASYNC_REGISTRATION_JOB_ID)); + verify(mSpyService, timeout(WAIT_IN_MILLIS).times(1)).jobFinished(any(), eq(false)); + verify(mMockJobScheduler, timeout(WAIT_IN_MILLIS).times(1)) + .cancel(eq(MEASUREMENT_ASYNC_REGISTRATION_JOB_ID)); } private void onStartJob_killSwitchOn() throws Exception { @@ -646,10 +642,9 @@ public class AsyncRegistrationQueueJobServiceTest { // Validate assertFalse(result); - // Allow background thread to execute - Thread.sleep(WAIT_IN_MILLIS); - verify(mSpyService, times(1)).jobFinished(any(), eq(false)); - verify(mMockJobScheduler, times(1)).cancel(eq(MEASUREMENT_ASYNC_REGISTRATION_JOB_ID)); + verify(mSpyService, timeout(WAIT_IN_MILLIS).times(1)).jobFinished(any(), eq(false)); + verify(mMockJobScheduler, timeout(WAIT_IN_MILLIS).times(1)) + .cancel(eq(MEASUREMENT_ASYNC_REGISTRATION_JOB_ID)); } private void onStartJob_killSwitchOff() throws Exception { @@ -701,9 +696,4 @@ public class AsyncRegistrationQueueJobServiceTest { ExtendedMockito.doReturn(mMockFlags).when(FlagsFactory::getFlags); ExtendedMockito.doReturn(value).when(mMockFlags).getAsyncRegistrationJobQueueKillSwitch(); } - - private Object countDown(CountDownLatch countDownLatch) { - countDownLatch.countDown(); - return null; - } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncRegistrationQueueRunnerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncRegistrationQueueRunnerTest.java index 3322190ddb..2cfc9e6c46 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncRegistrationQueueRunnerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncRegistrationQueueRunnerTest.java @@ -33,7 +33,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.adservices.measurement.RegistrationRequest; import android.adservices.measurement.WebSourceParams; import android.adservices.measurement.WebSourceRegistrationRequest; import android.content.ContentProviderClient; @@ -96,6 +95,7 @@ import org.mockito.stubbing.Answer; import java.io.IOException; import java.net.URL; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -125,6 +125,10 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo private static final String LIST_TYPE_REDIRECT_URI_1 = WebUtil.validUrl("https://foo.test"); private static final String LIST_TYPE_REDIRECT_URI_2 = WebUtil.validUrl("https://bar.test"); private static final String LOCATION_TYPE_REDIRECT_URI = WebUtil.validUrl("https://baz.test"); + private static final String LOCATION_TYPE_REDIRECT_URI_2 = WebUtil.validUrl("https://qux.test"); + private static final String LOCATION_TYPE_REDIRECT_URI_3 = + WebUtil.validUrl("https://quux.test"); + private static final Uri WEB_DESTINATION = WebUtil.validUri("https://web-destination.test"); private static final Uri APP_DESTINATION = Uri.parse("android-app://com.app_destination"); private static final Source SOURCE_1 = @@ -265,6 +269,12 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mFlags.getMeasurementFlexApiMaxInformationGainDualDestinationNavigation()) .thenReturn(Flags .MEASUREMENT_FLEX_API_MAX_INFORMATION_GAIN_DUAL_DESTINATION_NAVIGATION); + when(mFlags.getMeasurementVtcConfigurableMaxEventReportsCount()) + .thenReturn(Flags.DEFAULT_MEASUREMENT_VTC_CONFIGURABLE_MAX_EVENT_REPORTS_COUNT); + when(mFlags.getMeasurementEventReportsVtcEarlyReportingWindows()) + .thenReturn(Flags.MEASUREMENT_EVENT_REPORTS_VTC_EARLY_REPORTING_WINDOWS); + when(mFlags.getMeasurementEventReportsCtcEarlyReportingWindows()) + .thenReturn(Flags.MEASUREMENT_EVENT_REPORTS_CTC_EARLY_REPORTING_WINDOWS); when(mMeasurementDao.insertSource(any())).thenReturn(DEFAULT_SOURCE_ID); mContext = spy(sDefaultContext); when(mContext.getPackageManager()).thenReturn(mPackageManager); @@ -277,17 +287,18 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of( + WebUtil.validUri("https://example.test/sF1").toString(), + WebUtil.validUri("https://example.test/sF2").toString())); Answer<?> answerAsyncSourceFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - WebUtil.validUri("https://example.test/sF1"), - WebUtil.validUri("https://example.test/sF2"))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedSource); }; doAnswer(answerAsyncSourceFetcher) @@ -305,14 +316,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); // Execution @@ -339,17 +343,18 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of( + WebUtil.validUri("https://example.test/sF1").toString(), + WebUtil.validUri("https://example.test/sF2").toString())); Answer<?> answerAsyncSourceFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - WebUtil.validUri("https://example.test/sF1"), - WebUtil.validUri("https://example.test/sF2"))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedSource); }; doAnswer(answerAsyncSourceFetcher) @@ -367,14 +372,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); Thread.currentThread().interrupt(); @@ -420,16 +418,16 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo AsyncRegistrationQueueRunner asyncRegistrationQueueRunner = getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of(LIST_TYPE_REDIRECT_URI_1, LIST_TYPE_REDIRECT_URI_2)); Answer<Optional<Source>> answerAsyncSourceFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - Uri.parse(LIST_TYPE_REDIRECT_URI_1), - Uri.parse(LIST_TYPE_REDIRECT_URI_2))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedSource); }; doAnswer(answerAsyncSourceFetcher) @@ -444,14 +442,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); // Execution @@ -496,14 +487,16 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo AsyncRegistrationQueueRunner asyncRegistrationQueueRunner = getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LOCATION, + List.of(LOCATION_TYPE_REDIRECT_URI)); Answer<Optional<Source>> answerAsyncSourceFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LOCATION, - List.of(Uri.parse(LOCATION_TYPE_REDIRECT_URI))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedSource); }; doAnswer(answerAsyncSourceFetcher) @@ -518,14 +511,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); // Execution @@ -562,14 +548,16 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo AsyncRegistrationQueueRunner asyncRegistrationQueueRunner = getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LOCATION, + List.of(LOCATION_TYPE_REDIRECT_URI)); Answer<Optional<Source>> answerAsyncSourceFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LOCATION, - List.of(Uri.parse(LOCATION_TYPE_REDIRECT_URI))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedSource); }; doAnswer(answerAsyncSourceFetcher) @@ -621,6 +609,338 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo } @Test + public void runAsyncRegistrationQueueWorker_appSrc_defaultReg_redirectWellKnown_typeLocation() + throws DatastoreException { + // Setup + AsyncRegistrationQueueRunner asyncRegistrationQueueRunner = + getSpyAsyncRegistrationQueueRunner(); + AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); + Answer<Optional<Source>> answerAsyncSourceFetcher = + getAsyncSourceAnswerForLocationTypeRedirectToWellKnown( + LOCATION_TYPE_REDIRECT_URI, validAsyncRegistration); + doAnswer(answerAsyncSourceFetcher) + .when(mAsyncSourceFetcher) + .fetchSource(any(), any(), any()); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + + List<Source.FakeReport> eventReportList = + Collections.singletonList( + new Source.FakeReport(new UnsignedLong(1L), 1L, List.of(APP_DESTINATION))); + when(mSourceNoiseHandler.assignAttributionModeAndGenerateFakeReports(mMockedSource)) + .thenReturn(eventReportList); + when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) + .thenReturn(validAsyncRegistration); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); + when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); + + // Execution + asyncRegistrationQueueRunner.runAsyncRegistrationQueueWorker(); + + ArgumentCaptor<AsyncRegistration> asyncRegistrationArgumentCaptor = + ArgumentCaptor.forClass(AsyncRegistration.class); + + // Assertions + verify(mAsyncSourceFetcher, times(1)) + .fetchSource(any(AsyncRegistration.class), any(), any()); + verify(mMeasurementDao, times(1)).insertEventReport(any(EventReport.class)); + verify(mMeasurementDao, times(1)).insertSource(any(Source.class)); + verify(mMeasurementDao, times(1)) + .insertAsyncRegistration(asyncRegistrationArgumentCaptor.capture()); + + Assert.assertEquals(1, asyncRegistrationArgumentCaptor.getAllValues().size()); + AsyncRegistration asyncReg = asyncRegistrationArgumentCaptor.getAllValues().get(0); + Assert.assertEquals( + getRegistrationRedirectToWellKnownUri( + Uri.parse(LOCATION_TYPE_REDIRECT_URI), LOCATION_TYPE_REDIRECT_URI), + asyncReg.getRegistrationUri()); + + ArgumentCaptor<KeyValueData> redirectCountCaptor = + ArgumentCaptor.forClass(KeyValueData.class); + verify(mMeasurementDao, times(1)).insertOrUpdateKeyValueData(redirectCountCaptor.capture()); + assertEquals(2, redirectCountCaptor.getValue().getRegistrationRedirectCount()); + + verify(mMeasurementDao, times(1)).deleteAsyncRegistration(any(String.class)); + } + + @Test + public void runAsyncRegistrationQueueWorker_appSrc_defaultReg_redirectChain_typeLocation() + throws DatastoreException { + // Setup + AsyncRegistrationQueueRunner asyncRegistrationQueueRunner = + getSpyAsyncRegistrationQueueRunner(); + AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); + Answer<Optional<Source>> answerAsyncSourceFetcher = + getAsyncSourceAnswerForLocationTypeRedirectToWellKnown( + LOCATION_TYPE_REDIRECT_URI, validAsyncRegistration); + doAnswer(answerAsyncSourceFetcher) + .when(mAsyncSourceFetcher) + .fetchSource(any(), any(), any()); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + + List<Source.FakeReport> eventReportList = + Collections.singletonList( + new Source.FakeReport(new UnsignedLong(1L), 1L, List.of(APP_DESTINATION))); + when(mSourceNoiseHandler.assignAttributionModeAndGenerateFakeReports(mMockedSource)) + .thenReturn(eventReportList); + when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) + .thenReturn(validAsyncRegistration); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); + when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); + + // Execution + asyncRegistrationQueueRunner.runAsyncRegistrationQueueWorker(); + // Set up the second invocation. + Answer<Optional<Source>> answerAsyncSourceFetcher2 = + getAsyncSourceAnswerForLocationTypeRedirectToWellKnown( + LOCATION_TYPE_REDIRECT_URI_2, validAsyncRegistration); + doAnswer(answerAsyncSourceFetcher2) + .when(mAsyncSourceFetcher) + .fetchSource(any(), any(), any()); + + asyncRegistrationQueueRunner.runAsyncRegistrationQueueWorker(); + + // Set up the third invocation. + Answer<Optional<Source>> answerAsyncSourceFetcher3 = + getAsyncSourceAnswerForLocationTypeRedirectToWellKnown( + LOCATION_TYPE_REDIRECT_URI_3, validAsyncRegistration); + + doAnswer(answerAsyncSourceFetcher3) + .when(mAsyncSourceFetcher) + .fetchSource(any(), any(), any()); + + asyncRegistrationQueueRunner.runAsyncRegistrationQueueWorker(); + + // Assertions for all invocations + ArgumentCaptor<AsyncRegistration> asyncRegistrationArgumentCaptor = + ArgumentCaptor.forClass(AsyncRegistration.class); + verify(mMeasurementDao, times(3)) + .insertAsyncRegistration(asyncRegistrationArgumentCaptor.capture()); + Assert.assertEquals(3, asyncRegistrationArgumentCaptor.getAllValues().size()); + + ArgumentCaptor<KeyValueData> redirectCountCaptor = + ArgumentCaptor.forClass(KeyValueData.class); + verify(mMeasurementDao, times(3)).insertOrUpdateKeyValueData(redirectCountCaptor.capture()); + assertEquals(4, redirectCountCaptor.getValue().getRegistrationRedirectCount()); + + // Assertions for first invocation + assertRepeatedAsyncRegistration( + asyncRegistrationArgumentCaptor, + 0, + getRegistrationRedirectToWellKnownUri( + Uri.parse(LOCATION_TYPE_REDIRECT_URI), + LOCATION_TYPE_REDIRECT_URI.toString())); + + // Assertions for second invocation + assertRepeatedAsyncRegistration( + asyncRegistrationArgumentCaptor, + 1, + getRegistrationRedirectToWellKnownUri( + Uri.parse(LOCATION_TYPE_REDIRECT_URI_2), + LOCATION_TYPE_REDIRECT_URI_2.toString())); + + // Assertions for third invocation + assertRepeatedAsyncRegistration( + asyncRegistrationArgumentCaptor, + 2, + getRegistrationRedirectToWellKnownUri( + Uri.parse(LOCATION_TYPE_REDIRECT_URI_3), + LOCATION_TYPE_REDIRECT_URI_3.toString())); + } + + @Test + public void runAsyncRegistrationQueueWorker_appSrc_defaultReg_redirectWithExistingPathAndQuery() + throws DatastoreException { + // Setup + AsyncRegistrationQueueRunner asyncRegistrationQueueRunner = + getSpyAsyncRegistrationQueueRunner(); + AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); + String redirectWithExistingPath = LOCATION_TYPE_REDIRECT_URI + "/path?key=value"; + Answer<Optional<Source>> answerAsyncSourceFetcher = + getAsyncSourceAnswerForLocationTypeRedirectToWellKnown( + redirectWithExistingPath, validAsyncRegistration); + doAnswer(answerAsyncSourceFetcher) + .when(mAsyncSourceFetcher) + .fetchSource(any(), any(), any()); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + + List<Source.FakeReport> eventReportList = + Collections.singletonList( + new Source.FakeReport(new UnsignedLong(1L), 1L, List.of(APP_DESTINATION))); + when(mSourceNoiseHandler.assignAttributionModeAndGenerateFakeReports(mMockedSource)) + .thenReturn(eventReportList); + when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) + .thenReturn(validAsyncRegistration); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); + when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); + + // Execution + + asyncRegistrationQueueRunner.runAsyncRegistrationQueueWorker(); + + ArgumentCaptor<AsyncRegistration> asyncRegistrationArgumentCaptor = + ArgumentCaptor.forClass(AsyncRegistration.class); + + // Assertions + verify(mAsyncSourceFetcher, times(1)) + .fetchSource(any(AsyncRegistration.class), any(), any()); + verify(mMeasurementDao, times(1)).insertEventReport(any(EventReport.class)); + verify(mMeasurementDao, times(1)).insertSource(any(Source.class)); + verify(mMeasurementDao, times(1)) + .insertAsyncRegistration(asyncRegistrationArgumentCaptor.capture()); + + Assert.assertEquals(1, asyncRegistrationArgumentCaptor.getAllValues().size()); + AsyncRegistration asyncReg = asyncRegistrationArgumentCaptor.getAllValues().get(0); + + Uri expectedUri = + Uri.parse( + LOCATION_TYPE_REDIRECT_URI + + "/" + + AsyncRedirects.WELL_KNOWN_PATH_SEGMENT + + "?" + + AsyncRedirects.WELL_KNOWN_QUERY_PARAM + + "=" + + Uri.encode(redirectWithExistingPath)); + Assert.assertEquals(expectedUri, asyncReg.getRegistrationUri()); + } + + @Test + public void runAsyncRegistrationQueueWorker_noSourceReg_RedirectHasSource() + throws DatastoreException { + // Setup + AsyncRegistrationQueueRunner asyncRegistrationQueueRunner = + getSpyAsyncRegistrationQueueRunner(); + AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); + + // Create an empty response for fetchSource. This is necessary because we need to mock the + // addition of a redirect, despite a failing initial source registration. + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LOCATION, + List.of(LOCATION_TYPE_REDIRECT_URI)); + redirectHeaders.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); + Answer<Optional<Source>> answerEmptySource = + invocation -> { + AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); + asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); + return Optional.empty(); + }; + + doAnswer(answerEmptySource).when(mAsyncSourceFetcher).fetchSource(any(), any(), any()); + + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + + List<Source.FakeReport> eventReportList = + Collections.singletonList( + new Source.FakeReport(new UnsignedLong(1L), 1L, List.of(APP_DESTINATION))); + when(mSourceNoiseHandler.assignAttributionModeAndGenerateFakeReports(mMockedSource)) + .thenReturn(eventReportList); + when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) + .thenReturn(validAsyncRegistration); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); + when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); + + // Execution + + asyncRegistrationQueueRunner.runAsyncRegistrationQueueWorker(); + + // Set up second invocation of runner. This time, do return a valid source. + Answer<Optional<Source>> answerAsyncSourceFetcher = + getAsyncSourceAnswerForLocationTypeRedirectToWellKnown( + LOCATION_TYPE_REDIRECT_URI_2, validAsyncRegistration); + + doAnswer(answerAsyncSourceFetcher) + .when(mAsyncSourceFetcher) + .fetchSource(any(), any(), any()); + + asyncRegistrationQueueRunner.runAsyncRegistrationQueueWorker(); + + ArgumentCaptor<AsyncRegistration> asyncRegistrationArgumentCaptor = + ArgumentCaptor.forClass(AsyncRegistration.class); + + // Assertions + verify(mAsyncSourceFetcher, times(2)) + .fetchSource(any(AsyncRegistration.class), any(), any()); + verify(mMeasurementDao, times(1)).insertEventReport(any(EventReport.class)); + verify(mMeasurementDao, times(1)).insertSource(any(Source.class)); + verify(mMeasurementDao, times(2)) + .insertAsyncRegistration(asyncRegistrationArgumentCaptor.capture()); + + Assert.assertEquals(2, asyncRegistrationArgumentCaptor.getAllValues().size()); + AsyncRegistration asyncReg = asyncRegistrationArgumentCaptor.getAllValues().get(0); + + // Assert first invocation's redirect + Uri expectedUri = + getRegistrationRedirectToWellKnownUri( + Uri.parse(LOCATION_TYPE_REDIRECT_URI), + LOCATION_TYPE_REDIRECT_URI.toString()); + Assert.assertEquals(expectedUri, asyncReg.getRegistrationUri()); + + AsyncRegistration asyncReg2 = asyncRegistrationArgumentCaptor.getAllValues().get(1); + + // Assert second invocation's redirect + expectedUri = + getRegistrationRedirectToWellKnownUri( + Uri.parse(LOCATION_TYPE_REDIRECT_URI_2), + LOCATION_TYPE_REDIRECT_URI_2.toString()); + Assert.assertEquals(expectedUri, asyncReg2.getRegistrationUri()); + } + + @Test + public void runAsyncRegistrationQueueWorker_appSrc_defaultReg_redirectAlreadyWellKnown() + throws DatastoreException { + // Setup + AsyncRegistrationQueueRunner asyncRegistrationQueueRunner = + getSpyAsyncRegistrationQueueRunner(); + AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); + String redirectAlreadyWellKnown = + LOCATION_TYPE_REDIRECT_URI + "/" + AsyncRedirects.WELL_KNOWN_PATH_SEGMENT; + Answer<Optional<Source>> answerAsyncSourceFetcher = + getAsyncSourceAnswerForLocationTypeRedirectToWellKnown( + redirectAlreadyWellKnown, validAsyncRegistration); + doAnswer(answerAsyncSourceFetcher) + .when(mAsyncSourceFetcher) + .fetchSource(any(), any(), any()); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + + List<Source.FakeReport> eventReportList = + Collections.singletonList( + new Source.FakeReport(new UnsignedLong(1L), 1L, List.of(APP_DESTINATION))); + when(mSourceNoiseHandler.assignAttributionModeAndGenerateFakeReports(mMockedSource)) + .thenReturn(eventReportList); + when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) + .thenReturn(validAsyncRegistration); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); + when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); + + // Execution + + asyncRegistrationQueueRunner.runAsyncRegistrationQueueWorker(); + + ArgumentCaptor<AsyncRegistration> asyncRegistrationArgumentCaptor = + ArgumentCaptor.forClass(AsyncRegistration.class); + + // Assertions + verify(mAsyncSourceFetcher, times(1)) + .fetchSource(any(AsyncRegistration.class), any(), any()); + verify(mMeasurementDao, times(1)).insertEventReport(any(EventReport.class)); + verify(mMeasurementDao, times(1)).insertSource(any(Source.class)); + verify(mMeasurementDao, times(1)) + .insertAsyncRegistration(asyncRegistrationArgumentCaptor.capture()); + + Assert.assertEquals(1, asyncRegistrationArgumentCaptor.getAllValues().size()); + AsyncRegistration asyncReg = asyncRegistrationArgumentCaptor.getAllValues().get(0); + // Assert .well-known isn't duplicated in path. + Assert.assertEquals( + getRegistrationRedirectToWellKnownUri( + Uri.parse(LOCATION_TYPE_REDIRECT_URI), redirectAlreadyWellKnown.toString()), + asyncReg.getRegistrationUri()); + } + + @Test public void runAsyncRegistrationQueueWorker_appInstalled_markToBeDeleted() throws DatastoreException, PackageManager.NameNotFoundException { // Setup @@ -639,17 +959,18 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo mLogger); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of( + WebUtil.validUri("https://example.test/sF1").toString(), + WebUtil.validUri("https://example.test/sF2").toString())); Answer<?> answerAsyncSourceFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - WebUtil.validUri("https://example.test/sF1"), - WebUtil.validUri("https://example.test/sF2"))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of( SourceFixture.getValidSourceBuilder() .setDropSourceIfInstalled(true) @@ -670,14 +991,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); // Execution @@ -713,17 +1027,18 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo mLogger); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of( + WebUtil.validUri("https://example.test/sF1").toString(), + WebUtil.validUri("https://example.test/sF2").toString())); Answer<?> answerAsyncSourceFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - WebUtil.validUri("https://example.test/sF1"), - WebUtil.validUri("https://example.test/sF2"))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of( SourceFixture.getValidSourceBuilder() .setDropSourceIfInstalled(true) @@ -744,14 +1059,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); // Execution @@ -786,17 +1094,18 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo mLogger); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of( + WebUtil.validUri("https://example.test/sF1").toString(), + WebUtil.validUri("https://example.test/sF2").toString())); Answer<?> answerAsyncSourceFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - WebUtil.validUri("https://example.test/sF1"), - WebUtil.validUri("https://example.test/sF2"))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of( SourceFixture.getValidSourceBuilder() .setDropSourceIfInstalled(false) @@ -817,14 +1126,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); // Execution @@ -860,17 +1162,18 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo mLogger); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppSource(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of( + WebUtil.validUri("https://example.test/sF1").toString(), + WebUtil.validUri("https://example.test/sF2").toString())); Answer<?> answerAsyncSourceFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - WebUtil.validUri("https://example.test/sF1"), - WebUtil.validUri("https://example.test/sF2"))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of( SourceFixture.getValidSourceBuilder() .setDropSourceIfInstalled(false) @@ -891,14 +1194,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); // Execution @@ -922,17 +1218,16 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppTrigger(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of(LIST_TYPE_REDIRECT_URI_1, LIST_TYPE_REDIRECT_URI_2)); Answer<Optional<Trigger>> answerAsyncTriggerFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - Uri.parse(LIST_TYPE_REDIRECT_URI_1), - Uri.parse(LIST_TYPE_REDIRECT_URI_2))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedTrigger); }; doAnswer(answerAsyncTriggerFetcher) @@ -942,14 +1237,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); // Execution @@ -996,15 +1284,16 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppTrigger(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LOCATION, + List.of(LOCATION_TYPE_REDIRECT_URI)); Answer<Optional<Trigger>> answerAsyncTriggerFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LOCATION, - List.of(Uri.parse(LOCATION_TYPE_REDIRECT_URI))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedTrigger); }; doAnswer(answerAsyncTriggerFetcher) @@ -1014,14 +1303,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo when(mMeasurementDao.fetchNextQueuedAsyncRegistration(anyInt(), any())) .thenReturn(validAsyncRegistration) .thenReturn(null); - KeyValueData redirectCount = - new KeyValueData.Builder() - .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) - .setKey( - AsyncRegistrationFixture.ValidAsyncRegistrationParams - .REGISTRATION_ID) - .setValue(null) // Should default to 1 - .build(); + KeyValueData redirectCount = getKeyValueDataRedirectCount(); when(mMeasurementDao.getKeyValueData(anyString(), any())).thenReturn(redirectCount); // Execution @@ -1059,15 +1341,16 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppTrigger(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LOCATION, + List.of(LOCATION_TYPE_REDIRECT_URI)); Answer<Optional<Trigger>> answerAsyncTriggerFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LOCATION, - List.of(Uri.parse(LOCATION_TYPE_REDIRECT_URI))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedTrigger); }; doAnswer(answerAsyncTriggerFetcher) @@ -1120,17 +1403,18 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppTrigger(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + IntStream.range(1, 10) + .mapToObj((i) -> LIST_TYPE_REDIRECT_URI_1 + "/" + i) + .collect(Collectors.toList())); Answer<Optional<Trigger>> answerAsyncTriggerFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - IntStream.range(1, 10) - .mapToObj((i) -> Uri.parse(LIST_TYPE_REDIRECT_URI_1 + "/" + i)) - .collect(Collectors.toList())); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedTrigger); }; doAnswer(answerAsyncTriggerFetcher) @@ -1189,15 +1473,16 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppTrigger(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LOCATION, + Collections.singletonList((LOCATION_TYPE_REDIRECT_URI))); Answer<Optional<Trigger>> answerAsyncTriggerFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LOCATION, - Collections.singletonList(Uri.parse(LOCATION_TYPE_REDIRECT_URI))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedTrigger); }; doAnswer(answerAsyncTriggerFetcher) @@ -1433,17 +1718,18 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppTrigger(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of( + WebUtil.validUri("https://example.test/sF1").toString(), + WebUtil.validUri("https://example.test/sF2").toString())); Answer<?> answerAsyncTriggerFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - WebUtil.validUri("https://example.test/sF1"), - WebUtil.validUri("https://example.test/sF2"))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.of(mMockedTrigger); }; doAnswer(answerAsyncTriggerFetcher) @@ -1610,18 +1896,19 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo getSpyAsyncRegistrationQueueRunner(); AsyncRegistration validAsyncRegistration = createAsyncRegistrationForAppTrigger(); - + Map<String, List<String>> redirectHeaders = + getRedirectHeaders( + AsyncRegistration.RedirectType.LIST, + List.of( + WebUtil.validUri("https://example.test/sF1").toString(), + WebUtil.validUri("https://example.test/sF2").toString())); Answer<?> answerAsyncTriggerFetcher = invocation -> { AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); asyncFetchStatus.setEntityStatus(AsyncFetchStatus.EntityStatus.PARSING_ERROR); - AsyncRedirect asyncRedirect = invocation.getArgument(2); - asyncRedirect.addToRedirects( - AsyncRegistration.RedirectType.LIST, - List.of( - WebUtil.validUri("https://example.test/sF1"), - WebUtil.validUri("https://example.test/sF2"))); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, validAsyncRegistration); return Optional.empty(); }; doAnswer(answerAsyncTriggerFetcher) @@ -3285,12 +3572,56 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo assertTrue(status); } - private RegistrationRequest buildRequest(String registrationUri) { - return new RegistrationRequest.Builder( - RegistrationRequest.REGISTER_SOURCE, - Uri.parse(registrationUri), - sDefaultContext.getAttributionSource().getPackageName(), - SDK_PACKAGE_NAME) + private static KeyValueData getKeyValueDataRedirectCount() { + return new KeyValueData.Builder() + .setDataType(KeyValueData.DataType.REGISTRATION_REDIRECT_COUNT) + .setKey(AsyncRegistrationFixture.ValidAsyncRegistrationParams.REGISTRATION_ID) + .setValue(null) // Should default to 1 + .build(); + } + + private Map<String, List<String>> getRedirectHeaders( + AsyncRegistration.RedirectType redirectType, List<String> uris) { + Map<String, List<String>> headers = new HashMap<>(); + if (redirectType.equals(AsyncRegistration.RedirectType.LOCATION)) { + headers.put(AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, uris); + } else { + headers.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, uris); + } + + return headers; + } + + private void assertRepeatedAsyncRegistration( + ArgumentCaptor<AsyncRegistration> asyncRegistrationArgumentCaptor, + int index, + Uri redirectUri) { + AsyncRegistration asyncReg = asyncRegistrationArgumentCaptor.getAllValues().get(index); + Assert.assertEquals(redirectUri, asyncReg.getRegistrationUri()); + } + + private Answer<Optional<Source>> getAsyncSourceAnswerForLocationTypeRedirectToWellKnown( + String redirectUri, AsyncRegistration asyncRegistration) { + Map<String, List<String>> redirectHeaders = + getRedirectHeaders(AsyncRegistration.RedirectType.LOCATION, List.of(redirectUri)); + redirectHeaders.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); + return invocation -> { + AsyncFetchStatus asyncFetchStatus = invocation.getArgument(1); + asyncFetchStatus.setResponseStatus(AsyncFetchStatus.ResponseStatus.SUCCESS); + AsyncRedirects asyncRedirects = invocation.getArgument(2); + asyncRedirects.configure(redirectHeaders, mFlags, asyncRegistration); + return Optional.of(mMockedSource); + }; + } + + private Uri getRegistrationRedirectToWellKnownUri( + Uri registrationUri, String originalUriString) { + return registrationUri + .buildUpon() + .encodedPath(AsyncRedirects.WELL_KNOWN_PATH_SEGMENT) + .appendQueryParameter(AsyncRedirects.WELL_KNOWN_QUERY_PARAM, originalUriString) .build(); } @@ -3316,7 +3647,7 @@ public final class AsyncRegistrationQueueRunnerTest extends AdServicesExtendedMo new Source.FakeReport( new UnsignedLong(0L), new EventReportWindowCalcDelegate(mFlags) - .getReportingTimeForNoising(source, 0, false), + .getReportingTimeForNoising(source, 0), destinations)) .collect(Collectors.toList()); } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncSourceFetcherTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncSourceFetcherTest.java index 0489c91f50..aa07077e89 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncSourceFetcherTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncSourceFetcherTest.java @@ -122,6 +122,15 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC private static final String LIST_TYPE_REDIRECT_URI = WebUtil.validUrl("https://bar.test"); private static final String LOCATION_TYPE_REDIRECT_URI = WebUtil.validUrl("https://example.test"); + private static final String LOCATION_TYPE_REDIRECT_WELLKNOWN_URI = + WebUtil.validUrl( + LOCATION_TYPE_REDIRECT_URI + + "/" + + AsyncRedirects.WELL_KNOWN_PATH_SEGMENT + + "?" + + AsyncRedirects.WELL_KNOWN_QUERY_PARAM + + "=" + + Uri.encode(LOCATION_TYPE_REDIRECT_URI)); private static final long ALT_EVENT_ID = 123456789; private static final long ALT_EXPIRY = 456790; private static final Uri REGISTRATION_URI_1 = WebUtil.validUri("https://subdomain.foo.test"); @@ -226,6 +235,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC .thenReturn(Flags.MEASUREMENT_MAX_INSTALL_ATTRIBUTION_WINDOW); when(mFlags.getMeasurementMinInstallAttributionWindow()) .thenReturn(Flags.MEASUREMENT_MIN_INSTALL_ATTRIBUTION_WINDOW); + when(mFlags.getMeasurementVtcConfigurableMaxEventReportsCount()) + .thenReturn(Flags.DEFAULT_MEASUREMENT_VTC_CONFIGURABLE_MAX_EVENT_REPORTS_COUNT); + when(mFlags.getMeasurementEventReportsVtcEarlyReportingWindows()) + .thenReturn(Flags.MEASUREMENT_EVENT_REPORTS_VTC_EARLY_REPORTING_WINDOWS); + when(mFlags.getMeasurementEventReportsCtcEarlyReportingWindows()) + .thenReturn(Flags.MEASUREMENT_EVENT_REPORTS_CTC_EARLY_REPORTING_WINDOWS); } @Test @@ -260,13 +275,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "}\n"))); when(mFlags.getMeasurementEnableXNA()).thenReturn(true); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); asyncFetchStatus.setRegistrationDelay(0L); // Execution AsyncRegistration asyncRegistration = appSourceRegistrationRequest(request); Optional<Source> fetch = - mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -319,7 +334,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC when(mUrlConnection.getHeaderFields()) .thenReturn( Map.of( - "Attribution-Reporting-Redirect", + AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI), "Attribution-Reporting-Register-Source", List.of( @@ -340,19 +355,20 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_KEY + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion // Redirects should be parsed & added verify(mFetcher, times(1)).openUrl(any()); assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); - assertEquals(1, asyncRedirect.getRedirects().size()); - assertEquals(LIST_TYPE_REDIRECT_URI, asyncRedirect.getRedirects().get(0).toString()); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LIST_TYPE_REDIRECT_URI, asyncRedirects.getRedirects().get(0).getUri().toString()); // Source shouldn't be created assertEquals( @@ -385,12 +401,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"expiry\": \"432000\"," + "\"source_event_id\": \"987654321\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -433,12 +449,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"expiry\": \"432000\"," + "\"source_event_id\": \"987654321\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -476,12 +492,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"expiry\": \"432000\"," + "\"source_event_id\": \"987654321\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -520,12 +536,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"expiry\": \"432000\"," + "\"source_event_id\": \"987654321\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -555,12 +571,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -597,12 +613,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"install_attribution_window\": null,\n" + " \"post_install_exclusivity_window\": null\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -646,12 +662,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\":" + " \"9876543210\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -678,12 +694,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC WebUtil.validUri("http://foo.test"), sContext.getPackageName(), SDK_PACKAGE_NAME); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.ResponseStatus.INVALID_URL, asyncFetchStatus.getResponseStatus()); @@ -698,12 +714,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC WebUtil.validUri("bad-schema://foo.test"), sContext.getPackageName(), SDK_PACKAGE_NAME); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.ResponseStatus.INVALID_URL, asyncFetchStatus.getResponseStatus()); @@ -716,12 +732,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC doThrow(new IOException("Bad internet things")) .when(mFetcher) .openUrl(new URL(DEFAULT_REGISTRATION)); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.ResponseStatus.NETWORK_ERROR, @@ -743,12 +759,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"source_event_id\": \"" + DEFAULT_EVENT_ID + "\""))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.PARSING_ERROR, asyncFetchStatus.getEntityStatus()); @@ -762,12 +778,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(DEFAULT_REGISTRATION)); when(mUrlConnection.getResponseCode()).thenReturn(200); when(mUrlConnection.getHeaderFields()).thenReturn(Collections.emptyMap()); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -790,12 +806,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"destination\": \"" + DEFAULT_DESTINATION + "\""))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.PARSING_ERROR, asyncFetchStatus.getEntityStatus()); @@ -821,12 +837,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -861,12 +877,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"source_event_id\":\"" + DEFAULT_EVENT_ID + "\"," + "\"expiry\":\"-15\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -893,12 +909,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"," + "\"expiry\":\"86399\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -933,12 +949,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"," + "\"expiry\":\"2592001\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -980,12 +996,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + TimeUnit.DAYS.toSeconds(1) / 2L) + "\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1025,12 +1041,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC - 1L) + "\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1067,12 +1083,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + String.valueOf(TimeUnit.HOURS.toSeconds(25)) + "\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1107,12 +1123,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"," + "\"expiry\":\"172800\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1149,12 +1165,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"86400\"," + "\"aggregatable_report_window\":\"86400\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1192,12 +1208,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"2000\"," + "\"aggregatable_report_window\":\"1728\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1236,12 +1252,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"2000\"," + "\"aggregatable_report_window\":\"1728\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1279,12 +1295,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"172801\"," + "\"aggregatable_report_window\":\"172801\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1323,12 +1339,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"2592001\"," + "\"aggregatable_report_window\":\"2592001\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1362,12 +1378,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":86400," + "\"aggregatable_report_window\":86400" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -1397,12 +1413,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"-86400\"," + "\"aggregatable_report_window\":\"86400\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -1428,12 +1444,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"86400\"," + "\"aggregatable_report_window\":\"-86400\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -1457,12 +1473,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"source_event_id\":\"" + DEFAULT_EVENT_ID + "\"," + "\"priority\":15" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -1486,13 +1502,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\"," + "\"source_event_id\":35}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -1517,13 +1533,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\"," + "\"source_event_id\":\"-35\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -1546,13 +1562,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\"," + "\"source_event_id\":\"-35\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -1577,13 +1593,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\",\"source_event_id\":\"" + "18446744073709551616\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -1606,13 +1622,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\",\"source_event_id\":\"" + "18446744073709551616\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -1637,13 +1653,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\"," + "\"source_event_id\":\"8l2\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -1666,13 +1682,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\"," + "\"source_event_id\":\"8l2\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -1713,13 +1729,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "}\n"))); when(mFlags.getMeasurementEnableXNA()).thenReturn(false); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -1751,13 +1767,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\",\"source_event_id\":\"" + "18446744073709551615\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -1793,13 +1809,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"," + "\"debug_key\":18}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -1835,13 +1851,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"," + "\"debug_key\":\"-18\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -1878,13 +1894,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"," + "\"debug_key\":\"18446744073709551616\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -1920,13 +1936,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"," + "\"debug_key\":\"987fs\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -1962,13 +1978,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"," + "\"debug_key\":\"18446744073709551615\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -2005,12 +2021,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"expiry\": null\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -2047,12 +2063,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\",\n" + "\"expiry\": 1" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -2089,12 +2105,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\",\n" + "\"expiry\": \"1\"" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -2131,12 +2147,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\",\n" + "\"expiry\": 2678400" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -2173,12 +2189,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\",\n" + "\"expiry\": \"2678400\"" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -2213,13 +2229,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"," + "\"debug_reporting\":\"true\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -2254,13 +2270,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"," + "\"debug_reporting\":\"invalid\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -2295,13 +2311,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"," + "\"debug_reporting\":\"null\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -2336,13 +2352,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"," + "\"debug_reporting\":null}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -2376,13 +2392,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"source_event_id\":\"" + DEFAULT_EVENT_ID + "\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); @@ -2421,12 +2437,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "" + "}\n")); when(mUrlConnection.getHeaderFields()).thenReturn(headersSecondRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.ResponseStatus.SERVER_UNAVAILABLE, @@ -2442,7 +2458,8 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC when(mUrlConnection.getResponseCode()).thenReturn(200); Map<String, List<String>> headersFirstRequest = new HashMap<>(); headersFirstRequest.put("Attribution-Reporting-Register-Source", List.of("{}")); - headersFirstRequest.put("Attribution-Reporting-Redirect", List.of(LIST_TYPE_REDIRECT_URI)); + headersFirstRequest.put( + AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); Map<String, List<String>> headersSecondRequest = new HashMap<>(); headersSecondRequest.put( "Attribution-Reporting-Register-Source", @@ -2461,16 +2478,17 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC when(mUrlConnection.getHeaderFields()) .thenReturn(headersFirstRequest) .thenReturn(headersSecondRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); - assertEquals(1, asyncRedirect.getRedirects().size()); - assertEquals(LIST_TYPE_REDIRECT_URI, asyncRedirect.getRedirects().get(0).toString()); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LIST_TYPE_REDIRECT_URI, asyncRedirects.getRedirects().get(0).getUri().toString()); assertEquals( AsyncFetchStatus.EntityStatus.PARSING_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); @@ -2500,14 +2518,15 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EXPIRY + "" + "}\n")); - headersFirstRequest.put("Attribution-Reporting-Redirect", List.of(LIST_TYPE_REDIRECT_URI)); + headersFirstRequest.put( + AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); when(mUrlConnection.getHeaderFields()).thenReturn(headersFirstRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals(AsyncFetchStatus.EntityStatus.SUCCESS, asyncFetchStatus.getEntityStatus()); @@ -2520,8 +2539,9 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC assertEquals( result.getEventTime() + TimeUnit.SECONDS.toMillis(DEFAULT_EXPIRY_ROUNDED), result.getExpiryTime()); - assertEquals(1, asyncRedirect.getRedirects().size()); - assertEquals(LIST_TYPE_REDIRECT_URI, asyncRedirect.getRedirects().get(0).toString()); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LIST_TYPE_REDIRECT_URI, asyncRedirects.getRedirects().get(0).getUri().toString()); assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); } @@ -2549,14 +2569,15 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EXPIRY + "\"" + "}\n")); - headersFirstRequest.put("Attribution-Reporting-Redirect", List.of(LIST_TYPE_REDIRECT_URI)); + headersFirstRequest.put( + AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); when(mUrlConnection.getHeaderFields()).thenReturn(headersFirstRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals(AsyncFetchStatus.EntityStatus.SUCCESS, asyncFetchStatus.getEntityStatus()); @@ -2569,8 +2590,9 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC assertEquals( result.getEventTime() + TimeUnit.SECONDS.toMillis(DEFAULT_EXPIRY_ROUNDED), result.getExpiryTime()); - assertEquals(1, asyncRedirect.getRedirects().size()); - assertEquals(LIST_TYPE_REDIRECT_URI, asyncRedirect.getRedirects().get(0).toString()); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LIST_TYPE_REDIRECT_URI, asyncRedirects.getRedirects().get(0).getUri().toString()); assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); } @@ -2585,33 +2607,36 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC Map<String, List<String>> headers = getDefaultHeaders(); // Populate both 'list' and 'location' type headers - headers.put("Attribution-Reporting-Redirect", List.of(LIST_TYPE_REDIRECT_URI)); - headers.put("Location", List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); when(mUrlConnection.getHeaderFields()).thenReturn(headers); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); assertDefaultSourceRegistration(result); - assertEquals(2, asyncRedirect.getRedirects().size()); + assertEquals(2, asyncRedirects.getRedirects().size()); assertEquals( LIST_TYPE_REDIRECT_URI, - asyncRedirect + asyncRedirects .getRedirectsByType(AsyncRegistration.RedirectType.LIST) .get(0) + .getUri() .toString()); assertEquals( LOCATION_TYPE_REDIRECT_URI, - asyncRedirect + asyncRedirects .getRedirectsByType(AsyncRegistration.RedirectType.LOCATION) .get(0) + .getUri() .toString()); assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2625,22 +2650,25 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC Map<String, List<String>> headers = getDefaultHeaders(); // Populate only 'location' type header - headers.put("Location", List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); when(mUrlConnection.getHeaderFields()).thenReturn(headers); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); assertDefaultSourceRegistration(result); - assertEquals(1, asyncRedirect.getRedirects().size()); - assertEquals(LOCATION_TYPE_REDIRECT_URI, asyncRedirect.getRedirects().get(0).toString()); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_URI, + asyncRedirects.getRedirects().get(0).getUri().toString()); assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); } @@ -2652,25 +2680,237 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC when(mUrlConnection.getResponseCode()).thenReturn(302); Map<String, List<String>> headers = getDefaultHeaders(); - headers.put("Attribution-Reporting-Redirect", List.of(LIST_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + // Execution + Optional<Source> fetch = + mFetcher.fetchSource( + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Source result = fetch.get(); + assertDefaultSourceRegistration(result); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LIST_TYPE_REDIRECT_URI, asyncRedirects.getRedirects().get(0).getUri().toString()); + assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testRedirects_locationRedirectHeadersToWellKnown() throws Exception { + RegistrationRequest request = buildRequest(DEFAULT_REGISTRATION); + doReturn(mUrlConnection).when(mFetcher).openUrl(any(URL.class)); + when(mUrlConnection.getResponseCode()).thenReturn(302); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + // Execution + Optional<Source> fetch = + mFetcher.fetchSource( + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Source result = fetch.get(); + assertDefaultSourceRegistration(result); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_WELLKNOWN_URI, + asyncRedirects.getRedirects().get(0).getUri().toString()); + assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testRedirects_bothHeaders_locationTypeToWellKnown() throws Exception { + RegistrationRequest request = buildRequest(DEFAULT_REGISTRATION); + doReturn(mUrlConnection).when(mFetcher).openUrl(any(URL.class)); + when(mUrlConnection.getResponseCode()).thenReturn(200); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); when(mUrlConnection.getHeaderFields()).thenReturn(headers); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); assertDefaultSourceRegistration(result); - assertEquals(1, asyncRedirect.getRedirects().size()); - assertEquals(LIST_TYPE_REDIRECT_URI, asyncRedirect.getRedirects().get(0).toString()); + assertEquals(2, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_WELLKNOWN_URI, + asyncRedirects + .getRedirectsByType(AsyncRegistration.RedirectType.LOCATION) + .get(0) + .getUri() + .toString()); + assertEquals( + LIST_TYPE_REDIRECT_URI, + asyncRedirects + .getRedirectsByType(AsyncRegistration.RedirectType.LIST) + .get(0) + .getUri() + .toString()); + assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testRedirects_wellKnownHeader_noop() throws Exception { + RegistrationRequest request = buildRequest(DEFAULT_REGISTRATION); + doReturn(mUrlConnection).when(mFetcher).openUrl(any(URL.class)); + when(mUrlConnection.getResponseCode()).thenReturn(302); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + // Populate only redirect behavior header with no actual redirect + headers.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + // Execution + Optional<Source> fetch = + mFetcher.fetchSource( + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Source result = fetch.get(); + assertDefaultSourceRegistration(result); + assertEquals(0, asyncRedirects.getRedirects().size()); + assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testRedirects_wellKnownHeader_acceptsListTypeWithNoLocationType() throws Exception { + RegistrationRequest request = buildRequest(DEFAULT_REGISTRATION); + doReturn(mUrlConnection).when(mFetcher).openUrl(any(URL.class)); + when(mUrlConnection.getResponseCode()).thenReturn(200); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + headers.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + // Execution + Optional<Source> fetch = + mFetcher.fetchSource( + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Source result = fetch.get(); + assertDefaultSourceRegistration(result); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LIST_TYPE_REDIRECT_URI, + asyncRedirects + .getRedirectsByType(AsyncRegistration.RedirectType.LIST) + .get(0) + .getUri() + .toString()); assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); } + + @Test + public void testRedirects_locationRedirectHeaders_wellKnownHeaderMisconfigured() + throws Exception { + RegistrationRequest request = buildRequest(DEFAULT_REGISTRATION); + doReturn(mUrlConnection).when(mFetcher).openUrl(any(URL.class)); + when(mUrlConnection.getResponseCode()).thenReturn(302); + Map<String, List<String>> headers = getDefaultHeaders(); + + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, List.of("BAD")); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + // Execution + Optional<Source> fetch = + mFetcher.fetchSource( + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Source result = fetch.get(); + assertDefaultSourceRegistration(result); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_URI, + asyncRedirects.getRedirects().get(0).getUri().toString()); + assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testRedirects_locationRedirectHeaders_wellKnownHeaderNull() throws Exception { + RegistrationRequest request = buildRequest(DEFAULT_REGISTRATION); + doReturn(mUrlConnection).when(mFetcher).openUrl(any(URL.class)); + when(mUrlConnection.getResponseCode()).thenReturn(302); + Map<String, List<String>> headers = getDefaultHeaders(); + + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, null); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + // Execution + Optional<Source> fetch = + mFetcher.fetchSource( + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Source result = fetch.get(); + assertDefaultSourceRegistration(result); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_URI, + asyncRedirects.getRedirects().get(0).getUri().toString()); + assertEquals(DEFAULT_REGISTRATION, result.getRegistrationOrigin().toString()); + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + // End tests for redirect types @Test @@ -2693,12 +2933,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\",\n" + filterData + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -2736,12 +2976,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\",\n" + filterData + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -2770,12 +3010,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\",\n" + filterData + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2807,12 +3047,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\",\n" + filterData + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2841,12 +3081,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\",\n" + filterData + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2882,12 +3122,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\",\n" + filterData + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2916,12 +3156,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\",\n" + filterData + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2949,12 +3189,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\",\n" + filterData + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2967,8 +3207,10 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC doReturn(mUrlConnection).when(mFetcher).openUrl(any(URL.class)); when(mUrlConnection.getResponseCode()).thenReturn(200); when(mUrlConnection.getHeaderFields()) - .thenReturn(Map.of( - "Attribution-Reporting-Redirect", List.of(LIST_TYPE_REDIRECT_URI))) + .thenReturn( + Map.of( + AsyncRedirects.REDIRECT_LIST_HEADER_KEY, + List.of(LIST_TYPE_REDIRECT_URI))) .thenReturn( Map.of( "Attribution-Reporting-Register-Source", @@ -2987,22 +3229,23 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.HEADER_MISSING, asyncFetchStatus.getEntityStatus()); assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); - assertEquals(1, asyncRedirect.getRedirects().size()); + assertEquals(1, asyncRedirects.getRedirects().size()); assertEquals( LIST_TYPE_REDIRECT_URI, - asyncRedirect + asyncRedirects .getRedirectsByType(AsyncRegistration.RedirectType.LIST) .get(0) + .getUri() .toString()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -3027,12 +3270,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"aggregation_keys\": {\"campaignCounts\" :" + " \"0x159\", \"geoValue\" : \"0x5\"}\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3065,12 +3308,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"aggregation_keys\": {\"campaignCounts\" :" + " \"0x159G\", \"geoValue\" : \"0x5\"}\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -3098,12 +3341,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"aggregation_keys\": {\"campaignCounts\" :" + " \"0x159G\", \"geoValue\" : \"0x5\"}\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3140,12 +3383,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\":" + " \"987654321\",\"aggregation_keys\": " + tooManyKeys))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.PARSING_ERROR, asyncFetchStatus.getEntityStatus()); @@ -3176,12 +3419,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\":" + " \"987654321\",\"aggregation_keys\": " + tooManyKeys))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection).setRequestMethod("POST"); @@ -3207,12 +3450,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"aggregation_keys\": [\"campaignCounts\"," + " \"0x159\", \"geoValue\", \"0x5\"]\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -3240,12 +3483,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\": \"0x159\"," + "\"geoValue\": \"0x5\"}\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -3272,12 +3515,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"aggregation_keys\": {\"campaignCounts\" :" + " \"0159\", \"geoValue\" : \"0x5\"}\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -3305,12 +3548,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + LONG_AGGREGATE_KEY_PIECE + "\"}\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -3341,17 +3584,17 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_KEY + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution AsyncRegistration asyncRegistration = webSourceRegistrationRequest(request, true); Optional<Source> fetch = - mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertEquals(EVENT_ID_1, result.getEventId()); @@ -3392,14 +3635,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"expiry\": \"432000\"," + "\"source_event_id\": \"987654321\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3443,14 +3686,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"expiry\": \"432000\"," + "\"source_event_id\": \"987654321\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3489,14 +3732,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"expiry\": \"432000\"," + "\"source_event_id\": \"987654321\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -3536,14 +3779,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"expiry\": \"432000\"," + "\"source_event_id\": \"987654321\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -3573,14 +3816,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"," + "\"expiry\":\"2000\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3612,14 +3855,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"," + "\"expiry\":\"2592001\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3659,14 +3902,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + TimeUnit.DAYS.toSeconds(1) / 2L) + "\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true, Source.SourceType.EVENT), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3704,14 +3947,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC - 1L) + "\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true, Source.SourceType.EVENT), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3746,14 +3989,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + String.valueOf(TimeUnit.HOURS.toSeconds(25)) + "\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true, Source.SourceType.NAVIGATION), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3786,14 +4029,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"," + "\"expiry\":\"172800\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3828,14 +4071,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"86400\"," + "\"aggregatable_report_window\":\"86400\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3872,14 +4115,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"2000\"," + "\"aggregatable_report_window\":\"1728\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3916,14 +4159,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"2000\"," + "\"aggregatable_report_window\":\"1728\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3959,14 +4202,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"172801\"," + "\"aggregatable_report_window\":\"172801\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -4002,14 +4245,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_window\":\"2592001\"," + "\"aggregatable_report_window\":\"2592001\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -4048,19 +4291,19 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_KEY + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertEquals(EVENT_ID_1, result.getEventId()); @@ -4100,18 +4343,18 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_KEY + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, false), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertEquals(EVENT_ID_1, result.getEventId()); @@ -4154,14 +4397,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_KEY + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -4201,19 +4444,19 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + aggregateSource + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(OS_DESTINATION, result.getAppDestinations().get(0)); assertEquals(filterData, result.getFilterDataString()); @@ -4257,24 +4500,24 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"aggregation_keys\": " + aggregateSource + "}"), - "Attribution-Reporting-Redirect", + AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI), - "Location", + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertEquals(filterData, result.getFilterDataString()); @@ -4318,14 +4561,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"filter_data\": " + filterData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -4362,19 +4605,19 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_JOIN_KEY + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertEquals(EVENT_ID_1, result.getEventId()); @@ -4419,19 +4662,19 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_JOIN_KEY + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertEquals(EVENT_ID_1, result.getEventId()); @@ -4483,14 +4726,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"filter_data\": " + filterData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -4529,20 +4772,20 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + WEB_DESTINATION + "\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(OS_DESTINATION, result.getAppDestinations().get(0)); assertNull(result.getFilterDataString()); @@ -4585,20 +4828,20 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(OS_DESTINATION, result.getAppDestinations().get(0)); assertNull(result.getFilterDataString()); @@ -4638,19 +4881,19 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(OS_DESTINATION, result.getAppDestinations().get(0)); assertNull(result.getFilterDataString()); @@ -4683,14 +4926,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_EVENT_ID + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.PARSING_ERROR, asyncFetchStatus.getEntityStatus()); @@ -4723,19 +4966,19 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + EVENT_ID_1 + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertNull(result.getFilterDataString()); @@ -4776,14 +5019,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + EVENT_ID_1 + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -4813,13 +5056,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); asyncFetchStatus.setRegistrationDelay(0L); AsyncRegistration asyncRegistration = appSourceRegistrationRequest(request); // Execution Optional<Source> fetch = - mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, asyncRedirects); assertTrue(fetch.isPresent()); FetcherUtil.emitHeaderMetrics(mFlags, mLogger, asyncRegistration, asyncFetchStatus); @@ -4873,13 +5116,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_JOIN_KEY + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -4929,13 +5172,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_JOIN_KEY + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -4977,7 +5220,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC AsyncRegistration asyncRegistration = appSourceRegistrationRequest(request); // Execution Optional<Source> fetch = - mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, new AsyncRedirect()); + mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, new AsyncRedirects()); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5013,7 +5256,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC AsyncRegistration asyncRegistration = appSourceRegistrationRequest(request); // Execution Optional<Source> fetch = - mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, new AsyncRedirect()); + mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, new AsyncRedirects()); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5053,7 +5296,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution @@ -5061,7 +5304,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC mFetcher.fetchSource( appSourceRegistrationRequestWithAdId(request), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -5105,19 +5348,19 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_AD_ID_VALUE + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertEquals(EVENT_ID_1, result.getEventId()); @@ -5162,19 +5405,19 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_AD_ID_VALUE + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertEquals(EVENT_ID_1, result.getEventId()); @@ -5218,19 +5461,19 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEBUG_AD_ID_VALUE + "\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); assertEquals(Uri.parse(DEFAULT_DESTINATION), result.getAppDestinations().get(0)); assertEquals(EVENT_ID_1, result.getEventId()); @@ -5246,7 +5489,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC } @Test - public void fetchSource_setsFakeEnrollmentId_whenDisableEnrollmentFlagIsTrue() + public void fetchSource_setsSiteEnrollmentId_whenDisableEnrollmentFlagIsTrue() throws Exception { String uri = "https://test1.example.com:8081"; RegistrationRequest request = buildRequest(uri); @@ -5270,13 +5513,87 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC AsyncRegistration asyncRegistration = appSourceRegistrationRequest(request); // Execution Optional<Source> fetch = - mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, new AsyncRedirect()); + mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, new AsyncRedirects()); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Source result = fetch.get(); assertEquals("https://test1.example.com:8081", result.getRegistrationOrigin().toString()); - assertEquals(Enrollment.FAKE_ENROLLMENT, result.getEnrollmentId()); + assertEquals("https://example.com", result.getEnrollmentId()); + assertEquals(DEFAULT_DESTINATION, result.getAppDestinations().get(0).toString()); + assertEquals(DEFAULT_EVENT_ID, result.getEventId()); + verify(mUrlConnection).setRequestMethod("POST"); + } + + @Test + public void fetchSource_setsSiteEnrollmentId_whenDisableEnrollmentFlagIsTrueForIP() + throws Exception { + String uri = "https://127.0.0.1:8081"; + RegistrationRequest request = buildRequest(uri); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(uri)); + doReturn(true).when(mFlags).isDisableMeasurementEnrollmentCheck(); + when(mUrlConnection.getResponseCode()).thenReturn(200); + when(mUrlConnection.getHeaderFields()) + .thenReturn( + Map.of( + "Attribution-Reporting-Register-Source", + List.of( + "{\n" + + "\"destination\": \"" + + DEFAULT_DESTINATION + + "\",\n" + + "\"source_event_id\": \"" + + DEFAULT_EVENT_ID + + "\"\n" + + "}\n"))); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appSourceRegistrationRequest(request); + // Execution + Optional<Source> fetch = + mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, new AsyncRedirects()); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Source result = fetch.get(); + assertEquals("https://127.0.0.1:8081", result.getRegistrationOrigin().toString()); + assertEquals("https://127.0.0.1", result.getEnrollmentId()); + assertEquals(DEFAULT_DESTINATION, result.getAppDestinations().get(0).toString()); + assertEquals(DEFAULT_EVENT_ID, result.getEventId()); + verify(mUrlConnection).setRequestMethod("POST"); + } + + @Test + public void fetchSource_setsSiteEnrollmentId_whenDisableEnrollmentFlagIsTrueForLocalhost() + throws Exception { + String uri = "https://localhost:8081"; + RegistrationRequest request = buildRequest(uri); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(uri)); + doReturn(true).when(mFlags).isDisableMeasurementEnrollmentCheck(); + when(mUrlConnection.getResponseCode()).thenReturn(200); + when(mUrlConnection.getHeaderFields()) + .thenReturn( + Map.of( + "Attribution-Reporting-Register-Source", + List.of( + "{\n" + + "\"destination\": \"" + + DEFAULT_DESTINATION + + "\",\n" + + "\"source_event_id\": \"" + + DEFAULT_EVENT_ID + + "\"\n" + + "}\n"))); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appSourceRegistrationRequest(request); + // Execution + Optional<Source> fetch = + mFetcher.fetchSource(asyncRegistration, asyncFetchStatus, new AsyncRedirects()); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Source result = fetch.get(); + assertEquals("https://localhost:8081", result.getRegistrationOrigin().toString()); + assertEquals("https://localhost", result.getEnrollmentId()); assertEquals(DEFAULT_DESTINATION, result.getAppDestinations().get(0).toString()); assertEquals(DEFAULT_EVENT_ID, result.getEventId()); verify(mUrlConnection).setRequestMethod("POST"); @@ -5307,12 +5624,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5345,12 +5662,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5384,12 +5701,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5423,12 +5740,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5463,12 +5780,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5502,12 +5819,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"\n" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5537,12 +5854,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"post_install_exclusivity_window\": " + "\"987654\"" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5574,12 +5891,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"trigger_data_matching\": \"INVALID\"," + "\"post_install_exclusivity_window\": \"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isEmpty()); } @@ -5623,12 +5940,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5693,12 +6010,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5775,12 +6092,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5837,12 +6154,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -5887,12 +6204,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5954,14 +6271,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -6040,12 +6357,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -6092,12 +6409,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isEmpty()); } @@ -6142,12 +6459,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isEmpty()); } @@ -6193,12 +6510,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -6248,12 +6565,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -6321,12 +6638,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -6376,12 +6693,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -6447,12 +6764,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isEmpty()); } @@ -6499,14 +6816,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertTrue(fetch.isEmpty()); } @@ -6551,13 +6868,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isEmpty()); } @@ -6603,7 +6920,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution @@ -6611,7 +6928,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertTrue(fetch.isEmpty()); } @@ -6667,13 +6984,13 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isEmpty()); } @@ -6731,7 +7048,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution @@ -6739,7 +7056,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertTrue(fetch.isEmpty()); } @@ -6795,12 +7112,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -6878,14 +7195,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}\n"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -6951,12 +7268,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -7006,14 +7323,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( webSourceRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -7081,12 +7398,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7154,12 +7471,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7226,12 +7543,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7261,12 +7578,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\"," + " \"max_event_level_reports\": 21" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7295,12 +7612,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\"," + " \"max_event_level_reports\": -3" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7330,12 +7647,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"source_event_id\": \"987654321\"," + " \"max_event_level_reports\": \"3\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7372,12 +7689,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_windows\":" + eventReportWindows + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7413,12 +7730,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_windows\":" + eventReportWindows + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7454,12 +7771,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_windows\":" + eventReportWindows + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -7506,12 +7823,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_windows\":" + eventReportWindows + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -7554,12 +7871,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_windows\":" + eventReportWindows + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7591,12 +7908,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_windows\":" + eventReportWindows + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7628,12 +7945,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_windows\":" + eventReportWindows + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7665,12 +7982,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"event_report_windows\":" + eventReportWindows + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7705,12 +8022,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "," + " \"max_event_level_reports\": 5" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7744,12 +8061,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "," + " \"max_event_level_reports\": 5" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7783,12 +8100,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "," + " \"max_event_level_reports\": 5" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7822,12 +8139,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "," + " \"max_event_level_reports\": 5" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -7874,12 +8191,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -7927,12 +8244,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + " \"post_install_exclusivity_window\": " + "\"987654\"" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -7974,12 +8291,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "," + " \"max_event_level_reports\": 5" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -8023,12 +8340,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "," + " \"max_event_level_reports\": 5" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -8068,12 +8385,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "," + " \"max_event_level_reports\": 5" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -8113,12 +8430,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "," + " \"max_event_level_reports\": 5" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -8144,14 +8461,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\"," + "\"source_event_id\":\"35\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( appSourceRegistrationRequestWithPostBody(request, POST_BODY), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(POST_BODY, outputStream.toString()); assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -8176,14 +8493,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\"," + "\"source_event_id\":\"35\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( appSourceRegistrationRequestWithPostBody(request, null), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -8209,7 +8526,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\"," + "\"source_event_id\":\"35\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution String emptyPostBody = ""; @@ -8217,7 +8534,7 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC mFetcher.fetchSource( appSourceRegistrationRequestWithPostBody(request, emptyPostBody), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(emptyPostBody, outputStream.toString()); assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -8242,14 +8559,14 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + DEFAULT_DESTINATION + "\"," + "\"source_event_id\":\"35\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( appSourceRegistrationRequestWithPostBody(request, POST_BODY), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -8276,12 +8593,12 @@ public final class AsyncSourceFetcherTest extends AdServicesExtendedMockitoTestC + "\"," + "\"source_event_id\":\"35\"," + "\"drop_source_if_installed\":true}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Source> fetch = mFetcher.fetchSource( - appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appSourceRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncTriggerFetcherTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncTriggerFetcherTest.java index f22a19eb9c..41605bc539 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncTriggerFetcherTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/AsyncTriggerFetcherTest.java @@ -145,6 +145,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest WebUtil.validUrl("https://subdomain.bar.test"); private static final String LOCATION_TYPE_REDIRECT_URI = WebUtil.validUrl("https://example.test"); + private static final String LOCATION_TYPE_REDIRECT_WELLKNOWN_URI = + WebUtil.validUrl( + LOCATION_TYPE_REDIRECT_URI + + "/" + + AsyncRedirects.WELL_KNOWN_PATH_SEGMENT + + "?" + + AsyncRedirects.WELL_KNOWN_QUERY_PARAM + + "=" + + Uri.encode(LOCATION_TYPE_REDIRECT_URI)); private static final Uri REGISTRATION_URI_1 = WebUtil.validUri("https://subdomain.foo.test"); private static final WebTriggerParams TRIGGER_REGISTRATION_1 = new WebTriggerParams.Builder(REGISTRATION_URI_1).setDebugKeyAllowed(true).build(); @@ -248,13 +257,13 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest List.of("{\"event_trigger_data\":" + EVENT_TRIGGERS_1 + "}"))); doReturn(5000L).when(mFlags).getMaxResponseBasedRegistrationPayloadSizeBytes(); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); asyncFetchStatus.setRegistrationDelay(0L); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -325,13 +334,13 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "}"))); doReturn(5000L).when(mFlags).getMaxResponseBasedRegistrationPayloadSizeBytes(); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); asyncFetchStatus.setRegistrationDelay(0L); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -385,12 +394,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregateDedupKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -439,12 +448,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregateDedupKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -488,12 +497,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregateDedupKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -541,12 +550,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregateDedupKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -590,12 +599,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregateDedupKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -643,12 +652,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregateDedupKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -692,12 +701,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregateDedupKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -745,12 +754,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregateDedupKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -792,12 +801,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregateDedupKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -816,34 +825,37 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map<String, List<String>> headers = getDefaultHeaders(); // Populate both 'list' and 'location' type headers - headers.put("Attribution-Reporting-Redirect", List.of(LIST_TYPE_REDIRECT_URI)); - headers.put("Location", List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); when(mUrlConnection.getHeaderFields()).thenReturn(headers); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); assertTriggerRegistration(asyncRegistration, result); - assertEquals(2, asyncRedirect.getRedirects().size()); + assertEquals(2, asyncRedirects.getRedirects().size()); assertEquals( LIST_TYPE_REDIRECT_URI, - asyncRedirect + asyncRedirects .getRedirectsByType(AsyncRegistration.RedirectType.LIST) .get(0) + .getUri() .toString()); assertEquals( LOCATION_TYPE_REDIRECT_URI, - asyncRedirect + asyncRedirects .getRedirectsByType(AsyncRegistration.RedirectType.LOCATION) .get(0) + .getUri() .toString()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -857,68 +869,295 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map<String, List<String>> headers = getDefaultHeaders(); // Populate only 'location' type header - headers.put("Location", List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); when(mUrlConnection.getHeaderFields()).thenReturn(headers); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); assertTriggerRegistration(asyncRegistration, result); - assertEquals(1, asyncRedirect.getRedirects().size()); - assertEquals(LOCATION_TYPE_REDIRECT_URI, asyncRedirect.getRedirects().get(0).toString()); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_URI, + asyncRedirects.getRedirects().get(0).getUri().toString()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); } @Test - public void testRedirectType_locationRedirectType_ignoresListType() throws Exception { + public void testRedirectType_locationRedirectType_acceptsListType() throws Exception { RegistrationRequest request = buildRequest(TRIGGER_URI); doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(TRIGGER_URI)); when(mUrlConnection.getResponseCode()).thenReturn(302); Map<String, List<String>> headers = getDefaultHeaders(); // Populate both 'list' and 'location' type headers - headers.put("Attribution-Reporting-Redirect", List.of(LIST_TYPE_REDIRECT_URI)); - headers.put("Location", List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); when(mUrlConnection.getHeaderFields()).thenReturn(headers); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); assertTriggerRegistration(asyncRegistration, result); - assertEquals(2, asyncRedirect.getRedirects().size()); + assertEquals(2, asyncRedirects.getRedirects().size()); assertEquals( LOCATION_TYPE_REDIRECT_URI, - asyncRedirect + asyncRedirects + .getRedirectsByType(AsyncRegistration.RedirectType.LOCATION) + .get(0) + .getUri() + .toString()); + assertEquals( + LIST_TYPE_REDIRECT_URI, + asyncRedirects + .getRedirectsByType(AsyncRegistration.RedirectType.LIST) + .get(0) + .getUri() + .toString()); + + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testRedirectType_locationRedirectHeaderType_wellKnownPath() throws Exception { + RegistrationRequest request = buildRequest(TRIGGER_URI); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(TRIGGER_URI)); + when(mUrlConnection.getResponseCode()).thenReturn(302); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + // Populate only 'location' type header + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); + // Execution + Optional<Trigger> fetch = + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Trigger result = fetch.get(); + assertTriggerRegistration(asyncRegistration, result); + + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_WELLKNOWN_URI, + asyncRedirects.getRedirects().get(0).getUri().toString()); + + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testRedirectType_locationRedirectType_wellKnownPath_acceptsList() throws Exception { + RegistrationRequest request = buildRequest(TRIGGER_URI); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(TRIGGER_URI)); + when(mUrlConnection.getResponseCode()).thenReturn(302); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); + headers.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); + // Execution + Optional<Trigger> fetch = + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Trigger result = fetch.get(); + assertTriggerRegistration(asyncRegistration, result); + + assertEquals(2, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_WELLKNOWN_URI, + asyncRedirects .getRedirectsByType(AsyncRegistration.RedirectType.LOCATION) .get(0) + .getUri() .toString()); assertEquals( LIST_TYPE_REDIRECT_URI, - asyncRedirect + asyncRedirects .getRedirectsByType(AsyncRegistration.RedirectType.LIST) .get(0) + .getUri() .toString()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); } + @Test + public void testWellKnownPathHeader_noop() throws Exception { + RegistrationRequest request = buildRequest(TRIGGER_URI); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(TRIGGER_URI)); + when(mUrlConnection.getResponseCode()).thenReturn(200); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + // Populate behavior config header, but no redirects. + headers.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); + // Execution + Optional<Trigger> fetch = + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Trigger result = fetch.get(); + assertTriggerRegistration(asyncRegistration, result); + + assertEquals(0, asyncRedirects.getRedirects().size()); + + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testWellKnownPathHeader_acceptsListTypeWithNoLocationType() throws Exception { + RegistrationRequest request = buildRequest(TRIGGER_URI); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(TRIGGER_URI)); + when(mUrlConnection.getResponseCode()).thenReturn(200); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + // Populate behavior config header, but no Location type redirect. + headers.put( + AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, + List.of(AsyncRedirects.REDIRECT_302_TO_WELL_KNOWN)); + headers.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI)); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); + // Execution + Optional<Trigger> fetch = + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Trigger result = fetch.get(); + assertTriggerRegistration(asyncRegistration, result); + + assertEquals(1, asyncRedirects.getRedirects().size()); + + assertEquals( + LIST_TYPE_REDIRECT_URI, + asyncRedirects + .getRedirectsByType(AsyncRegistration.RedirectType.LIST) + .get(0) + .getUri() + .toString()); + + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testRedirectType_locationRedirectHeaderType_wellKnownHeaderMisconfigured() + throws Exception { + RegistrationRequest request = buildRequest(TRIGGER_URI); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(TRIGGER_URI)); + when(mUrlConnection.getResponseCode()).thenReturn(302); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, List.of("BAD")); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); + // Execution + Optional<Trigger> fetch = + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Trigger result = fetch.get(); + assertTriggerRegistration(asyncRegistration, result); + + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_URI, + asyncRedirects.getRedirects().get(0).getUri().toString()); + + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + + @Test + public void testRedirectType_locationRedirectHeaderType_wellKnownHeaderNull() throws Exception { + RegistrationRequest request = buildRequest(TRIGGER_URI); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(TRIGGER_URI)); + when(mUrlConnection.getResponseCode()).thenReturn(302); + when(mFlags.getMeasurementEnableRedirectToWellKnownPath()).thenReturn(true); + Map<String, List<String>> headers = getDefaultHeaders(); + + headers.put( + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI)); + headers.put(AsyncRedirects.HEADER_ATTRIBUTION_REPORTING_REDIRECT_CONFIG, null); + + when(mUrlConnection.getHeaderFields()).thenReturn(headers); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); + // Execution + Optional<Trigger> fetch = + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Trigger result = fetch.get(); + assertTriggerRegistration(asyncRegistration, result); + + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals( + LOCATION_TYPE_REDIRECT_URI, + asyncRedirects.getRedirects().get(0).getUri().toString()); + + verify(mUrlConnection, times(1)).setRequestMethod("POST"); + } + // End tests for redirect types @Test @@ -935,12 +1174,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -966,12 +1205,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggers + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -991,12 +1230,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"debug_key\": \"" + DEBUG_KEY + "\"}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1021,12 +1260,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1055,12 +1294,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggers + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -1080,15 +1319,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1107,15 +1346,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1135,12 +1374,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1165,15 +1404,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1194,12 +1433,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1223,15 +1462,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1251,12 +1490,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1280,12 +1519,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1309,12 +1548,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1338,15 +1577,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1366,15 +1605,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1394,15 +1633,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1422,12 +1661,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1452,12 +1691,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1482,15 +1721,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1510,15 +1749,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1539,12 +1778,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1568,15 +1807,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1596,12 +1835,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1628,15 +1867,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1658,15 +1897,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1689,12 +1928,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1721,15 +1960,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1752,12 +1991,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1784,15 +2023,15 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion - assertEquals(AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, - asyncFetchStatus.getEntityStatus()); + assertEquals( + AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -1815,12 +2054,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1845,12 +2084,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1875,12 +2114,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -1905,12 +2144,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -1935,12 +2174,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -1961,12 +2200,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -1995,12 +2234,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2021,12 +2260,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2047,12 +2286,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -2080,12 +2319,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2113,12 +2352,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2142,12 +2381,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2179,12 +2418,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2208,12 +2447,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + eventTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2234,12 +2473,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -2265,12 +2504,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2289,12 +2528,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2325,12 +2564,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_deduplication_keys\":" + tooManyEntries + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2362,12 +2601,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_deduplication_keys\":" + deduplicationKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2421,12 +2660,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + ",\"aggregatable_deduplication_keys\":" + deduplicationKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2481,12 +2720,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_deduplication_keys\":" + deduplicationKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2509,12 +2748,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "," + "\"aggregatable_deduplication_keys\":{}" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2537,12 +2776,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "," + "\"aggregatable_deduplication_keys\":" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2565,12 +2804,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2589,12 +2828,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2621,12 +2860,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2645,12 +2884,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2669,12 +2908,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); when(mFlags.getMeasurementEnableLookbackWindowFilter()).thenReturn(true); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2693,12 +2932,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); when(mFlags.getMeasurementEnableLookbackWindowFilter()).thenReturn(true); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2717,12 +2956,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); when(mFlags.getMeasurementEnableLookbackWindowFilter()).thenReturn(true); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2741,12 +2980,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"filters\":" + filters + "}"))); when(mFlags.getMeasurementEnableLookbackWindowFilter()).thenReturn(true); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2767,12 +3006,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"not_filters\":" + notFilters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -2798,12 +3037,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"not_filters\":" + notFilters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2822,12 +3061,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"not_filters\":" + notFilters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2850,12 +3089,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"not_filters\":" + notFilters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2874,12 +3113,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"not_filters\":" + notFilters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2906,12 +3145,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"not_filters\":" + notFilters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2930,12 +3169,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"not_filters\":" + notFilters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); @@ -2956,21 +3195,21 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()) .thenReturn( Map.of( - "Attribution-Reporting-Redirect", + AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(DEFAULT_REDIRECT), "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + EVENT_TRIGGERS_1 + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion verify(mFetcher, times(1)).openUrl(any()); assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); - assertEquals(1, asyncRedirect.getRedirects().size()); - assertEquals(DEFAULT_REDIRECT, asyncRedirect.getRedirects().get(0).toString()); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals(DEFAULT_REDIRECT, asyncRedirects.getRedirects().get(0).getUri().toString()); assertEquals( AsyncFetchStatus.EntityStatus.INVALID_ENROLLMENT, asyncFetchStatus.getEntityStatus()); @@ -2994,12 +3233,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3030,12 +3269,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -3062,12 +3301,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -3094,12 +3333,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -3126,12 +3365,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -3149,12 +3388,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest WebUtil.validUri("http://foo.test"), CONTEXT.getPackageName(), SDK_PACKAGE_NAME); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.ResponseStatus.INVALID_URL, asyncFetchStatus.getResponseStatus()); @@ -3178,11 +3417,11 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest false, false, null); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(registration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(registration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.ResponseStatus.INVALID_URL, asyncFetchStatus.getResponseStatus()); @@ -3195,12 +3434,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest doThrow(new IOException("Bad internet things")) .when(mFetcher) .openUrl(new URL(TRIGGER_URI)); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.ResponseStatus.NETWORK_ERROR, @@ -3219,12 +3458,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + EVENT_TRIGGERS_1 + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.ResponseStatus.SERVER_UNAVAILABLE, @@ -3243,12 +3482,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\": [{}]}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3271,14 +3510,14 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest headersFirstRequest.put( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + EVENT_TRIGGERS_1 + "}")); - headersFirstRequest.put("Attribution-Reporting-Redirect", List.of(DEFAULT_REDIRECT)); + headersFirstRequest.put(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(DEFAULT_REDIRECT)); when(mUrlConnection.getHeaderFields()).thenReturn(headersFirstRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3298,21 +3537,22 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest doReturn(mUrlConnection).when(mFetcher).openUrl(any(URL.class)); when(mUrlConnection.getResponseCode()).thenReturn(200); when(mUrlConnection.getHeaderFields()) - .thenReturn(Map.of("Attribution-Reporting-Redirect", List.of(DEFAULT_REDIRECT))) + .thenReturn( + Map.of(AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(DEFAULT_REDIRECT))) .thenReturn( Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + EVENT_TRIGGERS_1 + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); - assertEquals(1, asyncRedirect.getRedirects().size()); - assertEquals(DEFAULT_REDIRECT, asyncRedirect.getRedirects().get(0).toString()); + assertEquals(1, asyncRedirects.getRedirects().size()); + assertEquals(DEFAULT_REDIRECT, asyncRedirects.getRedirects().get(0).getUri().toString()); assertEquals( AsyncFetchStatus.EntityStatus.HEADER_MISSING, asyncFetchStatus.getEntityStatus()); @@ -3342,12 +3582,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregateTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3383,12 +3623,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregateTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.PARSING_ERROR, asyncFetchStatus.getEntityStatus()); @@ -3418,12 +3658,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregateTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3460,12 +3700,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregateTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3504,12 +3744,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "{\"aggregatable_trigger_data\":" + aggregateTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -3543,12 +3783,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "{\"aggregatable_trigger_data\":" + aggregateTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -3572,12 +3812,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3603,12 +3843,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"aggregatable_values\": " + tooManyKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); @@ -3632,12 +3872,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"filters\": " + filters + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3668,14 +3908,14 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection1.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( webTriggerRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3722,14 +3962,14 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( webTriggerRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -3758,24 +3998,24 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\": " + EVENT_TRIGGERS_1 + "}"), - "Attribution-Reporting-Redirect", + AsyncRedirects.REDIRECT_LIST_HEADER_KEY, List.of(LIST_TYPE_REDIRECT_URI), - "Location", + AsyncRedirects.REDIRECT_LOCATION_HEADER_KEY, List.of(LOCATION_TYPE_REDIRECT_URI))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( webTriggerRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); - assertEquals(0, asyncRedirect.getRedirects().size()); + assertEquals(0, asyncRedirects.getRedirects().size()); assertEquals(new JSONArray(EVENT_TRIGGERS_1).toString(), result.getEventTriggers()); assertEquals(REGISTRATION_URI_1, result.getRegistrationOrigin()); verify(mUrlConnection).setRequestMethod("POST"); @@ -3802,11 +4042,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution - Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + Optional<Trigger> fetch = + mFetcher.fetchTrigger( + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -3833,12 +4074,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -3867,12 +4108,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -3907,12 +4148,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -3942,12 +4183,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -3974,12 +4215,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4016,12 +4257,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4049,12 +4290,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4082,12 +4323,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -4118,12 +4359,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4157,12 +4398,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4191,12 +4432,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4234,12 +4475,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4268,12 +4509,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4307,12 +4548,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4342,12 +4583,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4385,12 +4626,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4420,12 +4661,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_trigger_data\": " + aggregatableTriggerData + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4447,12 +4688,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -4479,12 +4720,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -4511,12 +4752,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -4543,12 +4784,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -4572,12 +4813,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -4603,12 +4844,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); @@ -4633,12 +4874,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); @@ -4662,12 +4903,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); @@ -4692,12 +4933,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); @@ -4721,12 +4962,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); @@ -4753,12 +4994,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); @@ -4784,12 +5025,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); @@ -4816,12 +5057,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertEquals( AsyncFetchStatus.EntityStatus.VALIDATION_ERROR, asyncFetchStatus.getEntityStatus()); assertFalse(fetch.isPresent()); @@ -4847,12 +5088,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); @@ -4876,12 +5117,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4905,12 +5146,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{\"aggregatable_values\": " + tooManyKeys + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4932,12 +5173,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"aggregatable_values\": " + aggregatableValues + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( - appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirect); + appTriggerRegistrationRequest(request), asyncFetchStatus, asyncRedirects); assertFalse(fetch.isPresent()); verify(mUrlConnection, times(1)).setRequestMethod("POST"); verify(mFetcher, times(1)).openUrl(any()); @@ -4970,14 +5211,14 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest "Attribution-Reporting-Register-Trigger", List.of("{\"event_trigger_data\":" + EVENT_TRIGGERS_1 + "}"))); doReturn(5L).when(mFlags).getMaxResponseBasedRegistrationPayloadSizeBytes(); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); asyncFetchStatus.setRegistrationDelay(0L); asyncFetchStatus.setRetryCount(0); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); assertTrue(fetch.isPresent()); Trigger result = fetch.get(); assertEquals(ENROLLMENT_ID, result.getEnrollmentId()); @@ -5073,7 +5314,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest attributionConfig1.serializeAsJson(mFlags), attributionConfig2.serializeAsJson(mFlags))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); @@ -5081,7 +5322,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -5180,7 +5421,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest attributionConfig1.serializeAsJson(mFlags), attributionConfig2.serializeAsJson(mFlags))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = webTriggerRegistrationRequest(request, true); @@ -5188,7 +5429,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -5245,7 +5486,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "}"))); doReturn(5000L).when(mFlags).getMaxResponseBasedRegistrationPayloadSizeBytes(); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = webTriggerRegistrationRequest(request, true); @@ -5253,7 +5494,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -5289,7 +5530,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, new AsyncRedirect()); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, new AsyncRedirects()); // Assertion assertEquals( @@ -5318,7 +5559,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "}"))); doReturn(5000L).when(mFlags).getMaxResponseBasedRegistrationPayloadSizeBytes(); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); @@ -5326,7 +5567,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -5361,7 +5602,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "}"))); doReturn(5000L).when(mFlags).getMaxResponseBasedRegistrationPayloadSizeBytes(); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); @@ -5369,7 +5610,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -5426,7 +5667,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "}"))); doReturn(5000L).when(mFlags).getMaxResponseBasedRegistrationPayloadSizeBytes(); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); @@ -5434,7 +5675,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); @@ -5469,14 +5710,14 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection1.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( webTriggerRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5514,14 +5755,14 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection1.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( webTriggerRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5552,12 +5793,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -5591,12 +5832,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -5627,12 +5868,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5665,12 +5906,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5702,12 +5943,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequestWithAdId(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertTrue(fetch.isPresent()); Trigger result = fetch.get(); @@ -5742,14 +5983,14 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection1.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( webTriggerRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5786,14 +6027,14 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection1.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( webTriggerRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5829,14 +6070,14 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection1.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); // Execution Optional<Trigger> fetch = mFetcher.fetchTrigger( webTriggerRegistrationRequest(request, true), asyncFetchStatus, - asyncRedirect); + asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5847,7 +6088,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest } @Test - public void fetchTrigger_setsFakeEnrollmentId_whenDisableEnrollmentFlagIsTrue() + public void fetchTrigger_setsSiteEnrollmentId_whenDisableEnrollmentFlagIsTrue() throws Exception { String uri = WebUtil.validUrl("https://test1.example.test:8081"); RegistrationRequest request = buildRequest(uri); @@ -5866,12 +6107,12 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "\"" + "}")); when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertTrue(fetch.isPresent()); @@ -5879,7 +6120,85 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest assertEquals( WebUtil.validUrl("https://test1.example.test:8081"), result.getRegistrationOrigin().toString()); - assertEquals(Enrollment.FAKE_ENROLLMENT, result.getEnrollmentId()); + assertEquals("https://example.com", result.getEnrollmentId()); + assertEquals(new JSONArray(EVENT_TRIGGERS_1).toString(), result.getEventTriggers()); + assertEquals(DEBUG_KEY, result.getDebugKey()); + verify(mUrlConnection).setRequestMethod("POST"); + } + + @Test + public void fetchTrigger_setsSiteEnrollmentId_whenDisableEnrollmentFlagIsTrueForLocalhost() + throws Exception { + String uri = WebUtil.validUrl("https://localhost:8081"); + RegistrationRequest request = buildRequest(uri); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(uri)); + when(mUrlConnection.getResponseCode()).thenReturn(200); + doReturn(true).when(mFlags).isDisableMeasurementEnrollmentCheck(); + Map<String, List<String>> headersRequest = new HashMap<>(); + headersRequest.put( + "Attribution-Reporting-Register-Trigger", + List.of( + "{" + + "\"event_trigger_data\": " + + EVENT_TRIGGERS_1 + + ", \"debug_key\": \"" + + DEBUG_KEY + + "\"" + + "}")); + when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); + // Execution + Optional<Trigger> fetch = + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Trigger result = fetch.get(); + assertEquals( + WebUtil.validUrl("https://localhost:8081"), + result.getRegistrationOrigin().toString()); + assertEquals("https://localhost", result.getEnrollmentId()); + assertEquals(new JSONArray(EVENT_TRIGGERS_1).toString(), result.getEventTriggers()); + assertEquals(DEBUG_KEY, result.getDebugKey()); + verify(mUrlConnection).setRequestMethod("POST"); + } + + @Test + public void fetchTrigger_setsSiteEnrollmentId_whenDisableEnrollmentFlagIsTrueForIP() + throws Exception { + String uri = WebUtil.validUrl("https://127.0.0.1:8081"); + RegistrationRequest request = buildRequest(uri); + doReturn(mUrlConnection).when(mFetcher).openUrl(new URL(uri)); + when(mUrlConnection.getResponseCode()).thenReturn(200); + doReturn(true).when(mFlags).isDisableMeasurementEnrollmentCheck(); + Map<String, List<String>> headersRequest = new HashMap<>(); + headersRequest.put( + "Attribution-Reporting-Register-Trigger", + List.of( + "{" + + "\"event_trigger_data\": " + + EVENT_TRIGGERS_1 + + ", \"debug_key\": \"" + + DEBUG_KEY + + "\"" + + "}")); + when(mUrlConnection.getHeaderFields()).thenReturn(headersRequest); + AsyncRedirects asyncRedirects = new AsyncRedirects(); + AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); + AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); + // Execution + Optional<Trigger> fetch = + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); + // Assertion + assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); + assertTrue(fetch.isPresent()); + Trigger result = fetch.get(); + assertEquals( + WebUtil.validUrl("https://127.0.0.1:8081"), + result.getRegistrationOrigin().toString()); + assertEquals("https://127.0.0.1", result.getEnrollmentId()); assertEquals(new JSONArray(EVENT_TRIGGERS_1).toString(), result.getEventTriggers()); assertEquals(DEBUG_KEY, result.getDebugKey()); verify(mUrlConnection).setRequestMethod("POST"); @@ -5900,7 +6219,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "'aggregation_coordinator_origin': " + "'https://cloud.coordination.test'" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); when(mFlags.getMeasurementAggregationCoordinatorOriginEnabled()).thenReturn(true); @@ -5908,7 +6227,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest .thenReturn("https://cloud.coordination.test"); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals(AsyncFetchStatus.EntityStatus.SUCCESS, asyncFetchStatus.getEntityStatus()); @@ -5941,7 +6260,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "'aggregation_coordinator_origin': " + "'https://invalid.cloud.coordination.test'" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); when(mFlags.getMeasurementAggregationCoordinatorOriginEnabled()).thenReturn(true); @@ -5949,7 +6268,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest .thenReturn("https://cloud.coordination.test"); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -5968,13 +6287,13 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest Map.of( "Attribution-Reporting-Register-Trigger", List.of("{" + "\"event_trigger_data\": " + "[{}]" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); when(mFlags.getMeasurementAggregationCoordinatorOriginEnabled()).thenReturn(true); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals(AsyncFetchStatus.EntityStatus.SUCCESS, asyncFetchStatus.getEntityStatus()); @@ -6005,7 +6324,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest + "'aggregation_coordinator_origin': " + "'https://invalid.cloud.coordination.test'" + "}"))); - AsyncRedirect asyncRedirect = new AsyncRedirect(); + AsyncRedirects asyncRedirects = new AsyncRedirects(); AsyncFetchStatus asyncFetchStatus = new AsyncFetchStatus(); AsyncRegistration asyncRegistration = appTriggerRegistrationRequest(request); when(mFlags.getMeasurementAggregationCoordinatorOriginEnabled()).thenReturn(true); @@ -6013,7 +6332,7 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest .thenReturn("https://cloud.coordination.test"); // Execution Optional<Trigger> fetch = - mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirect); + mFetcher.fetchTrigger(asyncRegistration, asyncFetchStatus, asyncRedirects); // Assertion assertEquals(AsyncFetchStatus.ResponseStatus.SUCCESS, asyncFetchStatus.getResponseStatus()); assertEquals( @@ -6050,26 +6369,6 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest private static AsyncRegistration appTriggerRegistrationRequest( RegistrationRequest registrationRequest) { - // Necessary for testing - String enrollmentId = ""; - if (EnrollmentDao.getInstance(CONTEXT) - .getEnrollmentDataFromMeasurementUrl( - registrationRequest - .getRegistrationUri() - .buildUpon() - .clearQuery() - .build()) - != null) { - enrollmentId = - EnrollmentDao.getInstance(CONTEXT) - .getEnrollmentDataFromMeasurementUrl( - registrationRequest - .getRegistrationUri() - .buildUpon() - .clearQuery() - .build()) - .getEnrollmentId(); - } return createAsyncRegistration( UUID.randomUUID().toString(), registrationRequest.getRegistrationUri(), @@ -6091,26 +6390,6 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest private static AsyncRegistration appTriggerRegistrationRequestWithAdId( RegistrationRequest registrationRequest) { - // Necessary for testing - String enrollmentId = ""; - if (EnrollmentDao.getInstance(CONTEXT) - .getEnrollmentDataFromMeasurementUrl( - registrationRequest - .getRegistrationUri() - .buildUpon() - .clearQuery() - .build()) - != null) { - enrollmentId = - EnrollmentDao.getInstance(CONTEXT) - .getEnrollmentDataFromMeasurementUrl( - registrationRequest - .getRegistrationUri() - .buildUpon() - .clearQuery() - .build()) - .getEnrollmentId(); - } return createAsyncRegistration( UUID.randomUUID().toString(), registrationRequest.getRegistrationUri(), @@ -6136,28 +6415,6 @@ public final class AsyncTriggerFetcherTest extends AdServicesExtendedMockitoTest if (webTriggerRegistrationRequest.getTriggerParams().size() > 0) { WebTriggerParams webTriggerParams = webTriggerRegistrationRequest.getTriggerParams().get(0); - // Necessary for testing - String enrollmentId = ""; - if (EnrollmentDao.getInstance(CONTEXT) - .getEnrollmentDataFromMeasurementUrl( - webTriggerRegistrationRequest - .getTriggerParams() - .get(0) - .getRegistrationUri() - .buildUpon() - .clearQuery() - .build()) - != null) { - enrollmentId = - EnrollmentDao.getInstance(CONTEXT) - .getEnrollmentDataFromMeasurementUrl( - webTriggerParams - .getRegistrationUri() - .buildUpon() - .clearQuery() - .build()) - .getEnrollmentId(); - } return createAsyncRegistration( UUID.randomUUID().toString(), webTriggerParams.getRegistrationUri(), diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/EnqueueAsyncRegistrationTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/EnqueueAsyncRegistrationTest.java index 847dc6ab3a..7b6e78903d 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/EnqueueAsyncRegistrationTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/registration/EnqueueAsyncRegistrationTest.java @@ -243,6 +243,8 @@ public class EnqueueAsyncRegistrationTest { Assert.assertNotNull(asyncRegistration.getType()); Assert.assertEquals( AsyncRegistration.RegistrationType.APP_SOURCE, asyncRegistration.getType()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration.getRedirectBehavior()); } } @@ -300,6 +302,8 @@ public class EnqueueAsyncRegistrationTest { Assert.assertNotNull(asyncRegistration.getType()); Assert.assertEquals( AsyncRegistration.RegistrationType.APP_SOURCE, asyncRegistration.getType()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration.getRedirectBehavior()); } } @@ -390,6 +394,8 @@ public class EnqueueAsyncRegistrationTest { Assert.assertEquals( Uri.parse("android-app://test.destination"), asyncRegistration.getRegistrant()); Assert.assertNull(asyncRegistration.getSourceType()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration.getRedirectBehavior()); } } @@ -523,6 +529,8 @@ public class EnqueueAsyncRegistrationTest { VALID_WEB_SOURCE_REGISTRATION_NULL_INPUT_EVENT.getTopOriginUri(), asyncRegistration1.getTopOrigin()); assertEqualsWebSourceRegistrationCommon(asyncRegistration1); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration1.getRedirectBehavior()); Assert.assertTrue(cursor.moveToNext()); AsyncRegistration asyncRegistration2 = @@ -533,6 +541,8 @@ public class EnqueueAsyncRegistrationTest { VALID_WEB_SOURCE_REGISTRATION_NULL_INPUT_EVENT.getTopOriginUri(), asyncRegistration2.getTopOrigin()); assertEqualsWebSourceRegistrationCommon(asyncRegistration2); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration2.getRedirectBehavior()); Assert.assertEquals( asyncRegistration1.getRegistrationId(), @@ -591,6 +601,8 @@ public class EnqueueAsyncRegistrationTest { validWebSourceRegistration.getTopOriginUri(), asyncRegistration1.getTopOrigin()); assertEqualsWebSourceRegistrationCommon(asyncRegistration1); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration1.getRedirectBehavior()); Assert.assertTrue(cursor.moveToNext()); AsyncRegistration asyncRegistration2 = @@ -601,6 +613,8 @@ public class EnqueueAsyncRegistrationTest { validWebSourceRegistration.getTopOriginUri(), asyncRegistration2.getTopOrigin()); assertEqualsWebSourceRegistrationCommon(asyncRegistration2); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration2.getRedirectBehavior()); Assert.assertEquals( asyncRegistration1.getRegistrationId(), @@ -642,12 +656,16 @@ public class EnqueueAsyncRegistrationTest { SqliteObjectMapper.constructAsyncRegistration(cursor); Assert.assertEquals(REGISTRATION_URI_1, asyncRegistration1.getRegistrationUri()); assertEqualsWebTriggerRegistrationCommon(asyncRegistration1); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration1.getRedirectBehavior()); Assert.assertTrue(cursor.moveToNext()); AsyncRegistration asyncRegistration2 = SqliteObjectMapper.constructAsyncRegistration(cursor); Assert.assertEquals(REGISTRATION_URI_2, asyncRegistration2.getRegistrationUri()); assertEqualsWebTriggerRegistrationCommon(asyncRegistration2); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration2.getRedirectBehavior()); Assert.assertEquals( asyncRegistration1.getRegistrationId(), @@ -656,7 +674,7 @@ public class EnqueueAsyncRegistrationTest { } @Test - public void testRunInTransactionFail_inValid() { + public void testRunInTransactionFail_invalid() { when(mDatastoreManagerMock.runInTransaction(any())).thenReturn(false); Assert.assertFalse( EnqueueAsyncRegistration.webTriggerRegistrationRequest( @@ -722,6 +740,8 @@ public class EnqueueAsyncRegistrationTest { Assert.assertNotNull(asyncRegistration.getType()); Assert.assertEquals( AsyncRegistration.RegistrationType.APP_SOURCE, asyncRegistration.getType()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration.getRedirectBehavior()); } } @@ -773,6 +793,8 @@ public class EnqueueAsyncRegistrationTest { assertEqualsAppSourcesRegistrationCommon(asyncRegistration1); Assert.assertEquals(REGISTRATION_URI_1, asyncRegistration1.getRegistrationUri()); Assert.assertEquals(Source.SourceType.EVENT, asyncRegistration1.getSourceType()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration1.getRedirectBehavior()); Assert.assertTrue(cursor.moveToNext()); AsyncRegistration asyncRegistration2 = @@ -780,6 +802,8 @@ public class EnqueueAsyncRegistrationTest { assertEqualsAppSourcesRegistrationCommon(asyncRegistration2); Assert.assertEquals(REGISTRATION_URI_2, asyncRegistration2.getRegistrationUri()); Assert.assertEquals(Source.SourceType.EVENT, asyncRegistration2.getSourceType()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration2.getRedirectBehavior()); Assert.assertEquals( asyncRegistration1.getRegistrationId(), asyncRegistration2.getRegistrationId()); @@ -835,6 +859,8 @@ public class EnqueueAsyncRegistrationTest { assertEqualsAppSourcesRegistrationCommon(asyncRegistration1); Assert.assertEquals(REGISTRATION_URI_1, asyncRegistration1.getRegistrationUri()); Assert.assertEquals(Source.SourceType.NAVIGATION, asyncRegistration1.getSourceType()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration1.getRedirectBehavior()); Assert.assertTrue(cursor.moveToNext()); AsyncRegistration asyncRegistration2 = @@ -842,6 +868,8 @@ public class EnqueueAsyncRegistrationTest { assertEqualsAppSourcesRegistrationCommon(asyncRegistration2); Assert.assertEquals(REGISTRATION_URI_2, asyncRegistration2.getRegistrationUri()); Assert.assertEquals(Source.SourceType.NAVIGATION, asyncRegistration2.getSourceType()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration2.getRedirectBehavior()); Assert.assertEquals( asyncRegistration1.getRegistrationId(), asyncRegistration2.getRegistrationId()); @@ -898,6 +926,8 @@ public class EnqueueAsyncRegistrationTest { Assert.assertEquals(REGISTRATION_URI_1, asyncRegistration1.getRegistrationUri()); Assert.assertEquals(Source.SourceType.NAVIGATION, asyncRegistration1.getSourceType()); Assert.assertNull(asyncRegistration1.getPostBody()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration1.getRedirectBehavior()); Assert.assertTrue(cursor.moveToNext()); AsyncRegistration asyncRegistration2 = @@ -906,6 +936,8 @@ public class EnqueueAsyncRegistrationTest { Assert.assertEquals(REGISTRATION_URI_2, asyncRegistration2.getRegistrationUri()); Assert.assertEquals(Source.SourceType.NAVIGATION, asyncRegistration2.getSourceType()); Assert.assertNull(asyncRegistration2.getPostBody()); + Assert.assertEquals( + AsyncRedirect.RedirectBehavior.AS_IS, asyncRegistration2.getRedirectBehavior()); Assert.assertEquals( asyncRegistration1.getRegistrationId(), asyncRegistration2.getRegistrationId()); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/AggregateReportingJobHandlerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/AggregateReportingJobHandlerTest.java index e5700638e2..fd7668d937 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/AggregateReportingJobHandlerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/AggregateReportingJobHandlerTest.java @@ -54,6 +54,7 @@ import com.android.adservices.service.measurement.aggregation.AggregateCryptoFix import com.android.adservices.service.measurement.aggregation.AggregateEncryptionKey; import com.android.adservices.service.measurement.aggregation.AggregateEncryptionKeyManager; import com.android.adservices.service.measurement.aggregation.AggregateReport; +import com.android.adservices.service.measurement.aggregation.AggregateReportFixture; import com.android.adservices.service.measurement.util.UnsignedLong; import com.android.adservices.service.stats.AdServicesLogger; import com.android.adservices.service.stats.MeasurementReportsStats; @@ -989,6 +990,164 @@ public class AggregateReportingJobHandlerTest { verify(mTransaction, times(1)).end(); } + @Test + public void performReport_normalReportWithDebugKeys_hasDebugModeEnabled() + throws DatastoreException, IOException, JSONException { + AggregateReport aggregateReport = + AggregateReportFixture.getValidAggregateReportBuilder() + .setSourceDebugKey( + AggregateReportFixture.ValidAggregateReportParams.SOURCE_DEBUG_KEY) + .setTriggerDebugKey( + AggregateReportFixture.ValidAggregateReportParams.TRIGGER_DEBUG_KEY) + .build(); + executeDebugModeVerification(aggregateReport, mSpyAggregateReportingJobHandler, "enabled"); + verify(mMeasurementDao, times(1)) + .markAggregateReportStatus( + eq(aggregateReport.getId()), eq(AggregateReport.Status.DELIVERED)); + } + + @Test + public void performReport_normalReportWithOnlySourceDebugKey_hasDebugModeNull() + throws DatastoreException, IOException, JSONException { + // Setup + AggregateReport aggregateReport = + AggregateReportFixture.getValidAggregateReportBuilder() + .setSourceDebugKey( + AggregateReportFixture.ValidAggregateReportParams.SOURCE_DEBUG_KEY) + .setTriggerDebugKey(null) + .build(); + executeDebugModeVerification(aggregateReport, mSpyAggregateReportingJobHandler, ""); + verify(mMeasurementDao, times(1)) + .markAggregateReportStatus( + eq(aggregateReport.getId()), eq(AggregateReport.Status.DELIVERED)); + } + + @Test + public void performReport_normalReportWithOnlyTriggerDebugKey_hasDebugModeNull() + throws DatastoreException, IOException, JSONException { + AggregateReport aggregateReport = + AggregateReportFixture.getValidAggregateReportBuilder() + .setSourceDebugKey(null) + .setTriggerDebugKey( + AggregateReportFixture.ValidAggregateReportParams.TRIGGER_DEBUG_KEY) + .build(); + executeDebugModeVerification(aggregateReport, mSpyAggregateReportingJobHandler, ""); + verify(mMeasurementDao, times(1)) + .markAggregateReportStatus( + eq(aggregateReport.getId()), eq(AggregateReport.Status.DELIVERED)); + } + + @Test + public void performReport_normalReportWithNoDebugKey_hasDebugModeNull() + throws DatastoreException, IOException, JSONException { + AggregateReport aggregateReport = + AggregateReportFixture.getValidAggregateReportBuilder() + .setSourceDebugKey(null) + .setTriggerDebugKey(null) + .build(); + executeDebugModeVerification(aggregateReport, mSpyAggregateReportingJobHandler, ""); + verify(mMeasurementDao, times(1)) + .markAggregateReportStatus( + eq(aggregateReport.getId()), eq(AggregateReport.Status.DELIVERED)); + } + + @Test + public void performReport_debugReportWithDebugKeys_hasDebugModeEnabled() + throws DatastoreException, IOException, JSONException { + AggregateReport aggregateReport = + AggregateReportFixture.getValidAggregateReportBuilder() + .setSourceDebugKey( + AggregateReportFixture.ValidAggregateReportParams.SOURCE_DEBUG_KEY) + .setTriggerDebugKey( + AggregateReportFixture.ValidAggregateReportParams.TRIGGER_DEBUG_KEY) + .build(); + executeDebugModeVerification( + aggregateReport, mSpyDebugAggregateReportingJobHandler, "enabled"); + verify(mMeasurementDao, times(1)) + .markAggregateDebugReportDelivered(eq(aggregateReport.getId())); + } + + @Test + public void performReport_debugReportWithOnlySourceDebugKey_hasDebugModeNull() + throws DatastoreException, IOException, JSONException { + AggregateReport aggregateReport = + AggregateReportFixture.getValidAggregateReportBuilder() + .setSourceDebugKey( + AggregateReportFixture.ValidAggregateReportParams.SOURCE_DEBUG_KEY) + .setTriggerDebugKey(null) + .build(); + executeDebugModeVerification(aggregateReport, mSpyDebugAggregateReportingJobHandler, ""); + verify(mMeasurementDao, times(1)) + .markAggregateDebugReportDelivered(eq(aggregateReport.getId())); + } + + @Test + public void performReport_debugReportWithOnlyTriggerDebugKey_hasDebugModeNull() + throws DatastoreException, IOException, JSONException { + AggregateReport aggregateReport = + AggregateReportFixture.getValidAggregateReportBuilder() + .setSourceDebugKey(null) + .setTriggerDebugKey( + AggregateReportFixture.ValidAggregateReportParams.TRIGGER_DEBUG_KEY) + .build(); + executeDebugModeVerification(aggregateReport, mSpyDebugAggregateReportingJobHandler, ""); + } + + @Test + public void performReport_debugReportWithNoDebugKey_hasDebugModeNull() + throws DatastoreException, IOException, JSONException { + AggregateReport aggregateReport = + AggregateReportFixture.getValidAggregateReportBuilder() + .setSourceDebugKey(null) + .setTriggerDebugKey(null) + .build(); + executeDebugModeVerification(aggregateReport, mSpyDebugAggregateReportingJobHandler, ""); + verify(mMeasurementDao, times(1)) + .markAggregateDebugReportDelivered(eq(aggregateReport.getId())); + } + + private void executeDebugModeVerification( + AggregateReport aggregateReport, + AggregateReportingJobHandler aggregateReportingJobHandler, + String expectedDebugMode) + throws DatastoreException, IOException, JSONException { + when(mMeasurementDao.getAggregateReport(aggregateReport.getId())) + .thenReturn(aggregateReport); + doReturn(HttpURLConnection.HTTP_OK) + .when(aggregateReportingJobHandler) + .makeHttpPostRequest(eq(REPORTING_URI), Mockito.any()); + + doNothing() + .when(mMeasurementDao) + .markAggregateReportStatus( + aggregateReport.getId(), AggregateReport.Status.DELIVERED); + ArgumentCaptor<JSONObject> aggregateReportBodyCaptor = + ArgumentCaptor.forClass(JSONObject.class); + + // Execution + Assert.assertEquals( + AdServicesStatusUtils.STATUS_SUCCESS, + aggregateReportingJobHandler.performReport( + aggregateReport.getId(), + AggregateCryptoFixture.getKey(), + new ReportingStatus())); + + // Assertion + verify(aggregateReportingJobHandler) + .makeHttpPostRequest(eq(REPORTING_URI), aggregateReportBodyCaptor.capture()); + verify(mTransaction, times(2)).begin(); + verify(mTransaction, times(2)).end(); + + JSONObject aggregateReportBody = aggregateReportBodyCaptor.getValue(); + JSONObject sharedInfo = + new JSONObject( + aggregateReportBody.getString( + AggregateReportBody.PayloadBodyKeys.SHARED_INFO)); + assertEquals( + expectedDebugMode, + sharedInfo.optString(AggregateReportBody.SharedInfoKeys.DEBUG_MODE)); + } + private static JSONObject createASampleAggregateReportBody(AggregateReport aggregateReport) throws JSONException { return new AggregateReportBody.Builder() diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/DebugReportApiTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/DebugReportApiTest.java index 8e1a178aba..5656ba0079 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/DebugReportApiTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/DebugReportApiTest.java @@ -92,6 +92,12 @@ public final class DebugReportApiTest { when(mFlags.getMeasurementEnableDebugReport()).thenReturn(true); when(mFlags.getMeasurementEnableSourceDebugReport()).thenReturn(true); when(mFlags.getMeasurementEnableTriggerDebugReport()).thenReturn(true); + when(mFlags.getMeasurementVtcConfigurableMaxEventReportsCount()) + .thenReturn(Flags.DEFAULT_MEASUREMENT_VTC_CONFIGURABLE_MAX_EVENT_REPORTS_COUNT); + when(mFlags.getMeasurementEventReportsVtcEarlyReportingWindows()) + .thenReturn(Flags.MEASUREMENT_EVENT_REPORTS_VTC_EARLY_REPORTING_WINDOWS); + when(mFlags.getMeasurementEventReportsCtcEarlyReportingWindows()) + .thenReturn(Flags.MEASUREMENT_EVENT_REPORTS_CTC_EARLY_REPORTING_WINDOWS); } @Test @@ -3650,6 +3656,194 @@ public final class DebugReportApiTest { verify(mMeasurementDao, never()).insertDebugReport(any()); } + @Test + public void testScheduleTriggerEventWindowNotStartedDebugReport_triggerNotOpIn_dontSchedule() + throws Exception { + Source source = + SourceFixture.getMinimalValidSourceBuilder() + .setEventId(SOURCE_EVENT_ID) + .setIsDebugReporting(true) + .setAdIdPermission(true) + .build(); + Trigger trigger = + TriggerFixture.getValidTriggerBuilder() + .setIsDebugReporting(false) + .setAdIdPermission(true) + .build(); + ExtendedMockito.doNothing() + .when(() -> VerboseDebugReportingJobService.scheduleIfNeeded(any(), anyBoolean())); + + mDebugReportApi.scheduleTriggerDebugReport( + source, + trigger, + /* limit =*/ null, + mMeasurementDao, + DebugReportApi.Type.TRIGGER_EVENT_REPORT_WINDOW_NOT_STARTED); + verify(mMeasurementDao, never()).insertDebugReport(any()); + } + + @Test + public void testScheduleTriggerEventWindowNotStartedDebugReport_sourceNoAdId_dontSchedule() + throws Exception { + Source source = + SourceFixture.getMinimalValidSourceBuilder() + .setEventId(SOURCE_EVENT_ID) + .setIsDebugReporting(true) + .setAdIdPermission(false) + .build(); + Trigger trigger = + TriggerFixture.getValidTriggerBuilder() + .setIsDebugReporting(true) + .setAdIdPermission(true) + .build(); + ExtendedMockito.doNothing() + .when(() -> VerboseDebugReportingJobService.scheduleIfNeeded(any(), anyBoolean())); + + mDebugReportApi.scheduleTriggerDebugReport( + source, + trigger, + /* limit =*/ null, + mMeasurementDao, + DebugReportApi.Type.TRIGGER_EVENT_REPORT_WINDOW_NOT_STARTED); + verify(mMeasurementDao, never()).insertDebugReport(any()); + } + + @Test + public void testScheduleTriggerEventWindowNotStartedDebugReport_sourceNoArDebug_dontSchedule() + throws Exception { + Source source = + SourceFixture.getMinimalValidSourceBuilder() + .setEventId(SOURCE_EVENT_ID) + .setIsDebugReporting(true) + .setPublisherType(EventSurfaceType.WEB) + .setPublisher(SourceFixture.ValidSourceParams.WEB_PUBLISHER) + .setAppDestinations(null) + .setWebDestinations(SourceFixture.ValidSourceParams.WEB_DESTINATIONS) + .setArDebugPermission(false) + .build(); + Trigger trigger = + TriggerFixture.getValidTriggerBuilder() + .setIsDebugReporting(true) + .setDestinationType(EventSurfaceType.WEB) + .setAttributionDestination( + SourceFixture.ValidSourceParams.WEB_DESTINATIONS.get(0)) + .setArDebugPermission(true) + .build(); + ExtendedMockito.doNothing() + .when(() -> VerboseDebugReportingJobService.scheduleIfNeeded(any(), anyBoolean())); + + mDebugReportApi.scheduleTriggerDebugReport( + source, + trigger, + /* limit =*/ null, + mMeasurementDao, + DebugReportApi.Type.TRIGGER_EVENT_REPORT_WINDOW_NOT_STARTED); + verify(mMeasurementDao, never()).insertDebugReport(any()); + } + + @Test + public void testScheduleTriggerEventWindowNotStartedDebugReport_success() throws Exception { + Source source = + SourceFixture.getValidSourceBuilder() + .setEventId(SOURCE_EVENT_ID) + .setIsDebugReporting(true) + .setAdIdPermission(true) + .build(); + Trigger trigger = + TriggerFixture.getValidTriggerBuilder() + .setIsDebugReporting(true) + .setAdIdPermission(true) + .build(); + ExtendedMockito.doNothing() + .when(() -> VerboseDebugReportingJobService.scheduleIfNeeded(any(), anyBoolean())); + + mDebugReportApi.scheduleTriggerDebugReport( + source, + trigger, + /* limit =*/ null, + mMeasurementDao, + DebugReportApi.Type.TRIGGER_EVENT_REPORT_WINDOW_NOT_STARTED); + verify(mMeasurementDao, times(1)).insertDebugReport(any()); + } + + @Test + public void testScheduleTriggerEventWindowNotStartedDebugReport_debugFlagDisabled_dontSchedule() + throws Exception { + when(mFlags.getMeasurementEnableDebugReport()).thenReturn(false); + Source source = + SourceFixture.getValidSourceBuilder() + .setEventId(SOURCE_EVENT_ID) + .setIsDebugReporting(true) + .setAdIdPermission(true) + .build(); + Trigger trigger = + TriggerFixture.getValidTriggerBuilder() + .setIsDebugReporting(true) + .setAdIdPermission(true) + .build(); + ExtendedMockito.doNothing() + .when(() -> VerboseDebugReportingJobService.scheduleIfNeeded(any(), anyBoolean())); + + mDebugReportApi.scheduleTriggerDebugReport( + source, + trigger, + /* limit =*/ null, + mMeasurementDao, + DebugReportApi.Type.TRIGGER_EVENT_REPORT_WINDOW_NOT_STARTED); + verify(mMeasurementDao, never()).insertDebugReport(any()); + } + + @Test + public void + testScheduleTriggerEventWindowNotStartedDebugReport_triggerFlagDisabled_dontSchedule() + throws Exception { + when(mFlags.getMeasurementEnableTriggerDebugReport()).thenReturn(false); + Source source = + SourceFixture.getValidSourceBuilder() + .setEventId(SOURCE_EVENT_ID) + .setIsDebugReporting(true) + .setAdIdPermission(true) + .build(); + Trigger trigger = + TriggerFixture.getValidTriggerBuilder() + .setIsDebugReporting(true) + .setAdIdPermission(true) + .build(); + ExtendedMockito.doNothing() + .when(() -> VerboseDebugReportingJobService.scheduleIfNeeded(any(), anyBoolean())); + + mDebugReportApi.scheduleTriggerDebugReport( + source, + trigger, + /* limit =*/ null, + mMeasurementDao, + DebugReportApi.Type.TRIGGER_EVENT_REPORT_WINDOW_NOT_STARTED); + verify(mMeasurementDao, never()).insertDebugReport(any()); + } + + @Test + public void + testScheduleTriggerEventWindowNotStartedDebugReport_noTriggerPermission_dontSchedule() + throws Exception { + Source source = + SourceFixture.getMinimalValidSourceBuilder() + .setEventId(SOURCE_EVENT_ID) + .setIsDebugReporting(true) + .setAdIdPermission(true) + .build(); + Trigger trigger = TriggerFixture.getValidTriggerBuilder().setIsDebugReporting(true).build(); + ExtendedMockito.doNothing() + .when(() -> VerboseDebugReportingJobService.scheduleIfNeeded(any(), anyBoolean())); + + mDebugReportApi.scheduleTriggerDebugReport( + source, + trigger, + /* limit =*/ null, + mMeasurementDao, + DebugReportApi.Type.TRIGGER_EVENT_REPORT_WINDOW_NOT_STARTED); + verify(mMeasurementDao, never()).insertDebugReport(any()); + } + private static void assertSourceDebugReportParameters( DebugReport actualReport, String expectedReportType, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/EventReportWindowCalcDelegateTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/EventReportWindowCalcDelegateTest.java index 713ce8e982..756c5434cd 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/EventReportWindowCalcDelegateTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/measurement/reporting/EventReportWindowCalcDelegateTest.java @@ -61,6 +61,9 @@ public class EventReportWindowCalcDelegateTest { private static final String EVENT_REPORT_WINDOWS_2_WINDOWS_NO_START = "{'end_times': [172800000, 432000000]}"; + private static final String EVENT_REPORT_WINDOWS_2_WINDOWS_WITH_START = + "{ 'start_time': 3600000, 'end_times': [86400000, 1728000000]}"; + private static final String EVENT_REPORT_WINDOWS_5_WINDOWS_WITH_START = "{'start_time': 86400000, 'end_times': [172800000, 432000000, 604800000, 864000000," + " 1728000000]}"; @@ -71,9 +74,14 @@ public class EventReportWindowCalcDelegateTest { @Before public void setup() { - doReturn(false).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS) .when(mFlags).getMeasurementMinEventReportDelayMillis(); + doReturn(Flags.DEFAULT_MEASUREMENT_VTC_CONFIGURABLE_MAX_EVENT_REPORTS_COUNT) + .when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); + doReturn(Flags.MEASUREMENT_EVENT_REPORTS_VTC_EARLY_REPORTING_WINDOWS) + .when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); + doReturn(Flags.MEASUREMENT_EVENT_REPORTS_CTC_EARLY_REPORTING_WINDOWS) + .when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); mEventReportWindowCalcDelegate = new EventReportWindowCalcDelegate(mFlags); } @@ -85,6 +93,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -104,6 +113,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -121,6 +131,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -141,6 +152,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -159,6 +171,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -177,6 +190,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -195,6 +209,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -212,6 +227,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -231,6 +247,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -250,6 +267,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -267,6 +285,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -278,6 +297,9 @@ public class EventReportWindowCalcDelegateTest { @Test public void testMaxReportCount() { + doReturn(Flags.DEFAULT_MEASUREMENT_VTC_CONFIGURABLE_MAX_EVENT_REPORTS_COUNT) + .when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); + Source eventSourceInstallNotAttributed = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) @@ -285,12 +307,7 @@ public class EventReportWindowCalcDelegateTest { .build(); assertEquals( PrivacyParams.EVENT_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount( - eventSourceInstallNotAttributed, false)); - assertEquals( - PrivacyParams.EVENT_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount( - eventSourceInstallNotAttributed, false)); + mEventReportWindowCalcDelegate.getMaxReportCount(eventSourceInstallNotAttributed)); Source navigationSourceInstallNotAttributed = SourceFixture.getMinimalValidSourceBuilder() @@ -300,46 +317,33 @@ public class EventReportWindowCalcDelegateTest { assertEquals( PrivacyParams.NAVIGATION_SOURCE_MAX_REPORTS, mEventReportWindowCalcDelegate.getMaxReportCount( - navigationSourceInstallNotAttributed, false)); - assertEquals( - PrivacyParams.NAVIGATION_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount( - navigationSourceInstallNotAttributed, false)); + navigationSourceInstallNotAttributed)); Source eventSourceInstallAttributed = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) .setInstallAttributed(true) + .setInstallCooldownWindow(1L) .build(); assertEquals( PrivacyParams.INSTALL_ATTR_EVENT_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount( - eventSourceInstallAttributed, true)); - // Install attribution state does not matter for web destination - assertEquals( - PrivacyParams.EVENT_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount( - eventSourceInstallAttributed, false)); + mEventReportWindowCalcDelegate.getMaxReportCount(eventSourceInstallAttributed)); Source navigationSourceInstallAttributed = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) .setInstallAttributed(true) + .setInstallCooldownWindow(1L) .build(); assertEquals( PrivacyParams.NAVIGATION_SOURCE_MAX_REPORTS, mEventReportWindowCalcDelegate.getMaxReportCount( - navigationSourceInstallAttributed, true)); - assertEquals( - PrivacyParams.NAVIGATION_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount( - navigationSourceInstallAttributed, true)); + navigationSourceInstallAttributed)); } @Test public void getMaxReportCount_configuredConversionsNonInstall_returnsConfiguredCount() { // Setup - doReturn(true).when(mFlags).getMeasurementEnableVtcConfigurableMaxEventReports(); doReturn(3).when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); Source nonInstallEventSource = SourceFixture.getMinimalValidSourceBuilder() @@ -349,13 +353,12 @@ public class EventReportWindowCalcDelegateTest { // Execution & assertion Assert.assertEquals( - 3, mEventReportWindowCalcDelegate.getMaxReportCount(nonInstallEventSource, false)); + 3, mEventReportWindowCalcDelegate.getMaxReportCount(nonInstallEventSource)); } @Test public void getMaxReportCount_configuredConversionsInstallCase_returnsConfiguredCount() { // Setup - doReturn(true).when(mFlags).getMeasurementEnableVtcConfigurableMaxEventReports(); doReturn(2).when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); Source installEventSource = SourceFixture.getMinimalValidSourceBuilder() @@ -365,29 +368,28 @@ public class EventReportWindowCalcDelegateTest { // Execution & assertion Assert.assertEquals( - 2, mEventReportWindowCalcDelegate.getMaxReportCount(installEventSource, true)); + 2, mEventReportWindowCalcDelegate.getMaxReportCount(installEventSource)); } @Test public void getMaxReportCount_configuredConversionsToOneInstallCase_incrementConfiguredCount() { // Setup - doReturn(true).when(mFlags).getMeasurementEnableVtcConfigurableMaxEventReports(); doReturn(1).when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); Source installEventSource = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) .setInstallAttributed(true) + .setInstallCooldownWindow(1L) .build(); // Execution & assertion Assert.assertEquals( - 2, mEventReportWindowCalcDelegate.getMaxReportCount(installEventSource, true)); + 2, mEventReportWindowCalcDelegate.getMaxReportCount(installEventSource)); } @Test public void getMaxReportCount_configuredConversionsToOneInstallCase_noEffectOnCtc() { // Setup - doReturn(true).when(mFlags).getMeasurementEnableVtcConfigurableMaxEventReports(); doReturn(2).when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); Source navigationSource = SourceFixture.getMinimalValidSourceBuilder() @@ -397,7 +399,7 @@ public class EventReportWindowCalcDelegateTest { // Execution & assertion Assert.assertEquals( - 3, mEventReportWindowCalcDelegate.getMaxReportCount(navigationSource, false)); + 3, mEventReportWindowCalcDelegate.getMaxReportCount(navigationSource)); } @Test @@ -409,48 +411,51 @@ public class EventReportWindowCalcDelegateTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(10)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 0, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 1, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 1)); // Expected: 1 window at expiry Source eventSource7d = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(7)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(7) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource7d, /* windowIndex= */ 0, /* isInstallCase */ false)); + eventSource7d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(7) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource7d, /* windowIndex= */ 1, /* isInstallCase */ false)); + eventSource7d, /* windowIndex= */ 1)); // Expected: 1 window at expiry Source eventSource2d = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(2)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource2d, /* windowIndex= */ 0, /* isInstallCase */ false)); + eventSource2d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource2d, /* windowIndex= */ 1, /* isInstallCase */ false)); + eventSource2d, /* windowIndex= */ 1)); } @Test @@ -465,21 +470,21 @@ public class EventReportWindowCalcDelegateTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(10)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + minDelayMillis, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 0, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + minDelayMillis, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 1, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 1)); } @Test public void getReportingTimeForNoising_eventSrcWithConfiguredReportingWindows() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -493,27 +498,27 @@ public class EventReportWindowCalcDelegateTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(10)) .build(); assertEquals( eventTime + TimeUnit.HOURS.toMillis(1) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 0, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(1) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 1, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 1)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 2, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 2)); } @Test public void getReportingTimeForNoising_eventSrcInstallAttWithConfiguredReportingWindows() { // Addition another window for install attribution is ignored when configurable windows // are applied. - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -528,28 +533,28 @@ public class EventReportWindowCalcDelegateTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) .setEventTime(eventTime) + .setExpiryTime(expiry) .setEventReportWindow(expiry) .setInstallCooldownWindow(expiry) .build(); assertEquals( eventTime + TimeUnit.HOURS.toMillis(1) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 0, /* isInstallCase */ true)); + eventSource10d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(1) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 1, /* isInstallCase */ true)); + eventSource10d, /* windowIndex= */ 1)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 2, /* isInstallCase */ true)); + eventSource10d, /* windowIndex= */ 2)); } @Test public void getReportingTimeForNoising_navigationSrcWithConfiguredReportingWindows() { // Addition another window for install attribution is ignored when configurable windows // are applied. - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -563,27 +568,27 @@ public class EventReportWindowCalcDelegateTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(10)) .build(); assertEquals( eventTime + TimeUnit.HOURS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 0, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 1, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 1)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 2, /* isInstallCase */ false)); + eventSource10d, /* windowIndex= */ 2)); } @Test public void getReportingTimeForNoising_navigationSrcInstallAttWithConfiguredReportingWindows() { // Addition another window for install attribution is ignored when configurable windows // are applied. - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -598,21 +603,22 @@ public class EventReportWindowCalcDelegateTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) .setEventTime(eventTime) + .setExpiryTime(expiry) .setEventReportWindow(expiry) .setInstallCooldownWindow(expiry) .build(); assertEquals( eventTime + TimeUnit.HOURS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 0, /* isInstallCase */ true)); + eventSource10d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 1, /* isInstallCase */ true)); + eventSource10d, /* windowIndex= */ 1)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 2, /* isInstallCase */ true)); + eventSource10d, /* windowIndex= */ 2)); } @Test @@ -625,36 +631,38 @@ public class EventReportWindowCalcDelegateTest { .setSourceType(Source.SourceType.EVENT) .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(1)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(10)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 0, /* isInstallCase */ true)); + eventSource10d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 1, /* isInstallCase */ true)); + eventSource10d, /* windowIndex= */ 1)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(10) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource10d, /* windowIndex= */ 2, /* isInstallCase */ true)); + eventSource10d, /* windowIndex= */ 2)); // Expected: 1 window at 2d(expiry) Source eventSource2d = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(2)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource2d, /* windowIndex= */ 0, /* isInstallCase */ true)); + eventSource2d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - eventSource2d, /* windowIndex= */ 1, /* isInstallCase */ true)); + eventSource2d, /* windowIndex= */ 1)); } @Test @@ -666,56 +674,59 @@ public class EventReportWindowCalcDelegateTest { SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(20)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource20d, /* windowIndex= */ 0, /* isInstallCase */ false)); + navigationSource20d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(7) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource20d, /* windowIndex= */ 1, /* isInstallCase */ false)); + navigationSource20d, /* windowIndex= */ 1)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(20) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource20d, /* windowIndex= */ 2, /* isInstallCase */ false)); + navigationSource20d, /* windowIndex= */ 2)); // Expected: 2 windows at 2d & expiry(7d) Source navigationSource7d = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(7)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource7d, /* windowIndex= */ 0, /* isInstallCase */ false)); + navigationSource7d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(7) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource7d, /* windowIndex= */ 1, /* isInstallCase */ false)); + navigationSource7d, /* windowIndex= */ 1)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(7) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource7d, /* windowIndex= */ 2, /* isInstallCase */ false)); + navigationSource7d, /* windowIndex= */ 2)); // Expected: 1 window at 2d(expiry) Source navigationSource2d = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(2)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource2d, /* windowIndex= */ 0, /* isInstallCase */ false)); + navigationSource2d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource2d, /* windowIndex= */ 1, /* isInstallCase */ false)); + navigationSource2d, /* windowIndex= */ 1)); } @Test @@ -728,20 +739,21 @@ public class EventReportWindowCalcDelegateTest { .setSourceType(Source.SourceType.NAVIGATION) .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(1)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(20)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource20d, /* windowIndex= */ 0, /* isInstallCase */ false)); + navigationSource20d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(7) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource20d, /* windowIndex= */ 1, /* isInstallCase */ false)); + navigationSource20d, /* windowIndex= */ 1)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(20) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource20d, /* windowIndex= */ 2, /* isInstallCase */ false)); + navigationSource20d, /* windowIndex= */ 2)); // Expected: 2 windows at 2d & expiry(7d) Source navigationSource7d = @@ -749,20 +761,21 @@ public class EventReportWindowCalcDelegateTest { .setSourceType(Source.SourceType.NAVIGATION) .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(1)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(7)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource7d, /* windowIndex= */ 0, /* isInstallCase */ false)); + navigationSource7d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(7) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource7d, /* windowIndex= */ 1, /* isInstallCase */ false)); + navigationSource7d, /* windowIndex= */ 1)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(7) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource7d, /* windowIndex= */ 2, /* isInstallCase */ false)); + navigationSource7d, /* windowIndex= */ 2)); // Expected: 1 window at 2d(expiry) Source navigationSource2d = @@ -770,169 +783,21 @@ public class EventReportWindowCalcDelegateTest { .setSourceType(Source.SourceType.NAVIGATION) .setInstallCooldownWindow(TimeUnit.DAYS.toMillis(1)) .setEventTime(eventTime) + .setExpiryTime(eventTime + TimeUnit.DAYS.toMillis(30)) .setEventReportWindow(eventTime + TimeUnit.DAYS.toMillis(2)) .build(); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource2d, /* windowIndex= */ 0, /* isInstallCase */ false)); + navigationSource2d, /* windowIndex= */ 0)); assertEquals( eventTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - navigationSource2d, /* windowIndex= */ 1, /* isInstallCase */ false)); - } - - @Test - public void getReportingTime_nullWindowConfigEventSrcAppDest_fallbackToDefault() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long expiryTime = triggerTime + TimeUnit.DAYS.toMillis(30); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(1); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.EVENT) - .setEventReportWindow(expiryTime) - .setEventTime(sourceEventTime) - .build(); - assertEquals( - expiryTime + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.APP)); - } - - @Test - public void getReportingTime_nullWindowConfigEventSrcInstallAttAppDestTrigger1stWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long expiryTime = triggerTime + TimeUnit.DAYS.toMillis(30); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(1); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.EVENT) - .setEventReportWindow(expiryTime) - .setEventTime(sourceEventTime) - .setInstallAttributed(true) - .build(); - assertEquals( - sourceEventTime - + PrivacyParams.INSTALL_ATTR_EVENT_EARLY_REPORTING_WINDOW_MILLISECONDS[0] - + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.APP)); - } - - @Test - public void getReportingTime_nullWindowConfigEventSrcInstallAttAppDestTrigger2ndWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long expiryTime = triggerTime + TimeUnit.DAYS.toMillis(30); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(3); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.EVENT) - .setEventReportWindow(expiryTime) - .setEventTime(sourceEventTime) - .setInstallAttributed(true) - .build(); - assertEquals( - expiryTime + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.APP)); - } - - @Test - public void getReportingTime_nullWindowConfigEventSrcInstallAttWebDestTrigger1stWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long expiryTime = triggerTime + TimeUnit.DAYS.toMillis(30); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(1); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.EVENT) - .setEventReportWindow(expiryTime) - .setEventTime(sourceEventTime) - .setInstallAttributed(true) - .build(); - assertEquals( - expiryTime + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.WEB)); - } - - @Test - public void getReportingTime_nullWindowConfigEventSrcInstallAttWebDestTrigger2ndWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long expiryTime = triggerTime + TimeUnit.DAYS.toMillis(30); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(3); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.EVENT) - .setEventReportWindow(expiryTime) - .setEventTime(sourceEventTime) - .setInstallAttributed(true) - .build(); - assertEquals( - expiryTime + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.WEB)); - } - - @Test - public void getReportingTime_nullWindowConfigEventSourceWebDestination_fallbackToDefault() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long expiryTime = triggerTime + TimeUnit.DAYS.toMillis(30); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(1); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.EVENT) - .setEventReportWindow(expiryTime) - .setEventTime(sourceEventTime) - .build(); - assertEquals( - expiryTime + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.WEB)); - } - - @Test - public void getReportingTime_nullWindowConfigNavigationSourceTriggerInFirstWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long sourceExpiryTime = triggerTime + TimeUnit.DAYS.toMillis(25); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(1); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.NAVIGATION) - .setEventReportWindow(sourceExpiryTime) - .setEventTime(sourceEventTime) - .build(); - assertEquals( - sourceEventTime - + PrivacyParams.NAVIGATION_EARLY_REPORTING_WINDOW_MILLISECONDS[0] - + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.APP)); + navigationSource2d, /* windowIndex= */ 1)); } @Test public void getReportingTime_emptyWindowConfigNavigationSourceTriggerNextHour() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn("").when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); doReturn("").when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); long triggerTime = System.currentTimeMillis(); @@ -941,6 +806,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -952,7 +818,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_emptyWindowConfigEventSrcTriggerNextHour() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn("").when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); doReturn("").when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); long triggerTime = System.currentTimeMillis(); @@ -963,6 +828,7 @@ public class EventReportWindowCalcDelegateTest { .setAppDestinations( SourceFixture.ValidSourceParams.ATTRIBUTION_DESTINATIONS) .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -974,7 +840,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_emptyWindowConfigEventSrcInstallAttTriggerNextHour() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn("").when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); doReturn("").when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); long triggerTime = System.currentTimeMillis(); @@ -985,6 +850,7 @@ public class EventReportWindowCalcDelegateTest { .setAppDestinations( SourceFixture.ValidSourceParams.ATTRIBUTION_DESTINATIONS) .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -999,7 +865,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_emptyWindowConfigNavigationSrcInstallAttTriggerNextHour() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn("").when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); doReturn("").when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); long triggerTime = System.currentTimeMillis(); @@ -1010,6 +875,7 @@ public class EventReportWindowCalcDelegateTest { .setAppDestinations( SourceFixture.ValidSourceParams.ATTRIBUTION_DESTINATIONS) .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -1021,70 +887,7 @@ public class EventReportWindowCalcDelegateTest { } @Test - public void getReportingTime_nullWindowConfigNavigationSourceTriggerInSecondWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long sourceExpiryTime = triggerTime + TimeUnit.DAYS.toMillis(25); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(3); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.NAVIGATION) - .setEventReportWindow(sourceExpiryTime) - .setEventTime(sourceEventTime) - .build(); - assertEquals( - sourceEventTime - + PrivacyParams.NAVIGATION_EARLY_REPORTING_WINDOW_MILLISECONDS[1] - + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.APP)); - } - - @Test - public void getReportingTime_nullWindowConfigNavigationSecondExpiry() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long sourceExpiryTime = triggerTime + TimeUnit.DAYS.toMillis(2); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(3); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.NAVIGATION) - .setEventReportWindow(sourceExpiryTime) - .setEventTime(sourceEventTime) - .build(); - assertEquals( - sourceExpiryTime + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.APP)); - } - - @Test - public void getReportingTime_nullWindowConfigNavigationLast_fallbackToDefault() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsVtcEarlyReportingWindows(); - doReturn(null).when(mFlags).getMeasurementEventReportsCtcEarlyReportingWindows(); - long triggerTime = System.currentTimeMillis(); - long sourceExpiryTime = triggerTime + TimeUnit.DAYS.toMillis(1); - long sourceEventTime = triggerTime - TimeUnit.DAYS.toMillis(20); - Source source = - SourceFixture.getMinimalValidSourceBuilder() - .setSourceType(Source.SourceType.NAVIGATION) - .setEventReportWindow(sourceExpiryTime) - .setEventTime(sourceEventTime) - .build(); - assertEquals( - sourceExpiryTime + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, - mEventReportWindowCalcDelegate.getReportingTime( - source, triggerTime, EventSurfaceType.APP)); - } - - @Test public void getReportingTime_MalformedWindowConfigEventSourceAppDestination_returnsDefault() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(MALFORMED_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1097,6 +900,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -1108,7 +912,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_MalformedWindowConfigEventSrcInstallAttAppDestTrigger1stWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(MALFORMED_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1121,6 +924,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -1135,7 +939,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_MalformedWindowConfigEventSrcInstallAttAppDestTrigger2ndWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(MALFORMED_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1148,6 +951,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -1160,7 +964,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_MalformedWindowConfigEventSrcInstallAttWebDestTrigger1stWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(MALFORMED_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1173,6 +976,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -1185,7 +989,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_MalformedWindowConfigEventSrcInstallAttWebDestTrigger2ndWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(MALFORMED_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1198,6 +1001,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -1210,7 +1014,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_MalformedWindowConfigEventSourceWebDestination() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(MALFORMED_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1223,6 +1026,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -1234,7 +1038,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_MalformedWindowConfigNavigationSourceTriggerInFirstWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1247,6 +1050,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -1260,7 +1064,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_MalformedWindowConfigNavigationSourceTriggerInSecondWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1273,6 +1076,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -1286,7 +1090,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_MalformedWindowConfigNavigationSecondExpiry_fallbackToDefault() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1299,6 +1102,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -1310,7 +1114,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_MalformedWindowConfigNavigationLast_fallbackToDefault() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1323,6 +1126,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(sourceExpiryTime) .setEventReportWindow(sourceExpiryTime) .setEventTime(sourceEventTime) .build(); @@ -1334,7 +1138,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_validWindowConfigEventSourceTriggerIn1stWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1347,6 +1150,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -1358,7 +1162,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_validWindowConfigEventSourceTriggerIn2ndWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1371,6 +1174,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -1383,7 +1187,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_validWindowConfigEventSourceTriggerInLastWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1396,6 +1199,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -1408,7 +1212,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_validWindowConfigNavigationSourceTriggerIn1stWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1421,6 +1224,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -1432,7 +1236,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_validWindowConfigNavigationSourceTriggerIn2ndWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1445,6 +1248,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -1457,7 +1261,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_validWindowConfigNavigationSourceTriggerInLastWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(MALFORMED_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1470,6 +1273,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .setInstallAttributed(true) @@ -1482,7 +1286,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_invalidWindowConfigEventSourceTriggerIn1stWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(INVALID_1H_1D_2D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1495,6 +1298,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.EVENT) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -1506,7 +1310,6 @@ public class EventReportWindowCalcDelegateTest { @Test public void getReportingTime_invalidWindowConfigNavigationSourceTriggerIn1stWindow() { - doReturn(true).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); doReturn(VALID_1H_1D_WINDOW_CONFIG) .when(mFlags) .getMeasurementEventReportsVtcEarlyReportingWindows(); @@ -1519,6 +1322,7 @@ public class EventReportWindowCalcDelegateTest { Source source = SourceFixture.getMinimalValidSourceBuilder() .setSourceType(Source.SourceType.NAVIGATION) + .setExpiryTime(expiryTime) .setEventReportWindow(expiryTime) .setEventTime(sourceEventTime) .build(); @@ -1713,49 +1517,49 @@ public class EventReportWindowCalcDelegateTest { assertEquals( sourceTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - oneWindowNoStart, 0, false)); + oneWindowNoStart, 0)); // InstallCase doesn't affect the report time assertEquals( sourceTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - oneWindowNoStart, 0, true)); + oneWindowNoStart, 0)); assertEquals( sourceTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - oneWindowWithStart, 0, false)); + oneWindowWithStart, 0)); assertEquals( sourceTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - twoWindowsNoStart, 0, false)); + twoWindowsNoStart, 0)); assertEquals( sourceTime + TimeUnit.DAYS.toMillis(5) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - twoWindowsNoStart, 1, false)); + twoWindowsNoStart, 1)); assertEquals( sourceTime + TimeUnit.DAYS.toMillis(2) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - fiveWindowsWithStart, 0, false)); + fiveWindowsWithStart, 0)); assertEquals( sourceTime + TimeUnit.DAYS.toMillis(5) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - fiveWindowsWithStart, 1, false)); + fiveWindowsWithStart, 1)); assertEquals( sourceTime + TimeUnit.DAYS.toMillis(7) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - fiveWindowsWithStart, 2, false)); + fiveWindowsWithStart, 2)); assertEquals( sourceTime + TimeUnit.DAYS.toMillis(10) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - fiveWindowsWithStart, 3, false)); + fiveWindowsWithStart, 3)); assertEquals( sourceTime + TimeUnit.DAYS.toMillis(20) + MEASUREMENT_MIN_EVENT_REPORT_DELAY_MILLIS, mEventReportWindowCalcDelegate.getReportingTimeForNoising( - fiveWindowsWithStart, 4, false)); + fiveWindowsWithStart, 4)); } @Test @@ -1863,7 +1667,8 @@ public class EventReportWindowCalcDelegateTest { @Test public void getMaxReportCount_flexLiteApi() { doReturn(true).when(mFlags).getMeasurementFlexLiteApiEnabled(); - doReturn(false).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); + doReturn(Flags.DEFAULT_MEASUREMENT_VTC_CONFIGURABLE_MAX_EVENT_REPORTS_COUNT) + .when(mFlags).getMeasurementVtcConfigurableMaxEventReportsCount(); long sourceTime = System.currentTimeMillis(); Source source10Reports = SourceFixture.getMinimalValidSourceBuilder() @@ -1871,10 +1676,20 @@ public class EventReportWindowCalcDelegateTest { .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(30)) .setEventTime(sourceTime) .build(); - assertEquals(10, mEventReportWindowCalcDelegate.getMaxReportCount(source10Reports, true)); - assertEquals(10, mEventReportWindowCalcDelegate.getMaxReportCount(source10Reports, false)); + assertEquals(10, mEventReportWindowCalcDelegate.getMaxReportCount(source10Reports)); + assertEquals(10, mEventReportWindowCalcDelegate.getMaxReportCount(source10Reports)); - Source sourceDefaultEvent = + Source eventSourceInstallAttributed = + SourceFixture.getMinimalValidSourceBuilder() + .setEventReportWindows(EVENT_REPORT_WINDOWS_5_WINDOWS_WITH_START) + .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(30)) + .setEventTime(sourceTime) + .setSourceType(Source.SourceType.EVENT) + .setInstallAttributed(true) + .setInstallCooldownWindow(1L) + .build(); + + Source eventSource = SourceFixture.getMinimalValidSourceBuilder() .setEventReportWindows(EVENT_REPORT_WINDOWS_5_WINDOWS_WITH_START) .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(30)) @@ -1884,12 +1699,23 @@ public class EventReportWindowCalcDelegateTest { assertEquals( PrivacyParams.INSTALL_ATTR_EVENT_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount(sourceDefaultEvent, true)); + mEventReportWindowCalcDelegate.getMaxReportCount( + eventSourceInstallAttributed)); assertEquals( PrivacyParams.EVENT_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount(sourceDefaultEvent, false)); + mEventReportWindowCalcDelegate.getMaxReportCount(eventSource)); - Source sourceDefaultNavigation = + Source navigationSourceInstallAttributed = + SourceFixture.getMinimalValidSourceBuilder() + .setEventReportWindows(EVENT_REPORT_WINDOWS_5_WINDOWS_WITH_START) + .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(30)) + .setEventTime(sourceTime) + .setSourceType(Source.SourceType.NAVIGATION) + .setInstallAttributed(true) + .setInstallCooldownWindow(1L) + .build(); + + Source navigationSource = SourceFixture.getMinimalValidSourceBuilder() .setEventReportWindows(EVENT_REPORT_WINDOWS_5_WINDOWS_WITH_START) .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(30)) @@ -1898,18 +1724,27 @@ public class EventReportWindowCalcDelegateTest { .build(); assertEquals( - PrivacyParams.INSTALL_ATTR_NAVIGATION_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount(sourceDefaultNavigation, true)); + PrivacyParams.NAVIGATION_SOURCE_MAX_REPORTS, + mEventReportWindowCalcDelegate.getMaxReportCount( + navigationSourceInstallAttributed)); assertEquals( PrivacyParams.NAVIGATION_SOURCE_MAX_REPORTS, - mEventReportWindowCalcDelegate.getMaxReportCount(sourceDefaultNavigation, false)); + mEventReportWindowCalcDelegate.getMaxReportCount(navigationSource)); } @Test public void getReportingWindowCountForNoising_flexLiteApi() { doReturn(true).when(mFlags).getMeasurementFlexLiteApiEnabled(); - doReturn(false).when(mFlags).getMeasurementEnableConfigurableEventReportingWindows(); long sourceTime = System.currentTimeMillis(); + Source defaultSourceEventInstallAttributed = + SourceFixture.getMinimalValidSourceBuilder() + .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(30)) + .setEventTime(sourceTime) + .setSourceType(Source.SourceType.EVENT) + .setInstallAttributed(true) + .setInstallCooldownWindow(1L) + .build(); + Source defaultSourceEvent = SourceFixture.getMinimalValidSourceBuilder() .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(30)) @@ -1952,56 +1787,110 @@ public class EventReportWindowCalcDelegateTest { assertEquals( 2, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - defaultSourceEvent, true)); + defaultSourceEventInstallAttributed)); assertEquals( 1, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - defaultSourceEvent, false)); + defaultSourceEvent)); assertEquals( 3, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - defaultSourceNavigation, true)); + defaultSourceNavigation)); assertEquals( 3, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - defaultSourceNavigation, false)); + defaultSourceNavigation)); // InstallCase doesn't affect the report count assertEquals( 1, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - oneWindowNoStart, true)); + oneWindowNoStart)); assertEquals( 1, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - oneWindowNoStart, false)); + oneWindowNoStart)); assertEquals( 1, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - oneWindowWithStart, true)); + oneWindowWithStart)); assertEquals( 1, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - oneWindowWithStart, false)); + oneWindowWithStart)); assertEquals( 2, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - twoWindowsNoStart, true)); + twoWindowsNoStart)); assertEquals( 2, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - twoWindowsNoStart, false)); + twoWindowsNoStart)); assertEquals( 5, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - fiveWindowsWithStart, true)); + fiveWindowsWithStart)); assertEquals( 5, mEventReportWindowCalcDelegate.getReportingWindowCountForNoising( - fiveWindowsWithStart, false)); + fiveWindowsWithStart)); + } + + @Test + public void fallsWithinWindow_windowNotStarted() { + doReturn(true).when(mFlags).getMeasurementFlexLiteApiEnabled(); + long sourceTime = System.currentTimeMillis(); + long triggerTime = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1) - 1; + Source source = + SourceFixture.getMinimalValidSourceBuilder() + .setSourceType(Source.SourceType.EVENT) + .setEventTime(sourceTime) + .setEventReportWindows(EVENT_REPORT_WINDOWS_2_WINDOWS_WITH_START) + .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(25)) + .build(); + assertEquals( + EventReportWindowCalcDelegate.MomentPlacement.BEFORE, + mEventReportWindowCalcDelegate.fallsWithinWindow( + source, triggerTime, EventSurfaceType.APP)); + } + + @Test + public void fallsWithinWindow_windowWithin() { + doReturn(true).when(mFlags).getMeasurementFlexLiteApiEnabled(); + long sourceTime = System.currentTimeMillis(); + long triggerTime = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1); + Source source = + SourceFixture.getMinimalValidSourceBuilder() + .setSourceType(Source.SourceType.EVENT) + .setEventTime(sourceTime) + .setEventReportWindows(EVENT_REPORT_WINDOWS_2_WINDOWS_WITH_START) + .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(25)) + .build(); + assertEquals( + EventReportWindowCalcDelegate.MomentPlacement.WITHIN, + mEventReportWindowCalcDelegate.fallsWithinWindow( + source, triggerTime, EventSurfaceType.APP)); + } + + @Test + public void fallsWithinWindow_windowPassed() { + doReturn(true).when(mFlags).getMeasurementFlexLiteApiEnabled(); + long sourceTime = System.currentTimeMillis(); + long triggerTime = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(20); + Source source = + SourceFixture.getMinimalValidSourceBuilder() + .setSourceType(Source.SourceType.EVENT) + .setEventTime(sourceTime) + .setEventReportWindows(EVENT_REPORT_WINDOWS_2_WINDOWS_WITH_START) + .setExpiryTime(sourceTime + TimeUnit.DAYS.toMillis(25)) + .build(); + assertEquals( + EventReportWindowCalcDelegate.MomentPlacement.AFTER, + mEventReportWindowCalcDelegate.fallsWithinWindow( + source, triggerTime, EventSurfaceType.APP)); } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/shell/AdServicesShellCommandHandlerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/shell/AdServicesShellCommandHandlerTest.java index 7341b1d33f..0d2c088449 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/shell/AdServicesShellCommandHandlerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/shell/AdServicesShellCommandHandlerTest.java @@ -70,14 +70,14 @@ public final class AdServicesShellCommandHandlerTest extends AdServicesExtendedM @Test public void testRunHelp() throws Exception { - String result = mCmd.runInvalid(CMD_HELP); + String result = mCmd.runValid(CMD_HELP); assertHelpContents(result); } @Test public void testRunHelpShort() throws Exception { - String result = mCmd.runInvalid(CMD_SHORT_HELP); + String result = mCmd.runValid(CMD_SHORT_HELP); assertHelpContents(result); } @@ -283,7 +283,10 @@ public final class AdServicesShellCommandHandlerTest extends AdServicesExtendedM private final StringWriter mOutStringWriter = new StringWriter(); private final PrintWriter mOut = new PrintWriter(mOutStringWriter); - public final AdServicesShellCommandHandler cmd = new AdServicesShellCommandHandler(mOut); + private final StringWriter mErrStringWriter = new StringWriter(); + private final PrintWriter mErr = new PrintWriter(mErrStringWriter); + public final AdServicesShellCommandHandler cmd = + new AdServicesShellCommandHandler(mOut, mErr); private boolean mOutCalled; @@ -302,7 +305,7 @@ public final class AdServicesShellCommandHandlerTest extends AdServicesExtendedM .that(result) .isAtLeast(0); - return getOut(); + return getResult(mOut, mOutStringWriter); } /** @@ -316,7 +319,7 @@ public final class AdServicesShellCommandHandlerTest extends AdServicesExtendedM .that(result) .isLessThan(0); - return getOut(); + return getResult(mErr, mErrStringWriter); } /** @@ -334,13 +337,13 @@ public final class AdServicesShellCommandHandlerTest extends AdServicesExtendedM * <p>Can only be called once per test, as there is no way to reset it, which could cause * confusion for the test developer. */ - String getOut() throws IOException { + String getResult(PrintWriter pw, StringWriter sw) throws IOException { if (mOutCalled) { throw new IllegalStateException("getOut() already called"); } - mOut.flush(); - String out = mOutStringWriter.toString(); - mOut.close(); + pw.flush(); + String out = sw.toString(); + pw.close(); mOutCalled = true; return out; } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/shell/ShellCommandServiceImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/shell/ShellCommandServiceImplTest.java new file mode 100644 index 0000000000..a07a5f6503 --- /dev/null +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/shell/ShellCommandServiceImplTest.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2023 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.service.shell; + +import android.adservices.shell.IShellCommandCallback; +import android.adservices.shell.ShellCommandParam; +import android.adservices.shell.ShellCommandResult; +import android.os.IBinder; + +import com.android.adservices.common.AdServicesUnitTestCase; +import com.android.adservices.common.NoFailureSyncCallback; + +import org.junit.Test; + +public final class ShellCommandServiceImplTest extends AdServicesUnitTestCase { + + @Test + public void testRunShellCommand() throws Exception { + ShellCommandServiceImpl service = new ShellCommandServiceImpl(); + SyncIShellCommandCallback callback = new SyncIShellCommandCallback(); + + service.runShellCommand(new ShellCommandParam("echo", "xxx"), callback); + + ShellCommandResult response = callback.assertResultReceived(); + expect.withMessage("result").that(response.getResultCode()).isEqualTo(0); + expect.withMessage("out").that(response.getOut()).contains("xxx"); + expect.withMessage("err").that(response.getErr()).isEmpty(); + } + + @Test + public void testRunShellCommand_invalidCommand() throws Exception { + ShellCommandServiceImpl service = new ShellCommandServiceImpl(); + SyncIShellCommandCallback callback = new SyncIShellCommandCallback(); + + service.runShellCommand(new ShellCommandParam("invalid-cmd"), callback); + + ShellCommandResult response = callback.assertResultReceived(); + expect.withMessage("result").that(response.getResultCode()).isEqualTo(-1); + expect.withMessage("out").that(response.getOut()).isEmpty(); + expect.withMessage("err").that(response.getErr()).contains("Unknown command"); + } + + private static final class SyncIShellCommandCallback + extends NoFailureSyncCallback<ShellCommandResult> implements IShellCommandCallback { + + @Override + public void onResult(ShellCommandResult response) { + injectResult(response); + } + + @Override + public IBinder asBinder() { + return null; + } + } +} diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/PeriodicEncodingJobWorkerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/PeriodicEncodingJobWorkerTest.java index 3be31f28b1..1bf8fb9b98 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/PeriodicEncodingJobWorkerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/PeriodicEncodingJobWorkerTest.java @@ -37,10 +37,12 @@ import android.adservices.common.CommonFixture; import com.android.adservices.concurrency.AdServicesExecutors; import com.android.adservices.data.signals.DBEncodedPayload; import com.android.adservices.data.signals.DBEncoderLogicMetadata; +import com.android.adservices.data.signals.DBSignalsUpdateMetadata; import com.android.adservices.data.signals.EncodedPayloadDao; import com.android.adservices.data.signals.EncoderLogicHandler; import com.android.adservices.data.signals.EncoderLogicMetadataDao; import com.android.adservices.data.signals.EncoderPersistenceDao; +import com.android.adservices.data.signals.ProtectedSignalsDao; import com.android.adservices.service.Flags; import com.android.adservices.service.adselection.AdSelectionScriptEngine; import com.android.adservices.service.devapi.DevContextFilter; @@ -113,6 +115,7 @@ public class PeriodicEncodingJobWorkerTest { @Mock private EncoderLogicMetadataDao mEncoderLogicMetadataDao; @Mock private EncoderPersistenceDao mEncoderPersistenceDao; @Mock private EncodedPayloadDao mEncodedPayloadDao; + @Mock private ProtectedSignalsDao mProtectedSignalsDao; @Mock private SignalsProviderImpl mSignalStorageManager; @Mock private AdSelectionScriptEngine mScriptEngine; @Mock private DevContextFilter mDevContextFilter; @@ -138,9 +141,9 @@ public class PeriodicEncodingJobWorkerTest { new PeriodicEncodingJobWorker( mEncoderLogicHandler, mEncoderLogicMetadataDao, - mEncoderPersistenceDao, mEncodedPayloadDao, mSignalStorageManager, + mProtectedSignalsDao, mScriptEngine, mBackgroundExecutor, mLightWeightExecutor, @@ -172,9 +175,9 @@ public class PeriodicEncodingJobWorkerTest { new PeriodicEncodingJobWorker( mEncoderLogicHandler, mEncoderLogicMetadataDao, - mEncoderPersistenceDao, mEncodedPayloadDao, mSignalStorageManager, + mProtectedSignalsDao, mScriptEngine, mBackgroundExecutor, mLightWeightExecutor, @@ -243,7 +246,8 @@ public class PeriodicEncodingJobWorkerTest { .get(5, TimeUnit.SECONDS)); assertEquals(IllegalStateException.class, e.getCause().getClass()); assertEquals(PAYLOAD_PERSISTENCE_ERROR_MSG, e.getCause().getMessage()); - Mockito.verifyZeroInteractions(mEncodedPayloadDao); + verify(mEncodedPayloadDao).getEncodedPayload(BUYER); + verifyNoMoreInteractions(mEncodedPayloadDao); } @Test @@ -267,7 +271,8 @@ public class PeriodicEncodingJobWorkerTest { }); assertEquals(IllegalStateException.class, e.getCause().getClass()); assertEquals(PAYLOAD_PERSISTENCE_ERROR_MSG, e.getCause().getMessage()); - Mockito.verifyZeroInteractions(mEncodedPayloadDao); + verify(mEncodedPayloadDao).getEncodedPayload(BUYER); + verifyNoMoreInteractions(mEncodedPayloadDao); } @Test @@ -328,7 +333,8 @@ public class PeriodicEncodingJobWorkerTest { stallEncodingLatch.getCount()); // e is TimeoutFuture$TimeoutFutureException which extends TimeoutException assertTrue(TimeoutException.class.isAssignableFrom(e.getCause().getClass())); - Mockito.verifyZeroInteractions(mEncodedPayloadDao); + verify(mEncodedPayloadDao).getEncodedPayload(BUYER); + verifyNoMoreInteractions(mEncodedPayloadDao); } @Test @@ -361,6 +367,8 @@ public class PeriodicEncodingJobWorkerTest { verify(mEncoderLogicHandler).getAllRegisteredEncoders(); verify(mEncoderLogicHandler).getEncoder(BUYER); verify(mSignalStorageManager).getSignals(BUYER); + verify(mEncodedPayloadDao, times(1)).getEncodedPayload(BUYER); + verify(mEncodedPayloadDao, times(1)).getEncodedPayload(BUYER_2); verify(mEncodedPayloadDao, times(1)).persistEncodedPayload(mEncodedPayloadCaptor.capture()); verify(mEncoderLogicHandler).updateEncoderFailedCount(BUYER_2, 1); assertEquals(BUYER, mEncodedPayloadCaptor.getValue().getBuyer()); @@ -368,7 +376,6 @@ public class PeriodicEncodingJobWorkerTest { assertEquals( getSetFromBytes(validResponse), getSetFromBytes(mEncodedPayloadCaptor.getValue().getEncodedPayload())); - verify(mEncoderLogicHandler).updateEncoderFailedCount(BUYER_2, 1); } @Test @@ -417,6 +424,39 @@ public class PeriodicEncodingJobWorkerTest { } @Test + public void testEncodeSignals_noUpdateToBuyer_skipEncoding() + throws ExecutionException, InterruptedException, TimeoutException { + when(mSignalStorageManager.getSignals(BUYER)).thenReturn(FAKE_SIGNALS); + when(mProtectedSignalsDao.getSignalsUpdateMetadata(BUYER)) + .thenReturn( + DBSignalsUpdateMetadata.builder() + .setBuyer(BUYER) + .setLastSignalsUpdatedTime(CommonFixture.FIXED_EARLIER_ONE_DAY) + .build()); + when(mEncodedPayloadDao.getEncodedPayload(BUYER)) + .thenReturn( + DBEncodedPayload.create( + BUYER, 1, CommonFixture.FIXED_NOW, new byte[] {0x22, 0x33})); + + mJobWorker + .runEncodingPerBuyer( + DBEncoderLogicMetadata.builder() + .setBuyer(BUYER) + .setCreationTime(CommonFixture.FIXED_EARLIER_ONE_DAY) + .setVersion(1) + .setFailedEncodingCount(1) + .build(), + TIMEOUT_SECONDS) + .get(TIMEOUT_SECONDS, TimeUnit.SECONDS); + + verify(mSignalStorageManager).getSignals(BUYER); + verify(mProtectedSignalsDao).getSignalsUpdateMetadata(BUYER); + verify(mEncodedPayloadDao).getEncodedPayload(BUYER); + verifyNoMoreInteractions(mSignalStorageManager, mProtectedSignalsDao, mEncodedPayloadDao); + verifyZeroInteractions(mEncoderLogicHandler, mScriptEngine); + } + + @Test public void testUpdatesEncodersAllUpdatedEncodersDoNotDownloadAgain() { when(mEncoderLogicMetadataDao.getBuyersWithEncodersBeforeTime(any())) .thenReturn(Collections.emptyList()); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/ProtectedSignalsServiceImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/ProtectedSignalsServiceImplTest.java index 07ca5a5b4c..079d586128 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/ProtectedSignalsServiceImplTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/ProtectedSignalsServiceImplTest.java @@ -170,8 +170,7 @@ public class ProtectedSignalsServiceImplTest { mProtectedSignalsService.updateSignals(mInput, mUpdateSignalsCallbackMock); verify(mFledgeAuthorizationFilterMock) - .assertAppDeclaredProtectedSignalsPermission( - eq(CONTEXT), eq(PACKAGE), eq(API_NAME)); + .assertAppDeclaredPermission(eq(CONTEXT), eq(PACKAGE), eq(API_NAME)); verify(mCallingAppUidSupplierMock).getCallingAppUid(); verify(mDevContextFilterMock).createDevContext(); verify(mFlagsMock).getDisableFledgeEnrollmentCheck(); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsEncodingE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsEncodingE2ETest.java index 3c8e73dfc4..f877873f91 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsEncodingE2ETest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsEncodingE2ETest.java @@ -25,7 +25,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; @@ -199,6 +198,7 @@ public class SignalsEncodingE2ETest { mEncoderPersistenceDao, mEncoderEndpointsDao, mEncoderLogicMetadataDao, + mSignalsDao, mAdServicesHttpsClient, mBackgroundExecutorService); mUpdateEncoderEventHandler = @@ -244,7 +244,8 @@ public class SignalsEncodingE2ETest { mBackgroundExecutorService, mUpdatesDownloader, mUpdateProcessingOrchestrator, - mAdtechUriValidator); + mAdtechUriValidator, + CommonFixture.FIXED_CLOCK_TRUNCATED_TO_MILLI); mService = new ProtectedSignalsServiceImpl( mContextSpy, @@ -277,9 +278,9 @@ public class SignalsEncodingE2ETest { new PeriodicEncodingJobWorker( mEncoderLogicHandler, mEncoderLogicMetadataDao, - mEncoderPersistenceDao, mEncodedPayloadDao, mSignalStorageManager, + mSignalsDao, mAdSelectionScriptEngine, mBackgroundExecutorService, mLightweightExecutorService, @@ -650,9 +651,9 @@ public class SignalsEncodingE2ETest { new PeriodicEncodingJobWorker( mEncoderLogicHandler, mEncoderLogicMetadataDao, - mEncoderPersistenceDao, mEncodedPayloadDao, mSignalStorageManager, + mSignalsDao, mAdSelectionScriptEngine, mBackgroundExecutorService, mLightweightExecutorService, @@ -686,9 +687,9 @@ public class SignalsEncodingE2ETest { new PeriodicEncodingJobWorker( mEncoderLogicHandler, mEncoderLogicMetadataDao, - mEncoderPersistenceDao, mEncodedPayloadDao, mSignalStorageManager, + mSignalsDao, mAdSelectionScriptEngine, mBackgroundExecutorService, mLightweightExecutorService, @@ -705,7 +706,9 @@ public class SignalsEncodingE2ETest { "Encoding JS should have returned size of signals as result", new byte[] {(byte) expected.size()}, payload2); - assertTrue(secondEncodingRun.getCreationTime().isAfter(firstEncodingRun.getCreationTime())); + // The second run should skip based on the logic that we will skip encoding for unchanged + // buyer. + assertEquals(secondEncodingRun.getCreationTime(), firstEncodingRun.getCreationTime()); encoderLogicDownloadedLatch.await(5, TimeUnit.SECONDS); assertEquals( diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsIntakeE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsIntakeE2ETest.java index d57f6adf11..c158543e1b 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsIntakeE2ETest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsIntakeE2ETest.java @@ -172,6 +172,7 @@ public class SignalsIntakeE2ETest { mEncoderPersistenceDao, mEncoderEndpointsDao, mEncoderLogicMetadataDao, + mSignalsDao, mAdServicesHttpsClientMock, mBackgroundExecutorService); mUpdateEncoderEventHandler = @@ -235,7 +236,8 @@ public class SignalsIntakeE2ETest { mBackgroundExecutorService, mUpdatesDownloader, mUpdateProcessingOrchestrator, - mAdtechUriValidator); + mAdtechUriValidator, + CommonFixture.FIXED_CLOCK_TRUNCATED_TO_MILLI); mService = new ProtectedSignalsServiceImpl( mContextSpy, diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsMaintenanceTasksWorkerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsMaintenanceTasksWorkerTest.java index ab251d56a4..60d8859ac3 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsMaintenanceTasksWorkerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/SignalsMaintenanceTasksWorkerTest.java @@ -17,6 +17,7 @@ package com.android.adservices.service.signals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; @@ -55,6 +56,7 @@ public class SignalsMaintenanceTasksWorkerTest { @Mock private PackageManager mPackageManagerMock; SignalsMaintenanceTasksWorker mSignalsMaintenanceTasksWorker; + Instant mNow; Instant mExpirationTime; @Before @@ -69,6 +71,7 @@ public class SignalsMaintenanceTasksWorkerTest { mClockMock, mPackageManagerMock); when(mClockMock.instant()).thenReturn(CommonFixture.FIXED_NOW); + mNow = CommonFixture.FIXED_NOW; mExpirationTime = CommonFixture.FIXED_NOW.minusSeconds(ProtectedSignal.EXPIRATION_SECONDS); } @@ -76,21 +79,25 @@ public class SignalsMaintenanceTasksWorkerTest { public void testClearInvalidSignalsEnrollmentEnabled() throws Exception { when(mFlagsMock.getDisableFledgeEnrollmentCheck()).thenReturn(false); - mSignalsMaintenanceTasksWorker.clearInvalidSignals(mExpirationTime); + mSignalsMaintenanceTasksWorker.clearInvalidSignals(mExpirationTime, mNow); - verify(mProtectedSignalsDaoMock).deleteSignalsBeforeTime(mExpirationTime); + verify(mProtectedSignalsDaoMock) + .deleteExpiredSignalsAndUpdateSignalsUpdateMetadata(mExpirationTime, mNow); verify(mFlagsMock).getDisableFledgeEnrollmentCheck(); verify(mProtectedSignalsDaoMock).deleteDisallowedBuyerSignals(any()); - verify(mProtectedSignalsDaoMock).deleteAllDisallowedPackageSignals(any(), any()); + verify(mProtectedSignalsDaoMock) + .deleteAllDisallowedPackageSignalsAndUpdateSignalUpdateMetadata( + any(), any(), eq(mNow)); } @Test public void testClearInvalidSignalsEnrollmentDisabled() throws Exception { when(mFlagsMock.getDisableFledgeEnrollmentCheck()).thenReturn(true); - mSignalsMaintenanceTasksWorker.clearInvalidSignals(mExpirationTime); + mSignalsMaintenanceTasksWorker.clearInvalidSignals(mExpirationTime, mNow); - verify(mProtectedSignalsDaoMock).deleteSignalsBeforeTime(mExpirationTime); + verify(mProtectedSignalsDaoMock) + .deleteExpiredSignalsAndUpdateSignalsUpdateMetadata(mExpirationTime, mNow); verify(mFlagsMock).getDisableFledgeEnrollmentCheck(); } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/UpdateProcessingOrchestratorTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/UpdateProcessingOrchestratorTest.java index 4b6b57b398..346f969a0c 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/UpdateProcessingOrchestratorTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/UpdateProcessingOrchestratorTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; @@ -97,7 +98,7 @@ public class UpdateProcessingOrchestratorTest { ADTECH, PACKAGE, NOW, new JSONObject(), DEV_CONTEXT); verify(mProtectedSignalsDaoMock).getSignalsByBuyer(eq(ADTECH)); verify(mProtectedSignalsDaoMock) - .insertAndDelete(Collections.emptyList(), Collections.emptyList()); + .insertAndDelete(ADTECH, NOW, Collections.emptyList(), Collections.emptyList()); verifyZeroInteractions(mUpdateProcessorSelectorMock); verify(mSignalEvictionControllerMock) .evict( @@ -136,7 +137,9 @@ public class UpdateProcessingOrchestratorTest { mUpdateProcessingOrchestrator.processUpdates( ADTECH, PACKAGE, NOW, commandToNumber, DEV_CONTEXT)); assertEquals(exception, t.getCause()); + verify(mProtectedSignalsDaoMock).getSignalsByBuyer(ADTECH); verifyZeroInteractions(mSignalEvictionControllerMock); + verifyNoMoreInteractions(mProtectedSignalsDaoMock); } @Test @@ -156,8 +159,9 @@ public class UpdateProcessingOrchestratorTest { mUpdateProcessingOrchestrator.processUpdates(ADTECH, PACKAGE, NOW, json, DEV_CONTEXT); - List<DBProtectedSignal> expected = Arrays.asList(createSignal(KEY_1, VALUE)); - verify(mProtectedSignalsDaoMock).insertAndDelete(eq(expected), eq(Collections.emptyList())); + List<DBProtectedSignal> expected = List.of(createSignal(KEY_1, VALUE)); + verify(mProtectedSignalsDaoMock) + .insertAndDelete(ADTECH, NOW, expected, Collections.emptyList()); verify(mUpdateProcessorSelectorMock).getUpdateProcessor(eq(TEST_PROCESSOR)); verify(mSignalEvictionControllerMock) .evict( @@ -185,7 +189,8 @@ public class UpdateProcessingOrchestratorTest { mUpdateProcessingOrchestrator.processUpdates(ADTECH, PACKAGE, NOW, json, DEV_CONTEXT); List<DBProtectedSignal> expected = Arrays.asList(createSignal(KEY_1, VALUE)); - verify(mProtectedSignalsDaoMock).insertAndDelete(eq(expected), eq(Collections.emptyList())); + verify(mProtectedSignalsDaoMock) + .insertAndDelete(ADTECH, NOW, expected, Collections.emptyList()); verify(mUpdateProcessorSelectorMock).getUpdateProcessor(eq(TEST_PROCESSOR)); verify(mSignalEvictionControllerMock) .evict( @@ -214,7 +219,7 @@ public class UpdateProcessingOrchestratorTest { verify(mProtectedSignalsDaoMock).getSignalsByBuyer(eq(ADTECH)); verify(mProtectedSignalsDaoMock) - .insertAndDelete(eq(Collections.emptyList()), eq(Arrays.asList(toRemove))); + .insertAndDelete(ADTECH, NOW, Collections.emptyList(), Arrays.asList(toRemove)); verify(mUpdateProcessorSelectorMock).getUpdateProcessor(eq(TEST_PROCESSOR)); verify(mSignalEvictionControllerMock) .evict(eq(ADTECH), eq(List.of(toKeep)), mUpdateOutputArgumentCaptor.capture()); @@ -250,7 +255,8 @@ public class UpdateProcessingOrchestratorTest { DBProtectedSignal expected1 = createSignal(KEY_1, VALUE); DBProtectedSignal expected2 = createSignal(KEY_2, VALUE); verify(mProtectedSignalsDaoMock) - .insertAndDelete(mInsertCaptor.capture(), eq(Collections.emptyList())); + .insertAndDelete( + eq(ADTECH), eq(NOW), mInsertCaptor.capture(), eq(Collections.emptyList())); assertThat(mInsertCaptor.getValue()) .containsExactlyElementsIn(Arrays.asList(expected1, expected2)); verify(mUpdateProcessorSelectorMock).getUpdateProcessor(eq(TEST_PROCESSOR + 1)); @@ -317,7 +323,7 @@ public class UpdateProcessingOrchestratorTest { verify(mProtectedSignalsDaoMock).getSignalsByBuyer(eq(ADTECH)); verify(mProtectedSignalsDaoMock) .insertAndDelete( - eq(Collections.emptyList()), eq(Arrays.asList(toRemove1, toRemove2))); + ADTECH, NOW, Collections.emptyList(), Arrays.asList(toRemove1, toRemove2)); verify(mUpdateProcessorSelectorMock).getUpdateProcessor(eq(TEST_PROCESSOR)); verify(mSignalEvictionControllerMock) .evict(eq(ADTECH), eq(List.of()), mUpdateOutputArgumentCaptor.capture()); @@ -441,7 +447,7 @@ public class UpdateProcessingOrchestratorTest { mUpdateProcessingOrchestrator.processUpdates(ADTECH, PACKAGE, NOW, json, DEV_CONTEXT); List<DBProtectedSignal> expected = Arrays.asList(createSignal(KEY_1, VALUE)); - verify(mProtectedSignalsDaoMock).insertAndDelete(eq(expected), eq(expected)); + verify(mProtectedSignalsDaoMock).insertAndDelete(ADTECH, NOW, expected, expected); verify(mUpdateProcessorSelectorMock).getUpdateProcessor(eq(TEST_PROCESSOR)); } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/UpdateSignalsOrchestratorTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/UpdateSignalsOrchestratorTest.java index 0e693ffd35..9fea32c037 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/UpdateSignalsOrchestratorTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/signals/UpdateSignalsOrchestratorTest.java @@ -66,7 +66,8 @@ public class UpdateSignalsOrchestratorTest { AdServicesExecutors.getBackgroundExecutor(), mUpdatesDownloader, mUpdateProcessingOrchestrator, - mAdTechUriValidator); + mAdTechUriValidator, + CommonFixture.FIXED_CLOCK_TRUNCATED_TO_MILLI); } @Test diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/stats/AdServicesLoggerImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/stats/AdServicesLoggerImplTest.java index 7e63a2ced9..4fbe03c82c 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/stats/AdServicesLoggerImplTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/stats/AdServicesLoggerImplTest.java @@ -88,48 +88,37 @@ import static com.android.adservices.service.stats.RunAdSelectionProcessReported import static com.android.adservices.service.stats.UpdateCustomAudienceProcessReportedStatsTest.DATA_SIZE_OF_ADS_IN_BYTES; import static com.android.adservices.service.stats.UpdateCustomAudienceProcessReportedStatsTest.NUM_OF_ADS; -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import android.adservices.adselection.ReportEventRequest; +import com.android.adservices.common.AdServicesMockitoTestCase; import com.android.adservices.service.enrollment.EnrollmentStatus; import com.android.adservices.service.measurement.Source; import com.android.adservices.service.measurement.WipeoutStatus; import com.android.adservices.service.measurement.attribution.AttributionStatus; -import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** Unit tests for {@link AdServicesLoggerImpl}. */ -public class AdServicesLoggerImplTest { - @Mock StatsdAdServicesLogger mStatsdLoggerMock; - private static final String SOURCE_REGISTRANT = "android-app://com.registrant"; +public final class AdServicesLoggerImplTest extends AdServicesMockitoTestCase { - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - } + @Mock private StatsdAdServicesLogger mStatsdLoggerMock; @Test public void testLogFledgeApiCallStats() { - final int latencyMs = 10; + int latencyMs = 10; AdServicesLoggerImpl adServicesLogger = new AdServicesLoggerImpl(mStatsdLoggerMock); adServicesLogger.logFledgeApiCallStats( AD_SERVICES_API_CALLED__API_NAME__SELECT_ADS, STATUS_SUCCESS, latencyMs); verify(mStatsdLoggerMock) .logFledgeApiCallStats( - eq(AD_SERVICES_API_CALLED__API_NAME__SELECT_ADS), - eq(STATUS_SUCCESS), - eq(latencyMs)); + AD_SERVICES_API_CALLED__API_NAME__SELECT_ADS, STATUS_SUCCESS, latencyMs); } @Test @@ -149,22 +138,18 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<RunAdSelectionProcessReportedStats> argumentCaptor = ArgumentCaptor.forClass(RunAdSelectionProcessReportedStats.class); verify(mStatsdLoggerMock).logRunAdSelectionProcessReportedStats(argumentCaptor.capture()); - assertEquals(argumentCaptor.getValue().getIsRemarketingAdsWon(), IS_RMKT_ADS_WON); - assertEquals( - argumentCaptor.getValue().getDBAdSelectionSizeInBytes(), - DB_AD_SELECTION_SIZE_IN_BYTES); - assertEquals( - argumentCaptor.getValue().getPersistAdSelectionLatencyInMillis(), - PERSIST_AD_SELECTION_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getRunAdSelectionResultCode(), - PERSIST_AD_SELECTION_RESULT_CODE); - assertEquals( - argumentCaptor.getValue().getRunAdSelectionLatencyInMillis(), - RUN_AD_SELECTION_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getRunAdSelectionResultCode(), - RUN_AD_SELECTION_RESULT_CODE); + RunAdSelectionProcessReportedStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getIsRemarketingAdsWon()).isEqualTo(IS_RMKT_ADS_WON); + expect.that(loggedStats.getDBAdSelectionSizeInBytes()) + .isEqualTo(DB_AD_SELECTION_SIZE_IN_BYTES); + expect.that(loggedStats.getPersistAdSelectionLatencyInMillis()) + .isEqualTo(PERSIST_AD_SELECTION_LATENCY_IN_MILLIS); + expect.that(loggedStats.getRunAdSelectionResultCode()) + .isEqualTo(PERSIST_AD_SELECTION_RESULT_CODE); + expect.that(loggedStats.getRunAdSelectionLatencyInMillis()) + .isEqualTo(RUN_AD_SELECTION_LATENCY_IN_MILLIS); + expect.that(loggedStats.getRunAdSelectionResultCode()) + .isEqualTo(RUN_AD_SELECTION_RESULT_CODE); } @Test @@ -200,49 +185,35 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<RunAdScoringProcessReportedStats> argumentCaptor = ArgumentCaptor.forClass(RunAdScoringProcessReportedStats.class); verify(mStatsdLoggerMock).logRunAdScoringProcessReportedStats(argumentCaptor.capture()); - assertEquals( - argumentCaptor.getValue().getGetAdSelectionLogicLatencyInMillis(), - GET_AD_SELECTION_LOGIC_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getGetAdSelectionLogicResultCode(), - GET_AD_SELECTION_LOGIC_RESULT_CODE); - assertEquals( - argumentCaptor.getValue().getGetAdSelectionLogicScriptType(), - GET_AD_SELECTION_LOGIC_SCRIPT_TYPE); - assertEquals( - argumentCaptor.getValue().getFetchedAdSelectionLogicScriptSizeInBytes(), - FETCHED_AD_SELECTION_LOGIC_SCRIPT_SIZE_IN_BYTES); - assertEquals( - argumentCaptor.getValue().getGetTrustedScoringSignalsLatencyInMillis(), - GET_TRUSTED_SCORING_SIGNALS_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getGetTrustedScoringSignalsResultCode(), - GET_TRUSTED_SCORING_SIGNALS_RESULT_CODE); - assertEquals( - argumentCaptor.getValue().getFetchedTrustedScoringSignalsDataSizeInBytes(), - FETCHED_TRUSTED_SCORING_SIGNALS_DATA_SIZE_IN_BYTES); - assertEquals( - argumentCaptor.getValue().getScoreAdsLatencyInMillis(), - SCORE_ADS_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getGetAdScoresLatencyInMillis(), - GET_AD_SCORES_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getGetAdScoresResultCode(), GET_AD_SCORES_RESULT_CODE); - assertEquals( - argumentCaptor.getValue().getNumOfCasEnteringScoring(), - NUM_OF_CAS_ENTERING_SCORING); - assertEquals( - argumentCaptor.getValue().getNumOfRemarketingAdsEnteringScoring(), - NUM_OF_REMARKETING_ADS_ENTERING_SCORING); - assertEquals( - argumentCaptor.getValue().getNumOfContextualAdsEnteringScoring(), - NUM_OF_CONTEXTUAL_ADS_ENTERING_SCORING); - assertEquals( - argumentCaptor.getValue().getRunAdScoringLatencyInMillis(), - RUN_AD_SCORING_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getRunAdScoringResultCode(), RUN_AD_SCORING_RESULT_CODE); + RunAdScoringProcessReportedStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getGetAdSelectionLogicLatencyInMillis()) + .isEqualTo(GET_AD_SELECTION_LOGIC_LATENCY_IN_MILLIS); + expect.that(loggedStats.getGetAdSelectionLogicResultCode()) + .isEqualTo(GET_AD_SELECTION_LOGIC_RESULT_CODE); + expect.that(loggedStats.getGetAdSelectionLogicScriptType()) + .isEqualTo(GET_AD_SELECTION_LOGIC_SCRIPT_TYPE); + expect.that(loggedStats.getFetchedAdSelectionLogicScriptSizeInBytes()) + .isEqualTo(FETCHED_AD_SELECTION_LOGIC_SCRIPT_SIZE_IN_BYTES); + expect.that(loggedStats.getGetTrustedScoringSignalsLatencyInMillis()) + .isEqualTo(GET_TRUSTED_SCORING_SIGNALS_LATENCY_IN_MILLIS); + expect.that(loggedStats.getGetTrustedScoringSignalsResultCode()) + .isEqualTo(GET_TRUSTED_SCORING_SIGNALS_RESULT_CODE); + expect.that(loggedStats.getFetchedTrustedScoringSignalsDataSizeInBytes()) + .isEqualTo(FETCHED_TRUSTED_SCORING_SIGNALS_DATA_SIZE_IN_BYTES); + expect.that(loggedStats.getScoreAdsLatencyInMillis()) + .isEqualTo(SCORE_ADS_LATENCY_IN_MILLIS); + expect.that(loggedStats.getGetAdScoresLatencyInMillis()) + .isEqualTo(GET_AD_SCORES_LATENCY_IN_MILLIS); + expect.that(loggedStats.getGetAdScoresResultCode()).isEqualTo(GET_AD_SCORES_RESULT_CODE); + expect.that(loggedStats.getNumOfCasEnteringScoring()) + .isEqualTo(NUM_OF_CAS_ENTERING_SCORING); + expect.that(loggedStats.getNumOfRemarketingAdsEnteringScoring()) + .isEqualTo(NUM_OF_REMARKETING_ADS_ENTERING_SCORING); + expect.that(loggedStats.getNumOfContextualAdsEnteringScoring()) + .isEqualTo(NUM_OF_CONTEXTUAL_ADS_ENTERING_SCORING); + expect.that(loggedStats.getRunAdScoringLatencyInMillis()) + .isEqualTo(RUN_AD_SCORING_LATENCY_IN_MILLIS); + expect.that(loggedStats.getRunAdScoringResultCode()).isEqualTo(RUN_AD_SCORING_RESULT_CODE); } @Test @@ -270,34 +241,26 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<RunAdBiddingProcessReportedStats> argumentCaptor = ArgumentCaptor.forClass(RunAdBiddingProcessReportedStats.class); verify(mStatsdLoggerMock).logRunAdBiddingProcessReportedStats(argumentCaptor.capture()); - assertEquals( - argumentCaptor.getValue().getGetBuyersCustomAudienceLatencyInMills(), - GET_BUYERS_CUSTOM_AUDIENCE_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getGetBuyersCustomAudienceResultCode(), - GET_BUYERS_CUSTOM_AUDIENCE_RESULT_CODE); - assertEquals(argumentCaptor.getValue().getNumBuyersRequested(), NUM_BUYERS_REQUESTED); - assertEquals(argumentCaptor.getValue().getNumBuyersFetched(), NUM_BUYERS_FETCHED); - assertEquals( - argumentCaptor.getValue().getNumOfAdsEnteringBidding(), - NUM_OF_ADS_ENTERING_BIDDING); - assertEquals( - argumentCaptor.getValue().getNumOfCasEnteringBidding(), - NUM_OF_CAS_ENTERING_BIDDING); - assertEquals( - argumentCaptor.getValue().getNumOfCasPostBidding(), NUM_OF_CAS_POSTING_BIDDING); - assertEquals( - argumentCaptor.getValue().getRatioOfCasSelectingRmktAds(), - RATIO_OF_CAS_SELECTING_RMKT_ADS, - 0.0f); - assertEquals( - argumentCaptor.getValue().getRunAdBiddingLatencyInMillis(), - RUN_AD_BIDDING_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getRunAdBiddingResultCode(), RUN_AD_BIDDING_RESULT_CODE); - assertEquals( - argumentCaptor.getValue().getTotalAdBiddingStageLatencyInMillis(), - TOTAL_AD_BIDDING_STAGE_LATENCY_IN_MILLIS); + RunAdBiddingProcessReportedStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getGetBuyersCustomAudienceLatencyInMills()) + .isEqualTo(GET_BUYERS_CUSTOM_AUDIENCE_LATENCY_IN_MILLIS); + expect.that(loggedStats.getGetBuyersCustomAudienceResultCode()) + .isEqualTo(GET_BUYERS_CUSTOM_AUDIENCE_RESULT_CODE); + expect.that(loggedStats.getNumBuyersRequested()).isEqualTo(NUM_BUYERS_REQUESTED); + expect.that(loggedStats.getNumBuyersFetched()).isEqualTo(NUM_BUYERS_FETCHED); + expect.that(loggedStats.getNumOfAdsEnteringBidding()) + .isEqualTo(NUM_OF_ADS_ENTERING_BIDDING); + expect.that(loggedStats.getNumOfCasEnteringBidding()) + .isEqualTo(NUM_OF_CAS_ENTERING_BIDDING); + expect.that(loggedStats.getNumOfCasPostBidding()).isEqualTo(NUM_OF_CAS_POSTING_BIDDING); + expect.that(loggedStats.getRatioOfCasSelectingRmktAds()) + .isWithin(0.0f) + .of(RATIO_OF_CAS_SELECTING_RMKT_ADS); + expect.that(loggedStats.getRunAdBiddingLatencyInMillis()) + .isEqualTo(RUN_AD_BIDDING_LATENCY_IN_MILLIS); + expect.that(loggedStats.getRunAdBiddingResultCode()).isEqualTo(RUN_AD_BIDDING_RESULT_CODE); + expect.that(loggedStats.getTotalAdBiddingStageLatencyInMillis()) + .isEqualTo(TOTAL_AD_BIDDING_STAGE_LATENCY_IN_MILLIS); } @Test @@ -332,44 +295,33 @@ public class AdServicesLoggerImplTest { ArgumentCaptor.forClass(RunAdBiddingPerCAProcessReportedStats.class); verify(mStatsdLoggerMock) .logRunAdBiddingPerCAProcessReportedStats(argumentCaptor.capture()); - assertEquals(argumentCaptor.getValue().getNumOfAdsForBidding(), NUM_OF_ADS_FOR_BIDDING); - assertEquals( - argumentCaptor.getValue().getRunAdBiddingPerCaLatencyInMillis(), - RUN_AD_BIDDING_PER_CA_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getRunAdBiddingPerCaResultCode(), - RUN_AD_BIDDING_PER_CA_RESULT_CODE); - assertEquals( - argumentCaptor.getValue().getGetBuyerDecisionLogicLatencyInMillis(), - GET_BUYER_DECISION_LOGIC_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getGetBuyerDecisionLogicResultCode(), - GET_BUYER_DECISION_LOGIC_RESULT_CODE); - assertEquals( - argumentCaptor.getValue().getBuyerDecisionLogicScriptType(), - BUYER_DECISION_LOGIC_SCRIPT_TYPE); - assertEquals( - argumentCaptor.getValue().getFetchedBuyerDecisionLogicScriptSizeInBytes(), - FETCHED_BUYER_DECISION_LOGIC_SCRIPT_SIZE_IN_BYTES); - assertEquals( - argumentCaptor.getValue().getNumOfKeysOfTrustedBiddingSignals(), - NUM_OF_KEYS_OF_TRUSTED_BIDDING_SIGNALS); - assertEquals( - argumentCaptor.getValue().getFetchedTrustedBiddingSignalsDataSizeInBytes(), - FETCHED_TRUSTED_BIDDING_SIGNALS_DATA_SIZE_IN_BYTES); - assertEquals( - argumentCaptor.getValue().getGetTrustedBiddingSignalsLatencyInMillis(), - GET_TRUSTED_BIDDING_SIGNALS_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getGetTrustedBiddingSignalsResultCode(), - GET_TRUSTED_BIDDING_SIGNALS_RESULT_CODE); - assertEquals( - argumentCaptor.getValue().getGenerateBidsLatencyInMillis(), - GENERATE_BIDS_LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getRunBiddingLatencyInMillis(), - RUN_BIDDING_LATENCY_IN_MILLIS); - assertEquals(argumentCaptor.getValue().getRunBiddingResultCode(), RUN_BIDDING_RESULT_CODE); + RunAdBiddingPerCAProcessReportedStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getNumOfAdsForBidding()).isEqualTo(NUM_OF_ADS_FOR_BIDDING); + expect.that(loggedStats.getRunAdBiddingPerCaLatencyInMillis()) + .isEqualTo(RUN_AD_BIDDING_PER_CA_LATENCY_IN_MILLIS); + expect.that(loggedStats.getRunAdBiddingPerCaResultCode()) + .isEqualTo(RUN_AD_BIDDING_PER_CA_RESULT_CODE); + expect.that(loggedStats.getGetBuyerDecisionLogicLatencyInMillis()) + .isEqualTo(GET_BUYER_DECISION_LOGIC_LATENCY_IN_MILLIS); + expect.that(loggedStats.getGetBuyerDecisionLogicResultCode()) + .isEqualTo(GET_BUYER_DECISION_LOGIC_RESULT_CODE); + expect.that(loggedStats.getBuyerDecisionLogicScriptType()) + .isEqualTo(BUYER_DECISION_LOGIC_SCRIPT_TYPE); + expect.that(loggedStats.getFetchedBuyerDecisionLogicScriptSizeInBytes()) + .isEqualTo(FETCHED_BUYER_DECISION_LOGIC_SCRIPT_SIZE_IN_BYTES); + expect.that(loggedStats.getNumOfKeysOfTrustedBiddingSignals()) + .isEqualTo(NUM_OF_KEYS_OF_TRUSTED_BIDDING_SIGNALS); + expect.that(loggedStats.getFetchedTrustedBiddingSignalsDataSizeInBytes()) + .isEqualTo(FETCHED_TRUSTED_BIDDING_SIGNALS_DATA_SIZE_IN_BYTES); + expect.that(loggedStats.getGetTrustedBiddingSignalsLatencyInMillis()) + .isEqualTo(GET_TRUSTED_BIDDING_SIGNALS_LATENCY_IN_MILLIS); + expect.that(loggedStats.getGetTrustedBiddingSignalsResultCode()) + .isEqualTo(GET_TRUSTED_BIDDING_SIGNALS_RESULT_CODE); + expect.that(loggedStats.getGenerateBidsLatencyInMillis()) + .isEqualTo(GENERATE_BIDS_LATENCY_IN_MILLIS); + expect.that(loggedStats.getRunBiddingLatencyInMillis()) + .isEqualTo(RUN_BIDDING_LATENCY_IN_MILLIS); + expect.that(loggedStats.getRunBiddingResultCode()).isEqualTo(RUN_BIDDING_RESULT_CODE); } @Test @@ -386,11 +338,11 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<BackgroundFetchProcessReportedStats> argumentCaptor = ArgumentCaptor.forClass(BackgroundFetchProcessReportedStats.class); verify(mStatsdLoggerMock).logBackgroundFetchProcessReportedStats(argumentCaptor.capture()); - assertEquals(argumentCaptor.getValue().getLatencyInMillis(), LATENCY_IN_MILLIS); - assertEquals( - argumentCaptor.getValue().getNumOfEligibleToUpdateCas(), - NUM_OF_ELIGIBLE_TO_UPDATE_CAS); - assertEquals(argumentCaptor.getValue().getResultCode(), RESULT_CODE); + BackgroundFetchProcessReportedStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getLatencyInMillis()).isEqualTo(LATENCY_IN_MILLIS); + expect.that(loggedStats.getNumOfEligibleToUpdateCas()) + .isEqualTo(NUM_OF_ELIGIBLE_TO_UPDATE_CAS); + expect.that(loggedStats.getResultCode()).isEqualTo(RESULT_CODE); } @Test @@ -408,11 +360,11 @@ public class AdServicesLoggerImplTest { ArgumentCaptor.forClass(UpdateCustomAudienceProcessReportedStats.class); verify(mStatsdLoggerMock) .logUpdateCustomAudienceProcessReportedStats(argumentCaptor.capture()); - assertEquals(argumentCaptor.getValue().getLatencyInMills(), LATENCY_IN_MILLIS); - assertEquals(argumentCaptor.getValue().getResultCode(), RESULT_CODE); - assertEquals( - argumentCaptor.getValue().getDataSizeOfAdsInBytes(), DATA_SIZE_OF_ADS_IN_BYTES); - assertEquals(argumentCaptor.getValue().getNumOfAds(), NUM_OF_ADS); + UpdateCustomAudienceProcessReportedStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getLatencyInMills()).isEqualTo(LATENCY_IN_MILLIS); + expect.that(loggedStats.getResultCode()).isEqualTo(RESULT_CODE); + expect.that(loggedStats.getDataSizeOfAdsInBytes()).isEqualTo(DATA_SIZE_OF_ADS_IN_BYTES); + expect.that(loggedStats.getNumOfAds()).isEqualTo(NUM_OF_ADS); } @Test @@ -428,18 +380,18 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<MeasurementReportsStats> argumentCaptor = ArgumentCaptor.forClass(MeasurementReportsStats.class); verify(mStatsdLoggerMock).logMeasurementReports(argumentCaptor.capture()); - assertEquals(argumentCaptor.getValue().getCode(), AD_SERVICES_MESUREMENT_REPORTS_UPLOADED); - assertEquals( - argumentCaptor.getValue().getType(), - AD_SERVICES_MEASUREMENT_REPORTS_UPLOADED__TYPE__EVENT); - assertEquals(argumentCaptor.getValue().getResultCode(), STATUS_SUCCESS); + MeasurementReportsStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getCode()).isEqualTo(AD_SERVICES_MESUREMENT_REPORTS_UPLOADED); + expect.that(loggedStats.getType()) + .isEqualTo(AD_SERVICES_MEASUREMENT_REPORTS_UPLOADED__TYPE__EVENT); + expect.that(loggedStats.getResultCode()).isEqualTo(STATUS_SUCCESS); } @Test public void testLogApiCallStats() { - final String packageName = "com.android.test"; - final String sdkName = "com.android.container"; - final int latency = 100; + String packageName = "com.android.test"; + String sdkName = "com.android.container"; + int latency = 100; ApiCallStats stats = new ApiCallStats.Builder() .setCode(AD_SERVICES_API_CALLED) @@ -454,17 +406,16 @@ public class AdServicesLoggerImplTest { adServicesLogger.logApiCallStats(stats); ArgumentCaptor<ApiCallStats> argumentCaptor = ArgumentCaptor.forClass(ApiCallStats.class); verify(mStatsdLoggerMock).logApiCallStats(argumentCaptor.capture()); - assertEquals(argumentCaptor.getValue().getCode(), AD_SERVICES_API_CALLED); - assertEquals( - argumentCaptor.getValue().getApiClass(), - AD_SERVICES_API_CALLED__API_CLASS__TARGETING); - assertEquals( - argumentCaptor.getValue().getApiName(), - AD_SERVICES_API_CALLED__API_NAME__GET_TOPICS); - assertEquals(argumentCaptor.getValue().getAppPackageName(), packageName); - assertEquals(argumentCaptor.getValue().getSdkPackageName(), sdkName); - assertEquals(argumentCaptor.getValue().getLatencyMillisecond(), latency); - assertEquals(argumentCaptor.getValue().getResultCode(), STATUS_SUCCESS); + ApiCallStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getCode()).isEqualTo(AD_SERVICES_API_CALLED); + expect.that(loggedStats.getApiClass()) + .isEqualTo(AD_SERVICES_API_CALLED__API_CLASS__TARGETING); + expect.that(loggedStats.getApiName()) + .isEqualTo(AD_SERVICES_API_CALLED__API_NAME__GET_TOPICS); + expect.that(loggedStats.getAppPackageName()).isEqualTo(packageName); + expect.that(loggedStats.getSdkPackageName()).isEqualTo(sdkName); + expect.that(loggedStats.getLatencyMillisecond()).isEqualTo(latency); + expect.that(loggedStats.getResultCode()).isEqualTo(STATUS_SUCCESS); } @Test @@ -479,18 +430,18 @@ public class AdServicesLoggerImplTest { adServicesLogger.logUIStats(stats); ArgumentCaptor<UIStats> argumentCaptor = ArgumentCaptor.forClass(UIStats.class); verify(mStatsdLoggerMock).logUIStats(argumentCaptor.capture()); - assertEquals(argumentCaptor.getValue().getCode(), AD_SERVICES_SETTINGS_USAGE_REPORTED); - assertEquals( - argumentCaptor.getValue().getRegion(), - AD_SERVICES_SETTINGS_USAGE_REPORTED__REGION__ROW); - assertEquals( - argumentCaptor.getValue().getAction(), - AD_SERVICES_SETTINGS_USAGE_REPORTED__ACTION__OPT_OUT_SELECTED); + UIStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getCode()).isEqualTo(AD_SERVICES_SETTINGS_USAGE_REPORTED); + expect.that(loggedStats.getRegion()) + .isEqualTo(AD_SERVICES_SETTINGS_USAGE_REPORTED__REGION__ROW); + expect.that(loggedStats.getAction()) + .isEqualTo(AD_SERVICES_SETTINGS_USAGE_REPORTED__ACTION__OPT_OUT_SELECTED); } @Test public void testLogMsmtDebugKeyMatchStats() { - final String enrollmentId = "EnrollmentId"; + String sourceRegistrant = "android-app://com.registrant"; + String enrollmentId = "EnrollmentId"; long hashedValue = 5000L; long hashLimit = 10000L; MsmtDebugKeysMatchStats stats = @@ -501,19 +452,20 @@ public class AdServicesLoggerImplTest { AD_SERVICES_MEASUREMENT_DEBUG_KEYS__ATTRIBUTION_TYPE__APP_WEB) .setDebugJoinKeyHashedValue(hashedValue) .setDebugJoinKeyHashLimit(hashLimit) - .setSourceRegistrant(SOURCE_REGISTRANT) + .setSourceRegistrant(sourceRegistrant) .build(); AdServicesLoggerImpl adServicesLogger = new AdServicesLoggerImpl(mStatsdLoggerMock); adServicesLogger.logMeasurementDebugKeysMatch(stats); ArgumentCaptor<MsmtDebugKeysMatchStats> argumentCaptor = ArgumentCaptor.forClass(MsmtDebugKeysMatchStats.class); verify(mStatsdLoggerMock).logMeasurementDebugKeysMatch(argumentCaptor.capture()); - assertEquals(stats, argumentCaptor.getValue()); + expect.that(stats).isEqualTo(argumentCaptor.getValue()); } @Test public void testLogMsmtAdIdMatchForDebugKeysStats() { - final String enrollmentId = "enrollmentId"; + String sourceRegistrant = "android-app://com.registrant"; + String enrollmentId = "enrollmentId"; long uniqueAdIds = 2L; long uniqueAdIdLimit = 5L; MsmtAdIdMatchForDebugKeysStats stats = @@ -524,7 +476,7 @@ public class AdServicesLoggerImplTest { AD_SERVICES_MEASUREMENT_DEBUG_KEYS__ATTRIBUTION_TYPE__APP_WEB) .setNumUniqueAdIds(uniqueAdIds) .setNumUniqueAdIdsLimit(uniqueAdIdLimit) - .setSourceRegistrant(SOURCE_REGISTRANT) + .setSourceRegistrant(sourceRegistrant) .build(); AdServicesLoggerImpl adServicesLogger = new AdServicesLoggerImpl(mStatsdLoggerMock); @@ -533,7 +485,7 @@ public class AdServicesLoggerImplTest { ArgumentCaptor.forClass(MsmtAdIdMatchForDebugKeysStats.class); verify(mStatsdLoggerMock) .logMeasurementAdIdMatchForDebugKeysStats(argumentCaptor.capture()); - assertEquals(stats, argumentCaptor.getValue()); + expect.that(stats).isEqualTo(argumentCaptor.getValue()); } @Test @@ -554,22 +506,19 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<MeasurementAttributionStats> argumentCaptor = ArgumentCaptor.forClass(MeasurementAttributionStats.class); verify(mStatsdLoggerMock).logMeasurementAttributionStats(argumentCaptor.capture()); - assertEquals(argumentCaptor.getValue().getCode(), AD_SERVICES_MEASUREMENT_ATTRIBUTION); - assertEquals( - argumentCaptor.getValue().getSourceType(), - AttributionStatus.SourceType.VIEW.getValue()); - assertEquals( - argumentCaptor.getValue().getSurfaceType(), - AttributionStatus.AttributionSurface.APP_WEB.getValue()); - assertEquals( - argumentCaptor.getValue().getResult(), - AttributionStatus.AttributionResult.SUCCESS.getValue()); - assertEquals( - argumentCaptor.getValue().getFailureType(), - AttributionStatus.FailureType.UNKNOWN.getValue()); - assertEquals(argumentCaptor.getValue().isSourceDerived(), false); - assertEquals(argumentCaptor.getValue().isInstallAttribution(), true); - assertEquals(argumentCaptor.getValue().getAttributionDelay(), 100L); + MeasurementAttributionStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getCode()).isEqualTo(AD_SERVICES_MEASUREMENT_ATTRIBUTION); + expect.that(loggedStats.getSourceType()) + .isEqualTo(AttributionStatus.SourceType.VIEW.getValue()); + expect.that(loggedStats.getSurfaceType()) + .isEqualTo(AttributionStatus.AttributionSurface.APP_WEB.getValue()); + expect.that(loggedStats.getResult()) + .isEqualTo(AttributionStatus.AttributionResult.SUCCESS.getValue()); + expect.that(loggedStats.getFailureType()) + .isEqualTo(AttributionStatus.FailureType.UNKNOWN.getValue()); + expect.that(loggedStats.isSourceDerived()).isFalse(); + expect.that(loggedStats.isInstallAttribution()).isTrue(); + expect.that(loggedStats.getAttributionDelay()).isEqualTo(100L); } @Test @@ -585,10 +534,10 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<MeasurementWipeoutStats> argumentCaptor = ArgumentCaptor.forClass(MeasurementWipeoutStats.class); verify(mStatsdLoggerMock).logMeasurementWipeoutStats(argumentCaptor.capture()); - assertEquals(argumentCaptor.getValue().getCode(), AD_SERVICES_MEASUREMENT_WIPEOUT); - assertEquals( - argumentCaptor.getValue().getWipeoutType(), - WipeoutStatus.WipeoutType.CONSENT_FLIP.ordinal()); + MeasurementWipeoutStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getCode()).isEqualTo(AD_SERVICES_MEASUREMENT_WIPEOUT); + expect.that(loggedStats.getWipeoutType()) + .isEqualTo(WipeoutStatus.WipeoutType.CONSENT_FLIP.ordinal()); } @Test @@ -608,11 +557,11 @@ public class AdServicesLoggerImplTest { ArgumentCaptor.forClass(MeasurementDelayedSourceRegistrationStats.class); verify(mStatsdLoggerMock) .logMeasurementDelayedSourceRegistrationStats(argumentCaptor.capture()); - assertEquals( - argumentCaptor.getValue().getCode(), - AD_SERVICES_MEASUREMENT_DELAYED_SOURCE_REGISTRATION); - assertEquals(argumentCaptor.getValue().getRegistrationStatus(), UnknownEnumValue); - assertEquals(argumentCaptor.getValue().getRegistrationDelay(), registrationDelay); + MeasurementDelayedSourceRegistrationStats loggedStats = argumentCaptor.getValue(); + expect.that(loggedStats.getCode()) + .isEqualTo(AD_SERVICES_MEASUREMENT_DELAYED_SOURCE_REGISTRATION); + expect.that(loggedStats.getRegistrationStatus()).isEqualTo(UnknownEnumValue); + expect.that(loggedStats.getRegistrationDelay()).isEqualTo(registrationDelay); } @Test @@ -621,22 +570,21 @@ public class AdServicesLoggerImplTest { EnrollmentStatus.TransactionType.READ_TRANSACTION_TYPE.ordinal(); AdServicesLoggerImpl adServicesLogger = new AdServicesLoggerImpl(mStatsdLoggerMock); adServicesLogger.logEnrollmentDataStats(transactionTypeEnumValue, true, 100); - verify(mStatsdLoggerMock) - .logEnrollmentDataStats(eq(transactionTypeEnumValue), eq(true), eq(100)); + verify(mStatsdLoggerMock).logEnrollmentDataStats(transactionTypeEnumValue, true, 100); } @Test public void testLogEnrollmentMatchStats() { AdServicesLoggerImpl adServicesLogger = new AdServicesLoggerImpl(mStatsdLoggerMock); adServicesLogger.logEnrollmentMatchStats(true, 100); - verify(mStatsdLoggerMock).logEnrollmentMatchStats(eq(true), eq(100)); + verify(mStatsdLoggerMock).logEnrollmentMatchStats(true, 100); } @Test public void testLogEnrollmentFileDownloadStats() { AdServicesLoggerImpl adServicesLogger = new AdServicesLoggerImpl(mStatsdLoggerMock); adServicesLogger.logEnrollmentFileDownloadStats(true, 100); - verify(mStatsdLoggerMock).logEnrollmentFileDownloadStats(eq(true), eq(100)); + verify(mStatsdLoggerMock).logEnrollmentFileDownloadStats(true, 100); } @Test @@ -650,11 +598,7 @@ public class AdServicesLoggerImplTest { 100, dataFileGroupStatusEnumValue, 10, "SomeSdkName", errorCauseEnumValue); verify(mStatsdLoggerMock) .logEnrollmentFailedStats( - eq(100), - eq(dataFileGroupStatusEnumValue), - eq(10), - eq("SomeSdkName"), - eq(errorCauseEnumValue)); + 100, dataFileGroupStatusEnumValue, 10, "SomeSdkName", errorCauseEnumValue); } @Test @@ -683,14 +627,14 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<MeasurementClickVerificationStats> argumentCaptor = ArgumentCaptor.forClass(MeasurementClickVerificationStats.class); verify(mStatsdLoggerMock).logMeasurementClickVerificationStats(argumentCaptor.capture()); - assertEquals(stats, argumentCaptor.getValue()); + expect.that(stats).isEqualTo(argumentCaptor.getValue()); } @Test public void testLogEncryptionKeyFetchedStats() { - final String enrollmentId = "enrollmentId"; - final String companyId = "companyId"; - final String encryptionKeyUrl = "https://www.adtech1.com/.well-known/encryption-keys"; + String enrollmentId = "enrollmentId"; + String companyId = "companyId"; + String encryptionKeyUrl = "https://www.adtech1.com/.well-known/encryption-keys"; AdServicesEncryptionKeyFetchedStats stats = AdServicesEncryptionKeyFetchedStats.builder() @@ -708,7 +652,7 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<AdServicesEncryptionKeyFetchedStats> argumentCaptor = ArgumentCaptor.forClass(AdServicesEncryptionKeyFetchedStats.class); verify(mStatsdLoggerMock).logEncryptionKeyFetchedStats(argumentCaptor.capture()); - assertEquals(stats, argumentCaptor.getValue()); + expect.that(stats).isEqualTo(argumentCaptor.getValue()); } @Test @@ -726,7 +670,7 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<AdServicesEncryptionKeyDbTransactionEndedStats> argumentCaptor = ArgumentCaptor.forClass(AdServicesEncryptionKeyDbTransactionEndedStats.class); verify(mStatsdLoggerMock).logEncryptionKeyDbTransactionEndedStats(argumentCaptor.capture()); - assertEquals(stats, argumentCaptor.getValue()); + expect.that(stats).isEqualTo(argumentCaptor.getValue()); } @Test @@ -760,7 +704,7 @@ public class AdServicesLoggerImplTest { ArgumentCaptor.forClass(DestinationRegisteredBeaconsReportedStats.class); verify(mStatsdLoggerMock).logDestinationRegisteredBeaconsReportedStats( argumentCaptor.capture()); - assertEquals(stats, argumentCaptor.getValue()); + expect.that(stats).isEqualTo(argumentCaptor.getValue()); } @Test @@ -778,7 +722,7 @@ public class AdServicesLoggerImplTest { ArgumentCaptor<ReportInteractionApiCalledStats> argumentCaptor = ArgumentCaptor.forClass(ReportInteractionApiCalledStats.class); verify(mStatsdLoggerMock).logReportInteractionApiCalledStats(argumentCaptor.capture()); - assertEquals(stats, argumentCaptor.getValue()); + expect.that(stats).isEqualTo(argumentCaptor.getValue()); } @Test @@ -796,6 +740,6 @@ public class AdServicesLoggerImplTest { ArgumentCaptor.forClass(InteractionReportingTableClearedStats.class); verify(mStatsdLoggerMock).logInteractionReportingTableClearedStats( argumentCaptor.capture()); - assertEquals(stats, argumentCaptor.getValue()); + expect.that(stats).isEqualTo(argumentCaptor.getValue()); } } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/stats/StatsdAdServicesLoggerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/stats/StatsdAdServicesLoggerTest.java index 50dfe87bec..8ef66086ba 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/stats/StatsdAdServicesLoggerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/stats/StatsdAdServicesLoggerTest.java @@ -16,6 +16,7 @@ package com.android.adservices.service.stats; +import static com.android.adservices.mockito.ExtendedMockitoExpectations.mockIsAtLeastT; import static com.android.adservices.service.stats.AdServicesEncryptionKeyDbTransactionEndedStats.DbTransactionStatus.INSERT_EXCEPTION; import static com.android.adservices.service.stats.AdServicesEncryptionKeyDbTransactionEndedStats.DbTransactionType.WRITE_TRANSACTION_TYPE; import static com.android.adservices.service.stats.AdServicesEncryptionKeyDbTransactionEndedStats.MethodName.INSERT_KEY; @@ -36,18 +37,18 @@ import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICE import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_MEASUREMENT_WIPEOUT; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_MEASUREMENT_CLICK_VERIFICATION; import static com.android.adservices.service.stats.AdServicesStatsLog.DESTINATION_REGISTERED_BEACONS; -import static com.android.adservices.service.stats.AdServicesStatsLog.DESTINATION_REGISTERED_BEACONS__DESTINATION__SELLER_DESTINATION; import static com.android.adservices.service.stats.AdServicesStatsLog.INTERACTION_REPORTING_TABLE_CLEARED; import static com.android.adservices.service.stats.AdServicesStatsLog.REPORT_INTERACTION_API_CALLED; import static com.android.adservices.service.stats.EpochComputationClassifierStats.ClassifierType; import static com.android.adservices.service.stats.EpochComputationClassifierStats.OnDeviceClassifierStatus; import static com.android.adservices.service.stats.EpochComputationClassifierStats.PrecomputedClassifierStatus; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.staticMockMarker; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyIterable; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -57,28 +58,29 @@ import static org.mockito.Mockito.when; import android.adservices.adselection.ReportEventRequest; +import com.android.adservices.common.AdServicesExtendedMockitoTestCase; import com.android.adservices.service.Flags; import com.android.adservices.service.enrollment.EnrollmentStatus; import com.android.adservices.service.measurement.Source; import com.android.adservices.service.measurement.WipeoutStatus; import com.android.adservices.service.measurement.attribution.AttributionStatus; -import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.dx.mockito.inline.extended.MockedVoidMethod; import com.android.modules.utils.build.SdkLevel; +import com.android.modules.utils.testing.ExtendedMockitoRule.SpyStatic; import com.google.common.collect.ImmutableList; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; -import org.mockito.MockitoSession; -import org.mockito.quality.Strictness; import java.util.Arrays; import java.util.List; -public class StatsdAdServicesLoggerTest { +@SpyStatic(SdkLevel.class) +@SpyStatic(AdServicesStatsLog.class) +public final class StatsdAdServicesLoggerTest extends AdServicesExtendedMockitoTestCase { + // Atom IDs private static final int TOPICS_REPORTED_ATOM_ID = 535; private static final int EPOCH_COMPUTATION_CLASSIFIER_ATOM_ID = 537; @@ -119,39 +121,25 @@ public class StatsdAdServicesLoggerTest { private static final int SELLER_DESTINATION = ReportEventRequest.FLAG_REPORTING_DESTINATION_SELLER; - private MockitoSession mMockitoSession; private StatsdAdServicesLogger mLogger; @Mock private Flags mFlags; @Before public void setUp() { - mMockitoSession = - ExtendedMockito.mockitoSession() - .mockStatic(SdkLevel.class) - .mockStatic(AdServicesStatsLog.class) - .strictness(Strictness.LENIENT) - .initMocks(this) - .startMocking(); - mLogger = new StatsdAdServicesLogger(mFlags); } - @After - public void tearDown() { - mMockitoSession.finishMocking(); - } - @Test public void testLogGetTopicsReportedStats_tPlus() { // Mocks when(mFlags.getCompatLoggingKillSwitch()).thenReturn(false); - ExtendedMockito.doReturn(true).when(SdkLevel::isAtLeastT); - ExtendedMockito.doNothing() + mockIsAtLeastT(true); + doNothing() .when( () -> AdServicesStatsLog.write( anyInt(), anyInt(), anyInt(), anyInt(), any(byte[].class))); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -161,7 +149,7 @@ public class StatsdAdServicesLoggerTest { mLogger.logGetTopicsReportedStats(TOPICS_REPORTED_STATS_DATA); // Verify compat logging - ExtendedMockito.verify( + verify( () -> AdServicesStatsLog.write( eq(TOPICS_REPORTED_COMPAT_ATOM_ID), @@ -170,7 +158,7 @@ public class StatsdAdServicesLoggerTest { eq(TOPIC_IDS_COUNT), any(byte[].class))); // Verify T+ logging - ExtendedMockito.verify( + verify( () -> AdServicesStatsLog.write( TOPICS_REPORTED_ATOM_ID, @@ -186,8 +174,8 @@ public class StatsdAdServicesLoggerTest { public void testLogGetTopicsReportedStats_tPlus_noCompatLoggingDueToKillSwitch() { // Mocks when(mFlags.getCompatLoggingKillSwitch()).thenReturn(true); - ExtendedMockito.doReturn(true).when(SdkLevel::isAtLeastT); - ExtendedMockito.doNothing() + mockIsAtLeastT(true); + doNothing() .when( () -> AdServicesStatsLog.write( @@ -197,7 +185,7 @@ public class StatsdAdServicesLoggerTest { mLogger.logGetTopicsReportedStats(TOPICS_REPORTED_STATS_DATA); // Verify T+ logging only - ExtendedMockito.verify( + verify( () -> AdServicesStatsLog.write( TOPICS_REPORTED_ATOM_ID, @@ -213,8 +201,8 @@ public class StatsdAdServicesLoggerTest { public void testLogGetTopicsReportedStats_sMinus() { // Mocks when(mFlags.getCompatLoggingKillSwitch()).thenReturn(false); - ExtendedMockito.doReturn(false).when(SdkLevel::isAtLeastT); - ExtendedMockito.doNothing() + mockIsAtLeastT(false); + doNothing() .when( () -> AdServicesStatsLog.write( @@ -224,7 +212,7 @@ public class StatsdAdServicesLoggerTest { mLogger.logGetTopicsReportedStats(TOPICS_REPORTED_STATS_DATA); // Verify only compat logging took place - ExtendedMockito.verify( + verify( () -> AdServicesStatsLog.write( eq(TOPICS_REPORTED_COMPAT_ATOM_ID), @@ -240,7 +228,7 @@ public class StatsdAdServicesLoggerTest { public void testLogGetTopicsReportedStats_sMinus_noLoggingDueToKillSwitch() { // Mocks when(mFlags.getCompatLoggingKillSwitch()).thenReturn(true); - ExtendedMockito.doReturn(false).when(SdkLevel::isAtLeastT); + mockIsAtLeastT(false); // Invoke logging call mLogger.logGetTopicsReportedStats(TOPICS_REPORTED_STATS_DATA); @@ -253,8 +241,8 @@ public class StatsdAdServicesLoggerTest { public void testLogEpochComputationClassifierStats_tPlus() { // Mocks when(mFlags.getCompatLoggingKillSwitch()).thenReturn(false); - ExtendedMockito.doReturn(true).when(SdkLevel::isAtLeastT); - ExtendedMockito.doNothing() + mockIsAtLeastT(true); + doNothing() .when( () -> AdServicesStatsLog.write( @@ -265,7 +253,7 @@ public class StatsdAdServicesLoggerTest { anyInt(), anyInt(), anyInt())); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -281,7 +269,7 @@ public class StatsdAdServicesLoggerTest { mLogger.logEpochComputationClassifierStats(EPOCH_COMPUTATION_CLASSIFIER_STATS_DATA); // Verify compat logging - ExtendedMockito.verify( + verify( () -> AdServicesStatsLog.write( eq(EPOCH_COMPUTATION_CLASSIFIER_COMPAT_ATOM_ID), @@ -297,7 +285,7 @@ public class StatsdAdServicesLoggerTest { .PRECOMPUTED_CLASSIFIER_STATUS_NOT_INVOKED .getCompatLoggingValue()))); // Verify T+ logging - ExtendedMockito.verify( + verify( () -> AdServicesStatsLog.write( EPOCH_COMPUTATION_CLASSIFIER_ATOM_ID, @@ -318,8 +306,8 @@ public class StatsdAdServicesLoggerTest { public void testLogEpochComputationClassifierStats_tPlus_noCompatLoggingDueToKillSwitch() { // Mocks when(mFlags.getCompatLoggingKillSwitch()).thenReturn(true); - ExtendedMockito.doReturn(true).when(SdkLevel::isAtLeastT); - ExtendedMockito.doNothing() + mockIsAtLeastT(true); + doNothing() .when( () -> AdServicesStatsLog.write( @@ -335,7 +323,7 @@ public class StatsdAdServicesLoggerTest { mLogger.logEpochComputationClassifierStats(EPOCH_COMPUTATION_CLASSIFIER_STATS_DATA); // Verify T+ logging - ExtendedMockito.verify( + verify( () -> AdServicesStatsLog.write( EPOCH_COMPUTATION_CLASSIFIER_ATOM_ID, @@ -356,8 +344,8 @@ public class StatsdAdServicesLoggerTest { public void testLogEpochComputationClassifierStats_sMinus() { // Mocks when(mFlags.getCompatLoggingKillSwitch()).thenReturn(false); - ExtendedMockito.doReturn(false).when(SdkLevel::isAtLeastT); - ExtendedMockito.doNothing() + mockIsAtLeastT(false); + doNothing() .when( () -> AdServicesStatsLog.write( @@ -373,7 +361,7 @@ public class StatsdAdServicesLoggerTest { mLogger.logEpochComputationClassifierStats(EPOCH_COMPUTATION_CLASSIFIER_STATS_DATA); // Verify only compat logging took place - ExtendedMockito.verify( + verify( () -> AdServicesStatsLog.write( eq(EPOCH_COMPUTATION_CLASSIFIER_COMPAT_ATOM_ID), @@ -396,7 +384,7 @@ public class StatsdAdServicesLoggerTest { public void testLogEpochComputationClassifierStats_sMinus_noLoggingDueToKillSwitch() { // Mocks when(mFlags.getCompatLoggingKillSwitch()).thenReturn(true); - ExtendedMockito.doReturn(false).when(SdkLevel::isAtLeastT); + mockIsAtLeastT(false); // Invoke logging call mLogger.logEpochComputationClassifierStats(EPOCH_COMPUTATION_CLASSIFIER_STATS_DATA); @@ -409,7 +397,7 @@ public class StatsdAdServicesLoggerTest { public void logMeasurementDebugKeysMatch_success() { when(mFlags.getMeasurementEnableAppPackageNameLogging()).thenReturn(true); when(mFlags.getMeasurementAppPackageNameLoggingAllowlist()).thenReturn(SOURCE_REGISTRANT); - final String enrollmentId = "EnrollmentId"; + String enrollmentId = "EnrollmentId"; long hashedValue = 5000L; long hashLimit = 10000L; int attributionType = AD_SERVICES_MEASUREMENT_DEBUG_KEYS__ATTRIBUTION_TYPE__APP_WEB; @@ -422,7 +410,7 @@ public class StatsdAdServicesLoggerTest { .setDebugJoinKeyHashLimit(hashLimit) .setSourceRegistrant(SOURCE_REGISTRANT) .build(); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -449,7 +437,7 @@ public class StatsdAdServicesLoggerTest { eq(hashedValue), eq(hashLimit), eq(SOURCE_REGISTRANT)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -474,7 +462,7 @@ public class StatsdAdServicesLoggerTest { .setEventReportCount(3) .setEventDebugReportCount(1) .build(); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -515,7 +503,7 @@ public class StatsdAdServicesLoggerTest { eq(1), eq(0)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -530,8 +518,7 @@ public class StatsdAdServicesLoggerTest { .setWipeoutType(WipeoutStatus.WipeoutType.CONSENT_FLIP.ordinal()) .setSourceRegistrant(SOURCE_REGISTRANT) .build(); - ExtendedMockito.doNothing() - .when(() -> AdServicesStatsLog.write(anyInt(), anyInt(), anyString())); + doNothing().when(() -> AdServicesStatsLog.write(anyInt(), anyInt(), anyString())); // Invoke logging call mLogger.logMeasurementWipeoutStats(stats); @@ -544,7 +531,7 @@ public class StatsdAdServicesLoggerTest { eq(WipeoutStatus.WipeoutType.CONSENT_FLIP.ordinal()), eq(SOURCE_REGISTRANT)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -562,7 +549,7 @@ public class StatsdAdServicesLoggerTest { .setRegistrationDelay(registrationDelay) .setRegistrant(SOURCE_REGISTRANT) .build(); - ExtendedMockito.doNothing() + doNothing() .when(() -> AdServicesStatsLog.write(anyInt(), anyInt(), anyLong(), anyString())); // Invoke logging call @@ -577,7 +564,7 @@ public class StatsdAdServicesLoggerTest { eq(registrationDelay), eq(SOURCE_REGISTRANT)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -585,7 +572,7 @@ public class StatsdAdServicesLoggerTest { @Test public void logConsentMigrationStats_success() { when(mFlags.getAdservicesConsentMigrationLoggingEnabled()).thenReturn(true); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -627,7 +614,7 @@ public class StatsdAdServicesLoggerTest { eq(2), eq(2), eq(2)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -660,7 +647,7 @@ public class StatsdAdServicesLoggerTest { public void logMeasurementAdIdMatchForDebugKeys_success() { when(mFlags.getMeasurementEnableAppPackageNameLogging()).thenReturn(true); when(mFlags.getMeasurementAppPackageNameLoggingAllowlist()).thenReturn(SOURCE_REGISTRANT); - final String enrollmentId = "EnrollmentId"; + String enrollmentId = "EnrollmentId"; long uniqueAdIdValue = 1L; long uniqueAdIdLimit = 5L; int attributionType = AD_SERVICES_MEASUREMENT_DEBUG_KEYS__ATTRIBUTION_TYPE__APP_WEB; @@ -673,7 +660,7 @@ public class StatsdAdServicesLoggerTest { .setNumUniqueAdIdsLimit(uniqueAdIdLimit) .setSourceRegistrant(SOURCE_REGISTRANT) .build(); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -700,7 +687,7 @@ public class StatsdAdServicesLoggerTest { eq(uniqueAdIdLimit), eq(SOURCE_REGISTRANT)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -708,7 +695,7 @@ public class StatsdAdServicesLoggerTest { @Test public void logMeasurementAdIdMatchForDebugKeys_appLoggingDisabled_emptyString() { when(mFlags.getMeasurementEnableAppPackageNameLogging()).thenReturn(false); - final String enrollmentId = "EnrollmentId"; + String enrollmentId = "EnrollmentId"; long uniqueAdIdValue = 1L; long uniqueAdIdLimit = 5L; int attributionType = AD_SERVICES_MEASUREMENT_DEBUG_KEYS__ATTRIBUTION_TYPE__APP_WEB; @@ -721,7 +708,7 @@ public class StatsdAdServicesLoggerTest { .setNumUniqueAdIdsLimit(uniqueAdIdLimit) .setSourceRegistrant(SOURCE_REGISTRANT) .build(); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -748,7 +735,7 @@ public class StatsdAdServicesLoggerTest { eq(uniqueAdIdLimit), eq("")); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -757,7 +744,7 @@ public class StatsdAdServicesLoggerTest { public void logMeasurementAdIdMatchForDebugKeys_appNotAllowlisted_emptyString() { when(mFlags.getMeasurementEnableAppPackageNameLogging()).thenReturn(true); when(mFlags.getMeasurementAppPackageNameLoggingAllowlist()).thenReturn(""); - final String enrollmentId = "EnrollmentId"; + String enrollmentId = "EnrollmentId"; long uniqueAdIdValue = 1L; long uniqueAdIdLimit = 5L; int attributionType = AD_SERVICES_MEASUREMENT_DEBUG_KEYS__ATTRIBUTION_TYPE__APP_WEB; @@ -770,7 +757,7 @@ public class StatsdAdServicesLoggerTest { .setNumUniqueAdIdsLimit(uniqueAdIdLimit) .setSourceRegistrant(SOURCE_REGISTRANT) .build(); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -797,7 +784,7 @@ public class StatsdAdServicesLoggerTest { eq(uniqueAdIdLimit), eq("")); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -806,7 +793,7 @@ public class StatsdAdServicesLoggerTest { public void logEnrollmentData_success() { int transactionTypeEnumValue = EnrollmentStatus.TransactionType.WRITE_TRANSACTION_TYPE.ordinal(); - ExtendedMockito.doNothing() + doNothing() .when(() -> AdServicesStatsLog.write(anyInt(), anyInt(), anyBoolean(), anyInt())); // Invoke logging call @@ -821,15 +808,14 @@ public class StatsdAdServicesLoggerTest { eq(true), eq(100)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @Test public void logEnrollmentMatch_success() { - ExtendedMockito.doNothing() - .when(() -> AdServicesStatsLog.write(anyInt(), anyBoolean(), anyInt())); + doNothing().when(() -> AdServicesStatsLog.write(anyInt(), anyBoolean(), anyInt())); // Invoke logging call mLogger.logEnrollmentMatchStats(true, 100); @@ -840,15 +826,14 @@ public class StatsdAdServicesLoggerTest { AdServicesStatsLog.write( eq(AD_SERVICES_ENROLLMENT_MATCHED), eq(true), eq(100)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @Test public void logEnrollmentFileDownload_success() { - ExtendedMockito.doNothing() - .when(() -> AdServicesStatsLog.write(anyInt(), anyBoolean(), anyInt())); + doNothing().when(() -> AdServicesStatsLog.write(anyInt(), anyBoolean(), anyInt())); // Invoke logging call mLogger.logEnrollmentFileDownloadStats(true, 100); @@ -859,7 +844,7 @@ public class StatsdAdServicesLoggerTest { AdServicesStatsLog.write( eq(AD_SERVICES_ENROLLMENT_FILE_DOWNLOADED), eq(true), eq(100)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -870,7 +855,7 @@ public class StatsdAdServicesLoggerTest { EnrollmentStatus.DataFileGroupStatus.PENDING_CUSTOM_VALIDATION.ordinal(); int errorCauseEnumValue = EnrollmentStatus.ErrorCause.ENROLLMENT_BLOCKLISTED_ERROR_CAUSE.ordinal(); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -896,7 +881,7 @@ public class StatsdAdServicesLoggerTest { eq("SomeSdkName"), eq(errorCauseEnumValue)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -922,7 +907,7 @@ public class StatsdAdServicesLoggerTest { .setSourceRegistrant(sourceRegistrant) .build(); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -951,16 +936,16 @@ public class StatsdAdServicesLoggerTest { eq(validDelayWindowMs), eq("")); // App package name not in allow list. - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @Test public void logEncryptionKeyFetchedStats_success() { - final String enrollmentId = "enrollmentId"; - final String companyId = "companyId"; - final String encryptionKeyUrl = "https://www.adtech1.com/.well-known/encryption-keys"; + String enrollmentId = "enrollmentId"; + String companyId = "companyId"; + String encryptionKeyUrl = "https://www.adtech1.com/.well-known/encryption-keys"; AdServicesEncryptionKeyFetchedStats stats = AdServicesEncryptionKeyFetchedStats.builder() @@ -972,7 +957,7 @@ public class StatsdAdServicesLoggerTest { .setEncryptionKeyUrl(encryptionKeyUrl) .build(); - ExtendedMockito.doNothing() + doNothing() .when( () -> AdServicesStatsLog.write( @@ -999,7 +984,7 @@ public class StatsdAdServicesLoggerTest { eq(companyId), eq(encryptionKeyUrl)); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -1013,8 +998,7 @@ public class StatsdAdServicesLoggerTest { .setMethodName(INSERT_KEY) .build(); - ExtendedMockito.doNothing() - .when(() -> AdServicesStatsLog.write(anyInt(), anyInt(), anyInt(), anyInt())); + doNothing().when(() -> AdServicesStatsLog.write(anyInt(), anyInt(), anyInt(), anyInt())); // Invoke logging call. mLogger.logEncryptionKeyDbTransactionEndedStats(stats); @@ -1028,7 +1012,7 @@ public class StatsdAdServicesLoggerTest { eq(INSERT_EXCEPTION.getValue()), eq(INSERT_KEY.getValue())); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -1060,9 +1044,11 @@ public class StatsdAdServicesLoggerTest { .setAdServicesStatusCode(0) .build(); - ExtendedMockito.doNothing() - .when(() -> AdServicesStatsLog.write( - anyInt(), anyInt(), anyInt(), any(), anyInt(), anyInt())); + doNothing() + .when( + () -> + AdServicesStatsLog.write( + anyInt(), anyInt(), anyInt(), any(), anyInt(), anyInt())); // Invoke logging call. mLogger.logDestinationRegisteredBeaconsReportedStats(stats); @@ -1079,7 +1065,7 @@ public class StatsdAdServicesLoggerTest { eq(/* adServicesStatusCode */ 0) ); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -1092,9 +1078,7 @@ public class StatsdAdServicesLoggerTest { .setNumMatchingUris(5) .build(); - ExtendedMockito.doNothing() - .when(() -> AdServicesStatsLog.write( - anyInt(), anyInt(), anyInt())); + doNothing().when(() -> AdServicesStatsLog.write(anyInt(), anyInt(), anyInt())); // Invoke logging call. mLogger.logReportInteractionApiCalledStats(stats); @@ -1108,7 +1092,7 @@ public class StatsdAdServicesLoggerTest { eq(/* numMatchingUris */ 5) ); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } @@ -1121,9 +1105,7 @@ public class StatsdAdServicesLoggerTest { .setNumUnreportedUris(5) .build(); - ExtendedMockito.doNothing() - .when(() -> AdServicesStatsLog.write( - anyInt(), anyInt(), anyInt())); + doNothing().when(() -> AdServicesStatsLog.write(anyInt(), anyInt(), anyInt())); // Invoke logging call. mLogger.logInteractionReportingTableClearedStats(stats); @@ -1137,7 +1119,7 @@ public class StatsdAdServicesLoggerTest { eq(/* numUnreportedUris */ 5) ); - ExtendedMockito.verify(writeInvocation); + verify(writeInvocation); verifyNoMoreInteractions(staticMockMarker(AdServicesStatsLog.class)); } diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/EncryptionManagerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/EncryptionManagerTest.java index 23b3494051..afc827a759 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/EncryptionManagerTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/EncryptionManagerTest.java @@ -127,6 +127,7 @@ public final class EncryptionManagerTest { when(mFlags.getEnableDatabaseSchemaVersion9()).thenReturn(true); when(mFlags.getTopicsEncryptionEnabled()).thenReturn(true); + when(mFlags.getTopicsTestEncryptionPublicKey()).thenReturn(""); } @Test @@ -184,6 +185,23 @@ public final class EncryptionManagerTest { } @Test + public void testEncryption_useTestingKeys() { + String overrideTestKey = "YVfr8K7rpuv45LtaCv9L1eIGxBv/UK22WugJBjg53fo"; + when(mFlags.getTopicsTestEncryptionPublicKey()).thenReturn(overrideTestKey); + Topic topic = Topic.create(/* topic */ 5, /* taxonomyVersion */ 6L, /* modelVersion */ 7L); + + Optional<EncryptedTopic> optionalEncryptedTopic = + mEncryptionManager.encryptTopic(topic, SDK_NAME); + + // Verify EncryptedTopic is not empty. + assertThat(optionalEncryptedTopic.isPresent()).isTrue(); + assertThat(optionalEncryptedTopic.get().getEncryptedTopic()).isNotEmpty(); + // Verify test key used to override has been used. + assertThat(optionalEncryptedTopic.get().getKeyIdentifier()).isEqualTo(overrideTestKey); + assertThat(optionalEncryptedTopic.get().getEncapsulatedKey()).isNotEmpty(); + } + + @Test public void testEncryption_missingKeys() { doNothingOnErrorLogUtilError(); when(mEnrollmentDao.getEnrollmentDataFromSdkName(SDK_NAME)).thenReturn(ENROLLMENT_DATA); diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/TopicsServiceImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/TopicsServiceImplTest.java index fbd5fb26d4..16f20a54e6 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/TopicsServiceImplTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/TopicsServiceImplTest.java @@ -32,6 +32,7 @@ import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICE import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__GET_TOPICS; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__GET_TOPICS_PREVIEW_API; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__ERROR_CODE__PACKAGE_NAME_NOT_FOUND_EXCEPTION; +import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__ERROR_CODE__TOPICS_REQUEST_EMPTY_SDK_NAME; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__TOPICS; import static com.google.common.truth.Truth.assertThat; @@ -287,6 +288,7 @@ public final class TopicsServiceImplTest extends AdServicesExtendedMockitoTestCa } @Test public void checkEmptySdkNameRequests() throws Exception { + ExtendedMockito.doNothing().when(() -> ErrorLogUtil.e(anyInt(), anyInt())); mockGetTopicsDisableDirectAppCalls(true); GetTopicsParam request = @@ -297,6 +299,12 @@ public final class TopicsServiceImplTest extends AdServicesExtendedMockitoTestCa .build(); invokeGetTopicsAndVerifyError(mSpyContext, STATUS_INVALID_ARGUMENT, request, false); + ExtendedMockito.verify( + () -> + ErrorLogUtil.e( + eq( + AD_SERVICES_ERROR_REPORTED__ERROR_CODE__TOPICS_REQUEST_EMPTY_SDK_NAME), + eq(AD_SERVICES_ERROR_REPORTED__PPAPI_NAME__TOPICS))); } @Test |