Add tests for creating VM with CE/DE contexts
Test: atest MicrodroidTestApp
Change-Id: Iffa4a520be5cb4e742ce4bcf3589fef0d723e39c
diff --git a/javalib/api/test-current.txt b/javalib/api/test-current.txt
index 42ad060..8b7ec11 100644
--- a/javalib/api/test-current.txt
+++ b/javalib/api/test-current.txt
@@ -1,6 +1,10 @@
// Signature format: 2.0
package android.system.virtualmachine {
+ public class VirtualMachine implements java.lang.AutoCloseable {
+ method @NonNull public java.io.File getRootDir();
+ }
+
public final class VirtualMachineConfig {
method @Nullable public String getPayloadConfigPath();
}
diff --git a/javalib/src/android/system/virtualmachine/VirtualMachine.java b/javalib/src/android/system/virtualmachine/VirtualMachine.java
index 63b5628..04b638a 100644
--- a/javalib/src/android/system/virtualmachine/VirtualMachine.java
+++ b/javalib/src/android/system/virtualmachine/VirtualMachine.java
@@ -49,6 +49,7 @@
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.ComponentCallbacks2;
import android.content.Context;
import android.content.res.Configuration;
@@ -984,6 +985,18 @@
}
/**
+ * Returns the root directory where all files related to this {@link VirtualMachine} (e.g.
+ * {@code instance.img}, {@code apk.idsig}, etc) are stored.
+ *
+ * @hide
+ */
+ @TestApi
+ @NonNull
+ public File getRootDir() {
+ return mVmRootPath;
+ }
+
+ /**
* Captures the current state of the VM in a {@link VirtualMachineDescriptor} instance. The VM
* needs to be stopped to avoid inconsistency in its state representation.
*
diff --git a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
index 35b9e61..57703f3 100644
--- a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
+++ b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
@@ -325,6 +325,52 @@
}
@Test
+ @CddTest(requirements = {"9.17/C-1-1"})
+ public void vmFilesStoredInDeDirWhenCreatedFromDEContext() throws Exception {
+ final Context ctx = getContext().createDeviceProtectedStorageContext();
+ final int userId = ctx.getUserId();
+ final VirtualMachineManager vmm = ctx.getSystemService(VirtualMachineManager.class);
+ VirtualMachineConfig config =
+ newVmConfigBuilder().setPayloadBinaryPath("binary/path").build();
+ try {
+ VirtualMachine vm = vmm.create("vm-name", config);
+ // TODO(b/261430346): what about non-primary user?
+ assertThat(vm.getRootDir().getAbsolutePath())
+ .isEqualTo(
+ "/data/user_de/" + userId + "/com.android.microdroid.test/vm/vm-name");
+ } finally {
+ vmm.delete("vm-name");
+ }
+ }
+
+ @Test
+ @CddTest(requirements = {"9.17/C-1-1"})
+ public void vmFilesStoredInCeDirWhenCreatedFromCEContext() throws Exception {
+ final Context ctx = getContext().createCredentialProtectedStorageContext();
+ final int userId = ctx.getUserId();
+ final VirtualMachineManager vmm = ctx.getSystemService(VirtualMachineManager.class);
+ VirtualMachineConfig config =
+ newVmConfigBuilder().setPayloadBinaryPath("binary/path").build();
+ try {
+ VirtualMachine vm = vmm.create("vm-name", config);
+ // TODO(b/261430346): what about non-primary user?
+ assertThat(vm.getRootDir().getAbsolutePath())
+ .isEqualTo("/data/user/" + userId + "/com.android.microdroid.test/vm/vm-name");
+ } finally {
+ vmm.delete("vm-name");
+ }
+ }
+
+ @Test
+ @CddTest(requirements = {"9.17/C-1-1"})
+ public void differentManagersForDifferentContexts() throws Exception {
+ final Context ceCtx = getContext().createCredentialProtectedStorageContext();
+ final Context deCtx = getContext().createDeviceProtectedStorageContext();
+ assertThat(ceCtx.getSystemService(VirtualMachineManager.class))
+ .isNotSameInstanceAs(deCtx.getSystemService(VirtualMachineManager.class));
+ }
+
+ @Test
@CddTest(requirements = {
"9.17/C-1-1",
"9.17/C-1-2",