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