Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1286)

Unified Diff: chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageRequestTest.java

Issue 2245733004: Serve offline page for online URL on disconnected or bad networks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update comment in test Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageRequestTest.java
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageRequestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageRequestTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..543d0cccba1e09eae8af7550068857bc320f2454
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageRequestTest.java
@@ -0,0 +1,157 @@
+// Copyright 2016 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.offlinepages;
+
+import android.os.Environment;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.OfflinePageModelObserver;
+import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.SavePageCallback;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.test.ChromeActivityTestCaseBase;
+import org.chromium.components.offlinepages.SavePageResult;
+import org.chromium.net.NetworkChangeNotifier;
+import org.chromium.net.test.EmbeddedTestServer;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/** Unit tests for offline page request handling. */
+@CommandLineFlags.Add("enable-features=OfflineBookmarks")
+public class OfflinePageRequestTest extends ChromeActivityTestCaseBase<ChromeActivity> {
+ private static final String TEST_PAGE = "/chrome/test/data/android/test.html";
+ private static final String ABOUT_PAGE = "/chrome/test/data/android/about.html";
+ private static final int TIMEOUT_MS = 5000;
+ private static final ClientId CLIENT_ID =
+ new ClientId(OfflinePageBridge.BOOKMARK_NAMESPACE, "1234");
+
+ private OfflinePageBridge mOfflinePageBridge;
+
+ public OfflinePageRequestTest() {
+ super(ChromeActivity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ final Semaphore semaphore = new Semaphore(0);
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ if (!NetworkChangeNotifier.isInitialized()) {
+ NetworkChangeNotifier.init(getActivity().getBaseContext());
+ }
+ NetworkChangeNotifier.forceConnectivityState(true);
+
+ Profile profile = Profile.getLastUsedProfile();
+ mOfflinePageBridge = OfflinePageBridge.getForProfile(profile);
+ if (mOfflinePageBridge.isOfflinePageModelLoaded()) {
+ semaphore.release();
+ } else {
+ mOfflinePageBridge.addObserver(new OfflinePageModelObserver() {
+ @Override
+ public void offlinePageModelLoaded() {
+ semaphore.release();
+ mOfflinePageBridge.removeObserver(this);
+ }
+ });
+ }
+ }
+ });
+ assertTrue(semaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ @Override
+ public void startMainActivity() throws InterruptedException {
+ startMainActivityOnBlankPage();
+ }
+
+ @SmallTest
+ public void testLoadOfflinePageOnDisconnectedNetwork() throws Exception {
+ EmbeddedTestServer testServer = EmbeddedTestServer.createAndStartFileServer(
+ getInstrumentation().getContext(), Environment.getExternalStorageDirectory());
+ String testUrl = testServer.getURL(TEST_PAGE);
+ String aboutUrl = testServer.getURL(ABOUT_PAGE);
+
+ Tab tab = getActivity().getActivityTab();
+
+ // Load and save an offline page.
+ savePage(testUrl);
+ assertFalse(isErrorPage(tab));
+ assertFalse(isOfflinePage(tab));
+
+ // Load another page.
+ loadUrl(aboutUrl);
+ assertFalse(isErrorPage(tab));
+ assertFalse(isOfflinePage(tab));
+
+ // Stop the server and also disconnect the network.
+ testServer.stopAndDestroyServer();
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ NetworkChangeNotifier.forceConnectivityState(false);
+ }
+ });
+
+ // Load the page that has an offline copy. The offline page should be shown.
+ loadUrl(testUrl);
+ assertFalse(isErrorPage(tab));
+ assertTrue(isOfflinePage(tab));
+ }
+
+ private void savePage(String url) throws InterruptedException {
+ loadUrl(url);
+
+ final Semaphore semaphore = new Semaphore(0);
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mOfflinePageBridge.savePage(getActivity().getActivityTab().getWebContents(),
+ CLIENT_ID, new SavePageCallback() {
+ @Override
+ public void onSavePageDone(
+ int savePageResult, String url, long offlineId) {
+ assertEquals(
+ "Save failed.", SavePageResult.SUCCESS, savePageResult);
+ semaphore.release();
+ }
+ });
+ }
+ });
+ assertTrue(semaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ }
+
+ private boolean isOfflinePage(final Tab tab) {
+ final boolean[] isOffline = new boolean[1];
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ isOffline[0] = tab.isOfflinePage();
+ }
+ });
+ return isOffline[0];
+ }
+
+ private boolean isErrorPage(final Tab tab) {
+ final boolean[] isShowingError = new boolean[1];
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ isShowingError[0] = tab.isShowingErrorPage();
+ }
+ });
+ return isShowingError[0];
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698