blob: 2e05ce6d9f2c8c4b7099ea795b08fc31c853b729 [file] [log] [blame]
// 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.android_webview.test;
import android.support.test.filters.SmallTest;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwContentsClient.AwWebResourceRequest;
import org.chromium.base.test.util.DisabledTest;
import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer;
import org.chromium.net.test.util.TestWebServer;
import java.util.List;
/**
* Tests Service Worker Client related APIs.
*/
@RunWith(AwJUnit4ClassRunner.class)
public class AwServiceWorkerClientTest {
@Rule
public AwActivityTestRule mActivityTestRule = new AwActivityTestRule();
private TestAwContentsClient mContentsClient;
private AwContents mAwContents;
private TestWebServer mWebServer;
private AwTestContainerView mTestContainerView;
private TestAwServiceWorkerClient mServiceWorkerClient;
private static final String INDEX_HTML =
"<!DOCTYPE html>\n"
+ "<html>\n"
+ " <body>\n"
+ " <script>\n"
+ " success = 0;\n"
+ " navigator.serviceWorker.register('sw.js').then(function(reg) {;\n"
+ " success = 1;\n"
+ " }).catch(function(err) { \n"
+ " console.error(err);\n"
+ " });\n"
+ " </script>\n"
+ " </body>\n"
+ "</html>\n";
private static final String SW_HTML = "fetch('fetch.html');";
private static final String FETCH_HTML = ";)";
@Before
public void setUp() throws Exception {
mWebServer = TestWebServer.start();
mContentsClient = new TestAwContentsClient();
mTestContainerView = mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
mServiceWorkerClient = new TestAwServiceWorkerClient();
mActivityTestRule.getAwBrowserContext().getServiceWorkerController().setServiceWorkerClient(
mServiceWorkerClient);
mAwContents = mTestContainerView.getAwContents();
AwActivityTestRule.enableJavaScriptOnUiThread(mAwContents);
}
@After
public void tearDown() throws Exception {
if (mWebServer != null) mWebServer.shutdown();
}
@Test
@SmallTest
public void testInvokeInterceptCallback() throws Throwable {
final String fullIndexUrl = mWebServer.setResponse("/index.html", INDEX_HTML, null);
final String fullSwUrl = mWebServer.setResponse("/sw.js", SW_HTML, null);
final String fullFetchUrl = mWebServer.setResponse("/fetch.html", FETCH_HTML, null);
TestAwServiceWorkerClient.ShouldInterceptRequestHelper helper =
mServiceWorkerClient.getShouldInterceptRequestHelper();
loadPage(fullIndexUrl, helper, 2);
// Check that the two service worker related callbacks were correctly intercepted.
List<AwWebResourceRequest> requests = helper.getAwWebResourceRequests();
Assert.assertEquals(2, requests.size());
Assert.assertEquals(fullSwUrl, requests.get(0).url);
Assert.assertEquals(fullFetchUrl, requests.get(1).url);
}
// Verify that WebView ServiceWorker code can properly handle http errors that happened
// in ServiceWorker fetches.
@Test
@SmallTest
@DisabledTest(message = "Disable for flakyness http://crbug.com/676422")
public void testFetchHttpError() throws Throwable {
final String fullIndexUrl = mWebServer.setResponse("/index.html", INDEX_HTML, null);
final String fullSwUrl = mWebServer.setResponse("/sw.js", SW_HTML, null);
mWebServer.setResponseWithNotFoundStatus("/fetch.html");
TestAwServiceWorkerClient.ShouldInterceptRequestHelper helper =
mServiceWorkerClient.getShouldInterceptRequestHelper();
loadPage(fullIndexUrl, helper, 1);
// Check that the two service worker related callbacks were correctly intercepted.
List<AwWebResourceRequest> requests = helper.getAwWebResourceRequests();
Assert.assertEquals(2, requests.size());
Assert.assertEquals(fullSwUrl, requests.get(0).url);
}
// Verify that WebView ServiceWorker code can properly handle resource loading errors
// that happened in ServiceWorker fetches.
@Test
@SmallTest
public void testFetchResourceLoadingError() throws Throwable {
final String fullIndexUrl = mWebServer.setResponse("/index.html", INDEX_HTML, null);
final String fullSwUrl = mWebServer.setResponse("/sw.js",
"fetch('https://google.gov');", null);
TestAwServiceWorkerClient.ShouldInterceptRequestHelper helper =
mServiceWorkerClient.getShouldInterceptRequestHelper();
loadPage(fullIndexUrl, helper, 1);
// Check that the two service worker related callbacks were correctly intercepted.
List<AwWebResourceRequest> requests = helper.getAwWebResourceRequests();
Assert.assertEquals(2, requests.size());
Assert.assertEquals(fullSwUrl, requests.get(0).url);
}
private void loadPage(final String fullIndexUrl,
TestAwServiceWorkerClient.ShouldInterceptRequestHelper helper,
int expectedInterceptRequestCount) throws Exception {
int currentShouldInterceptRequestCount = helper.getCallCount();
TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
mContentsClient.getOnPageFinishedHelper();
mActivityTestRule.loadUrlSync(mAwContents, onPageFinishedHelper, fullIndexUrl);
Assert.assertEquals(fullIndexUrl, onPageFinishedHelper.getUrl());
// Check that the service worker has been registered successfully.
AwActivityTestRule.pollInstrumentationThread(() -> getSuccessFromJS() == 1);
helper.waitForCallback(currentShouldInterceptRequestCount, expectedInterceptRequestCount);
}
private int getSuccessFromJS() {
int result = -1;
try {
result = Integer.parseInt(mActivityTestRule.executeJavaScriptAndWaitForResult(
mAwContents, mContentsClient, "success"));
} catch (Exception e) {
Assert.fail("Unable to get success");
}
return result;
}
}