diff options
author | Xin Li <delphij@google.com> | 2021-03-03 21:41:39 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2021-03-03 21:41:39 +0000 |
commit | 1af6a12e98c9b2c5317b35ebe2d8c8d269e98dce (patch) | |
tree | 4a40de3ab56e53511cca4b5da843de96dad1e693 /tests | |
parent | eeb577dc441eb72b6969ee23e5218bc22d313dca (diff) | |
parent | e085f87400d3044b57e7af85d7e33f1beaefc77c (diff) |
Merge "Merge RQ2A.210305.007"
Diffstat (limited to 'tests')
3 files changed, 135 insertions, 1 deletions
diff --git a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java index 1b5e6dd65540..dddb317f31e5 100644 --- a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java +++ b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java @@ -28,6 +28,7 @@ import android.platform.test.annotations.LargeTest; import com.android.ddmlib.Log; import com.android.tests.rollback.host.AbandonSessionsRule; +import com.android.tradefed.device.DeviceNotAvailableException; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; import com.android.tradefed.util.ProcessInfo; @@ -39,6 +40,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.io.File; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; @RunWith(DeviceJUnit4ClassRunner.class) public class StagedInstallInternalTest extends BaseHostJUnit4Test { @@ -182,9 +186,55 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test { assertThat(sessionIds.length).isEqualTo(3); } + @Test + public void testStagedInstallationShouldCleanUpOnValidationFailure() throws Exception { + List<String> before = getStagingDirectories(); + runPhase("testStagedInstallationShouldCleanUpOnValidationFailure"); + List<String> after = getStagingDirectories(); + assertThat(after).isEqualTo(before); + } + + @Test + public void testStagedInstallationShouldCleanUpOnValidationFailureMultiPackage() + throws Exception { + List<String> before = getStagingDirectories(); + runPhase("testStagedInstallationShouldCleanUpOnValidationFailureMultiPackage"); + List<String> after = getStagingDirectories(); + assertThat(after).isEqualTo(before); + } + + @Test + public void testOrphanedStagingDirectoryGetsCleanedUpOnReboot() throws Exception { + //create random directories in /data/app-staging folder + getDevice().enableAdbRoot(); + getDevice().executeShellCommand("mkdir /data/app-staging/session_123"); + getDevice().executeShellCommand("mkdir /data/app-staging/random_name"); + getDevice().disableAdbRoot(); + + assertThat(getStagingDirectories()).isNotEmpty(); + getDevice().reboot(); + assertThat(getStagingDirectories()).isEmpty(); + } + + private List<String> getStagingDirectories() throws DeviceNotAvailableException { + String baseDir = "/data/app-staging"; + try { + getDevice().enableAdbRoot(); + return getDevice().getFileEntry(baseDir).getChildren(false) + .stream().filter(entry -> entry.getName().matches("session_\\d+")) + .map(entry -> entry.getName()) + .collect(Collectors.toList()); + } catch (Exception e) { + // Return an empty list if any error + return Collections.EMPTY_LIST; + } finally { + getDevice().disableAdbRoot(); + } + } + private void restartSystemServer() throws Exception { // Restart the system server - final long oldStartTime = getDevice().getProcessByName("system_server").getStartTime(); + long oldStartTime = getDevice().getProcessByName("system_server").getStartTime(); getDevice().enableAdbRoot(); // Need root to restart system server assertThat(getDevice().executeShellCommand("am restart")).contains("Restart the system"); diff --git a/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java b/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java index e482708e385b..a0a5a293f2e4 100644 --- a/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java +++ b/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProvider.java @@ -92,6 +92,14 @@ public class FakeSettingsProvider extends MockContentProvider { } /** + * Creates a {@link org.junit.rules.TestRule} that makes sure {@link #clearSettingsProvider()} + * is triggered before and after each test. + */ + public static FakeSettingsProviderRule rule() { + return new FakeSettingsProviderRule(); + } + + /** * This needs to be called before and after using the FakeSettingsProvider class. */ public static void clearSettingsProvider() { diff --git a/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProviderRule.java b/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProviderRule.java new file mode 100644 index 000000000000..c4e9545dfde2 --- /dev/null +++ b/tests/utils/testutils/java/com/android/internal/util/test/FakeSettingsProviderRule.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.util.test; + +import android.content.Context; +import android.provider.Settings; +import android.test.mock.MockContentResolver; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +/** + * JUnit Rule helps keeping test {@link FakeSettingsProvider} clean. + * + * <p>It clears {@link FakeSettingsProvider} before and after each test. Example use: + * <pre class="code"><code class="java"> + * public class ExampleTest { + * + * @Rule public FakeSettingsProviderRule rule = FakeSettingsProvider.rule(); + * + * @Test + * public void shouldDoSomething() { + * ContextResolver cr = rule.mockContentResolver(mContext); + * Settings.Global.putInt(cr, "my_setting_name", 1); + * // Test code relying on my_setting_name value using cr + * } + * } + * </code></pre> + * + * @see FakeSettingsProvider + */ +public final class FakeSettingsProviderRule implements TestRule { + + /** Prevent initialization outside {@link FakeSettingsProvider}. */ + FakeSettingsProviderRule() { + } + + /** + * Creates a {@link MockContentResolver} that uses the {@link FakeSettingsProvider} as the + * {@link Settings#AUTHORITY} provider. + */ + public MockContentResolver mockContentResolver(Context context) { + MockContentResolver contentResolver = new MockContentResolver(context); + contentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); + return contentResolver; + } + + @Override + public Statement apply(Statement base, Description description) { + return new Statement() { + public void evaluate() throws Throwable { + FakeSettingsProvider.clearSettingsProvider(); + try { + base.evaluate(); + } finally { + FakeSettingsProvider.clearSettingsProvider(); + } + } + }; + } +} |