diff options
author | 2024-10-09 00:29:02 +0000 | |
---|---|---|
committer | 2024-10-09 00:29:03 +0000 | |
commit | 9c7227ee47154aeef8e2fcd59b89a328038b3433 (patch) | |
tree | f3954702fdf1aae25b5501df64e849e7f74eeab9 /ravenwood/junit-impl-src | |
parent | b1815bd8ce061386eeca68a04bc9e6ccaaaf61ee (diff) |
[Ravenwood] Mock UiAutomation to support permission APIs
On Ravenwood, since there are no "permissions", we can provide no-op
implementations for adopt/drop shell permissions method families in
UiAutomation. To prevent pulling in a lot of unnecessary internal
dependencies of UiAutomation, we simply inject a mock UiAutomation in
our Instrumentation class.
Flag: EXEMPT host test change only
Bug: 292141694
Test: atest RavenwoodBivalentTest
Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/run-ravenwood-tests.sh
Change-Id: I8826a8c491efa5fc8d6cb10cf11c6dd677ad7f31
Diffstat (limited to 'ravenwood/junit-impl-src')
-rw-r--r-- | ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java index 4ae5bd1f7b71..5894476b9201 100644 --- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java +++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java @@ -22,10 +22,14 @@ import static com.android.ravenwood.common.RavenwoodCommonUtils.RAVENWOOD_VERBOS import static com.android.ravenwood.common.RavenwoodCommonUtils.RAVENWOOD_VERSION_JAVA_SYSPROP; import static org.junit.Assert.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; import android.app.ActivityManager; import android.app.Instrumentation; import android.app.ResourcesManager; +import android.app.UiAutomation; import android.content.res.Resources; import android.os.Binder; import android.os.Build; @@ -40,6 +44,7 @@ import android.util.Log; import androidx.test.platform.app.InstrumentationRegistry; +import com.android.hoststubgen.hosthelper.HostTestUtils; import com.android.internal.os.RuntimeInit; import com.android.ravenwood.RavenwoodRuntimeNative; import com.android.ravenwood.common.RavenwoodCommonUtils; @@ -52,8 +57,10 @@ import org.junit.runner.Description; import java.io.File; import java.io.IOException; import java.io.PrintStream; +import java.util.Collections; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -125,6 +132,9 @@ public class RavenwoodRuntimeEnvironmentController { private static RavenwoodConfig sConfig; private static RavenwoodSystemProperties sProps; + // TODO: use the real UiAutomation class instead of a mock + private static UiAutomation sMockUiAutomation; + private static Set<String> sAdoptedPermissions = Collections.emptySet(); private static boolean sInitialized = false; /** @@ -171,6 +181,7 @@ public class RavenwoodRuntimeEnvironmentController { "androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner"); assertMockitoVersion(); + sMockUiAutomation = createMockUiAutomation(); } /** @@ -261,7 +272,7 @@ public class RavenwoodRuntimeEnvironmentController { // Prepare other fields. config.mInstrumentation = new Instrumentation(); - config.mInstrumentation.basicInit(config.mInstContext, config.mTargetContext); + config.mInstrumentation.basicInit(instContext, targetContext, sMockUiAutomation); InstrumentationRegistry.registerInstance(config.mInstrumentation, Bundle.EMPTY); RavenwoodSystemServer.init(config); @@ -300,12 +311,13 @@ public class RavenwoodRuntimeEnvironmentController { config.mInstrumentation = null; if (config.mInstContext != null) { ((RavenwoodContext) config.mInstContext).cleanUp(); + config.mInstContext = null; } if (config.mTargetContext != null) { ((RavenwoodContext) config.mTargetContext).cleanUp(); + config.mTargetContext = null; } - config.mInstContext = null; - config.mTargetContext = null; + sMockUiAutomation.dropShellPermissionIdentity(); if (config.mProvideMainThread) { Looper.getMainLooper().quit(); @@ -407,6 +419,31 @@ public class RavenwoodRuntimeEnvironmentController { () -> Class.forName("org.mockito.Matchers")); } + private static UiAutomation createMockUiAutomation() { + var mock = mock(UiAutomation.class, inv -> { + HostTestUtils.onThrowMethodCalled(); + return null; + }); + doAnswer(inv -> { + sAdoptedPermissions = UiAutomation.ALL_PERMISSIONS; + return null; + }).when(mock).adoptShellPermissionIdentity(); + doAnswer(inv -> { + if (inv.getArgument(0) == null) { + sAdoptedPermissions = UiAutomation.ALL_PERMISSIONS; + } else { + sAdoptedPermissions = (Set) Set.of(inv.getArguments()); + } + return null; + }).when(mock).adoptShellPermissionIdentity(any()); + doAnswer(inv -> { + sAdoptedPermissions = Collections.emptySet(); + return null; + }).when(mock).dropShellPermissionIdentity(); + doAnswer(inv -> sAdoptedPermissions).when(mock).getAdoptedShellPermissions(); + return mock; + } + @SuppressWarnings("unused") // Called from native code (ravenwood_sysprop.cpp) private static void checkSystemPropertyAccess(String key, boolean write) { boolean result = write ? sProps.isKeyWritable(key) : sProps.isKeyReadable(key); |