- add sources.
[platform/framework/web/crosswalk.git] / src / android_webview / javatests / src / org / chromium / android_webview / test / AwQuotaManagerBridgeTest.java
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 }