Move more operations to DeviceState.
They will be reused in the tests to be added later.
This change also makes the tests cleaner and more robust.
Bug: 272245228
Test: atest odsign_e2e_tests_full:OdrefreshHostTest
Change-Id: I6327b00cb3b175fa30c10707cf55d85a0c7fce28
diff --git a/test/odsign/test-src/com/android/tests/odsign/DeviceState.java b/test/odsign/test-src/com/android/tests/odsign/DeviceState.java
index 771623a..012908c 100644
--- a/test/odsign/test-src/com/android/tests/odsign/DeviceState.java
+++ b/test/odsign/test-src/com/android/tests/odsign/DeviceState.java
@@ -26,7 +26,9 @@
import org.w3c.dom.NodeList;
import java.io.File;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.xml.parsers.DocumentBuilder;
@@ -40,12 +42,15 @@
public class DeviceState {
private static final String APEX_INFO_FILE = "/apex/apex-info-list.xml";
private static final String TEST_JAR_RESOURCE_NAME = "/art-gtest-jars-Main.jar";
+ private static final String PHENOTYPE_FLAG_NAMESPACE = "runtime_native_boot";
private final TestInformation mTestInfo;
private final OdsignTestUtils mTestUtils;
private Set<String> mTempFiles = new HashSet<>();
private Set<String> mMountPoints = new HashSet<>();
+ private Map<String, String> mMutatedProperties = new HashMap<>();
+ private Set<String> mMutatedPhenotypeFlags = new HashSet<>();
public DeviceState(TestInformation testInfo) throws Exception {
mTestInfo = testInfo;
@@ -61,6 +66,21 @@
for (String tempFile : mTempFiles) {
mTestInfo.getDevice().deleteFile(tempFile);
}
+
+ for (var entry : mMutatedProperties.entrySet()) {
+ mTestInfo.getDevice().setProperty(
+ entry.getKey(), entry.getValue() != null ? entry.getValue() : "");
+ }
+
+ for (String flag : mMutatedPhenotypeFlags) {
+ mTestInfo.getDevice().executeShellV2Command(String.format(
+ "device_config delete '%s' '%s'", PHENOTYPE_FLAG_NAMESPACE, flag));
+ }
+
+ if (!mMutatedPhenotypeFlags.isEmpty()) {
+ mTestInfo.getDevice().executeShellV2Command(
+ "device_config set_sync_disabled_for_tests none");
+ }
}
/** Simulates that the ART APEX has been upgraded. */
@@ -108,6 +128,41 @@
pushAndBindMount(localFile, "/system/framework/services.jar");
}
+ /** Sets a system property. */
+ public void setProperty(String key, String value) throws Exception {
+ if (!mMutatedProperties.containsKey(key)) {
+ // Backup the original value.
+ mMutatedProperties.put(key, mTestInfo.getDevice().getProperty(key));
+ }
+
+ mTestInfo.getDevice().setProperty(key, value);
+ }
+
+ /** Sets a phenotype flag. */
+ public void setPhenotypeFlag(String key, String value) throws Exception {
+ if (!mMutatedPhenotypeFlags.contains(key)) {
+ // Tests assume that phenotype flags are initially not set. Check if the assumption is
+ // true.
+ assertThat(mTestUtils.assertCommandSucceeds(String.format(
+ "device_config get '%s' '%s'", PHENOTYPE_FLAG_NAMESPACE, key)))
+ .isEqualTo("null");
+ mMutatedPhenotypeFlags.add(key);
+ }
+
+ // Disable phenotype flag syncing. Potentially, we can set `set_sync_disabled_for_tests` to
+ // `until_reboot`, but setting it to `persistent` prevents unrelated system crashes/restarts
+ // from affecting the test. `set_sync_disabled_for_tests` is reset in `restore` anyway.
+ mTestUtils.assertCommandSucceeds("device_config set_sync_disabled_for_tests persistent");
+
+ if (value != null) {
+ mTestUtils.assertCommandSucceeds(String.format(
+ "device_config put '%s' '%s' '%s'", PHENOTYPE_FLAG_NAMESPACE, key, value));
+ } else {
+ mTestUtils.assertCommandSucceeds(
+ String.format("device_config delete '%s' '%s'", PHENOTYPE_FLAG_NAMESPACE, key));
+ }
+ }
+
/**
* Pushes the file to a temporary location and bind-mount it at the given path. This is useful
* when the path is readonly.
diff --git a/test/odsign/test-src/com/android/tests/odsign/OdrefreshHostTest.java b/test/odsign/test-src/com/android/tests/odsign/OdrefreshHostTest.java
index 3091527..ab0297b 100644
--- a/test/odsign/test-src/com/android/tests/odsign/OdrefreshHostTest.java
+++ b/test/odsign/test-src/com/android/tests/odsign/OdrefreshHostTest.java
@@ -165,131 +165,85 @@
@Test
public void verifyEnableUffdGcChangeTriggersCompilation() throws Exception {
- try {
- // Disable phenotype flag syncing. Potentially, we can set
- // `set_sync_disabled_for_tests` to `until_reboot`, but setting it to
- // `persistent` prevents unrelated system crashes/restarts from affecting the
- // test. `set_sync_disabled_for_tests` is reset in the `finally` block anyway.
- getDevice().executeShellV2Command(
- "device_config set_sync_disabled_for_tests persistent");
+ mDeviceState.setPhenotypeFlag("enable_uffd_gc", "false");
- // Simulate that the phenotype flag is set to false.
- getDevice().executeShellV2Command(
- "device_config put runtime_native_boot enable_uffd_gc false");
+ long timeMs = mTestUtils.getCurrentTimeMs();
+ runOdrefresh();
- long timeMs = mTestUtils.getCurrentTimeMs();
- runOdrefresh();
+ // Artifacts should be re-compiled.
+ assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
+ assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
- // Artifacts should be re-compiled.
- assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
- assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
+ mDeviceState.setPhenotypeFlag("enable_uffd_gc", "true");
- // Simulate that the phenotype flag is set to true.
- getDevice().executeShellV2Command(
- "device_config put runtime_native_boot enable_uffd_gc true");
+ timeMs = mTestUtils.getCurrentTimeMs();
+ runOdrefresh();
- timeMs = mTestUtils.getCurrentTimeMs();
- runOdrefresh();
+ // Artifacts should be re-compiled.
+ assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
+ assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
- // Artifacts should be re-compiled.
- assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
- assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
+ // Run odrefresh again with the flag unchanged.
+ timeMs = mTestUtils.getCurrentTimeMs();
+ runOdrefresh();
- // Run odrefresh again with the flag unchanged.
- timeMs = mTestUtils.getCurrentTimeMs();
- runOdrefresh();
+ // Artifacts should not be re-compiled.
+ assertArtifactsNotModifiedAfter(getZygoteArtifacts(), timeMs);
+ assertArtifactsNotModifiedAfter(getSystemServerArtifacts(), timeMs);
- // Artifacts should not be re-compiled.
- assertArtifactsNotModifiedAfter(getZygoteArtifacts(), timeMs);
- assertArtifactsNotModifiedAfter(getSystemServerArtifacts(), timeMs);
+ mDeviceState.setPhenotypeFlag("enable_uffd_gc", null);
- // Simulate that the phenotype flag is cleared.
- getDevice().executeShellV2Command(
- "device_config delete runtime_native_boot enable_uffd_gc");
+ timeMs = mTestUtils.getCurrentTimeMs();
+ runOdrefresh();
- timeMs = mTestUtils.getCurrentTimeMs();
- runOdrefresh();
-
- // Artifacts should be re-compiled.
- assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
- assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
- } finally {
- getDevice().executeShellV2Command("device_config set_sync_disabled_for_tests none");
- getDevice().executeShellV2Command(
- "device_config delete runtime_native_boot enable_uffd_gc");
- }
+ // Artifacts should be re-compiled.
+ assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
+ assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
}
@Test
public void verifySystemServerCompilerFilterOverrideChangeTriggersCompilation()
throws Exception {
- try {
- // Disable phenotype flag syncing. Potentially, we can set
- // `set_sync_disabled_for_tests` to `until_reboot`, but setting it to
- // `persistent` prevents unrelated system crashes/restarts from affecting the
- // test. `set_sync_disabled_for_tests` is reset in the `finally` block anyway.
- getDevice()
- .executeShellV2Command("device_config set_sync_disabled_for_tests persistent");
+ mDeviceState.setPhenotypeFlag("systemservercompilerfilter_override", null);
- // Simulate that the phenotype flag is set to the default value.
- getDevice()
- .executeShellV2Command(
- "device_config put runtime_native_boot"
- + " systemservercompilerfilter_override");
+ long timeMs = mTestUtils.getCurrentTimeMs();
+ runOdrefresh();
- long timeMs = mTestUtils.getCurrentTimeMs();
- runOdrefresh();
+ // Artifacts should not be re-compiled.
+ assertArtifactsNotModifiedAfter(getZygoteArtifacts(), timeMs);
+ assertArtifactsNotModifiedAfter(getSystemServerArtifacts(), timeMs);
- // Artifacts should not be re-compiled.
- assertArtifactsNotModifiedAfter(getZygoteArtifacts(), timeMs);
- assertArtifactsNotModifiedAfter(getSystemServerArtifacts(), timeMs);
+ mDeviceState.setPhenotypeFlag("systemservercompilerfilter_override", "speed");
- // Simulate that the phenotype flag is set to "speed".
- getDevice()
- .executeShellV2Command(
- "device_config put runtime_native_boot"
- + " systemservercompilerfilter_override speed");
+ timeMs = mTestUtils.getCurrentTimeMs();
+ runOdrefresh();
- timeMs = mTestUtils.getCurrentTimeMs();
- runOdrefresh();
+ // Artifacts should be re-compiled.
+ assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
+ assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
- // Artifacts should be re-compiled.
- assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
- assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
+ // Run odrefresh again with the flag unchanged.
+ timeMs = mTestUtils.getCurrentTimeMs();
+ runOdrefresh();
- // Run odrefresh again with the flag unchanged.
- timeMs = mTestUtils.getCurrentTimeMs();
- runOdrefresh();
+ // Artifacts should not be re-compiled.
+ assertArtifactsNotModifiedAfter(getZygoteArtifacts(), timeMs);
+ assertArtifactsNotModifiedAfter(getSystemServerArtifacts(), timeMs);
- // Artifacts should not be re-compiled.
- assertArtifactsNotModifiedAfter(getZygoteArtifacts(), timeMs);
- assertArtifactsNotModifiedAfter(getSystemServerArtifacts(), timeMs);
+ mDeviceState.setPhenotypeFlag("systemservercompilerfilter_override", "verify");
- // Simulate that the phenotype flag is set to "verify".
- getDevice()
- .executeShellV2Command(
- "device_config put runtime_native_boot"
- + " systemservercompilerfilter_override verify");
+ timeMs = mTestUtils.getCurrentTimeMs();
+ runOdrefresh();
- timeMs = mTestUtils.getCurrentTimeMs();
- runOdrefresh();
-
- // Artifacts should be re-compiled.
- assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
- assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
- } finally {
- getDevice().executeShellV2Command("device_config set_sync_disabled_for_tests none");
- getDevice()
- .executeShellV2Command(
- "device_config delete runtime_native_boot"
- + " systemservercompilerfilter_override");
- }
+ // Artifacts should be re-compiled.
+ assertArtifactsModifiedAfter(getZygoteArtifacts(), timeMs);
+ assertArtifactsModifiedAfter(getSystemServerArtifacts(), timeMs);
}
@Test
public void verifySystemPropertyMismatchTriggersCompilation() throws Exception {
// Change a system property from empty to a value.
- getDevice().setProperty("dalvik.vm.foo", "1");
+ mDeviceState.setProperty("dalvik.vm.foo", "1");
long timeMs = mTestUtils.getCurrentTimeMs();
runOdrefresh();
@@ -306,7 +260,7 @@
assertArtifactsNotModifiedAfter(getSystemServerArtifacts(), timeMs);
// Change the system property to another value.
- getDevice().setProperty("dalvik.vm.foo", "2");
+ mDeviceState.setProperty("dalvik.vm.foo", "2");
timeMs = mTestUtils.getCurrentTimeMs();
runOdrefresh();
@@ -323,7 +277,7 @@
assertArtifactsNotModifiedAfter(getSystemServerArtifacts(), timeMs);
// Change the system property to empty.
- getDevice().setProperty("dalvik.vm.foo", "");
+ mDeviceState.setProperty("dalvik.vm.foo", "");
timeMs = mTestUtils.getCurrentTimeMs();
runOdrefresh();