xref: /aosp_15_r20/cts/tests/tests/webkit/src/android/webkit/cts/CookieTest.java (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
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