Index: chrome/android/javatests_shell/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
diff --git a/chrome/android/javatests_shell/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java b/chrome/android/javatests_shell/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
index 538c34bd5c8b97d5eb334f83392e09b42c913353..6107c0b6c2a7a771597f47cff6739b5742fa2905 100644 |
--- a/chrome/android/javatests_shell/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
+++ b/chrome/android/javatests_shell/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
@@ -4,11 +4,19 @@ |
package org.chromium.chrome.browser.banners; |
+import android.app.Activity; |
+import android.app.Instrumentation.ActivityMonitor; |
+import android.app.Instrumentation.ActivityResult; |
+import android.content.Intent; |
+import android.content.IntentFilter; |
+import android.content.pm.PackageInfo; |
import android.net.Uri; |
+import android.test.mock.MockPackageManager; |
import android.test.suitebuilder.annotation.MediumTest; |
import android.test.suitebuilder.annotation.SmallTest; |
import android.text.TextUtils; |
import android.view.View; |
+import android.widget.Button; |
import android.widget.TextView; |
import org.chromium.base.ThreadUtils; |
@@ -18,6 +26,7 @@ import org.chromium.chrome.R; |
import org.chromium.chrome.browser.ChromeSwitches; |
import org.chromium.chrome.browser.infobar.AnimationHelper; |
import org.chromium.chrome.browser.infobar.AppBannerInfoBar; |
+import org.chromium.chrome.browser.infobar.AppBannerInfoBarDelegate; |
import org.chromium.chrome.browser.infobar.InfoBar; |
import org.chromium.chrome.browser.infobar.InfoBarContainer; |
import org.chromium.chrome.shell.ChromeShellTestBase; |
@@ -28,6 +37,7 @@ import org.chromium.content.browser.test.util.CriteriaHelper; |
import org.chromium.content.browser.test.util.TouchCommon; |
import java.util.ArrayList; |
+import java.util.List; |
/** |
* Tests the app banners. |
@@ -42,24 +52,33 @@ public class AppBannerManagerTest extends ChromeShellTestBase { |
private static final String NATIVE_APP_TITLE = "Mock app title"; |
+ private static final String NATIVE_APP_PACKAGE = "123456"; |
+ |
+ private static final String NATIVE_APP_INSTALL_TEXT = "Install this"; |
+ |
private static final String WEB_APP_URL = |
TestHttpServerClient.getUrl("chrome/test/data/banners/manifest_test_page.html"); |
private static final String WEB_APP_TITLE = "Manifest test app"; |
+ private static final String INSTALL_ACTION = "INSTALL_ACTION"; |
+ |
private static class MockAppDetailsDelegate extends AppDetailsDelegate { |
private Observer mObserver; |
private AppData mAppData; |
private int mNumRetrieved; |
+ private Intent mInstallIntent; |
@Override |
protected void getAppDetailsAsynchronously( |
Observer observer, String url, String packageName, int iconSize) { |
mNumRetrieved += 1; |
mObserver = observer; |
+ mInstallIntent = new Intent(INSTALL_ACTION); |
+ |
mAppData = new AppData(url, packageName); |
- mAppData.setPackageInfo( |
- NATIVE_APP_TITLE, NATIVE_ICON_URL, 4.5f, "Install this", null, null); |
+ mAppData.setPackageInfo(NATIVE_APP_TITLE, NATIVE_ICON_URL, 4.5f, |
+ NATIVE_APP_INSTALL_TEXT, null, mInstallIntent); |
ThreadUtils.runOnUiThread(new Runnable() { |
@Override |
public void run() { |
@@ -73,6 +92,23 @@ public class AppBannerManagerTest extends ChromeShellTestBase { |
} |
} |
+ private static class TestPackageManager extends MockPackageManager { |
+ public boolean isInstalled = false; |
+ |
+ @Override |
+ public List<PackageInfo> getInstalledPackages(int flags) { |
+ List<PackageInfo> packages = new ArrayList<PackageInfo>(); |
+ |
+ if (isInstalled) { |
+ PackageInfo info = new PackageInfo(); |
+ info.packageName = NATIVE_APP_PACKAGE; |
+ packages.add(info); |
+ } |
+ |
+ return packages; |
+ } |
+ } |
+ |
private static class InfobarListener implements InfoBarContainer.InfoBarAnimationListener { |
private boolean mDoneAnimating; |
@@ -83,12 +119,15 @@ public class AppBannerManagerTest extends ChromeShellTestBase { |
} |
private MockAppDetailsDelegate mDetailsDelegate; |
+ private TestPackageManager mPackageManager; |
@Override |
protected void setUp() throws Exception { |
mDetailsDelegate = new MockAppDetailsDelegate(); |
+ mPackageManager = new TestPackageManager(); |
AppBannerManager.setAppDetailsDelegate(mDetailsDelegate); |
AppBannerManager.setIsEnabledForTesting(true); |
+ AppBannerInfoBarDelegate.setPackageManagerForTesting(mPackageManager); |
clearAppData(); |
super.setUp(); |
@@ -139,19 +178,63 @@ public class AppBannerManagerTest extends ChromeShellTestBase { |
@SmallTest |
@Feature({"AppBanners"}) |
- public void testBannerAppears() throws Exception { |
+ public void testFullNativeInstallPathway() throws Exception { |
// Visit a site that requests a banner. |
assertTrue(CriteriaHelper.pollForUIThreadCriteria( |
new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL))); |
assertTrue(waitUntilAppDetailsRetrieved(1)); |
assertTrue(waitUntilNoInfoBarsExist()); |
- // Indicate a day has passed, then revisit the page. |
+ // Indicate a day has passed, then revisit the page to get the banner to appear. |
+ InfoBarContainer container = getActivity().getActiveTab().getInfoBarContainer(); |
+ final InfobarListener listener = new InfobarListener(); |
+ container.setAnimationListener(listener); |
AppBannerManager.setTimeDeltaForTesting(1); |
assertTrue(CriteriaHelper.pollForUIThreadCriteria( |
new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL))); |
assertTrue(waitUntilAppDetailsRetrieved(2)); |
assertTrue(waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE)); |
+ assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return listener.mDoneAnimating; |
+ } |
+ })); |
+ |
+ // Check that the button asks if the user wants to install the app. |
+ InfoBar infobar = container.getInfoBars().get(0); |
+ final Button button = |
+ (Button) infobar.getContentWrapper().findViewById(R.id.button_primary); |
+ assertEquals(NATIVE_APP_INSTALL_TEXT, button.getText()); |
+ |
+ // Click the button to trigger the install. |
+ final ActivityMonitor activityMonitor = new ActivityMonitor( |
+ new IntentFilter(INSTALL_ACTION), new ActivityResult(Activity.RESULT_OK, null), |
+ true); |
+ getInstrumentation().addMonitor(activityMonitor); |
+ TouchCommon.singleClickView(button); |
+ |
+ // Wait for the infobar to register that the app is installing. |
+ final String installingText = |
+ getInstrumentation().getTargetContext().getString(R.string.app_banner_installing); |
+ assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return getInstrumentation().checkMonitorHit(activityMonitor, 1) |
+ && TextUtils.equals(button.getText(), installingText); |
+ } |
+ })); |
+ |
+ // Say that the package is installed. Infobar should say that the app is ready to open. |
+ mPackageManager.isInstalled = true; |
+ final String openText = |
+ getInstrumentation().getTargetContext().getString(R.string.app_banner_open); |
+ assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return TextUtils.equals(button.getText(), openText); |
+ } |
+ })); |
} |
@MediumTest |