Index: android_webview/tools/PageCycler/src/org/chromium/webview_shell/page_cycler/PageCyclerTest.java |
diff --git a/android_webview/tools/PageCycler/src/org/chromium/webview_shell/page_cycler/PageCyclerTest.java b/android_webview/tools/PageCycler/src/org/chromium/webview_shell/page_cycler/PageCyclerTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bc29b7b7ec770b9d566d15c85ae9e19e0ec51a78 |
--- /dev/null |
+++ b/android_webview/tools/PageCycler/src/org/chromium/webview_shell/page_cycler/PageCyclerTest.java |
@@ -0,0 +1,163 @@ |
+// 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.webview_shell.page_cycler; |
+ |
+import android.test.ActivityInstrumentationTestCase2; |
+import android.test.suitebuilder.annotation.LargeTest; |
+import android.webkit.WebSettings; |
+import android.webkit.WebView; |
+import android.webkit.WebViewClient; |
+ |
+import org.chromium.base.test.util.Restriction; |
+import org.chromium.content.browser.test.util.CallbackHelper; |
+import org.chromium.webview_shell.PageCyclerTestActivity; |
+ |
+import java.util.concurrent.TimeUnit; |
+import java.util.concurrent.TimeoutException; |
+ |
+/** |
+ * Tests running on bots with internet connection to load popular urls, |
+ * making sure webview doesn't crash |
+ */ |
+public class PageCyclerTest |
+ extends ActivityInstrumentationTestCase2<PageCyclerTestActivity> { |
+ |
+ private static final long TIMEOUT_IN_SECS = 20; |
+ |
+ private PageCyclerTestActivity mTestActivity; |
+ |
+ public PageCyclerTest() { |
+ super(PageCyclerTestActivity.class); |
+ } |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ super.setUp(); |
+ mTestActivity = getActivity(); |
+ } |
+ |
+ @LargeTest |
+ @Restriction(Restriction.RESTRICTION_TYPE_INTERNET) |
+ public void testVisitGoogleCom() throws Throwable { |
+ //TODO(yolandyan@): verify the page |
+ visitUrlSync("http://google.com"); |
+ } |
+ |
+ @LargeTest |
+ @Restriction(Restriction.RESTRICTION_TYPE_INTERNET) |
+ public void testVisitFacebookCom() throws Throwable { |
+ visitUrlSync("http://facebook.com"); |
+ } |
+ |
+ @LargeTest |
+ @Restriction(Restriction.RESTRICTION_TYPE_INTERNET) |
+ public void testVisitWikipediaOrg() throws Throwable { |
+ visitUrlSync("http://wikipedia.org"); |
+ } |
+ |
+ @LargeTest |
+ @Restriction(Restriction.RESTRICTION_TYPE_INTERNET) |
+ public void testVisitAmazonCom() throws Throwable { |
+ visitUrlSync("http://amazon.com"); |
+ } |
+ |
+ @LargeTest |
+ @Restriction(Restriction.RESTRICTION_TYPE_INTERNET) |
+ public void testVisitYoutubeCom() throws Throwable { |
+ visitUrlSync("http://youtube.com"); |
+ } |
+ |
+ @LargeTest |
+ @Restriction(Restriction.RESTRICTION_TYPE_INTERNET) |
+ public void testVisitYahooCom() throws Throwable { |
+ visitUrlSync("http://yahoo.com"); |
+ } |
+ |
+ @LargeTest |
+ @Restriction(Restriction.RESTRICTION_TYPE_INTERNET) |
+ public void testVisitEbayCom() throws Throwable { |
+ visitUrlSync("http://ebay.com"); |
+ } |
+ |
+ @LargeTest |
+ @Restriction(Restriction.RESTRICTION_TYPE_INTERNET) |
+ public void testVisitRedditCom() throws Throwable { |
+ visitUrlSync("http://reddit.com"); |
+ } |
+ |
+ private static class PageCyclerWebViewClient extends WebViewClient { |
+ private final CallbackHelper mPageFinishedCallback; |
+ private final CallbackHelper mErrorCallback; |
+ |
+ public PageCyclerWebViewClient() { |
+ super(); |
+ mPageFinishedCallback = new CallbackHelper(); |
+ mErrorCallback = new CallbackHelper(); |
+ } |
+ |
+ public CallbackHelper getPageFinishedCallback() { |
+ return mPageFinishedCallback; |
+ } |
+ |
+ public CallbackHelper getErrorCallback() { |
+ return mErrorCallback; |
+ } |
+ |
+ @Override |
+ public void onPageFinished(WebView view, String url) { |
+ mPageFinishedCallback.notifyCalled(); |
+ } |
+ |
+ // TODO(yolandyan@): create helper class to manage network error |
+ @Override |
+ public void onReceivedError(WebView webview, int code, String description, |
+ String failingUrl) { |
+ mErrorCallback.notifyCalled(); |
+ } |
+ } |
+ |
+ private void visitUrlSync(final String url) throws Throwable { |
+ final PageCyclerWebViewClient pageCyclerWebViewClient = new PageCyclerWebViewClient(); |
+ getInstrumentation().runOnMainSync(new Runnable() { |
+ @Override |
+ public void run() { |
+ final WebView view = mTestActivity.getWebView(); |
+ WebSettings settings = view.getSettings(); |
+ settings.setJavaScriptEnabled(true); |
+ view.setWebViewClient(pageCyclerWebViewClient); |
+ } |
+ }); |
+ CallbackHelper pageFinishedCallback = pageCyclerWebViewClient.getPageFinishedCallback(); |
+ CallbackHelper errorCallback = pageCyclerWebViewClient.getErrorCallback(); |
+ loadUrlSync(url, pageFinishedCallback, errorCallback); |
+ } |
+ |
+ private void loadUrlSync(final String url, final CallbackHelper pageFinishedCallback, |
+ final CallbackHelper errorCallback) throws InterruptedException { |
+ boolean timeout = false; |
+ int pageFinishedCount = pageFinishedCallback.getCallCount(); |
+ int errorCount = errorCallback.getCallCount(); |
+ loadUrlAsync(url); |
+ try { |
+ pageFinishedCallback.waitForCallback(pageFinishedCount, pageFinishedCount + 1, |
+ TIMEOUT_IN_SECS, TimeUnit.SECONDS); |
+ } catch (TimeoutException ex) { |
+ timeout = true; |
+ } |
+ assertEquals(String.format("Network error while accessing %s", url), errorCount, |
+ errorCallback.getCallCount()); |
+ assertFalse(String.format("Timeout error while accessing %s", url), timeout); |
+ } |
+ |
+ private void loadUrlAsync(final String url) { |
+ getInstrumentation().runOnMainSync(new Runnable() { |
+ @Override |
+ public void run() { |
+ WebView view = mTestActivity.getWebView(); |
+ view.loadUrl(url); |
+ } |
+ }); |
+ } |
+} |