summaryrefslogtreecommitdiff
path: root/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java')
-rw-r--r--tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java74
1 files changed, 73 insertions, 1 deletions
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
index 5f9733c61c8..52fb4c37e7f 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityEndToEndTest.java
@@ -17,7 +17,9 @@
package android.accessibilityservice.cts;
import static android.Manifest.permission.POST_NOTIFICATIONS;
+import static android.accessibility.cts.common.InstrumentedAccessibilityService.TIMEOUT_SERVICE_ENABLE;
import static android.accessibility.cts.common.InstrumentedAccessibilityService.enableService;
+import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
import static android.accessibilityservice.cts.utils.AccessibilityEventFilterUtils.filterForEventType;
import static android.accessibilityservice.cts.utils.AccessibilityEventFilterUtils.filterForEventTypeWithAction;
import static android.accessibilityservice.cts.utils.AccessibilityEventFilterUtils.filterForEventTypeWithResource;
@@ -76,7 +78,9 @@ import android.graphics.Region;
import android.os.Process;
import android.os.SystemClock;
import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.AsbSecurityTest;
import android.platform.test.annotations.Presubmit;
+import android.provider.Settings;
import android.test.suitebuilder.annotation.MediumTest;
import android.text.TextUtils;
import android.util.Log;
@@ -99,6 +103,9 @@ import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
import com.android.compatibility.common.util.CtsMouseUtil;
+import com.android.compatibility.common.util.ShellUtils;
+import com.android.compatibility.common.util.TestUtils;
+import com.android.sts.common.util.StsExtraBusinessLogicTestCase;
import org.junit.After;
import org.junit.AfterClass;
@@ -120,7 +127,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
* are generated and their correct dispatch verified.
*/
@RunWith(AndroidJUnit4.class)
-public class AccessibilityEndToEndTest {
+public class AccessibilityEndToEndTest extends StsExtraBusinessLogicTestCase {
private static final String LOG_TAG = "AccessibilityEndToEndTest";
@@ -1013,6 +1020,71 @@ public class AccessibilityEndToEndTest {
}
}
+ @AsbSecurityTest(cveBugId = {243378132})
+ @Test
+ public void testUninstallPackage_DisablesMultipleServices() throws Exception {
+ final String apkPath =
+ "/data/local/tmp/cts/content/CtsAccessibilityMultipleServicesApp.apk";
+ final String packageName = "foo.bar.multipleservices";
+ final ComponentName service1 = ComponentName.createRelative(packageName, ".StubService1");
+ final ComponentName service2 = ComponentName.createRelative(packageName, ".StubService2");
+ // Match AccessibilityManagerService#COMPONENT_NAME_SEPARATOR
+ final String componentNameSeparator = ":";
+
+ final String originalEnabledServicesSetting = getEnabledServicesSetting();
+
+ try {
+ // Install the apk in this test method, instead of as part of the target preparer, to
+ // allow repeated --iterations of the test.
+ com.google.common.truth.Truth.assertThat(
+ ShellUtils.runShellCommand("pm install " + apkPath)).startsWith("Success");
+
+ // Enable the two services and wait until AccessibilityManager reports them as enabled.
+ final String servicesToEnable = getEnabledServicesSetting() + componentNameSeparator
+ + service1.flattenToShortString() + componentNameSeparator
+ + service2.flattenToShortString();
+ ShellCommandBuilder.create(sInstrumentation)
+ .putSecureSetting(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ servicesToEnable)
+ .putSecureSetting(Settings.Secure.ACCESSIBILITY_ENABLED, "1")
+ .run();
+ TestUtils.waitUntil("Failed to enable 2 services from package " + packageName,
+ (int) TIMEOUT_SERVICE_ENABLE / 1000,
+ () -> getEnabledServices().stream().filter(
+ info -> info.getId().startsWith(packageName)).count() == 2);
+
+ // Uninstall the package that contains the services.
+ com.google.common.truth.Truth.assertThat(
+ ShellUtils.runShellCommand("pm uninstall " + packageName)).startsWith(
+ "Success");
+
+ // Ensure the uninstall removed the services from the secure setting.
+ TestUtils.waitUntil(
+ "Failed to disable services after uninstalling package " + packageName,
+ (int) TIMEOUT_SERVICE_ENABLE / 1000,
+ () -> !getEnabledServicesSetting().contains(packageName));
+ } finally {
+ ShellCommandBuilder.create(sInstrumentation)
+ .putSecureSetting(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ originalEnabledServicesSetting)
+ .run();
+ ShellUtils.runShellCommand("pm uninstall " + packageName);
+ }
+ }
+
+ private List<AccessibilityServiceInfo> getEnabledServices() {
+ return ((AccessibilityManager) sInstrumentation.getContext().getSystemService(
+ Context.ACCESSIBILITY_SERVICE)).getEnabledAccessibilityServiceList(
+ FEEDBACK_ALL_MASK);
+ }
+
+ private String getEnabledServicesSetting() {
+ final String result = Settings.Secure.getString(
+ sInstrumentation.getContext().getContentResolver(),
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
+ return result != null ? result : "";
+ }
+
private static void assertPackageName(AccessibilityNodeInfo node, String packageName) {
if (node == null) {
return;