Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 200968ad authored by lucychang's avatar lucychang
Browse files

Enhances test cases for isA11yCategoryService

Enhances test cases for isA11yCategoryService by adding test cases
to specify three kinds of A11yCategoryService:
1.sysA11yTool
2.nonSysA11yToolFromAllowedInstallerInAllowedList
2.nonSysA11yToolFromValidInstallerWithoutAllowedList

Bug: 194190613
Test: atest AccessibilitySecurityPolicyTest
Change-Id: I0377e189835e87f5eacc9a4fa92585b5dbf22d11
parent 1149bd1b
Loading
Loading
Loading
Loading
+103 −57
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.accessibility;

import static android.content.pm.PackageManagerInternal.PACKAGE_INSTALLER;

import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;

import static junit.framework.Assert.assertFalse;
@@ -46,6 +48,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.InstallSourceInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.SigningInfo;
@@ -59,6 +62,7 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityWindowInfo;

import com.android.internal.R;
import com.android.server.LocalServices;

import org.junit.Before;
import org.junit.Rule;
@@ -84,10 +88,8 @@ public class AccessibilitySecurityPolicyTest {
    private static final int APP_PID = 2000;
    private static final int SYSTEM_PID = 558;
    private static final int TEST_USER_ID = UserHandle.USER_SYSTEM;
    private static final String TEST_PACKAGE_NAME = "com.android.server.accessibility";
    private static final ComponentName TEST_COMPONENT_NAME = new ComponentName(
            TEST_PACKAGE_NAME, "AccessibilitySecurityPolicyTest");
    private static final String ALLOWED_INSTALL_PACKAGE_NAME = "com.allowed.install.package";
            "com.android.server.accessibility", "AccessibilitySecurityPolicyTest");

    private static final int[] ALWAYS_DISPATCH_EVENTS = {
            AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED,
@@ -158,6 +160,8 @@ public class AccessibilitySecurityPolicyTest {
    private PackageInfo mMockSourcePackageInfo;
    @Mock
    private PolicyWarningUIController mPolicyWarningUIController;
    @Mock
    private PackageManagerInternal mPackageManagerInternal;

    @Before
    public void setUp() throws PackageManager.NameNotFoundException {
@@ -167,20 +171,6 @@ public class AccessibilitySecurityPolicyTest {
        mContext.addMockSystemService(Context.APP_OPS_SERVICE, mMockAppOpsManager);
        mContext.getOrCreateTestableResources().addOverride(
                R.dimen.accessibility_focus_highlight_stroke_width, 1);
        mContext.getOrCreateTestableResources().addOverride(R.array
                        .config_accessibility_allowed_install_source,
                new String[]{ALLOWED_INSTALL_PACKAGE_NAME});

        when(mMockA11yServiceInfo.getResolveInfo()).thenReturn(mMockResolveInfo);
        when(mMockA11yServiceInfo.getComponentName()).thenReturn(TEST_COMPONENT_NAME);
        when(mMockA11yServiceConnection.getServiceInfo()).thenReturn(mMockA11yServiceInfo);
        when(mMockPackageManager.getPackageInfo(ALLOWED_INSTALL_PACKAGE_NAME, 0)).thenReturn(
                mMockSourcePackageInfo);

        mMockResolveInfo.serviceInfo = mMockServiceInfo;
        mMockServiceInfo.applicationInfo = mMockApplicationInfo;
        mMockServiceInfo.packageName = TEST_PACKAGE_NAME;
        mMockSourcePackageInfo.applicationInfo = mMockSourceApplicationInfo;

        mA11ySecurityPolicy = new AccessibilitySecurityPolicy(
                mPolicyWarningUIController, mContext, mMockA11yUserManager);
@@ -621,92 +611,148 @@ public class AccessibilitySecurityPolicyTest {
    }

    @Test
    public void onBoundServicesChanged_bindNonA11yToolService_activateUIControllerAction() {
    public void onBoundServicesChanged_nonA11yTool_invokeAction()
            throws PackageManager.NameNotFoundException {
        final ArrayList<AccessibilityServiceConnection> boundServices = new ArrayList<>();
        boundServices.add(mMockA11yServiceConnection);
        when(mMockA11yServiceInfo.isAccessibilityTool()).thenReturn(false);
        initServiceInfoAndConnection(TEST_COMPONENT_NAME,
                mMockA11yServiceConnection,
                /* isAccessibilityTool= */ false);

        mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, boundServices);

        verify(mPolicyWarningUIController).onNonA11yCategoryServiceBound(eq(TEST_USER_ID),
                eq(TEST_COMPONENT_NAME));
    }

    @Test
    public void onBoundServicesChanged_unbindNonA11yToolService_activateUIControllerAction() {
        onBoundServicesChanged_bindNonA11yToolService_activateUIControllerAction();

        mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, new ArrayList<>());

        verify(mPolicyWarningUIController).onNonA11yCategoryServiceUnbound(eq(TEST_USER_ID),
                eq(TEST_COMPONENT_NAME));
    }

    @Test
    public void onBoundServicesChanged_bindSystemA11yToolService_noUIControllerAction() {
    public void onBoundServicesChanged_sysA11yTool_noAction()
            throws PackageManager.NameNotFoundException {
        final ArrayList<AccessibilityServiceConnection> boundServices = new ArrayList<>();
        initServiceInfoAndConnection(TEST_COMPONENT_NAME,
                mMockA11yServiceConnection,
                /* isAccessibilityTool= */ true,
                /* isSystemApp= */true,
                /* installSourceInfo= */ null);
        boundServices.add(mMockA11yServiceConnection);
        when(mMockApplicationInfo.isSystemApp()).thenReturn(true);
        when(mMockA11yServiceInfo.isAccessibilityTool()).thenReturn(true);

        mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, boundServices);

        verify(mPolicyWarningUIController, never()).onNonA11yCategoryServiceBound(anyInt(), any());
    }

    @Test
    public void onBoundServicesChanged_unbindSystemA11yToolService_noUIControllerAction() {
        onBoundServicesChanged_bindSystemA11yToolService_noUIControllerAction();

        mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, new ArrayList<>());

        verify(mPolicyWarningUIController, never()).onNonA11yCategoryServiceUnbound(anyInt(),
                any());
    }

    @Test
    public void onBoundServicesChanged_bindAllowedSourceA11yToolService_noUIControllerAction()
    public void onBoundServicesChanged_nonSysA11yToolFromAllowedInstallerInAllowedList_noAction()
            throws PackageManager.NameNotFoundException {
        final ArrayList<AccessibilityServiceConnection> boundServices = new ArrayList<>();
        final String allowedSourcePackageName = "com.allowed.install.package";
        mContext.getOrCreateTestableResources().addOverride(R.array
                        .config_accessibility_allowed_install_source,
                new String[]{allowedSourcePackageName});
        // The allowed Installer should be system app in the allowed list.
        InstallSourceInfo allowedSource = initInstallSourceInfo(
                allowedSourcePackageName, /* isSystemApp= */ true);
        initServiceInfoAndConnection(TEST_COMPONENT_NAME,
                mMockA11yServiceConnection,
                /* isAccessibilityTool= */ true,
                /* isSystemApp= */ false,
                allowedSource);
        boundServices.add(mMockA11yServiceConnection);
        when(mMockApplicationInfo.isSystemApp()).thenReturn(false);
        final InstallSourceInfo installSourceInfo = new InstallSourceInfo(
                ALLOWED_INSTALL_PACKAGE_NAME, new SigningInfo(), null,
                ALLOWED_INSTALL_PACKAGE_NAME);
        when(mMockPackageManager.getInstallSourceInfo(TEST_PACKAGE_NAME)).thenReturn(
                installSourceInfo);
        when(mMockSourceApplicationInfo.isSystemApp()).thenReturn(true);
        when(mMockA11yServiceInfo.isAccessibilityTool()).thenReturn(true);

        mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, boundServices);

        verify(mPolicyWarningUIController, never()).onNonA11yCategoryServiceBound(anyInt(), any());

        mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, new ArrayList<>());
        verify(mPolicyWarningUIController, never()).onNonA11yCategoryServiceUnbound(anyInt(),
                any());
    }

    @Test
    public void onBoundServicesChanged_bindUnknownSourceA11yToolService_activateUIControllerAction()
    public void onBoundServicesChanged_nonSysA11yToolFromValidInstallerWithoutAllowedList_noAction()
            throws PackageManager.NameNotFoundException {
        final ArrayList<AccessibilityServiceConnection> boundServices = new ArrayList<>();
        final String validInstallerPackageName = "com.valid.install.package";
        final String defaultInstallerPackageName = "com.default.install.package";
        LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
        when(mPackageManagerInternal.getKnownPackageNames(PACKAGE_INSTALLER,
                TEST_USER_ID)).thenReturn(new String[]{defaultInstallerPackageName});
        mContext.getOrCreateTestableResources().addOverride(R.array
                        .config_accessibility_allowed_install_source,
                new String[]{});
        // The valid Installer should be system app and not the default installer.
        InstallSourceInfo validSource = initInstallSourceInfo(
                validInstallerPackageName, /* isSystemApp= */ true);
        initServiceInfoAndConnection(TEST_COMPONENT_NAME,
                mMockA11yServiceConnection, /* isAccessibilityTool= */ true,
                /* isSystemApp= */ false,
                validSource);
        boundServices.add(mMockA11yServiceConnection);
        when(mMockA11yServiceInfo.isAccessibilityTool()).thenReturn(true);
        final InstallSourceInfo installSourceInfo = new InstallSourceInfo(null, null, null, null);
        when(mMockPackageManager.getInstallSourceInfo(TEST_PACKAGE_NAME)).thenReturn(
                installSourceInfo);

        mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, boundServices);
        verify(mPolicyWarningUIController, never()).onNonA11yCategoryServiceBound(anyInt(), any());

        verify(mPolicyWarningUIController).onNonA11yCategoryServiceBound(eq(TEST_USER_ID),
                eq(TEST_COMPONENT_NAME));
        mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, new ArrayList<>());
        verify(mPolicyWarningUIController, never()).onNonA11yCategoryServiceUnbound(anyInt(),
                any());
    }

    @Test
    public void onSwitchUser_differentUser_activateUIControllerAction() {
        onBoundServicesChanged_bindNonA11yToolService_activateUIControllerAction();
    public void onSwitchUser_oldUserHadAction_invokeActionForOldUser()
            throws PackageManager.NameNotFoundException {
        final int newUserId = 2;
        final ArrayList<AccessibilityServiceConnection> boundServices = new ArrayList<>();
        initServiceInfoAndConnection(TEST_COMPONENT_NAME,
                mMockA11yServiceConnection,
                /* isAccessibilityTool= */ false);
        boundServices.add(mMockA11yServiceConnection);
        mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, boundServices);
        verify(mPolicyWarningUIController).onNonA11yCategoryServiceBound(eq(TEST_USER_ID),
                eq(TEST_COMPONENT_NAME));

        mA11ySecurityPolicy.onSwitchUserLocked(2, new HashSet<>());
        mA11ySecurityPolicy.onSwitchUserLocked(newUserId, new HashSet<>());

        verify(mPolicyWarningUIController).onSwitchUserLocked(eq(2), eq(new HashSet<>()));
        verify(mPolicyWarningUIController).onSwitchUserLocked(eq(newUserId), eq(new HashSet<>()));
        verify(mPolicyWarningUIController).onNonA11yCategoryServiceUnbound(eq(TEST_USER_ID),
                eq(TEST_COMPONENT_NAME));
    }

    private void initServiceInfoAndConnection(ComponentName componentName,
            AccessibilityServiceConnection connection,
            boolean isAccessibilityTool) throws PackageManager.NameNotFoundException {
        initServiceInfoAndConnection(componentName, connection, isAccessibilityTool, false, null);
    }

    private void initServiceInfoAndConnection(ComponentName componentName,
            AccessibilityServiceConnection connection,
            boolean isAccessibilityTool, boolean isSystemApp, InstallSourceInfo installSourceInfo)
            throws PackageManager.NameNotFoundException {
        when(connection.getServiceInfo()).thenReturn(mMockA11yServiceInfo);
        when(mMockA11yServiceInfo.getComponentName()).thenReturn(componentName);
        when(mMockA11yServiceInfo.isAccessibilityTool()).thenReturn(isAccessibilityTool);
        when(mMockA11yServiceInfo.getResolveInfo()).thenReturn(mMockResolveInfo);
        mMockResolveInfo.serviceInfo = mMockServiceInfo;
        mMockServiceInfo.applicationInfo = mMockApplicationInfo;
        mMockServiceInfo.packageName = componentName.getPackageName();
        when(mMockApplicationInfo.isSystemApp()).thenReturn(isSystemApp);
        when(mMockPackageManager.getInstallSourceInfo(componentName.getPackageName())).thenReturn(
                installSourceInfo);
    }

    private InstallSourceInfo initInstallSourceInfo(String packageName, boolean isSystemApp)
            throws PackageManager.NameNotFoundException {
        final InstallSourceInfo installSourceInfo = new InstallSourceInfo(
                packageName, new SigningInfo(), null,
                packageName);
        when(mMockPackageManager.getPackageInfo(packageName, 0)).thenReturn(
                mMockSourcePackageInfo);
        mMockSourcePackageInfo.applicationInfo = mMockSourceApplicationInfo;
        when(mMockSourceApplicationInfo.isSystemApp()).thenReturn(isSystemApp);
        return installSourceInfo;
    }
}