summaryrefslogtreecommitdiff
path: root/adservices/tests/cts/sandbox/measurement/src/com/android/tests/sandbox/measurement/SandboxedMeasurementManagerTest.java
blob: 6b6f5adfbd10199a91fc5faf1d09713a1c16c4e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.tests.sandbox.measurement;

import static com.google.common.truth.Truth.assertWithMessage;

import android.app.sdksandbox.SdkSandboxManager;
import android.app.sdksandbox.testutils.FakeLoadSdkCallback;
import android.content.Context;
import android.os.Bundle;

import androidx.test.platform.app.InstrumentationRegistry;

import com.android.compatibility.common.util.ShellUtils;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.time.Duration;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeoutException;

/*
 * Test Measurement APIs running within the Sandbox.
 */
@RunWith(JUnit4.class)
public class SandboxedMeasurementManagerTest {
    private static final Executor CALLBACK_EXECUTOR = Executors.newCachedThreadPool();
    private static final String SDK_NAME = "com.android.tests.providers.sdkmeasurement";

    private static final Context sContext =
            InstrumentationRegistry.getInstrumentation().getContext();

    @Before
    public void setup() throws TimeoutException {
        // Start a foreground activity
        SimpleActivity.startAndWaitForSimpleActivity(sContext, Duration.ofMillis(1000));

        // We need to turn the Consent Manager into debug mode to simulate grant Consent
        overrideConsentManagerDebugMode();

        enforceMeasurementEnrollmentCheck(true);

        // Allow sandbox package name to be able to execute Measurement APIs
        allowSandboxPackageNameAccessMeasurementApis();
    }

    @After
    public void shutDown() {
        SimpleActivity.stopSimpleActivity(sContext);

        // Reset back the original values.
        resetAllowSandboxPackageNameAccessMeasurementApis();
        resetOverrideConsentManagerDebugMode();
    }

    @Test
    public void loadSdkAndRunMeasurementApi() {
        // The setup for this test:
        // SandboxedMeasurementManagerTest is the test app.
        // It will load the SdkMeasurement into the Sandbox.
        // The SdkMeasurement (running within the Sandbox) will call all Measurement APIs and verify
        // no errors are thrown.
        // After SdkMeasurement finishes, it will communicate back to the
        // SandboxedMeasurementManagerTest via the loadSdk's callback.
        // In this test, we use the loadSdk's callback as a 2-way communications between the Test
        // app (this class) and the Sdk running within the Sandbox process.

        final SdkSandboxManager sdkSandboxManager =
                sContext.getSystemService(SdkSandboxManager.class);

        // The enrolled URLs should time out when registering to them, because we don't control
        // them; each timeout is 5 seconds, plus some wiggle room
        final FakeLoadSdkCallback callback = new FakeLoadSdkCallback(25);

        // Load SdkMeasurement
        sdkSandboxManager.loadSdk(SDK_NAME, new Bundle(), CALLBACK_EXECUTOR, callback);

        // This verifies SdkMeasurement finished without errors.
        // callback.isLoadSdkSuccessful returns true if there were no errors.
        assertWithMessage(
                        callback.isLoadSdkSuccessful()
                                ? "Callback was successful"
                                : "Callback failed with message " + callback.getLoadSdkErrorMsg())
                .that(callback.isLoadSdkSuccessful())
                .isTrue();
    }

    private void enforceMeasurementEnrollmentCheck(boolean shouldEnforce) {
        ShellUtils.runShellCommand(
                "device_config put adservices disable_measurement_enrollment_check %s",
                !shouldEnforce);
    }

    private void allowSandboxPackageNameAccessMeasurementApis() {
        final String sdkSbxName = "com.android.tests.sandbox.measurement";
        ShellUtils.runShellCommand(
                "device_config put adservices web_context_client_allow_list " + sdkSbxName);
    }

    private void overrideConsentManagerDebugMode() {
        ShellUtils.runShellCommand("setprop debug.adservices.consent_manager_debug_mode true");
    }

    private void resetAllowSandboxPackageNameAccessMeasurementApis() {
        ShellUtils.runShellCommand(
                "device_config put adservices web_context_client_allow_list null");
    }

    private void resetOverrideConsentManagerDebugMode() {
        ShellUtils.runShellCommand("setprop debug.adservices.consent_manager_debug_mode null");
    }
}