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. |
4 | |
5 | package org.chromium.android_webview.test; |
6 | |
7 | import android.test.suitebuilder.annotation.LargeTest; |
8 | import android.util.Pair; |
9 | import android.webkit.ValueCallback; |
10 | |
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; |
20 | |
21 | import java.util.ArrayList; |
22 | import java.util.concurrent.Callable; |
23 | import java.util.List; |
24 | |
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; |
31 | |
32 | @Override |
33 | public void setUp() throws Exception { |
34 | super.setUp(); |
35 | mContentsClient = new TestAwContentsClient(); |
36 | mTestView = createAwTestContainerViewOnMainSync(mContentsClient); |
37 | mAwContents = mTestView.getAwContents(); |
38 | mWebServer = new TestWebServer(false); |
39 | mOrigin = mWebServer.getBaseUrl(); |
40 | |
41 | AwSettings settings = getAwSettingsOnUiThread(mAwContents); |
42 | settings.setJavaScriptEnabled(true); |
43 | settings.setDomStorageEnabled(true); |
44 | settings.setAppCacheEnabled(true); |
45 | settings.setAppCachePath("whatever"); // Enables AppCache. |
46 | } |
47 | |
48 | @Override |
49 | public void tearDown() throws Exception { |
50 | deleteAllData(); |
51 | if (mWebServer != null) { |
52 | mWebServer.shutdown(); |
53 | } |
54 | super.tearDown(); |
55 | } |
56 | |
57 | private void deleteAllData() throws Exception { |
58 | final AwQuotaManagerBridge bridge = |
59 | AwQuotaManagerBridgeTestUtil.getQuotaManagerBridge(this); |
60 | getInstrumentation().runOnMainSync(new Runnable() { |
61 | @Override |
62 | public void run() { |
63 | bridge.deleteAllData(); |
64 | } |
65 | }); |
66 | } |
67 | |
68 | private void deleteOrigin(final String origin) throws Exception { |
69 | final AwQuotaManagerBridge bridge = |
70 | AwQuotaManagerBridgeTestUtil.getQuotaManagerBridge(this); |
71 | getInstrumentation().runOnMainSync(new Runnable() { |
72 | @Override |
73 | public void run() { |
74 | bridge.deleteOrigin(origin); |
75 | } |
76 | }); |
77 | } |
78 | |
79 | private static class LongValueCallbackHelper extends CallbackHelper { |
80 | private long mValue; |
81 | |
82 | public void notifyCalled(long value) { |
83 | mValue = value; |
84 | notifyCalled(); |
85 | } |
86 | |
87 | public long getValue() { |
88 | assert getCallCount() > 0; |
89 | return mValue; |
90 | } |
91 | } |
92 | |
93 | private long getQuotaForOrigin(final String origin) throws Exception { |
94 | final LongValueCallbackHelper callbackHelper = new LongValueCallbackHelper(); |
95 | final AwQuotaManagerBridge bridge = |
96 | AwQuotaManagerBridgeTestUtil.getQuotaManagerBridge(this); |
97 | |
98 | int callCount = callbackHelper.getCallCount(); |
99 | getInstrumentation().runOnMainSync(new Runnable() { |
100 | @Override |
101 | public void run() { |
102 | bridge.getQuotaForOrigin("foo.com", |
103 | new ValueCallback<Long>() { |
104 | @Override |
105 | public void onReceiveValue(Long quota) { |
106 | callbackHelper.notifyCalled(quota); |
107 | } |
108 | } |
109 | ); |
110 | } |
111 | }); |
112 | callbackHelper.waitForCallback(callCount); |
113 | |
114 | return callbackHelper.getValue(); |
115 | } |
116 | |
117 | private long getUsageForOrigin(final String origin) throws Exception { |
118 | final LongValueCallbackHelper callbackHelper = new LongValueCallbackHelper(); |
119 | final AwQuotaManagerBridge bridge = |
120 | AwQuotaManagerBridgeTestUtil.getQuotaManagerBridge(this); |
121 | |
122 | int callCount = callbackHelper.getCallCount(); |
123 | getInstrumentation().runOnMainSync(new Runnable() { |
124 | @Override |
125 | public void run() { |
126 | bridge.getUsageForOrigin(origin, |
127 | new ValueCallback<Long>() { |
128 | @Override |
129 | public void onReceiveValue(Long usage) { |
130 | callbackHelper.notifyCalled(usage); |
131 | } |
132 | } |
133 | ); |
134 | } |
135 | }); |
136 | callbackHelper.waitForCallback(callCount); |
137 | |
138 | return callbackHelper.getValue(); |
139 | } |
140 | |
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); |
145 | |
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); |
151 | |
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); |
156 | |
157 | loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url); |
158 | executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, |
159 | "window.applicationCache.update();"); |
160 | } |
161 | |
162 | @LargeTest |
163 | @Feature({"AndroidWebView", "WebStore"}) |
164 | public void testDeleteAllWithAppCache() throws Exception { |
165 | long currentUsage = getUsageForOrigin(mOrigin); |
166 | assertEquals(0, currentUsage); |
167 | |
168 | useAppCache(); |
169 | assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
170 | @Override |
171 | public boolean isSatisfied() { |
172 | try { |
173 | return getUsageForOrigin(mOrigin) > 0; |
174 | } catch (Exception e) { |
175 | return false; |
176 | } |
177 | } |
178 | })); |
179 | |
180 | deleteAllData(); |
181 | assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
182 | @Override |
183 | public boolean isSatisfied() { |
184 | try { |
185 | return getUsageForOrigin(mOrigin) == 0; |
186 | } catch (Exception e) { |
187 | return false; |
188 | } |
189 | } |
190 | })); |
191 | } |
192 | |
193 | @LargeTest |
194 | @Feature({"AndroidWebView", "WebStore"}) |
195 | public void testDeleteOriginWithAppCache() throws Exception { |
196 | long currentUsage = getUsageForOrigin(mOrigin); |
197 | assertEquals(0, currentUsage); |
198 | |
199 | useAppCache(); |
200 | assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
201 | @Override |
202 | public boolean isSatisfied() { |
203 | try { |
204 | return getUsageForOrigin(mOrigin) > 0; |
205 | } catch (Exception e) { |
206 | return false; |
207 | } |
208 | } |
209 | })); |
210 | |
211 | deleteOrigin(mOrigin); |
212 | assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
213 | @Override |
214 | public boolean isSatisfied() { |
215 | try { |
216 | return getUsageForOrigin(mOrigin) == 0; |
217 | } catch (Exception e) { |
218 | return false; |
219 | } |
220 | } |
221 | })); |
222 | } |
223 | |
224 | @LargeTest |
225 | @Feature({"AndroidWebView", "WebStore"}) |
226 | public void testGetResultsMatch() throws Exception { |
227 | useAppCache(); |
228 | |
229 | CriteriaHelper.pollForCriteria(new Criteria() { |
230 | @Override |
231 | public boolean isSatisfied() { |
232 | try { |
233 | return AwQuotaManagerBridgeTestUtil.getOrigins( |
234 | AwQuotaManagerBridgeTest.this).mOrigins.length > 0; |
235 | } catch (Exception e) { |
236 | return false; |
237 | } |
238 | } |
239 | }); |
240 | |
241 | AwQuotaManagerBridge.Origins origins = AwQuotaManagerBridgeTestUtil.getOrigins(this); |
242 | assertEquals(origins.mOrigins.length, origins.mUsages.length); |
243 | assertEquals(origins.mOrigins.length, origins.mQuotas.length); |
244 | |
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])); |
248 | } |
249 | } |
250 | } |