OLD | NEW |
(Empty) | |
| 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.SmallTest; |
| 8 import android.test.suitebuilder.annotation.LargeTest; |
| 9 import android.util.Pair; |
| 10 import android.webkit.ValueCallback; |
| 11 |
| 12 import org.chromium.android_webview.AwContents; |
| 13 import org.chromium.android_webview.AwQuotaManagerBridge; |
| 14 import org.chromium.content.browser.ContentSettings; |
| 15 import org.chromium.content.browser.test.util.CallbackHelper; |
| 16 import org.chromium.content.browser.test.util.Criteria; |
| 17 import org.chromium.content.browser.test.util.CriteriaHelper; |
| 18 import org.chromium.net.test.util.TestWebServer; |
| 19 |
| 20 import java.util.ArrayList; |
| 21 import java.util.concurrent.Callable; |
| 22 import java.util.List; |
| 23 |
| 24 public class AwQuotaManagerBridgeTest extends AndroidWebViewTestBase { |
| 25 private TestAwContentsClient mContentsClient; |
| 26 private AwTestContainerView mTestView; |
| 27 private AwContents mAwContents; |
| 28 private TestWebServer mWebServer; |
| 29 private String mOrigin; |
| 30 |
| 31 @Override |
| 32 public void setUp() throws Exception { |
| 33 super.setUp(); |
| 34 mContentsClient = new TestAwContentsClient(); |
| 35 mTestView = createAwTestContainerViewOnMainSync(mContentsClient); |
| 36 mAwContents = mTestView.getAwContents(); |
| 37 mWebServer = new TestWebServer(false); |
| 38 mOrigin = mWebServer.getBaseUrl(); |
| 39 |
| 40 ContentSettings settings = getContentSettingsOnUiThread(mAwContents); |
| 41 settings.setJavaScriptEnabled(true); |
| 42 settings.setDomStorageEnabled(true); |
| 43 settings.setAppCacheEnabled(true); |
| 44 settings.setAppCachePath("whatever"); // Enables AppCache. |
| 45 } |
| 46 |
| 47 @Override |
| 48 public void tearDown() throws Exception { |
| 49 deleteAllData(); |
| 50 if (mWebServer != null) { |
| 51 mWebServer.shutdown(); |
| 52 } |
| 53 super.tearDown(); |
| 54 } |
| 55 |
| 56 private AwQuotaManagerBridge getQuotaManagerBridge() throws Exception { |
| 57 return runTestOnUiThreadAndGetResult(new Callable<AwQuotaManagerBridge>(
) { |
| 58 @Override |
| 59 public AwQuotaManagerBridge call() throws Exception { |
| 60 return AwQuotaManagerBridge.getInstance(); |
| 61 } |
| 62 }); |
| 63 } |
| 64 |
| 65 private void deleteAllData() throws Exception { |
| 66 final AwQuotaManagerBridge bridge = getQuotaManagerBridge(); |
| 67 getInstrumentation().runOnMainSync(new Runnable() { |
| 68 @Override |
| 69 public void run() { |
| 70 bridge.deleteAllData(); |
| 71 } |
| 72 }); |
| 73 } |
| 74 |
| 75 private void deleteOrigin(final String origin) throws Exception { |
| 76 final AwQuotaManagerBridge bridge = getQuotaManagerBridge(); |
| 77 getInstrumentation().runOnMainSync(new Runnable() { |
| 78 @Override |
| 79 public void run() { |
| 80 bridge.deleteOrigin(origin); |
| 81 } |
| 82 }); |
| 83 } |
| 84 |
| 85 private static class GetOriginsCallbackHelper extends CallbackHelper { |
| 86 private AwQuotaManagerBridge.Origins mOrigins; |
| 87 |
| 88 public void notifyCalled(AwQuotaManagerBridge.Origins origins) { |
| 89 mOrigins = origins; |
| 90 notifyCalled(); |
| 91 } |
| 92 |
| 93 public AwQuotaManagerBridge.Origins getOrigins() { |
| 94 assert mCallCount > 0; |
| 95 return mOrigins; |
| 96 } |
| 97 } |
| 98 |
| 99 private AwQuotaManagerBridge.Origins getOrigins() throws Exception { |
| 100 final GetOriginsCallbackHelper callbackHelper = new GetOriginsCallbackHe
lper(); |
| 101 final AwQuotaManagerBridge bridge = getQuotaManagerBridge(); |
| 102 |
| 103 int callCount = callbackHelper.getCallCount(); |
| 104 getInstrumentation().runOnMainSync(new Runnable() { |
| 105 @Override |
| 106 public void run() { |
| 107 bridge.getOrigins( |
| 108 new ValueCallback<AwQuotaManagerBridge.Origins>() { |
| 109 @Override |
| 110 public void onReceiveValue(AwQuotaManagerBridge.Origins
origins) { |
| 111 callbackHelper.notifyCalled(origins); |
| 112 } |
| 113 } |
| 114 ); |
| 115 } |
| 116 }); |
| 117 callbackHelper.waitForCallback(callCount); |
| 118 |
| 119 return callbackHelper.getOrigins(); |
| 120 } |
| 121 |
| 122 private static class LongValueCallbackHelper extends CallbackHelper { |
| 123 private long mValue; |
| 124 |
| 125 public void notifyCalled(long value) { |
| 126 mValue = value; |
| 127 notifyCalled(); |
| 128 } |
| 129 |
| 130 public long getValue() { |
| 131 assert mCallCount > 0; |
| 132 return mValue; |
| 133 } |
| 134 } |
| 135 |
| 136 private long getQuotaForOrigin(final String origin) throws Exception { |
| 137 final LongValueCallbackHelper callbackHelper = new LongValueCallbackHelp
er(); |
| 138 final AwQuotaManagerBridge bridge = getQuotaManagerBridge(); |
| 139 |
| 140 int callCount = callbackHelper.getCallCount(); |
| 141 getInstrumentation().runOnMainSync(new Runnable() { |
| 142 @Override |
| 143 public void run() { |
| 144 bridge.getQuotaForOrigin("foo.com", |
| 145 new ValueCallback<Long>() { |
| 146 @Override |
| 147 public void onReceiveValue(Long quota) { |
| 148 callbackHelper.notifyCalled(quota); |
| 149 } |
| 150 } |
| 151 ); |
| 152 } |
| 153 }); |
| 154 callbackHelper.waitForCallback(callCount); |
| 155 |
| 156 return callbackHelper.getValue(); |
| 157 } |
| 158 |
| 159 private long getUsageForOrigin(final String origin) throws Exception { |
| 160 final LongValueCallbackHelper callbackHelper = new LongValueCallbackHelp
er(); |
| 161 final AwQuotaManagerBridge bridge = getQuotaManagerBridge(); |
| 162 |
| 163 int callCount = callbackHelper.getCallCount(); |
| 164 getInstrumentation().runOnMainSync(new Runnable() { |
| 165 @Override |
| 166 public void run() { |
| 167 bridge.getUsageForOrigin(origin, |
| 168 new ValueCallback<Long>() { |
| 169 @Override |
| 170 public void onReceiveValue(Long usage) { |
| 171 callbackHelper.notifyCalled(usage); |
| 172 } |
| 173 } |
| 174 ); |
| 175 } |
| 176 }); |
| 177 callbackHelper.waitForCallback(callCount); |
| 178 |
| 179 return callbackHelper.getValue(); |
| 180 } |
| 181 |
| 182 private void useAppCache() throws Exception { |
| 183 final String CACHED_FILE_PATH = "/foo.js"; |
| 184 final String CACHED_FILE_CONTENTS = "1 + 1;"; |
| 185 mWebServer.setResponse(CACHED_FILE_PATH, CACHED_FILE_CONTENTS, null); |
| 186 |
| 187 final String MANIFEST_PATH = "/foo.manifest"; |
| 188 final String MANIFEST_CONTENTS = "CACHE MANIFEST\nCACHE:\n" + CACHED_FIL
E_PATH; |
| 189 List<Pair<String, String>> manifestHeaders = new ArrayList<Pair<String,
String>>(); |
| 190 manifestHeaders.add(Pair.create("Content-Disposition", "text/cache-manif
est")); |
| 191 mWebServer.setResponse(MANIFEST_PATH, MANIFEST_CONTENTS, manifestHeaders
); |
| 192 |
| 193 final String PAGE_PATH = "/appcache.html"; |
| 194 final String PAGE_CONTENTS = "<html manifest=\"" + MANIFEST_PATH + "\">"
+ |
| 195 "<head><script src=\"" + CACHED_FILE_PATH + "\"></script></head>
</html>"; |
| 196 String url = mWebServer.setResponse(PAGE_PATH, PAGE_CONTENTS, null); |
| 197 |
| 198 loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url)
; |
| 199 executeJavaScriptAndWaitForResult(mAwContents, mContentsClient, |
| 200 "window.applicationCache.update();"); |
| 201 } |
| 202 |
| 203 @LargeTest |
| 204 public void testDeleteAllWithAppCache() throws Exception { |
| 205 long currentUsage = getUsageForOrigin(mOrigin); |
| 206 assertEquals(0, currentUsage); |
| 207 |
| 208 useAppCache(); |
| 209 assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| 210 @Override |
| 211 public boolean isSatisfied() { |
| 212 try { |
| 213 return getUsageForOrigin(mOrigin) > 0; |
| 214 } catch (Exception e) { |
| 215 return false; |
| 216 } |
| 217 } |
| 218 })); |
| 219 |
| 220 deleteAllData(); |
| 221 assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| 222 @Override |
| 223 public boolean isSatisfied() { |
| 224 try { |
| 225 return getUsageForOrigin(mOrigin) == 0; |
| 226 } catch (Exception e) { |
| 227 return false; |
| 228 } |
| 229 } |
| 230 })); |
| 231 } |
| 232 |
| 233 @LargeTest |
| 234 public void testDeleteOriginWithAppCache() throws Exception { |
| 235 long currentUsage = getUsageForOrigin(mOrigin); |
| 236 assertEquals(0, currentUsage); |
| 237 |
| 238 useAppCache(); |
| 239 assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| 240 @Override |
| 241 public boolean isSatisfied() { |
| 242 try { |
| 243 return getUsageForOrigin(mOrigin) > 0; |
| 244 } catch (Exception e) { |
| 245 return false; |
| 246 } |
| 247 } |
| 248 })); |
| 249 |
| 250 deleteOrigin(mOrigin); |
| 251 assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { |
| 252 @Override |
| 253 public boolean isSatisfied() { |
| 254 try { |
| 255 return getUsageForOrigin(mOrigin) == 0; |
| 256 } catch (Exception e) { |
| 257 return false; |
| 258 } |
| 259 } |
| 260 })); |
| 261 } |
| 262 |
| 263 @LargeTest |
| 264 public void testGetResultsMatch() throws Exception { |
| 265 useAppCache(); |
| 266 |
| 267 CriteriaHelper.pollForCriteria(new Criteria() { |
| 268 @Override |
| 269 public boolean isSatisfied() { |
| 270 try { |
| 271 return getOrigins().mOrigins.length > 0; |
| 272 } catch (Exception e) { |
| 273 return false; |
| 274 } |
| 275 } |
| 276 }); |
| 277 |
| 278 AwQuotaManagerBridge.Origins origins = getOrigins(); |
| 279 assertEquals(origins.mOrigins.length, origins.mUsage.length); |
| 280 assertEquals(origins.mOrigins.length, origins.mQuota.length); |
| 281 |
| 282 for (int i = 0; i < origins.mOrigins.length; ++i) { |
| 283 assertEquals(origins.mUsage[i], getUsageForOrigin(new String(origins
.mOrigins[i]))); |
| 284 assertEquals(origins.mQuota[i], getQuotaForOrigin(new String(origins
.mOrigins[i]))); |
| 285 } |
| 286 } |
| 287 } |
OLD | NEW |