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
This commit is contained in:
lucychang
2021-07-22 18:34:31 +08:00
parent 1149bd1b36
commit 200968ad80

View File

@@ -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());
mA11ySecurityPolicy.onBoundServicesChangedLocked(TEST_USER_ID, new ArrayList<>());
verify(mPolicyWarningUIController, never()).onNonA11yCategoryServiceUnbound(anyInt(),
any());
}
@Test
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));
}
@Test
public void onSwitchUser_differentUser_activateUIControllerAction() {
onBoundServicesChanged_bindNonA11yToolService_activateUIControllerAction();
mA11ySecurityPolicy.onSwitchUserLocked(newUserId, new HashSet<>());
mA11ySecurityPolicy.onSwitchUserLocked(2, 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;
}
}