1 // Copyright (c) 2013 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.
5 package org.chromium.android_webview.test;
7 import android.test.suitebuilder.annotation.LargeTest;
8 import android.util.Pair;
9 import android.webkit.ValueCallback;
11 import org.chromium.android_webview.AwContents;
12 import org.chromium.android_webview.AwQuotaManagerBridge;
13 import org.chromium.android_webview.AwSettings;
14 import org.chromium.android_webview.test.util.AwQuotaManagerBridgeTestUtil;
15 import org.chromium.base.test.util.Feature;
16 import org.chromium.content.browser.test.util.CallbackHelper;
17 import org.chromium.content.browser.test.util.Criteria;
18 import org.chromium.content.browser.test.util.CriteriaHelper;
19 import org.chromium.net.test.util.TestWebServer;
21 import java.util.ArrayList;
22 import java.util.concurrent.Callable;
23 import java.util.List;
25 public class AwQuotaManagerBridgeTest extends AwTestBase {
26 private TestAwContentsClient mContentsClient;
27 private AwTestContainerView mTestView;
28 private AwContents mAwContents;
29 private TestWebServer mWebServer;
30 private String mOrigin;
33 public void setUp() throws Exception {
35 mContentsClient = new TestAwContentsClient();
36 mTestView = createAwTestContainerViewOnMainSync(mContentsClient);
37 mAwContents = mTestView.getAwContents();
38 mWebServer = new TestWebServer(false);
39 mOrigin = mWebServer.getBaseUrl();
41 AwSettings settings = getAwSettingsOnUiThread(mAwContents);
42 settings.setJavaScriptEnabled(true);
43 settings.setDomStorageEnabled(true);
44 settings.setAppCacheEnabled(true);
45 settings.setAppCachePath("whatever"); // Enables AppCache.
49 public void tearDown() throws Exception {
51 if (mWebServer != null) {
52 mWebServer.shutdown();
57 private void deleteAllData() throws Exception {
58 final AwQuotaManagerBridge bridge =
59 AwQuotaManagerBridgeTestUtil.getQuotaManagerBridge(this);
60 getInstrumentation().runOnMainSync(new Runnable() {
63 bridge.deleteAllData();
68 private void deleteOrigin(final String origin) throws Exception {
69 final AwQuotaManagerBridge bridge =
70 AwQuotaManagerBridgeTestUtil.getQuotaManagerBridge(this);
71 getInstrumentation().runOnMainSync(new Runnable() {
74 bridge.deleteOrigin(origin);
79 private static class LongValueCallbackHelper extends CallbackHelper {
82 public void notifyCalled(long value) {
87 public long getValue() {
88 assert getCallCount() > 0;
93 private long getQuotaForOrigin(final String origin) throws Exception {
94 final LongValueCallbackHelper callbackHelper = new LongValueCallbackHelper();
95 final AwQuotaManagerBridge bridge =
96 AwQuotaManagerBridgeTestUtil.getQuotaManagerBridge(this);
98 int callCount = callbackHelper.getCallCount();
99 getInstrumentation().runOnMainSync(new Runnable() {
102 bridge.getQuotaForOrigin("foo.com",
103 new ValueCallback<Long>() {
105 public void onReceiveValue(Long quota) {
106 callbackHelper.notifyCalled(quota);
112 callbackHelper.waitForCallback(callCount);
114 return callbackHelper.getValue();
117 private long getUsageForOrigin(final String origin) throws Exception {
118 final LongValueCallbackHelper callbackHelper = new LongValueCallbackHelper();
119 final AwQuotaManagerBridge bridge =
120 AwQuotaManagerBridgeTestUtil.getQuotaManagerBridge(this);
122 int callCount = callbackHelper.getCallCount();
123 getInstrumentation().runOnMainSync(new Runnable() {
126 bridge.getUsageForOrigin(origin,
127 new ValueCallback<Long>() {
129 public void onReceiveValue(Long usage) {
130 callbackHelper.notifyCalled(usage);
136 callbackHelper.waitForCallback(callCount);
138 return callbackHelper.getValue();
141 private void useAppCache() throws Exception {
142 final String CACHED_FILE_PATH = "/foo.js";
143 final String CACHED_FILE_CONTENTS = "1 + 1;";
144 mWebServer.setResponse(CACHED_FILE_PATH, CACHED_FILE_CONTENTS, null);
146 final String MANIFEST_PATH = "/foo.manifest";
147 final String MANIFEST_CONTENTS = "CACHE MANIFEST\nCACHE:\n" + CACHED_FILE_PATH;
148 List<Pair<String, String>> manifestHeaders = new ArrayList<Pair<String, String>>();
149 manifestHeaders.add(Pair.create("Content-Disposition", "text/cache-manifest"));
150 mWebServer.setResponse(MANIFEST_PATH, MANIFEST_CONTENTS, manifestHeaders);
152 final String PAGE_PATH = "/appcache.html";
153 final String PAGE_CONTENTS = "<html manifest=\"" + MANIFEST_PATH + "\">" +
154 "<head><script src=\"" + CACHED_FILE_PATH + "\"></script></head></html>";
155 String url = mWebServer.setResponse(PAGE_PATH, PAGE_CONTENTS, null);
157 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
158 executeJavaScriptAndWaitForResult(mAwContents, mContentsClient,
159 "window.applicationCache.update();");
163 @Feature({"AndroidWebView", "WebStore"})
164 public void testDeleteAllWithAppCache() throws Exception {
165 long currentUsage = getUsageForOrigin(mOrigin);
166 assertEquals(0, currentUsage);
169 assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
171 public boolean isSatisfied() {
173 return getUsageForOrigin(mOrigin) > 0;
174 } catch (Exception e) {
181 assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
183 public boolean isSatisfied() {
185 return getUsageForOrigin(mOrigin) == 0;
186 } catch (Exception e) {
194 @Feature({"AndroidWebView", "WebStore"})
195 public void testDeleteOriginWithAppCache() throws Exception {
196 long currentUsage = getUsageForOrigin(mOrigin);
197 assertEquals(0, currentUsage);
200 assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
202 public boolean isSatisfied() {
204 return getUsageForOrigin(mOrigin) > 0;
205 } catch (Exception e) {
211 deleteOrigin(mOrigin);
212 assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
214 public boolean isSatisfied() {
216 return getUsageForOrigin(mOrigin) == 0;
217 } catch (Exception e) {
225 @Feature({"AndroidWebView", "WebStore"})
226 public void testGetResultsMatch() throws Exception {
229 CriteriaHelper.pollForCriteria(new Criteria() {
231 public boolean isSatisfied() {
233 return AwQuotaManagerBridgeTestUtil.getOrigins(
234 AwQuotaManagerBridgeTest.this).mOrigins.length > 0;
235 } catch (Exception e) {
241 AwQuotaManagerBridge.Origins origins = AwQuotaManagerBridgeTestUtil.getOrigins(this);
242 assertEquals(origins.mOrigins.length, origins.mUsages.length);
243 assertEquals(origins.mOrigins.length, origins.mQuotas.length);
245 for (int i = 0; i < origins.mOrigins.length; ++i) {
246 assertEquals(origins.mUsages[i], getUsageForOrigin(origins.mOrigins[i]));
247 assertEquals(origins.mQuotas[i], getQuotaForOrigin(origins.mOrigins[i]));