Move DisableAnimationsTestRule to test/ui and add base DummyUiActivityTestCase for DummyUiActivity


Bug: 728297
Change-Id: I5945bb2abaef870e10f60f82b0ff41dab116cd00
Reviewed-on: https://chromium-review.googlesource.com/c/1415771
Commit-Queue: Yun Liu <yliuyliu@google.com>
Reviewed-by: David Trainor <dtrainor@chromium.org>
Cr-Commit-Position: refs/heads/master@{#623833}
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 690fbc39..4ca7824 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -1987,7 +1987,6 @@
   "javatests/src/org/chromium/chrome/browser/dom_distiller/DistillabilityServiceTest.java",
   "javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java",
   "javatests/src/org/chromium/chrome/browser/download/ChromeDownloadDelegateTest.java",
-  "javatests/src/org/chromium/chrome/browser/download/DisableAnimationsRule.java",
   "javatests/src/org/chromium/chrome/browser/download/DownloadActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManagerTest.java",
   "javatests/src/org/chromium/chrome/browser/download/DownloadForegroundServiceTest.java",
@@ -2360,7 +2359,9 @@
   "javatests/src/org/chromium/chrome/browser/widget/bottomsheet/TestBottomSheetContent.java",
   "javatests/src/org/chromium/chrome/browser/widget/findinpage/FindTest.java",
   "javatests/src/org/chromium/chrome/test/crash/IntentionalCrashTest.java",
+  "javatests/src/org/chromium/chrome/test/ui/DisableAnimationsTestRule.java",
   "javatests/src/org/chromium/chrome/test/ui/DummyUiActivity.java",
+  "javatests/src/org/chromium/chrome/test/ui/DummyUiActivityTestCase.java",
   "javatests/src/org/chromium/chrome/test/util/ChromeSigninUtilsTest.java",
 ]
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadActivityTest.java
index b2911bbd..fb4f910 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadActivityTest.java
@@ -62,6 +62,7 @@
 import org.chromium.chrome.browser.widget.ListMenuButton.Item;
 import org.chromium.chrome.browser.widget.selection.SelectionDelegate.SelectionObserver;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.ui.DisableAnimationsTestRule;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.offline_items_collection.OfflineItem;
