diff --git a/tests/Android.bp b/tests/Android.bp index 5a52440673..ac0749e9e6 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -54,6 +54,7 @@ filegroup { "src/com/android/launcher3/util/rule/SamplerRule.java", "src/com/android/launcher3/util/rule/ScreenRecordRule.java", "src/com/android/launcher3/util/rule/ShellCommandRule.java", + "src/com/android/launcher3/util/rule/TestIsolationRule.java", "src/com/android/launcher3/util/rule/TestStabilityRule.java", "src/com/android/launcher3/util/rule/TISBindRule.java", "src/com/android/launcher3/util/viewcapture_analysis/*.java", diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java index 5240e6a02b..8fac53d7c0 100644 --- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java @@ -68,6 +68,7 @@ import com.android.launcher3.util.rule.FailureWatcher; import com.android.launcher3.util.rule.SamplerRule; import com.android.launcher3.util.rule.ScreenRecordRule; import com.android.launcher3.util.rule.ShellCommandRule; +import com.android.launcher3.util.rule.TestIsolationRule; import com.android.launcher3.util.rule.TestStabilityRule; import com.android.launcher3.util.rule.ViewCaptureRule; @@ -123,6 +124,10 @@ public abstract class AbstractLauncherUiTest { }, DEFAULT_UI_TIMEOUT, launcher); } + public void checkDetectedLeaks() { + checkDetectedLeaks(mLauncher); + } + private static String getActivityLeakErrorMessage(LauncherInstrumentation launcher) { sActivityLeakReported = true; return "Activity leak detector has found leaked activities, " @@ -215,7 +220,8 @@ public abstract class AbstractLauncherUiTest { @Rule public TestRule mOrderSensitiveRules = RuleChain - .outerRule(new SamplerRule()) + .outerRule(new TestIsolationRule(this)) + .around(new SamplerRule()) .around(new TestStabilityRule()) .around(getRulesInsideActivityMonitor()); @@ -488,6 +494,12 @@ public abstract class AbstractLauncherUiTest { } protected void closeLauncherActivity() { + finishLauncherActivity(); + waitForLauncherCondition( + "Launcher still active", launcher -> launcher == null, DEFAULT_UI_TIMEOUT); + } + + public void finishLauncherActivity() { // Destroy Launcher activity. executeOnLauncher(launcher -> { if (launcher != null) { @@ -495,8 +507,6 @@ public abstract class AbstractLauncherUiTest { launcher.finish(); } }); - waitForLauncherCondition( - "Launcher still active", launcher -> launcher == null, DEFAULT_UI_TIMEOUT); } protected boolean isInLaunchedApp(Launcher launcher) { diff --git a/tests/src/com/android/launcher3/util/rule/TestIsolationRule.java b/tests/src/com/android/launcher3/util/rule/TestIsolationRule.java new file mode 100644 index 0000000000..d4bfa6bbe2 --- /dev/null +++ b/tests/src/com/android/launcher3/util/rule/TestIsolationRule.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2023 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.launcher3.util.rule; + +import androidx.annotation.NonNull; + +import com.android.launcher3.ui.AbstractLauncherUiTest; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +/** + * Isolates tests from some of the state created by the previous test. + */ +public class TestIsolationRule implements TestRule { + final AbstractLauncherUiTest mTest; + + public TestIsolationRule(AbstractLauncherUiTest test) { + mTest = test; + } + + @NonNull + @Override + public Statement apply(@NonNull Statement base, @NonNull Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + mTest.finishLauncherActivity(); + mTest.checkDetectedLeaks(); + try { + base.evaluate(); + } finally { + mTest.finishLauncherActivity(); + } + mTest.checkDetectedLeaks(); + } + }; + } +}