Index: chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java |
index df5bf024cee399ad568a479bf270aae5b1245f4a..0e4a031c307e883dbe9e6062859a210d496d1fa1 100644 |
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java |
@@ -11,16 +11,19 @@ import android.content.Context; |
import android.content.Intent; |
import android.net.Uri; |
import android.support.customtabs.CustomTabsIntent; |
+import android.support.test.filters.MediumTest; |
import android.support.test.filters.SmallTest; |
-import android.test.InstrumentationTestCase; |
+import android.widget.Button; |
+import org.chromium.base.ThreadUtils; |
import org.chromium.base.test.util.CommandLineFlags; |
+import org.chromium.chrome.R; |
import org.chromium.chrome.browser.ChromeSwitches; |
import org.chromium.chrome.browser.ChromeTabbedActivity; |
import org.chromium.chrome.browser.customtabs.CustomTabActivity; |
import org.chromium.chrome.browser.document.ChromeLauncherActivity; |
import org.chromium.chrome.browser.searchwidget.SearchActivity; |
-import org.chromium.chrome.test.util.ApplicationTestUtils; |
+import org.chromium.chrome.test.MultiActivityTestBase; |
import org.chromium.content.browser.test.util.Criteria; |
import org.chromium.content.browser.test.util.CriteriaHelper; |
@@ -28,16 +31,19 @@ import org.chromium.content.browser.test.util.CriteriaHelper; |
* Integration test suite for the first run experience. |
*/ |
@CommandLineFlags.Remove(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE) |
-public class FirstRunIntegrationTest extends InstrumentationTestCase { |
+public class FirstRunIntegrationTest extends MultiActivityTestBase { |
+ private FirstRunActivityTestObserver mTestObserver = new FirstRunActivityTestObserver(); |
+ private Activity mActivity; |
+ |
@Override |
public void setUp() throws Exception { |
super.setUp(); |
- ApplicationTestUtils.setUp(getInstrumentation().getTargetContext(), true); |
+ FirstRunActivity.setObserverForTest(mTestObserver); |
} |
@Override |
public void tearDown() throws Exception { |
- ApplicationTestUtils.tearDown(getInstrumentation().getTargetContext()); |
+ if (mActivity != null) mActivity.finish(); |
super.tearDown(); |
} |
@@ -164,4 +170,105 @@ public class FirstRunIntegrationTest extends InstrumentationTestCase { |
assertEquals(0, freMonitor.getHits()); |
} |
+ @SmallTest |
+ public void testAbortFirstRun() throws Exception { |
+ final ActivityMonitor freMonitor = |
+ new ActivityMonitor(FirstRunActivity.class.getName(), null, false); |
+ Instrumentation instrumentation = getInstrumentation(); |
+ instrumentation.addMonitor(freMonitor); |
+ |
+ final Context context = instrumentation.getTargetContext(); |
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://test.com")); |
+ intent.setPackage(context.getPackageName()); |
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
+ context.startActivity(intent); |
+ |
+ // Because the AsyncInitializationActivity notices that the FRE hasn't been run yet, it |
+ // redirects to it. Once the user closes the FRE, the user should be kicked back into the |
+ // startup flow where they were interrupted. |
+ mActivity = instrumentation.waitForMonitorWithTimeout( |
+ freMonitor, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL); |
+ instrumentation.removeMonitor(freMonitor); |
+ ActivityMonitor activityMonitor = |
+ new ActivityMonitor(ChromeLauncherActivity.class.getName(), null, false); |
+ instrumentation.addMonitor(activityMonitor); |
+ |
+ assertEquals(0, mTestObserver.abortFirstRunExperienceCallback.getCallCount()); |
+ mActivity.onBackPressed(); |
+ mTestObserver.abortFirstRunExperienceCallback.waitForCallback( |
+ "FirstRunActivity didn't abort", 0); |
+ |
+ mActivity = instrumentation.waitForMonitorWithTimeout( |
+ activityMonitor, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL); |
+ CriteriaHelper.pollInstrumentationThread(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return mActivity.isFinishing(); |
+ } |
+ }); |
+ } |
+ |
+ @MediumTest |
+ public void testClickThroughFirstRun() throws Exception { |
+ final ActivityMonitor freMonitor = |
+ new ActivityMonitor(FirstRunActivity.class.getName(), null, false); |
+ Instrumentation instrumentation = getInstrumentation(); |
+ instrumentation.addMonitor(freMonitor); |
+ |
+ final Context context = instrumentation.getTargetContext(); |
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://test.com")); |
+ intent.setPackage(context.getPackageName()); |
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
+ context.startActivity(intent); |
+ |
+ // Because the AsyncInitializationActivity notices that the FRE hasn't been run yet, it |
+ // redirects to it. Once the user closes the FRE, the user should be kicked back into the |
+ // startup flow where they were interrupted. |
+ mActivity = instrumentation.waitForMonitorWithTimeout( |
+ freMonitor, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL); |
+ instrumentation.removeMonitor(freMonitor); |
+ ActivityMonitor activityMonitor = |
+ new ActivityMonitor(ChromeTabbedActivity.class.getName(), null, false); |
+ instrumentation.addMonitor(activityMonitor); |
+ |
+ // Accept the ToS. |
+ mTestObserver.flowIsKnownCallback.waitForCallback("Failed to finalize the flow", 0); |
+ clickButton(mActivity, R.id.terms_accept); |
+ mTestObserver.acceptTermsOfServiceCallback.waitForCallback("Failed to accept the ToS", 0); |
+ mTestObserver.jumpToPageCallback.waitForCallback( |
+ "Failed to try moving to the next screen", 0); |
+ |
+ // Acknowledge that Data Saver will be enabled. |
+ int jumpCallCount = mTestObserver.jumpToPageCallback.getCallCount(); |
+ clickButton(mActivity, R.id.next_button); |
+ mTestObserver.jumpToPageCallback.waitForCallback( |
+ "Failed to try moving to next screen", jumpCallCount); |
+ |
+ // Don't sign in the user. |
+ assertEquals(0, mTestObserver.updateCachedEngineCallback.getCallCount()); |
+ jumpCallCount = mTestObserver.jumpToPageCallback.getCallCount(); |
+ clickButton(mActivity, R.id.negative_button); |
+ mTestObserver.jumpToPageCallback.waitForCallback( |
+ "Failed to try moving to next screen", jumpCallCount); |
+ mTestObserver.updateCachedEngineCallback.waitForCallback( |
+ "Failed to alert search widgets that an update is necessary", 0); |
+ |
+ // FRE should be completed now, which will kick the user back into the interrupted flow. |
+ // In this case, the user gets sent to the ChromeTabbedActivity after a View Intent is |
+ // processed by ChromeLauncherActivity. |
+ mActivity = instrumentation.waitForMonitorWithTimeout( |
+ activityMonitor, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL); |
+ assertNotNull(mActivity); |
+ } |
+ |
+ private void clickButton(final Activity activity, final int id) { |
+ ThreadUtils.runOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ Button button = (Button) activity.findViewById(id); |
+ assertNotNull(button); |
+ button.performClick(); |
+ } |
+ }); |
+ } |
} |