summaryrefslogtreecommitdiff
path: root/adservices/tests/endtoends/src/com/android/adservices/measurement/MeasurementManagerTest.java
diff options
context:
space:
mode:
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.java269
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");