1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.android_webview.test;
6
7import android.test.suitebuilder.annotation.MediumTest;
8import android.webkit.WebSettings;
9
10import org.chromium.android_webview.AwContents;
11import org.chromium.android_webview.ErrorCodeConversionHelper;
12import org.chromium.base.test.util.Feature;
13import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
14
15import java.util.concurrent.TimeUnit;
16
17/**
18 * Tests for the ContentViewClient.onReceivedError() method.
19 */
20public class ClientOnReceivedErrorTest extends AwTestBase {
21
22    private TestAwContentsClient mContentsClient;
23    private AwContents mAwContents;
24
25    @Override
26    public void setUp() throws Exception {
27        super.setUp();
28        mContentsClient = new TestAwContentsClient();
29        final AwTestContainerView testContainerView =
30                createAwTestContainerViewOnMainSync(mContentsClient);
31        mAwContents = testContainerView.getAwContents();
32    }
33
34    @MediumTest
35    @Feature({"AndroidWebView"})
36    public void testOnReceivedErrorOnInvalidUrl() throws Throwable {
37        TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
38                mContentsClient.getOnReceivedErrorHelper();
39
40        String url = "http://man.id.be.really.surprised.if.this.address.existed.blah/";
41        int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
42        loadUrlAsync(mAwContents, url);
43
44        onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount,
45                                              1 /* numberOfCallsToWaitFor */,
46                                              WAIT_TIMEOUT_MS,
47                                              TimeUnit.MILLISECONDS);
48        assertEquals(ErrorCodeConversionHelper.ERROR_HOST_LOOKUP,
49                onReceivedErrorHelper.getErrorCode());
50        assertEquals(url, onReceivedErrorHelper.getFailingUrl());
51        assertNotNull(onReceivedErrorHelper.getDescription());
52    }
53
54    @MediumTest
55    @Feature({"AndroidWebView"})
56    public void testOnReceivedErrorOnInvalidScheme() throws Throwable {
57        TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
58                mContentsClient.getOnReceivedErrorHelper();
59
60        String url = "foo://some/resource";
61        int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
62        loadUrlAsync(mAwContents, url);
63
64        onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount);
65        assertEquals(ErrorCodeConversionHelper.ERROR_UNSUPPORTED_SCHEME,
66                onReceivedErrorHelper.getErrorCode());
67        assertEquals(url, onReceivedErrorHelper.getFailingUrl());
68        assertNotNull(onReceivedErrorHelper.getDescription());
69    }
70
71    @MediumTest
72    @Feature({"AndroidWebView"})
73    public void testNoErrorOnFailedSubresourceLoad() throws Throwable {
74        TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
75                mContentsClient.getOnReceivedErrorHelper();
76        TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
77                mContentsClient.getOnPageFinishedHelper();
78
79        int currentCallCount = onPageFinishedHelper.getCallCount();
80        loadDataAsync(mAwContents,
81                      "<html><iframe src=\"http//invalid.url.co/\" /></html>",
82                      "text/html",
83                      false);
84
85        onPageFinishedHelper.waitForCallback(currentCallCount);
86        assertEquals(0, onReceivedErrorHelper.getCallCount());
87    }
88
89    @MediumTest
90    @Feature({"AndroidWebView"})
91    public void testNonExistentAssetUrl() throws Throwable {
92        TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
93                mContentsClient.getOnReceivedErrorHelper();
94        final String url = "file:///android_asset/does_not_exist.html";
95        int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
96        loadUrlAsync(mAwContents, url);
97
98        onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount);
99        assertEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN,
100                     onReceivedErrorHelper.getErrorCode());
101        assertEquals(url, onReceivedErrorHelper.getFailingUrl());
102        assertNotNull(onReceivedErrorHelper.getDescription());
103    }
104
105    @MediumTest
106    @Feature({"AndroidWebView"})
107    public void testNonExistentResourceUrl() throws Throwable {
108        TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
109                mContentsClient.getOnReceivedErrorHelper();
110        final String url = "file:///android_res/raw/does_not_exist.html";
111        int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
112        loadUrlAsync(mAwContents, url);
113
114        onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount);
115        assertEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN,
116                     onReceivedErrorHelper.getErrorCode());
117        assertEquals(url, onReceivedErrorHelper.getFailingUrl());
118        assertNotNull(onReceivedErrorHelper.getDescription());
119    }
120
121    @MediumTest
122    @Feature({"AndroidWebView"})
123    public void testCacheMiss() throws Throwable {
124        TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
125                mContentsClient.getOnReceivedErrorHelper();
126        final String url = "http://example.com/index.html";
127        int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
128        getAwSettingsOnUiThread(mAwContents).setCacheMode(WebSettings.LOAD_CACHE_ONLY);
129        loadUrlAsync(mAwContents, url);
130
131        onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount);
132        assertEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN,
133                     onReceivedErrorHelper.getErrorCode());
134        assertEquals(url, onReceivedErrorHelper.getFailingUrl());
135        assertFalse(onReceivedErrorHelper.getDescription().isEmpty());
136    }
137}
138