1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.webkit.cts; 18 19 import android.platform.test.annotations.Presubmit; 20 import android.webkit.CookieManager; 21 22 import com.android.compatibility.common.util.NullWebViewUtils; 23 24 import static org.junit.Assert.assertEquals; 25 import static org.junit.Assert.assertFalse; 26 import static org.junit.Assert.assertNull; 27 import static org.junit.Assert.assertTrue; 28 29 import android.webkit.WebView; 30 31 import androidx.test.ext.junit.rules.ActivityScenarioRule; 32 import androidx.test.ext.junit.runners.AndroidJUnit4; 33 import androidx.test.filters.MediumTest; 34 35 import org.junit.Assume; 36 import org.junit.Before; 37 import org.junit.Rule; 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 41 /** 42 * Original framework tests for CookieManager 43 */ 44 @MediumTest 45 @RunWith(AndroidJUnit4.class) 46 public class CookieTest extends SharedWebViewTest { 47 48 private CookieManager mCookieManager; 49 private static final long WAIT_TIME = 50; 50 51 @Rule 52 public ActivityScenarioRule mActivityScenarioRule = 53 new ActivityScenarioRule(CookieSyncManagerCtsActivity.class); 54 55 @Before setUp()56 public void setUp() throws Exception { 57 if (getTestEnvironment().getWebView() == null) { 58 return; 59 } 60 61 mCookieManager = CookieManager.getInstance(); 62 mCookieManager.removeAllCookie(); 63 // cookies are removed asynchronously, wait a bit for cookies to be removed 64 int maxWait = 10; 65 for (int i=0; i < maxWait; i++) { 66 // this is unfortuately non-deterministic, but ensure sleep a least once to limit 67 // chance of remove thread running after test has begun 68 Thread.sleep(WAIT_TIME); 69 if (!mCookieManager.hasCookies()) { 70 break; 71 } 72 } 73 assertFalse(mCookieManager.hasCookies()); 74 } 75 76 @Override createTestEnvironment()77 protected SharedWebViewTestEnvironment createTestEnvironment() { 78 Assume.assumeTrue("WebView is not available", NullWebViewUtils.isWebViewAvailable()); 79 80 SharedWebViewTestEnvironment.Builder builder = new SharedWebViewTestEnvironment.Builder(); 81 82 mActivityScenarioRule 83 .getScenario() 84 .onActivity( 85 activity -> { 86 WebView webView = ((CookieSyncManagerCtsActivity) activity) 87 .getWebView(); 88 builder.setHostAppInvoker( 89 SharedWebViewTestEnvironment.createHostAppInvoker( 90 activity)) 91 .setWebView(webView); 92 }); 93 94 return builder.build(); 95 } 96 97 @Presubmit 98 @Test testDomain()99 public void testDomain() { 100 String url = "http://www.foo.com"; 101 102 // basic 103 mCookieManager.setCookie(url, "a=b"); 104 String cookie = mCookieManager.getCookie(url); 105 assertEquals("a=b", cookie); 106 107 // no cross domain cookie 108 cookie = mCookieManager.getCookie("http://bar.com"); 109 assertNull(cookie); 110 111 // more than one cookie 112 mCookieManager.setCookie(url, "c=d; domain=.foo.com"); 113 cookie = mCookieManager.getCookie(url); 114 assertTrue(cookie.contains("a=b;")); 115 assertTrue(cookie.contains("c=d")); 116 117 // host cookie should not be accessible from a sub-domain. 118 cookie = mCookieManager.getCookie("http://bar.www.foo.com"); 119 assertEquals("c=d", cookie); 120 121 // test setting a domain= that doesn't start w/ a dot, should 122 // treat it as a domain cookie, as if there was a pre-pended dot. 123 mCookieManager.setCookie(url, "e=f; domain=www.foo.com"); 124 cookie = mCookieManager.getCookie(url); 125 assertTrue(cookie.contains("a=b")); 126 assertTrue(cookie.contains("c=d")); 127 assertTrue(cookie.contains("e=f")); 128 129 cookie = mCookieManager.getCookie("http://sub.www.foo.com"); 130 assertTrue(cookie.contains("c=d")); 131 assertTrue(cookie.contains("e=f")); 132 133 cookie = mCookieManager.getCookie("http://foo.com"); 134 assertEquals("c=d", cookie); 135 } 136 137 @Test testSubDomain()138 public void testSubDomain() { 139 String url_abcd = "http://a.b.c.d.com"; 140 String url_bcd = "http://b.c.d.com"; 141 String url_cd = "http://c.d.com"; 142 String url_d = "http://d.com"; 143 144 mCookieManager.setCookie(url_abcd, "a=1; domain=.a.b.c.d.com"); 145 mCookieManager.setCookie(url_abcd, "b=2; domain=.b.c.d.com"); 146 mCookieManager.setCookie(url_abcd, "c=3; domain=.c.d.com"); 147 mCookieManager.setCookie(url_abcd, "d=4; domain=.d.com"); 148 149 String cookie = mCookieManager.getCookie(url_abcd); 150 assertTrue(cookie.contains("a=1")); 151 assertTrue(cookie.contains("b=2")); 152 assertTrue(cookie.contains("c=3")); 153 assertTrue(cookie.contains("d=4")); 154 cookie = mCookieManager.getCookie(url_bcd); 155 assertTrue(cookie.contains("b=2")); 156 assertTrue(cookie.contains("c=3")); 157 assertTrue(cookie.contains("d=4")); 158 cookie = mCookieManager.getCookie(url_cd); 159 assertTrue(cookie.contains("c=3")); 160 assertTrue(cookie.contains("d=4")); 161 cookie = mCookieManager.getCookie(url_d); 162 assertEquals("d=4", cookie); 163 164 // check that the same cookie can exist on different sub-domains. 165 mCookieManager.setCookie(url_bcd, "x=bcd; domain=.b.c.d.com"); 166 mCookieManager.setCookie(url_bcd, "x=cd; domain=.c.d.com"); 167 cookie = mCookieManager.getCookie(url_bcd); 168 assertTrue(cookie.contains("b=2")); 169 assertTrue(cookie.contains("c=3")); 170 assertTrue(cookie.contains("d=4")); 171 assertTrue(cookie.contains("x=bcd")); 172 assertTrue(cookie.contains("x=cd")); 173 cookie = mCookieManager.getCookie(url_cd); 174 assertTrue(cookie.contains("c=3")); 175 assertTrue(cookie.contains("d=4")); 176 assertTrue(cookie.contains("x=cd")); 177 } 178 179 @Test testInvalidDomain()180 public void testInvalidDomain() { 181 String url = "http://foo.bar.com"; 182 183 mCookieManager.setCookie(url, "a=1; domain=.yo.foo.bar.com"); 184 String cookie = mCookieManager.getCookie(url); 185 assertNull(cookie); 186 187 mCookieManager.setCookie(url, "b=2; domain=.foo.com"); 188 cookie = mCookieManager.getCookie(url); 189 assertNull(cookie); 190 191 mCookieManager.setCookie(url, "c=3; domain=.bar.foo.com"); 192 cookie = mCookieManager.getCookie(url); 193 assertNull(cookie); 194 195 mCookieManager.setCookie(url, "d=4; domain=.foo.bar.com.net"); 196 cookie = mCookieManager.getCookie(url); 197 assertNull(cookie); 198 199 mCookieManager.setCookie(url, "e=5; domain=.ar.com"); 200 cookie = mCookieManager.getCookie(url); 201 assertNull(cookie); 202 203 mCookieManager.setCookie(url, "f=6; domain=.com"); 204 cookie = mCookieManager.getCookie(url); 205 assertNull(cookie); 206 207 mCookieManager.setCookie(url, "g=7; domain=.co.uk"); 208 cookie = mCookieManager.getCookie(url); 209 assertNull(cookie); 210 211 mCookieManager.setCookie(url, "h=8; domain=.foo.bar.com.com"); 212 cookie = mCookieManager.getCookie(url); 213 assertNull(cookie); 214 } 215 216 @Test testPath()217 public void testPath() { 218 String url = "http://www.foo.com"; 219 220 mCookieManager.setCookie(url, "a=b; path=/wee"); 221 String cookie = mCookieManager.getCookie(url + "/wee"); 222 assertEquals("a=b", cookie); 223 cookie = mCookieManager.getCookie(url + "/wee/"); 224 assertEquals("a=b", cookie); 225 cookie = mCookieManager.getCookie(url + "/wee/hee"); 226 assertEquals("a=b", cookie); 227 cookie = mCookieManager.getCookie(url + "/wee/hee/more"); 228 assertEquals("a=b", cookie); 229 cookie = mCookieManager.getCookie(url + "/weehee"); 230 assertNull(cookie); 231 cookie = mCookieManager.getCookie(url); 232 assertNull(cookie); 233 234 mCookieManager.setCookie(url, "a=c; path="); 235 cookie = mCookieManager.getCookie(url + "/wee"); 236 // order of contents matters in this case, per spec 237 assertEquals("a=b; a=c", cookie); 238 cookie = mCookieManager.getCookie(url); 239 assertEquals("a=c", cookie); 240 241 mCookieManager.setCookie(url, "a=d"); 242 cookie = mCookieManager.getCookie(url + "/wee"); 243 assertEquals("a=b; a=d", cookie); 244 } 245 246 @Test testEmptyValue()247 public void testEmptyValue() { 248 String url = "http://www.foobar.com"; 249 250 mCookieManager.setCookie(url, "bar="); 251 String cookie = mCookieManager.getCookie(url); 252 assertEquals("bar=", cookie); 253 254 mCookieManager.setCookie(url, "foobar=;"); 255 cookie = mCookieManager.getCookie(url); 256 assertEquals("bar=; foobar=", cookie); 257 258 mCookieManager.setCookie(url, "baz=; path=/wee"); 259 cookie = mCookieManager.getCookie(url + "/wee"); 260 assertEquals("baz=; bar=; foobar=", cookie); 261 } 262 } 263