diff options
Diffstat (limited to 'adservices/tests/endtoends/src/com/android/adservices/measurement/MeasurementManagerTest.java')
-rw-r--r-- | adservices/tests/endtoends/src/com/android/adservices/measurement/MeasurementManagerTest.java | 269 |
1 files changed, 198 insertions, 71 deletions
diff --git a/adservices/tests/endtoends/src/com/android/adservices/measurement/MeasurementManagerTest.java b/adservices/tests/endtoends/src/com/android/adservices/measurement/MeasurementManagerTest.java index ee01f35858..0fa9238e39 100644 --- a/adservices/tests/endtoends/src/com/android/adservices/measurement/MeasurementManagerTest.java +++ b/adservices/tests/endtoends/src/com/android/adservices/measurement/MeasurementManagerTest.java @@ -15,6 +15,7 @@ */ package com.android.adservices.measurement; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; @@ -40,6 +41,7 @@ import android.content.pm.ApplicationInfo; import android.net.Uri; import android.os.OutcomeReceiver; +import androidx.annotation.NonNull; import androidx.test.core.app.ApplicationProvider; import com.android.compatibility.common.util.ShellUtils; @@ -58,23 +60,20 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class MeasurementManagerTest { - // TODO: Add register tests with non-null callback and executor - private static final String TAG = "MeasurementManagerTest"; - private static final String SERVICE_APK_NAME = "com.android.adservices.api"; private static final String CLIENT_PACKAGE_NAME = "com.android.adservices.endtoendtest"; - private static final long AWAIT_GET_ADID_TIMEOUT = 5000L; + private static final long TIMEOUT = 5000L; protected static final Context sContext = ApplicationProvider.getApplicationContext(); private static final Executor CALLBACK_EXECUTOR = Executors.newCachedThreadPool(); private static final SandboxedSdkContext sSandboxedSdkContext = new SandboxedSdkContext( sContext, + sContext.getClassLoader(), CLIENT_PACKAGE_NAME, new ApplicationInfo(), "sdkName", /* sdkCeDataDir = */ null, /* sdkDeDataDir = */ null); - @After public void tearDown() { resetOverrideConsentManagerDebugMode(); @@ -88,7 +87,7 @@ public class MeasurementManagerTest { ArgumentCaptor<RegistrationRequest> captor = ArgumentCaptor.forClass(RegistrationRequest.class); CountDownLatch countDownLatch = new CountDownLatch(1); - Answer answer = + Answer<Void> answer = (invocation) -> { countDownLatch.countDown(); return null; @@ -101,7 +100,7 @@ public class MeasurementManagerTest { /* executor = */ null, /* callback = */ null); - assertTrue(countDownLatch.await(AWAIT_GET_ADID_TIMEOUT, TimeUnit.SECONDS)); + assertTrue(countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); Assert.assertNotNull(captor.getValue().getPackageName()); Assert.assertEquals(CLIENT_PACKAGE_NAME, captor.getValue().getPackageName()); } @@ -115,7 +114,7 @@ public class MeasurementManagerTest { ArgumentCaptor<RegistrationRequest> captor = ArgumentCaptor.forClass(RegistrationRequest.class); CountDownLatch countDownLatch = new CountDownLatch(1); - Answer answer = + Answer<Void> answer = (invocation) -> { countDownLatch.countDown(); return null; @@ -128,12 +127,52 @@ public class MeasurementManagerTest { /* executor = */ null, /* callback = */ null); - assertTrue(countDownLatch.await(AWAIT_GET_ADID_TIMEOUT, TimeUnit.SECONDS)); + assertTrue(countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); Assert.assertNotNull(captor.getValue().getPackageName()); Assert.assertEquals(CLIENT_PACKAGE_NAME, captor.getValue().getPackageName()); } @Test + public void testRegisterSource_executorAndCallbackCalled() throws Exception { + final MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); + final CountDownLatch anyCountDownLatch = new CountDownLatch(1); + + mm.registerSource( + Uri.parse("https://registration-source"), + /* inputEvent = */ null, + CALLBACK_EXECUTOR, + new OutcomeReceiver<Object, Exception>() { + @Override + public void onResult(@NonNull Object result) { + anyCountDownLatch.countDown(); + } + + @Override + public void onError(@NonNull Exception error) { + anyCountDownLatch.countDown(); + } + }); + + assertTrue(anyCountDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); + } + + private WebSourceRegistrationRequest buildDefaultWebSourceRegistrationRequest() { + WebSourceParams webSourceParams = + new WebSourceParams.Builder(Uri.parse("https://example.com")) + .setDebugKeyAllowed(false) + .build(); + + return new WebSourceRegistrationRequest.Builder( + Collections.singletonList(webSourceParams), + Uri.parse("https://example.com")) + .setInputEvent(null) + .setAppDestination(Uri.parse("android-app://com.example")) + .setWebDestination(Uri.parse("https://example.com")) + .setVerifiedDestination(null) + .build(); + } + + @Test public void testRegisterWebSource_callingApp_expectedAttributionSource() throws Exception { MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); IMeasurementService mockService = mock(IMeasurementService.class); @@ -141,31 +180,19 @@ public class MeasurementManagerTest { ArgumentCaptor<WebSourceRegistrationRequestInternal> captor = ArgumentCaptor.forClass(WebSourceRegistrationRequestInternal.class); CountDownLatch countDownLatch = new CountDownLatch(1); - Answer answer = + Answer<Void> answer = (invocation) -> { countDownLatch.countDown(); return null; }; doAnswer(answer).when(mockService).registerWebSource(captor.capture(), any(), any()); - WebSourceParams webSourceParams = - new WebSourceParams.Builder(Uri.parse("https://example.com")) - .setDebugKeyAllowed(false) - .build(); - - WebSourceRegistrationRequest webSourceRegistrationRequest = - new WebSourceRegistrationRequest.Builder( - Collections.singletonList(webSourceParams), - Uri.parse("https://example.com")) - .setInputEvent(null) - .setAppDestination(Uri.parse("android-app://com.example")) - .setWebDestination(Uri.parse("https://example.com")) - .setVerifiedDestination(null) - .build(); mm.registerWebSource( - webSourceRegistrationRequest, /* executor = */ null, /* callback = */ null); + buildDefaultWebSourceRegistrationRequest(), + /* executor = */ null, + /* callback = */ null); - assertTrue(countDownLatch.await(AWAIT_GET_ADID_TIMEOUT, TimeUnit.SECONDS)); + assertTrue(countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); Assert.assertNotNull(captor.getValue().getPackageName()); Assert.assertEquals(CLIENT_PACKAGE_NAME, captor.getValue().getPackageName()); } @@ -179,36 +206,58 @@ public class MeasurementManagerTest { ArgumentCaptor<WebSourceRegistrationRequestInternal> captor = ArgumentCaptor.forClass(WebSourceRegistrationRequestInternal.class); CountDownLatch countDownLatch = new CountDownLatch(1); - Answer answer = + Answer<Void> answer = (invocation) -> { countDownLatch.countDown(); return null; }; doAnswer(answer).when(mockService).registerWebSource(captor.capture(), any(), any()); - WebSourceParams webSourceParams = - new WebSourceParams.Builder(Uri.parse("https://example.com")) - .setDebugKeyAllowed(false) - .build(); - - WebSourceRegistrationRequest webSourceRegistrationRequest = - new WebSourceRegistrationRequest.Builder( - Collections.singletonList(webSourceParams), - Uri.parse("https://example.com")) - .setInputEvent(null) - .setAppDestination(Uri.parse("android-app://com.example")) - .setWebDestination(Uri.parse("https://example.com")) - .setVerifiedDestination(null) - .build(); mm.registerWebSource( - webSourceRegistrationRequest, /* executor = */ null, /* callback = */ null); + buildDefaultWebSourceRegistrationRequest(), + /* executor = */ null, + /* callback = */ null); - assertTrue(countDownLatch.await(AWAIT_GET_ADID_TIMEOUT, TimeUnit.SECONDS)); + assertTrue(countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); Assert.assertNotNull(captor.getValue().getPackageName()); Assert.assertEquals(CLIENT_PACKAGE_NAME, captor.getValue().getPackageName()); } @Test + public void testRegisterWebSource_executorAndCallbackCalled() throws Exception { + final MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); + final CountDownLatch anyCountDownLatch = new CountDownLatch(1); + + mm.registerWebSource( + buildDefaultWebSourceRegistrationRequest(), + CALLBACK_EXECUTOR, + new OutcomeReceiver<Object, Exception>() { + @Override + public void onResult(@NonNull Object result) { + anyCountDownLatch.countDown(); + } + + @Override + public void onError(@NonNull Exception error) { + anyCountDownLatch.countDown(); + } + }); + + assertTrue(anyCountDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); + } + + private WebTriggerRegistrationRequest buildDefaultWebTriggerRegistrationRequest() { + WebTriggerParams webTriggerParams = + new WebTriggerParams.Builder(Uri.parse("https://example.com")) + .setDebugKeyAllowed(false) + .build(); + return new WebTriggerRegistrationRequest.Builder( + Collections.singletonList(webTriggerParams), + Uri.parse("https://example.com")) + .build(); + } + + @Test public void testRegisterWebTrigger_callingApp_expectedAttributionSource() throws Exception { MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); IMeasurementService mockService = mock(IMeasurementService.class); @@ -216,26 +265,19 @@ public class MeasurementManagerTest { ArgumentCaptor<WebTriggerRegistrationRequestInternal> captor = ArgumentCaptor.forClass(WebTriggerRegistrationRequestInternal.class); CountDownLatch countDownLatch = new CountDownLatch(1); - Answer answer = + Answer<Void> answer = (invocation) -> { countDownLatch.countDown(); return null; }; doAnswer(answer).when(mockService).registerWebTrigger(captor.capture(), any(), any()); - WebTriggerParams webTriggerParams = - new WebTriggerParams.Builder(Uri.parse("https://example.com")) - .setDebugKeyAllowed(false) - .build(); - WebTriggerRegistrationRequest webTriggerRegistrationRequest = - new WebTriggerRegistrationRequest.Builder( - Collections.singletonList(webTriggerParams), - Uri.parse("https://example.com")) - .build(); mm.registerWebTrigger( - webTriggerRegistrationRequest, /* executor = */ null, /* callback = */ null); + buildDefaultWebTriggerRegistrationRequest(), + /* executor = */ null, + /* callback = */ null); - assertTrue(countDownLatch.await(AWAIT_GET_ADID_TIMEOUT, TimeUnit.SECONDS)); + assertTrue(countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); Assert.assertNotNull(captor.getValue().getPackageName()); Assert.assertEquals(CLIENT_PACKAGE_NAME, captor.getValue().getPackageName()); } @@ -249,31 +291,47 @@ public class MeasurementManagerTest { ArgumentCaptor<WebTriggerRegistrationRequestInternal> captor = ArgumentCaptor.forClass(WebTriggerRegistrationRequestInternal.class); CountDownLatch countDownLatch = new CountDownLatch(1); - Answer answer = + Answer<Void> answer = (invocation) -> { countDownLatch.countDown(); return null; }; doAnswer(answer).when(mockService).registerWebTrigger(captor.capture(), any(), any()); - WebTriggerParams webTriggerParams = - new WebTriggerParams.Builder(Uri.parse("https://example.com")) - .setDebugKeyAllowed(false) - .build(); - WebTriggerRegistrationRequest webTriggerRegistrationRequest = - new WebTriggerRegistrationRequest.Builder( - Collections.singletonList(webTriggerParams), - Uri.parse("https://example.com")) - .build(); mm.registerWebTrigger( - webTriggerRegistrationRequest, /* executor = */ null, /* callback = */ null); + buildDefaultWebTriggerRegistrationRequest(), + /* executor = */ null, + /* callback = */ null); - assertTrue(countDownLatch.await(AWAIT_GET_ADID_TIMEOUT, TimeUnit.SECONDS)); + assertTrue(countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); Assert.assertNotNull(captor.getValue().getPackageName()); Assert.assertEquals(CLIENT_PACKAGE_NAME, captor.getValue().getPackageName()); } @Test + public void testRegisterWebTrigger_executorAndCallbackCalled() throws Exception { + final MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); + final CountDownLatch anyCountDownLatch = new CountDownLatch(1); + + mm.registerWebTrigger( + buildDefaultWebTriggerRegistrationRequest(), + CALLBACK_EXECUTOR, + new OutcomeReceiver<Object, Exception>() { + @Override + public void onResult(@NonNull Object result) { + anyCountDownLatch.countDown(); + } + + @Override + public void onError(@NonNull Exception error) { + anyCountDownLatch.countDown(); + } + }); + + assertTrue(anyCountDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); + } + + @Test public void testRegisterTrigger_callingApp_expectedAttributionSource() throws Exception { MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); IMeasurementService mockService = mock(IMeasurementService.class); @@ -281,7 +339,7 @@ public class MeasurementManagerTest { ArgumentCaptor<RegistrationRequest> captor = ArgumentCaptor.forClass(RegistrationRequest.class); CountDownLatch countDownLatch = new CountDownLatch(1); - Answer answer = + Answer<Void> answer = (invocation) -> { countDownLatch.countDown(); return null; @@ -291,7 +349,7 @@ public class MeasurementManagerTest { mm.registerTrigger( Uri.parse("https://example.com"), /* executor = */ null, /* callback = */ null); - assertTrue(countDownLatch.await(AWAIT_GET_ADID_TIMEOUT, TimeUnit.SECONDS)); + assertTrue(countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); Assert.assertNotNull(captor.getValue().getPackageName()); Assert.assertEquals(CLIENT_PACKAGE_NAME, captor.getValue().getPackageName()); } @@ -305,7 +363,7 @@ public class MeasurementManagerTest { ArgumentCaptor<RegistrationRequest> captor = ArgumentCaptor.forClass(RegistrationRequest.class); CountDownLatch countDownLatch = new CountDownLatch(1); - Answer answer = + Answer<Void> answer = (invocation) -> { countDownLatch.countDown(); return null; @@ -315,12 +373,35 @@ public class MeasurementManagerTest { mm.registerTrigger( Uri.parse("https://example.com"), /* executor = */ null, /* callback = */ null); - assertTrue(countDownLatch.await(AWAIT_GET_ADID_TIMEOUT, TimeUnit.SECONDS)); + assertTrue(countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); Assert.assertNotNull(captor.getValue().getPackageName()); Assert.assertEquals(CLIENT_PACKAGE_NAME, captor.getValue().getPackageName()); } @Test + public void testRegisterTrigger_executorAndCallbackCalled() throws Exception { + final MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); + final CountDownLatch anyCountDownLatch = new CountDownLatch(1); + + mm.registerTrigger( + Uri.parse("https://registration-trigger"), + CALLBACK_EXECUTOR, + new OutcomeReceiver<Object, Exception>() { + @Override + public void onResult(@NonNull Object result) { + anyCountDownLatch.countDown(); + } + + @Override + public void onError(@NonNull Exception error) { + anyCountDownLatch.countDown(); + } + }); + + assertTrue(anyCountDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)); + } + + @Test public void testDeleteRegistrations_callingApp_expectedAttributionSource() throws Exception { MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); IMeasurementService mockService = mock(IMeasurementService.class); @@ -356,6 +437,32 @@ public class MeasurementManagerTest { } @Test + public void testDeleteRegistrations_nullExecutor_throwNullPointerException() { + MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); + + assertThrows( + NullPointerException.class, + () -> + mm.deleteRegistrations( + new DeletionRequest.Builder().build(), + /* executor */ null, + i -> new CompletableFuture<>().complete(i))); + } + + @Test + public void testDeleteRegistrations_nullCallback_throwNullPointerException() { + MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); + + assertThrows( + NullPointerException.class, + () -> + mm.deleteRegistrations( + new DeletionRequest.Builder().build(), + CALLBACK_EXECUTOR, + /* callback */ null)); + } + + @Test public void testGetMeasurementApiStatus() throws Exception { MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); overrideConsentManagerDebugMode(); @@ -380,6 +487,26 @@ public class MeasurementManagerTest { Integer.valueOf(MeasurementManager.MEASUREMENT_API_STATE_ENABLED), future.get()); } + @Test + public void testGetMeasurementApiStatus_nullExecutor_throwNullPointerException() { + MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); + overrideConsentManagerDebugMode(); + + assertThrows( + NullPointerException.class, + () -> mm.getMeasurementApiStatus(/* executor */ null, result -> {})); + } + + @Test + public void testGetMeasurementApiStatus_nullCallback_throwNullPointerException() { + MeasurementManager mm = spy(sContext.getSystemService(MeasurementManager.class)); + overrideConsentManagerDebugMode(); + + assertThrows( + NullPointerException.class, + () -> mm.getMeasurementApiStatus(CALLBACK_EXECUTOR, /* callback */ null)); + } + // Override the Consent Manager behaviour - Consent Given private void overrideConsentManagerDebugMode() { ShellUtils.runShellCommand("setprop debug.adservices.consent_manager_debug_mode true"); |