@@ -80,7 +81,7 @@
 public class DownloadActivityTest {
     // Disable animations to reduce flakiness.
     @ClassRule
-    public static DisableAnimationsRule disableAnimationsRule = new DisableAnimationsRule();
+    public static DisableAnimationsTestRule disableAnimationsRule = new DisableAnimationsTestRule();
 
     @Rule
     public ActivityTestRule<DownloadActivity> mActivityTestRule =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java
index 29c9d50..3e342e9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/home/DownloadActivityV2Test.java
@@ -10,17 +10,12 @@
 import static android.support.test.espresso.matcher.ViewMatchers.withText;
 
 import android.support.test.filters.MediumTest;
-import android.support.test.rule.ActivityTestRule;
 
-import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
+import org.mockito.MockitoAnnotations;
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.metrics.RecordHistogram;
@@ -28,7 +23,6 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.UrlConstants;
-import org.chromium.chrome.browser.download.DisableAnimationsRule;
 import org.chromium.chrome.browser.download.home.list.UiUtils;
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory;
 import org.chromium.chrome.browser.download.ui.StubbedProvider;
@@ -37,6 +31,7 @@
 import org.chromium.chrome.browser.snackbar.SnackbarManager;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ui.DummyUiActivity;
+import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
 import org.chromium.components.feature_engagement.Tracker;
 import org.chromium.components.offline_items_collection.OfflineItem;
 import org.chromium.ui.test.util.UiRestriction;
@@ -44,21 +39,10 @@
 import java.util.HashMap;
 import java.util.Map;
 
-/** Tests the DownloadActivity and the DownloadManagerUi. */
+/** Tests the DownloadActivity home V2. */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
-public class DownloadActivityV2Test {
-    // Disable animations to reduce flakiness.
-    @ClassRule
-    public static DisableAnimationsRule disableAnimationsRule = new DisableAnimationsRule();
-
-    @Rule
-    public ActivityTestRule<DummyUiActivity> mActivityTestRule =
-            new ActivityTestRule<>(DummyUiActivity.class);
-
-    @Rule
-    public MockitoRule mMockitoRule = MockitoJUnit.rule();
-
+public class DownloadActivityV2Test extends DummyUiActivityTestCase {
     @Mock
     private Profile mProfile;
     @Mock
@@ -66,7 +50,6 @@
     @Mock
     private SnackbarManager mSnackbarManager;
 
-    private DummyUiActivity mActivity;
     private DownloadManagerCoordinator mDownloadCoordinator;
 
     @BeforeClass
@@ -77,8 +60,10 @@
         DummyUiActivity.setTestTheme(org.chromium.chrome.R.style.FullscreenWhiteActivityTheme);
     }
 
-    @Before
-    public void setUp() throws Exception {
+    @Override
+    public void setUpTest() throws Exception {
+        super.setUpTest();
+        MockitoAnnotations.initMocks(this);
         // TODO(yliuyliu): Write a new StubbedOfflineContentProvider for new Download UI testing.
         StubbedProvider stubbedProvider = new StubbedProvider();
         OfflineContentAggregatorFactory.setOfflineContentProviderForTests(
@@ -102,8 +87,6 @@
         features.put(ChromeFeatureList.DOWNLOAD_HOME_V2, true);
         features.put(ChromeFeatureList.OFFLINE_PAGES_PREFETCHING, true);
         ChromeFeatureList.setTestFeatures(features);
-
-        mActivity = mActivityTestRule.getActivity();
     }
 
     private void setUpUi() {
@@ -113,9 +96,9 @@
                                                  .setUseNewDownloadPath(true)
                                                  .setUseNewDownloadPathThumbnails(true)
                                                  .build();
-        mDownloadCoordinator =
-                new DownloadManagerCoordinatorImpl(mProfile, mActivity, config, mSnackbarManager);
-        mActivity.setContentView(mDownloadCoordinator.getView());
+        mDownloadCoordinator = new DownloadManagerCoordinatorImpl(
+                mProfile, getActivity(), config, mSnackbarManager);
+        getActivity().setContentView(mDownloadCoordinator.getView());
 
         mDownloadCoordinator.updateForUrl(UrlConstants.DOWNLOADS_URL);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DisableAnimationsRule.java b/chrome/android/javatests/src/org/chromium/chrome/test/ui/DisableAnimationsTestRule.java
similarity index 92%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/download/DisableAnimationsRule.java
rename to chrome/android/javatests/src/org/chromium/chrome/test/ui/DisableAnimationsTestRule.java
index 433c1b9..e6dcb30c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DisableAnimationsRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/test/ui/DisableAnimationsTestRule.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.download;
+package org.chromium.chrome.test.ui;
 
 import android.os.IBinder;
 
@@ -18,21 +18,21 @@
 /**
  * {@link TestRule} to disable animations for UI testing.
  */
-public class DisableAnimationsRule implements TestRule {
+public class DisableAnimationsTestRule implements TestRule {
     private Method mSetAnimationScalesMethod;
     private Method mGetAnimationScalesMethod;
     private Object mWindowManagerObject;
 
     private static final float DISABLED_SCALE_FACTOR = 0.0f;
     private static final float DEFAULT_SCALE_FACTOR = 1.0f;
-    private static final String TAG = "disable_animations";
+    private static final String TAG = "DisableAnimations";
 
     /**
      * Invoke setAnimationScalesMethod to turn off system animations, such as Window animation
      * scale, Transition animation scale, Animator duration scale, which can improve stability
      * and reduce flakiness for UI testing.
      */
-    public DisableAnimationsRule() {
+    public DisableAnimationsTestRule() {
         try {
             Class<?> windowManagerStubClazz = Class.forName("android.view.IWindowManager$Stub");
             Method asInterface =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/test/ui/DummyUiActivityTestCase.java b/chrome/android/javatests/src/org/chromium/chrome/test/ui/DummyUiActivityTestCase.java
new file mode 100644
index 0000000..350a36f
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/test/ui/DummyUiActivityTestCase.java
@@ -0,0 +1,69 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.test.ui;
+
+import android.support.test.rule.ActivityTestRule;
+
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+/**
+ * Test case to instrument DummyUiActivity for UI testing scenarios.
+ * Recommend to use setUpTest() and tearDownTest() to setup and tear down instead of @Before and
+ * @After.
+ */
+public class DummyUiActivityTestCase {
+    private DummyUiActivity mActivity;
+
+    private ActivityTestRule<DummyUiActivity> mActivityTestRule =
+            new ActivityTestRule<>(DummyUiActivity.class);
+
+    // Disable animations to reduce flakiness.
+    @ClassRule
+    public static DisableAnimationsTestRule disableAnimationsRule = new DisableAnimationsTestRule();
+
+    @Rule
+    public TestRule ruleChain = RuleChain.outerRule(mActivityTestRule).around(new TestDriverRule());
+
+    /**
+     * TestRule to setup and tear down for each test.
+     */
+    public final class TestDriverRule implements TestRule {
+        @Override
+        public Statement apply(final Statement base, Description description) {
+            return new Statement() {
+                @Override
+                public void evaluate() throws Throwable {
+                    setUpTest();
+                    try {
+                        base.evaluate();
+                    } finally {
+                        tearDownTest();
+                    }
+                }
+            };
+        }
+    }
+
+    // Override this to setup before test.
+    public void setUpTest() throws Exception {
+        mActivity = mActivityTestRule.getActivity();
+    }
+
+    // Override this to tear down after test.
+    public void tearDownTest() throws Exception {}
+
+    public DummyUiActivity getActivity() {
+        return mActivity;
+    }
+
+    public ActivityTestRule<DummyUiActivity> getActivityTestRule() {
+        return mActivityTestRule;
+    }
+}