Loading services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +61 −42 Original line number Diff line number Diff line Loading @@ -35,7 +35,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.argThat; import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; Loading Loading @@ -97,8 +96,9 @@ import android.view.DisplayInfo; import android.view.KeyEvent; import android.view.WindowManager; import androidx.test.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry; import com.android.compatibility.common.util.AdoptShellPermissionsRule; import com.android.internal.app.BlockedAppStreamingActivity; import com.android.server.LocalServices; import com.android.server.input.InputManagerInternal; Loading @@ -107,6 +107,7 @@ import com.android.server.sensors.SensorManagerInternal; import com.google.android.collect.Sets; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; Loading Loading @@ -195,6 +196,11 @@ public class VirtualDeviceManagerServiceTest { .build(); private static final String TEST_SITE = "http://test"; @Rule public AdoptShellPermissionsRule mAdoptShellPermissionsRule = new AdoptShellPermissionsRule( InstrumentationRegistry.getInstrumentation().getUiAutomation(), Manifest.permission.CREATE_VIRTUAL_DEVICE); private Context mContext; private InputManagerMockHelper mInputManagerMockHelper; private VirtualDeviceImpl mDeviceImpl; Loading Loading @@ -304,10 +310,9 @@ public class VirtualDeviceManagerServiceTest { LocalServices.removeServiceForTest(DisplayManagerInternal.class); LocalServices.addService(DisplayManagerInternal.class, mDisplayManagerInternalMock); mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); mContext = Mockito.spy(new ContextWrapper( InstrumentationRegistry.getInstrumentation().getTargetContext())); doReturn(mContext).when(mContext).createContextAsUser(eq(Process.myUserHandle()), anyInt()); doNothing().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn( mDevicePolicyManagerMock); Loading Loading @@ -844,53 +849,52 @@ public class VirtualDeviceManagerServiceTest { @Test public void createVirtualDpad_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualDpad(DPAD_CONFIG, BINDER)); } } @Test public void createVirtualKeyboard_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualKeyboard(KEYBOARD_CONFIG, BINDER)); } } @Test public void createVirtualMouse_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualMouse(MOUSE_CONFIG, BINDER)); } } @Test public void createVirtualTouchscreen_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualTouchscreen(TOUCHSCREEN_CONFIG, BINDER)); } } @Test public void createVirtualNavigationTouchpad_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualNavigationTouchpad(NAVIGATION_TOUCHPAD_CONFIG, BINDER)); } } @Test public void createVirtualSensor_noPermission_failsSecurityException() { doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows( SecurityException.class, () -> mDeviceImpl.createVirtualSensor( Loading @@ -898,23 +902,24 @@ public class VirtualDeviceManagerServiceTest { new VirtualSensorConfig.Builder( Sensor.TYPE_ACCELEROMETER, DEVICE_NAME).build())); } } @Test public void onAudioSessionStarting_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.onAudioSessionStarting( DISPLAY_ID_1, mRoutingCallback, mConfigChangedCallback)); } } @Test public void onAudioSessionEnded_noPermission_failsSecurityException() { doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.onAudioSessionEnded()); } } @Test public void createVirtualDpad_hasDisplay_obtainFileDescriptor() { Loading Loading @@ -1593,4 +1598,18 @@ public class VirtualDeviceManagerServiceTest { mVdms.addVirtualDevice(virtualDeviceImpl); return virtualDeviceImpl; } /** Helper class to drop permissions temporarily and restore them at the end of a test. */ static final class DropShellPermissionsTemporarily implements AutoCloseable { DropShellPermissionsTemporarily() { InstrumentationRegistry.getInstrumentation().getUiAutomation() .dropShellPermissionIdentity(); } @Override public void close() { InstrumentationRegistry.getInstrumentation().getUiAutomation() .adoptShellPermissionIdentity(); } } } Loading
services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +61 −42 Original line number Diff line number Diff line Loading @@ -35,7 +35,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.argThat; import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; Loading Loading @@ -97,8 +96,9 @@ import android.view.DisplayInfo; import android.view.KeyEvent; import android.view.WindowManager; import androidx.test.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry; import com.android.compatibility.common.util.AdoptShellPermissionsRule; import com.android.internal.app.BlockedAppStreamingActivity; import com.android.server.LocalServices; import com.android.server.input.InputManagerInternal; Loading @@ -107,6 +107,7 @@ import com.android.server.sensors.SensorManagerInternal; import com.google.android.collect.Sets; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; Loading Loading @@ -195,6 +196,11 @@ public class VirtualDeviceManagerServiceTest { .build(); private static final String TEST_SITE = "http://test"; @Rule public AdoptShellPermissionsRule mAdoptShellPermissionsRule = new AdoptShellPermissionsRule( InstrumentationRegistry.getInstrumentation().getUiAutomation(), Manifest.permission.CREATE_VIRTUAL_DEVICE); private Context mContext; private InputManagerMockHelper mInputManagerMockHelper; private VirtualDeviceImpl mDeviceImpl; Loading Loading @@ -304,10 +310,9 @@ public class VirtualDeviceManagerServiceTest { LocalServices.removeServiceForTest(DisplayManagerInternal.class); LocalServices.addService(DisplayManagerInternal.class, mDisplayManagerInternalMock); mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); mContext = Mockito.spy(new ContextWrapper( InstrumentationRegistry.getInstrumentation().getTargetContext())); doReturn(mContext).when(mContext).createContextAsUser(eq(Process.myUserHandle()), anyInt()); doNothing().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn( mDevicePolicyManagerMock); Loading Loading @@ -844,53 +849,52 @@ public class VirtualDeviceManagerServiceTest { @Test public void createVirtualDpad_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualDpad(DPAD_CONFIG, BINDER)); } } @Test public void createVirtualKeyboard_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualKeyboard(KEYBOARD_CONFIG, BINDER)); } } @Test public void createVirtualMouse_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualMouse(MOUSE_CONFIG, BINDER)); } } @Test public void createVirtualTouchscreen_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualTouchscreen(TOUCHSCREEN_CONFIG, BINDER)); } } @Test public void createVirtualNavigationTouchpad_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.createVirtualNavigationTouchpad(NAVIGATION_TOUCHPAD_CONFIG, BINDER)); } } @Test public void createVirtualSensor_noPermission_failsSecurityException() { doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows( SecurityException.class, () -> mDeviceImpl.createVirtualSensor( Loading @@ -898,23 +902,24 @@ public class VirtualDeviceManagerServiceTest { new VirtualSensorConfig.Builder( Sensor.TYPE_ACCELEROMETER, DEVICE_NAME).build())); } } @Test public void onAudioSessionStarting_noPermission_failsSecurityException() { mDeviceImpl.mVirtualDisplayIds.add(DISPLAY_ID_1); doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.onAudioSessionStarting( DISPLAY_ID_1, mRoutingCallback, mConfigChangedCallback)); } } @Test public void onAudioSessionEnded_noPermission_failsSecurityException() { doCallRealMethod().when(mContext).enforceCallingOrSelfPermission( eq(Manifest.permission.CREATE_VIRTUAL_DEVICE), anyString()); try (DropShellPermissionsTemporarily drop = new DropShellPermissionsTemporarily()) { assertThrows(SecurityException.class, () -> mDeviceImpl.onAudioSessionEnded()); } } @Test public void createVirtualDpad_hasDisplay_obtainFileDescriptor() { Loading Loading @@ -1593,4 +1598,18 @@ public class VirtualDeviceManagerServiceTest { mVdms.addVirtualDevice(virtualDeviceImpl); return virtualDeviceImpl; } /** Helper class to drop permissions temporarily and restore them at the end of a test. */ static final class DropShellPermissionsTemporarily implements AutoCloseable { DropShellPermissionsTemporarily() { InstrumentationRegistry.getInstrumentation().getUiAutomation() .dropShellPermissionIdentity(); } @Override public void close() { InstrumentationRegistry.getInstrumentation().getUiAutomation() .adoptShellPermissionIdentity(); } } }