Index: chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1bcbd91f090301ab309517a5ef88c997e7c3ed60 |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java |
@@ -0,0 +1,235 @@ |
+// Copyright 2015 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.browser.partnercustomizations; |
+ |
+import android.content.SharedPreferences; |
+import android.net.Uri; |
+import android.preference.PreferenceManager; |
+import android.test.suitebuilder.annotation.MediumTest; |
+import android.view.View; |
+import android.widget.CheckBox; |
+import android.widget.Checkable; |
+import android.widget.EditText; |
+ |
+import com.google.android.apps.chrome.R; |
+ |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.base.test.util.CommandLineFlags; |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.chrome.browser.ChromeSwitches; |
+import org.chromium.chrome.browser.ChromeTabbedActivity; |
+import org.chromium.chrome.browser.Tab; |
+import org.chromium.chrome.browser.preferences.HomepagePreferences; |
+import org.chromium.chrome.browser.preferences.Preferences; |
+import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; |
+import org.chromium.chrome.browser.tabmodel.TabList; |
+import org.chromium.chrome.browser.tabmodel.TabModel; |
+import org.chromium.chrome.browser.widget.ChromeSwitchCompat; |
+import org.chromium.chrome.test.partnercustomizations.TestPartnerBrowserCustomizationsProvider; |
+import org.chromium.chrome.test.util.ChromeTabUtils; |
+import org.chromium.chrome.test.util.TestHttpServerClient; |
+import org.chromium.content.browser.test.util.CallbackHelper; |
+import org.chromium.content.browser.test.util.Criteria; |
+import org.chromium.content.browser.test.util.CriteriaHelper; |
+import org.chromium.content.browser.test.util.TouchCommon; |
+import org.chromium.content.browser.test.util.UiUtils; |
+ |
+import java.util.concurrent.TimeoutException; |
+ |
+/** |
+ * Integration test suite for partner homepage. |
+ */ |
+public class PartnerHomepageIntegrationTest extends BasePartnerBrowserCustomizationIntegrationTest { |
+ private static final String TEST_URL = |
+ TestHttpServerClient.getUrl("chrome/test/data/android/about.html"); |
+ |
+ @Override |
+ public void startMainActivity() throws InterruptedException { |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable(){ |
+ @Override |
+ public void run() { |
+ // TODO(newt): Remove this once SharedPreferences is cleared automatically at the |
+ // beginning of every test. http://crbug.com/441859 |
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences( |
+ getInstrumentation().getTargetContext()); |
+ sp.edit().clear().apply(); |
+ } |
+ }); |
+ |
+ startMainActivityFromLauncher(); |
+ } |
+ |
+ /** |
+ * Homepage is loaded on startup. |
+ */ |
+ @MediumTest |
+ @Feature({"Homepage" }) |
+ public void testHomepageInitialLoading() { |
+ assertEquals(Uri.parse(TestPartnerBrowserCustomizationsProvider.HOMEPAGE_URI), |
+ Uri.parse(getActivity().getActivityTab().getUrl())); |
+ } |
+ |
+ /** |
+ * Clicking the homepage button should load homepage in the current tab. |
+ */ |
+ @MediumTest |
+ @Feature({"Homepage"}) |
+ public void testHomepageButtonClick() throws InterruptedException { |
+ // Load non-homepage URL. |
+ loadUrl(TEST_URL); |
+ UiUtils.settleDownUI(getInstrumentation()); |
+ assertNotSame(Uri.parse(TestPartnerBrowserCustomizationsProvider.HOMEPAGE_URI), |
+ Uri.parse(getActivity().getActivityTab().getUrl())); |
+ |
+ // Click homepage button. |
+ ChromeTabUtils.waitForTabPageLoaded(getActivity().getActivityTab(), new Runnable() { |
+ @Override |
+ public void run() { |
+ View homeButton = getActivity().findViewById(R.id.home_button); |
+ assertEquals("Homepage button is not shown", |
+ View.VISIBLE, homeButton.getVisibility()); |
+ singleClickView(homeButton); |
+ } |
+ }); |
+ assertEquals(Uri.parse(TestPartnerBrowserCustomizationsProvider.HOMEPAGE_URI), |
+ Uri.parse(getActivity().getActivityTab().getUrl())); |
+ } |
+ |
+ /** |
+ * Homepage button visibility should be updated by enabling and disabling homepage in settings. |
+ * @throws InterruptedException |
+ */ |
+ @MediumTest |
+ @Feature({"Homepage"}) |
+ public void testHomepageButtonEnableDisable() throws InterruptedException { |
+ // Disable homepage. |
+ Preferences homepagePreferenceActivity = |
+ startPreferences(HomepagePreferences.class.getName()); |
+ ChromeSwitchCompat homepageSwitch = |
+ (ChromeSwitchCompat) homepagePreferenceActivity.findViewById(R.id.homepage_switch); |
+ assertNotNull(homepageSwitch); |
+ TouchCommon.singleClickView(homepageSwitch); |
+ waitForCheckedState(homepageSwitch, false); |
+ homepagePreferenceActivity.finish(); |
+ |
+ // Assert no homepage button. |
+ assertFalse(HomepageManager.isHomepageEnabled(getActivity())); |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ assertEquals("Homepage button is shown", View.GONE, |
+ getActivity().findViewById(R.id.home_button).getVisibility()); |
+ } |
+ }); |
+ |
+ // Enable homepage. |
+ homepagePreferenceActivity = startPreferences(HomepagePreferences.class.getName()); |
+ homepageSwitch = |
+ (ChromeSwitchCompat) homepagePreferenceActivity.findViewById(R.id.homepage_switch); |
+ assertNotNull(homepageSwitch); |
+ TouchCommon.singleClickView(homepageSwitch); |
+ waitForCheckedState(homepageSwitch, true); |
+ homepagePreferenceActivity.finish(); |
+ |
+ // Assert homepage button. |
+ assertTrue(HomepageManager.isHomepageEnabled(getActivity())); |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ assertEquals("Homepage button is shown", View.VISIBLE, |
+ getActivity().findViewById(R.id.home_button).getVisibility()); |
+ } |
+ }); |
+ } |
+ |
+ private boolean waitForCheckedState(final Checkable view, final boolean isChecked) |
+ throws InterruptedException { |
+ return CriteriaHelper.pollForUIThreadCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return view.isChecked() == isChecked; |
+ } |
+ }); |
+ } |
+ |
+ /** |
+ * Custom homepage URI should be fixed (e.g., "chrome.com" -> "http://chrome.com/") |
+ * on exiting Homepage settings page. |
+ */ |
+ @MediumTest |
+ @Feature({"Homepage"}) |
+ public void testPreferenceCustomUriFixup() throws InterruptedException { |
+ // Change homepage custom URI on homepage settings. |
+ final Preferences homepagePreferenceActivity = |
+ startPreferences(HomepagePreferences.class.getName()); |
+ CheckBox checkBox = |
+ (CheckBox) homepagePreferenceActivity.findViewById(R.id.default_checkbox); |
+ assertTrue(checkBox.isChecked()); |
+ TouchCommon.singleClickView(checkBox); |
+ TouchCommon.singleClickView(homepagePreferenceActivity.findViewById(R.id.custom_uri)); |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ ((EditText) homepagePreferenceActivity.findViewById(R.id.custom_uri)) |
+ .setText("chrome.com"); |
+ } |
+ }); |
+ homepagePreferenceActivity.finish(); |
+ |
+ UiUtils.settleDownUI(getInstrumentation()); |
+ assertEquals("http://chrome.com/", HomepageManager.getHomepageUri(getActivity())); |
+ } |
+ |
+ /** |
+ * Closing the last tab should also close Chrome on Tabbed mode. |
+ */ |
+ @CommandLineFlags.Add(ChromeSwitches.DISABLE_DOCUMENT_MODE) |
+ @MediumTest |
+ @Feature({"Homepage" }) |
+ public void testLastTabClosed() throws InterruptedException { |
+ ChromeTabUtils.closeCurrentTab(getInstrumentation(), (ChromeTabbedActivity) getActivity()); |
+ assertTrue("Activity was not closed.", |
+ getActivity().isFinishing() || getActivity().isDestroyed()); |
+ } |
+ |
+ /** |
+ * Closing all tabs should finalize all tab closures and close Chrome on Tabbed mode. |
+ */ |
+ @CommandLineFlags.Add(ChromeSwitches.DISABLE_DOCUMENT_MODE) |
+ @MediumTest |
+ @Feature({"Homepage" }) |
+ public void testCloseAllTabs() throws InterruptedException { |
+ final CallbackHelper tabClosed = new CallbackHelper(); |
+ final TabModel tabModel = getActivity().getCurrentTabModel(); |
+ getActivity().getCurrentTabModel().addObserver(new EmptyTabModelObserver() { |
+ @Override |
+ public void didCloseTab(Tab tab) { |
+ if (tabModel.getCount() == 0) tabClosed.notifyCalled(); |
+ } |
+ }); |
+ getInstrumentation().runOnMainSync(new Runnable() { |
+ @Override |
+ public void run() { |
+ getActivity().getTabModelSelector().closeAllTabs(); |
+ } |
+ }); |
+ |
+ try { |
+ tabClosed.waitForCallback(0); |
+ } catch (TimeoutException e) { |
+ fail("Never closed all of the tabs"); |
+ } |
+ assertEquals("Expected no tabs to be present", |
+ 0, getActivity().getCurrentTabModel().getCount()); |
+ TabList fullModel = getActivity().getCurrentTabModel().getComprehensiveModel(); |
+ // By the time TAB_CLOSED event is received, all tab closures should be finalized |
+ assertEquals("Expected no tabs to be present in the comprehensive model", |
+ 0, fullModel.getCount()); |
+ |
+ getInstrumentation().waitForIdleSync(); |
+ assertTrue("Activity was not closed.", |
+ getActivity().isFinishing() || getActivity().isDestroyed()); |
+ } |
+} |