CookieManagerTest.java revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 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.MoreAsserts;
8import android.test.suitebuilder.annotation.MediumTest;
9import android.test.suitebuilder.annotation.SmallTest;
10import android.util.Pair;
11
12import org.chromium.android_webview.AwContents;
13import org.chromium.android_webview.CookieManager;
14import org.chromium.base.test.util.Feature;
15import org.chromium.content.browser.test.util.Criteria;
16import org.chromium.content.browser.test.util.CriteriaHelper;
17import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper;
18import org.chromium.net.test.util.TestWebServer;
19
20import java.util.ArrayList;
21import java.util.Arrays;
22import java.util.Date;
23import java.util.HashSet;
24import java.util.List;
25import java.util.Set;
26import java.util.concurrent.atomic.AtomicInteger;
27
28/**
29 * Tests for the CookieManager.
30 */
31public class CookieManagerTest extends AndroidWebViewTestBase {
32
33    private CookieManager mCookieManager;
34    private TestAwContentsClient mContentsClient;
35    private AwContents mAwContents;
36
37    @Override
38    protected void setUp() throws Exception {
39        super.setUp();
40
41        mCookieManager = new CookieManager();
42        mContentsClient = new TestAwContentsClient();
43        final AwTestContainerView testContainerView =
44                createAwTestContainerViewOnMainSync(mContentsClient);
45        mAwContents = testContainerView.getAwContents();
46        mAwContents.getContentViewCore().getContentSettings().setJavaScriptEnabled(true);
47        assertNotNull(mCookieManager);
48    }
49
50    @SmallTest
51    @Feature({"AndroidWebView", "Privacy"})
52    public void testAllowFileSchemeCookies() throws Throwable {
53        assertFalse(CookieManager.allowFileSchemeCookies());
54        CookieManager.setAcceptFileSchemeCookies(true);
55        assertTrue(CookieManager.allowFileSchemeCookies());
56        CookieManager.setAcceptFileSchemeCookies(false);
57        assertFalse(CookieManager.allowFileSchemeCookies());
58    }
59
60    @MediumTest
61    @Feature({"AndroidWebView", "Privacy"})
62    public void testAcceptCookie() throws Throwable {
63        TestWebServer webServer = null;
64        try {
65            webServer = new TestWebServer(false);
66            String path = "/cookie_test.html";
67            String responseStr =
68                    "<html><head><title>TEST!</title></head><body>HELLO!</body></html>";
69            String url = webServer.setResponse(path, responseStr, null);
70
71            mCookieManager.setAcceptCookie(false);
72            mCookieManager.removeAllCookie();
73            assertFalse(mCookieManager.acceptCookie());
74            assertFalse(mCookieManager.hasCookies());
75
76            loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
77            setCookie("test1", "value1");
78            assertNull(mCookieManager.getCookie(url));
79
80            List<Pair<String, String>> responseHeaders = new ArrayList<Pair<String, String>>();
81            responseHeaders.add(
82                    Pair.create("Set-Cookie", "header-test1=header-value1; path=" + path));
83            url = webServer.setResponse(path, responseStr, responseHeaders);
84            loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
85            assertNull(mCookieManager.getCookie(url));
86
87            mCookieManager.setAcceptCookie(true);
88            assertTrue(mCookieManager.acceptCookie());
89
90            url = webServer.setResponse(path, responseStr, null);
91            loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
92            setCookie("test2", "value2");
93            waitForCookie(url);
94            String cookie = mCookieManager.getCookie(url);
95            assertNotNull(cookie);
96            validateCookies(cookie, "test2");
97
98            responseHeaders = new ArrayList<Pair<String, String>>();
99            responseHeaders.add(
100                    Pair.create("Set-Cookie", "header-test2=header-value2 path=" + path));
101            url = webServer.setResponse(path, responseStr, responseHeaders);
102            loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
103            waitForCookie(url);
104            cookie = mCookieManager.getCookie(url);
105            assertNotNull(cookie);
106            validateCookies(cookie, "test2", "header-test2");
107
108            // clean up all cookies
109            mCookieManager.removeAllCookie();
110        } finally {
111            if (webServer != null) webServer.shutdown();
112        }
113    }
114
115    private void setCookie(final String name, final String value)
116            throws Throwable {
117        OnEvaluateJavaScriptResultHelper onEvaluateJavaScriptResultHelper =
118                mContentsClient.getOnEvaluateJavaScriptResultHelper();
119        int currentCallCount = onEvaluateJavaScriptResultHelper.getCallCount();
120        final AtomicInteger requestId = new AtomicInteger();
121        runTestOnUiThread(new Runnable() {
122            @Override
123            public void run() {
124                requestId.set(mAwContents.getContentViewCore().evaluateJavaScript(
125                        "var expirationDate = new Date();" +
126                        "expirationDate.setDate(expirationDate.getDate() + 5);" +
127                        "document.cookie='" + name + "=" + value +
128                                "; expires=' + expirationDate.toUTCString();"));
129            }
130        });
131        onEvaluateJavaScriptResultHelper.waitForCallback(currentCallCount);
132        assertEquals("Response ID mismatch when evaluating JavaScript.",
133                requestId.get(), onEvaluateJavaScriptResultHelper.getId());
134    }
135
136    private void waitForCookie(final String url) throws InterruptedException {
137        assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
138            @Override
139            public boolean isSatisfied() {
140                return mCookieManager.getCookie(url) != null;
141            }
142        }));
143    }
144
145    private void validateCookies(String responseCookie, String... expectedCookieNames) {
146        String[] cookies = responseCookie.split(";");
147        Set<String> foundCookieNames = new HashSet<String>();
148        for (String cookie : cookies) {
149            foundCookieNames.add(cookie.substring(0, cookie.indexOf("=")).trim());
150        }
151        MoreAsserts.assertEquals(
152                foundCookieNames, new HashSet<String>(Arrays.asList(expectedCookieNames)));
153    }
154
155    @MediumTest
156    @Feature({"AndroidWebView", "Privacy"})
157    public void testRemoveAllCookie() throws InterruptedException {
158        // enable cookie
159        mCookieManager.setAcceptCookie(true);
160        assertTrue(mCookieManager.acceptCookie());
161
162        // first there should be no cookie stored
163        mCookieManager.removeAllCookie();
164        assertFalse(mCookieManager.hasCookies());
165
166        String url = "http://www.example.com";
167        String cookie = "name=test";
168        mCookieManager.setCookie(url, cookie);
169        assertEquals(cookie, mCookieManager.getCookie(url));
170
171        assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
172            @Override
173            public boolean isSatisfied() {
174                return mCookieManager.hasCookies();
175            }
176        }));
177
178        // clean up all cookies
179        mCookieManager.removeAllCookie();
180        assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
181            @Override
182            public boolean isSatisfied() {
183                return !mCookieManager.hasCookies();
184            }
185        }));
186    }
187
188    @MediumTest
189    @Feature({"AndroidWebView", "Privacy"})
190    @SuppressWarnings("deprecation")
191    public void testCookieExpiration() throws InterruptedException {
192        // enable cookie
193        mCookieManager.setAcceptCookie(true);
194        assertTrue(mCookieManager.acceptCookie());
195        mCookieManager.removeAllCookie();
196        assertFalse(mCookieManager.hasCookies());
197
198        final String url = "http://www.example.com";
199        final String cookie1 = "cookie1=peter";
200        final String cookie2 = "cookie2=sue";
201        final String cookie3 = "cookie3=marc";
202
203        mCookieManager.setCookie(url, cookie1); // session cookie
204
205        Date date = new Date();
206        date.setTime(date.getTime() + 1000 * 600);
207        String value2 = cookie2 + "; expires=" + date.toGMTString();
208        mCookieManager.setCookie(url, value2); // expires in 10min
209
210        long expiration = 3000;
211        date = new Date();
212        date.setTime(date.getTime() + expiration);
213        String value3 = cookie3 + "; expires=" + date.toGMTString();
214        mCookieManager.setCookie(url, value3); // expires in 3s
215
216        String allCookies = mCookieManager.getCookie(url);
217        assertTrue(allCookies.contains(cookie1));
218        assertTrue(allCookies.contains(cookie2));
219        assertTrue(allCookies.contains(cookie3));
220
221        mCookieManager.removeSessionCookie();
222        assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
223            @Override
224            public boolean isSatisfied() {
225                String c = mCookieManager.getCookie(url);
226                return !c.contains(cookie1) && c.contains(cookie2) && c.contains(cookie3);
227            }
228        }));
229
230        Thread.sleep(expiration + 1000); // wait for cookie to expire
231        mCookieManager.removeExpiredCookie();
232        assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
233            @Override
234            public boolean isSatisfied() {
235                String c = mCookieManager.getCookie(url);
236                return !c.contains(cookie1) && c.contains(cookie2) && !c.contains(cookie3);
237            }
238        }));
239
240        mCookieManager.removeAllCookie();
241        assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
242            @Override
243            public boolean isSatisfied() {
244                return mCookieManager.getCookie(url) == null;
245            }
246        }));
247    }
248}
249