Revert "Cookies: Add targetSdkVersion based compatibility for domain matching."

This reverts commit 1e7abd80b139d532f53d6ca8a2a0b5671fa1fb43.

Change-Id: Iefc1342b628ee241bbb999b59ca0fa211bedf5b9
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/CookieManagerTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/CookieManagerTest.java
new file mode 100644
index 0000000..9092f26
--- /dev/null
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/CookieManagerTest.java
@@ -0,0 +1,364 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.tests.java.net;
+
+import junit.framework.TestCase;
+import java.io.IOException;
+import java.net.CookieManager;
+import java.net.CookiePolicy;
+import java.net.CookieStore;
+import java.net.HttpCookie;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class CookieManagerTest extends TestCase {
+
+    private static void checkValidParams4Get(URI uri,
+            Map<String, List<String>> map) throws IOException {
+        CookieManager manager = new CookieManager();
+        try {
+            manager.get(uri, map);
+            fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+    }
+
+    private static void checkValidParams4Put(URI uri,
+            Map<String, List<String>> map) throws IOException {
+        CookieManager manager = new CookieManager();
+        try {
+            manager.put(uri, map);
+            fail("Should throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+    }
+
+    /**
+     * {@link java.net.CookieManager#get(java.net.URI, java.util.Map)} &
+     * {@link java.net.CookieManager#put(java.net.URI, java.util.Map)}
+     * IllegalArgumentException
+     * @since 1.6
+     */
+    public void test_Put_Get_LURI_LMap_exception() throws IOException,
+            URISyntaxException {
+        // get
+        checkValidParams4Get(new URI(""), null);
+        checkValidParams4Get(new URI("http://www.test.com"), null);
+        checkValidParams4Get(null, null);
+        checkValidParams4Get(null, new HashMap<String, List<String>>());
+
+        // put
+        checkValidParams4Put(new URI(""), null);
+        checkValidParams4Put(new URI("http://www.test.com"), null);
+        checkValidParams4Put(null, null);
+        checkValidParams4Put(null, new HashMap<String, List<String>>());
+    }
+
+    private static Map<String, List<String>> addCookie(String[][] cookies) {
+        Map<String, List<String>> responseHeaders = new LinkedHashMap<String, List<String>>();
+        for (int i = 0; i < cookies.length; i++) {
+            List<String> fields = new ArrayList<String>();
+            for (int j = 1; j < cookies[i].length; j += 2) {
+                fields.add(cookies[i][j]);
+            }
+            responseHeaders.put(cookies[i][0], fields);
+        }
+        return responseHeaders;
+    }
+
+    private static CookieManager store(String[][] cookies,
+            Map<String, List<String>> responseHeaders, CookiePolicy policy)
+            throws IOException, URISyntaxException {
+        CookieManager manager = new CookieManager(null, policy);
+        // Put all cookies into manager
+        for (int i = 0; i < cookies.length; i++) {
+            for (int j = 2; j < cookies[i].length; j += 2) {
+                URI uri = new URI(cookies[i][j]);
+                manager.put(uri, responseHeaders);
+            }
+        }
+        return manager;
+    }
+
+    /**
+     * Unlike the RI, we flatten all matching cookies into a single Cookie header
+     * instead of sending down multiple cookie headers. Also, when no cookies match
+     * a given URI, we leave the requestHeaders unmodified.
+     *
+     * @since 1.6
+     */
+    public void test_Put_Get_LURI_LMap() throws IOException, URISyntaxException {
+        // cookie-key | (content, URI)...
+        String[][] cookies = {
+                { "Set-cookie",
+                        "Set-cookie:PREF=test;path=/;domain=.b.c;", "http://a.b.c/",
+                        "Set-cookie:PREF1=test2;path=/;domain=.beg.com;", "http://a.b.c/" },
+
+                { "Set-cookie2",
+                        "Set-cookie2:NAME1=VALUE1;path=/te;domain=.b.c;", "http://a.b.c/test" },
+
+                { "Set-cookie",
+                        "Set-cookie2:NAME=VALUE;path=/;domain=.beg.com;", "http://a.beg.com/test",
+                        "Set-cookie2:NAME1=VALUE1;path=/;domain=.beg.com;", "http://a.beg.com/test" },
+
+                { "Set-cookie2",
+                        "Set-cookie3:NAME=VALUE;path=/;domain=.test.org;", "http://a.test.org/test" },
+
+                { null,
+                        "Set-cookie3:NAME=VALUE;path=/te;domain=.test.org;", "http://a.test.org/test" },
+
+                { "Set-cookie2",
+                        "lala", "http://a.test.org/test" }
+
+        };
+
+        // requires path of cookie is the prefix of uri
+        // domain of cookie must match that of uri
+        Map<String, List<String>> responseHeaders = addCookie(new String[][] {
+                cookies[0], cookies[1] });
+        CookieManager manager = store(
+                new String[][] { cookies[0], cookies[1] }, responseHeaders,
+                null);
+
+        HashMap<String, List<String>> dummyMap = new HashMap<String, List<String>>();
+        Map<String, List<String>> map = manager.get(new URI("http://a.b.c/"),
+                dummyMap);
+
+        assertEquals(1, map.size());
+        List<String> list = map.get("Cookie");
+        assertEquals(1, list.size());
+
+        // requires path of cookie is the prefix of uri
+        map = manager.get(new URI("http://a.b.c/te"), dummyMap);
+        list = map.get("Cookie");
+        assertEquals(1, list.size());
+        assertTrue(list.get(0).contains("PREF=test"));
+        // Cookies from "/test" should *not* match the URI "/te".
+        assertFalse(list.get(0).contains("NAME=VALUE"));
+
+        // If all cookies are of version 1, then $version=1 will be added
+        // ,no matter the value cookie-key
+        responseHeaders = addCookie(new String[][] { cookies[2] });
+        manager = store(new String[][] { cookies[2] }, responseHeaders, null);
+        map = manager.get(new URI("http://a.beg.com/test"), dummyMap);
+        list = map.get("Cookie");
+        assertEquals(1, list.size());
+        assertTrue(list.get(0).startsWith("$Version=\"1\""));
+
+        // cookie-key will not have effect on determining cookie version
+        responseHeaders = addCookie(new String[][] { cookies[3] });
+        manager = store(new String[][] { cookies[3] }, responseHeaders, null);
+        map = manager.get(new URI("http://a.test.org/"), responseHeaders);
+        list = map.get("Cookie");
+        assertEquals(1, list.size());
+        assertEquals("Set-cookie3:NAME=VALUE", list.get(0));
+
+        // When key is null, no cookie can be stored/retrieved, even if policy =
+        // ACCEPT_ALL
+        responseHeaders = addCookie(new String[][] { cookies[4] });
+        manager = store(new String[][] { cookies[4] }, responseHeaders,
+                CookiePolicy.ACCEPT_ALL);
+        map = manager.get(new URI("http://a.test.org/"), responseHeaders);
+        list = map.get("Cookie");
+        assertNull(list);
+
+        // All cookies will be rejected if policy == ACCEPT_NONE
+        responseHeaders = addCookie(new String[][] { cookies[3] });
+        manager = store(new String[][] { cookies[3] }, responseHeaders,
+                CookiePolicy.ACCEPT_NONE);
+        map = manager.get(new URI("http://a.test.org/"), responseHeaders);
+        list = map.get("Cookie");
+        assertNull(list);
+
+        responseHeaders = addCookie(new String[][] { cookies[5] });
+        manager = store(new String[][] { cookies[5] }, responseHeaders,
+                CookiePolicy.ACCEPT_ALL);
+        list = map.get("Cookie");
+        assertNull(list);
+
+        try {
+            map.put(null, null);
+            fail("Should throw UnsupportedOperationException");
+        } catch (UnsupportedOperationException e) {
+            // expected
+        }
+
+    }
+
+    /**
+     * {@link java.net.CookieManager#CookieManager()}
+     * @since 1.6
+     */
+    public void test_CookieManager() {
+        CookieManager cookieManager = new CookieManager();
+        assertNotNull(cookieManager);
+        assertNotNull(cookieManager.getCookieStore());
+    }
+
+    /**
+     * {@link java.net.CookieManager#CookieManager(java.net.CookieStore, java.net.CookiePolicy)}
+     * @since 1.6
+     */
+    public void testCookieManager_LCookieStore_LCookiePolicy() {
+        class DummyStore implements CookieStore {
+            public String getName() {
+                return "A dummy store";
+            }
+
+            public void add(URI uri, HttpCookie cookie) {
+                // expected
+            }
+
+            public List<HttpCookie> get(URI uri) {
+                return null;
+            }
+
+            public List<HttpCookie> getCookies() {
+                return null;
+            }
+
+            public List<URI> getURIs() {
+                return null;
+            }
+
+            public boolean remove(URI uri, HttpCookie cookie) {
+                return false;
+            }
+
+            public boolean removeAll() {
+                return false;
+            }
+        }
+        CookieStore store = new DummyStore();
+        CookieManager cookieManager = new CookieManager(store,
+                CookiePolicy.ACCEPT_ALL);
+        assertEquals("A dummy store", ((DummyStore) cookieManager
+                .getCookieStore()).getName());
+        assertSame(store, cookieManager.getCookieStore());
+    }
+
+    /**
+     * {@link java.net.CookieManager#setCookiePolicy(java.net.CookiePolicy)}
+     * @since 1.6
+     */
+    public void test_SetCookiePolicy_LCookiePolicy() throws URISyntaxException,
+            IOException {
+
+        // Policy = ACCEPT_NONE
+        CookieManager manager = new CookieManager();
+        manager.setCookiePolicy(CookiePolicy.ACCEPT_NONE);
+        Map<String, List<String>> responseHeaders = new TreeMap<String, List<String>>();
+        URI uri = new URI("http://a.b.c");
+        manager.put(uri, responseHeaders);
+        Map<String, List<String>> map = manager.get(uri,
+                new HashMap<String, List<String>>());
+
+        assertEquals(0, map.size());
+
+        // Policy = ACCEPT_ALL
+        manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
+        responseHeaders = new TreeMap<String, List<String>>();
+        ArrayList<String> list = new ArrayList<String>();
+        list.add("test=null");
+        responseHeaders.put("Set-cookie", list);
+        uri = new URI("http://b.c.d");
+        manager.put(uri, responseHeaders);
+        map = manager.get(uri, new HashMap<String, List<String>>());
+        assertEquals(1, map.size());
+    }
+
+    /**
+     * {@link java.net.CookieManager#getCookieStore()}
+     * @since 1.6
+     */
+    public void test_GetCookieStore() {
+        CookieManager cookieManager = new CookieManager();
+        CookieStore store = cookieManager.getCookieStore();
+        assertNotNull(store);
+    }
+
+    // http://b/25763487
+    public void testCookieWithNullPath() throws Exception {
+        FakeSingleCookieStore fscs = new FakeSingleCookieStore();
+        CookieManager cm = new CookieManager(fscs, CookiePolicy.ACCEPT_ALL);
+
+        HttpCookie cookie = new HttpCookie("foo", "bar");
+        cookie.setDomain("http://www.foo.com");
+        cookie.setVersion(0);
+
+        fscs.setNextCookie(cookie);
+
+        Map<String, List<String>> cookieHeaders = cm.get(
+                new URI("http://www.foo.com/log/me/in"), Collections.EMPTY_MAP);
+
+        List<String> cookies = cookieHeaders.get("Cookie");
+        assertEquals("foo=bar", cookies.get(0));
+    }
+
+    /**
+     * A cookie store that always returns one cookie per URI (without any sort of
+     * rule matching). The cookie that's returned is provided via a call to setNextCookie
+     */
+    public static class FakeSingleCookieStore implements CookieStore {
+        private List<HttpCookie> cookies;
+
+        void setNextCookie(HttpCookie cookie) {
+            cookies = Collections.singletonList(cookie);
+        }
+
+        @Override
+        public void add(URI uri, HttpCookie cookie) {
+        }
+
+        @Override
+        public List<HttpCookie> get(URI uri) {
+            return cookies;
+        }
+
+        @Override
+        public List<HttpCookie> getCookies() {
+            return cookies;
+        }
+
+        @Override
+        public List<URI> getURIs() {
+            return null;
+        }
+
+        @Override
+        public boolean remove(URI uri, HttpCookie cookie) {
+            cookies = Collections.EMPTY_LIST;
+            return true;
+        }
+
+        @Override
+        public boolean removeAll() {
+            cookies = Collections.EMPTY_LIST;
+            return true;
+        }
+    }
+}
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/CookieStoreTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/CookieStoreTest.java
new file mode 100644
index 0000000..72be761
--- /dev/null
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/java/net/CookieStoreTest.java
@@ -0,0 +1,401 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.harmony.tests.java.net;
+
+import junit.framework.TestCase;
+import java.net.CookieManager;
+import java.net.CookieStore;
+import java.net.HttpCookie;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.RandomAccess;
+
+public class CookieStoreTest extends TestCase {
+
+    private CookieManager cookieManager;
+
+    private CookieStore cookieStore;
+
+    /**
+     * java.net.CookieStore#add(URI, HttpCookie)
+     * @since 1.6
+     */
+    public void test_add_LURI_LHttpCookie() throws URISyntaxException {
+        URI uri = new URI("http://harmony.test.unit.org");
+        HttpCookie cookie = new HttpCookie("name1", "value1");
+        cookie.setDiscard(true);
+
+        // This needn't throw. We should use the cookie's domain, if set.
+        // If no domain is set, this cookie will languish in the store until
+        // it expires.
+        cookieStore.add(null, cookie);
+
+        try {
+            cookieStore.add(uri, null);
+            fail("should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+
+        try {
+            cookieStore.add(null, null);
+            fail("should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+
+        cookieStore.add(uri, cookie);
+        List<HttpCookie> list = cookieStore.get(uri);
+        assertEquals(1, list.size());
+        assertTrue(list.contains(cookie));
+
+        HttpCookie cookie2 = new HttpCookie("  NaME1   ", "  TESTVALUE1   ");
+        cookieStore.add(uri, cookie2);
+        list = cookieStore.get(uri);
+        assertEquals(1, list.size());
+        assertEquals("  TESTVALUE1   ", list.get(0).getValue());
+        assertTrue(list.contains(cookie2));
+
+        // domain and path attributes works
+        HttpCookie anotherCookie = new HttpCookie("name1", "value1");
+        anotherCookie.setDomain("domain");
+        anotherCookie.setPath("Path");
+        cookieStore.add(uri, anotherCookie);
+        list = cookieStore.get(uri);
+        assertEquals(2, list.size());
+        assertNull(list.get(0).getDomain());
+        assertEquals("domain", list.get(1).getDomain());
+        assertEquals("Path", list.get(1).getPath());
+
+        URI uri2 = new URI("http://.test.unit.org");
+        HttpCookie cookie3 = new HttpCookie("NaME2", "VALUE2");
+        cookieStore.add(uri2, cookie3);
+        list = cookieStore.get(uri2);
+        assertEquals(1, list.size());
+        assertEquals("VALUE2", list.get(0).getValue());
+        list = cookieStore.getCookies();
+        assertEquals(3, list.size());
+
+        // expired cookie won't be selected.
+        HttpCookie cookie4 = new HttpCookie("cookie4", "value4");
+        cookie4.setMaxAge(-2);
+        assertTrue(cookie4.hasExpired());
+        cookieStore.add(uri2, cookie4);
+        list = cookieStore.getCookies();
+        assertEquals(3, list.size());
+        assertFalse(cookieStore.remove(uri2, cookie4));
+
+        cookie4.setMaxAge(3000);
+        cookie4.setDomain("domain");
+        cookie4.setPath("path");
+        cookieStore.add(uri2, cookie4);
+        list = cookieStore.get(uri2);
+        assertEquals(2, list.size());
+
+        cookieStore.add(uri, cookie4);
+        list = cookieStore.get(uri);
+        assertEquals(3, list.size());
+        list = cookieStore.get(uri2);
+        assertEquals(2, list.size());
+        list = cookieStore.getCookies();
+        assertEquals(4, list.size());
+
+        URI baduri = new URI("bad_url");
+        HttpCookie cookie6 = new HttpCookie("cookie5", "value5");
+        cookieStore.add(baduri, cookie6);
+        list = cookieStore.get(baduri);
+        assertTrue(list.contains(cookie6));
+    }
+
+    /**
+     * java.net.CookieStore#get(URI)
+     * @since 1.6
+     */
+    public void test_get_LURI() throws URISyntaxException {
+        try {
+            cookieStore.get(null);
+            fail("should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+
+        URI uri1 = new URI("http://get.uri1.test.org");
+        List<HttpCookie> list = cookieStore.get(uri1);
+        assertTrue(list.isEmpty());
+
+        HttpCookie cookie1 = new HttpCookie("cookie_name1", "cookie_value1");
+        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
+        cookieStore.add(uri1, cookie1);
+        cookieStore.add(uri1, cookie2);
+        URI uri2 = new URI("http://get.uri2.test.org");
+        HttpCookie cookie3 = new HttpCookie("cookie_name3", "cookie_value3");
+        cookieStore.add(uri2, cookie3);
+        list = cookieStore.get(uri1);
+        assertEquals(2, list.size());
+        list = cookieStore.get(uri2);
+        assertEquals(1, list.size());
+
+        // domain-match cookies also be selected.
+        HttpCookie cookie4 = new HttpCookie("cookie_name4", "cookie_value4");
+        cookie4.setDomain(".uri1.test.org");
+        cookieStore.add(uri2, cookie4);
+        list = cookieStore.get(uri1);
+        assertEquals(3, list.size());
+
+        cookieStore.add(uri1, cookie4);
+        list = cookieStore.get(uri1);
+        assertEquals(3, list.size());
+        list = cookieStore.get(uri2);
+        assertEquals(2, list.size());
+
+        // expired cookie won't be selected.
+        HttpCookie cookie5 = new HttpCookie("cookie_name5", "cookie_value5");
+        cookie5.setMaxAge(-333);
+        assertTrue(cookie5.hasExpired());
+        cookieStore.add(uri1, cookie5);
+        list = cookieStore.get(uri1);
+        assertEquals(3, list.size());
+        assertFalse(cookieStore.remove(uri1, cookie5));
+        list = cookieStore.getCookies();
+        assertEquals(4, list.size());
+
+        cookie4.setMaxAge(-123);
+        list = cookieStore.get(uri1);
+        assertEquals(2, list.size());
+        list = cookieStore.getCookies();
+        assertEquals(3, list.size());
+        // expired cookies are also deleted even if it domain-matches the URI
+        HttpCookie cookie6 = new HttpCookie("cookie_name6", "cookie_value6");
+        cookie6.setMaxAge(-2);
+        cookie6.setDomain(".uri1.test.org");
+        cookieStore.add(uri2, cookie6);
+        list = cookieStore.get(uri1);
+        assertEquals(2, list.size());
+        assertFalse(cookieStore.remove(null, cookie6));
+
+        URI uri3 = new URI("http://get.uri3.test.org");
+        assertTrue(cookieStore.get(uri3).isEmpty());
+        URI baduri = new URI("invalid_uri");
+        assertTrue(cookieStore.get(baduri).isEmpty());
+    }
+
+    /**
+     * java.net.CookieStore#getCookies()
+     * @since 1.6
+     */
+    public void test_getCookies() throws URISyntaxException {
+        List<HttpCookie> list = cookieStore.getCookies();
+        assertTrue(list.isEmpty());
+        assertTrue(list instanceof RandomAccess);
+
+        HttpCookie cookie1 = new HttpCookie("cookie_name", "cookie_value");
+        URI uri1 = new URI("http://getcookies1.test.org");
+        cookieStore.add(uri1, cookie1);
+        list = cookieStore.getCookies();
+        assertTrue(list.contains(cookie1));
+
+        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
+        URI uri2 = new URI("http://getcookies2.test.org");
+        cookieStore.add(uri2, cookie2);
+        list = cookieStore.getCookies();
+        assertEquals(2, list.size());
+        assertTrue(list.contains(cookie1));
+        assertTrue(list.contains(cookie2));
+
+        // duplicated cookie won't be selected.
+        cookieStore.add(uri2, cookie1);
+        list = cookieStore.getCookies();
+        assertEquals(2, list.size());
+        // expired cookie won't be selected.
+        HttpCookie cookie3 = new HttpCookie("cookie_name3", "cookie_value3");
+        cookie3.setMaxAge(-1357);
+        cookieStore.add(uri1, cookie3);
+        list = cookieStore.getCookies();
+        assertEquals(2, list.size());
+
+        try {
+            list.add(new HttpCookie("readOnlyName", "readOnlyValue"));
+            fail("should throw UnsupportedOperationException");
+        } catch (UnsupportedOperationException e) {
+            // expected
+        }
+
+        try {
+            list.remove(new HttpCookie("readOnlyName", "readOnlyValue"));
+            fail("should throw UnsupportedOperationException");
+        } catch (UnsupportedOperationException e) {
+            // expected
+        }
+    }
+
+    /**
+     * java.net.CookieStore#getURIs()
+     * @since 1.6
+     */
+    public void test_getURIs() throws URISyntaxException {
+        List<URI> list = cookieStore.getURIs();
+        assertTrue(list.isEmpty());
+
+        URI uri1 = new URI("http://geturis1.test.com");
+        HttpCookie cookie1 = new HttpCookie("cookie_name1", "cookie_value1");
+        cookieStore.add(uri1, cookie1);
+        list = cookieStore.getURIs();
+        assertEquals("geturis1.test.com", list.get(0).getHost());
+
+        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
+        cookieStore.add(uri1, cookie2);
+        list = cookieStore.getURIs();
+        assertEquals(1, list.size());
+
+        URI uri2 = new URI("http://geturis2.test.com");
+        cookieStore.add(uri2, cookie2);
+        list = cookieStore.getURIs();
+        assertEquals(2, list.size());
+        assertTrue(list.contains(uri1));
+        assertTrue(list.contains(uri2));
+    }
+
+    /**
+     * java.net.CookieStore#remove(URI, HttpCookie)
+     * @since 1.6
+     */
+    public void test_remove_LURI_LHttpCookie() throws URISyntaxException {
+        URI uri1 = new URI("http://remove1.test.com");
+        HttpCookie cookie1 = new HttpCookie("cookie_name1", "cookie_value1");
+        try {
+            cookieStore.remove(uri1, null);
+            fail("should throw NullPointerException");
+        } catch (NullPointerException e) {
+            // expected
+        }
+        assertFalse(cookieStore.remove(uri1, cookie1));
+        assertFalse(cookieStore.remove(null, cookie1));
+
+        cookieStore.add(uri1, cookie1);
+        URI uri2 = new URI("http://remove2.test.com");
+        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
+        cookieStore.add(uri2, cookie2);
+        assertTrue(cookieStore.remove(uri1, cookie1));
+        assertFalse(cookieStore.remove(uri1, cookie1));
+        assertEquals(2, cookieStore.getURIs().size());
+        assertEquals(1, cookieStore.getCookies().size());
+        assertTrue(cookieStore.remove(uri2, cookie2));
+        assertFalse(cookieStore.remove(uri2, cookie2));
+        assertEquals(2, cookieStore.getURIs().size());
+        assertEquals(0, cookieStore.getCookies().size());
+
+        assertTrue(cookieStore.removeAll());
+        cookieStore.add(uri1, cookie1);
+        cookieStore.add(uri2, cookie2);
+        HttpCookie cookie3 = new HttpCookie("cookie_name3", "cookie_value3");
+        assertFalse(cookieStore.remove(null, cookie3));
+        // No guarantees on behavior if we call remove with a different
+        // uri from the one originally associated with the cookie.
+        assertFalse(cookieStore.remove(null, cookie1));
+        assertTrue(cookieStore.remove(uri1, cookie1));
+        assertFalse(cookieStore.remove(uri1, cookie1));
+
+        assertEquals(2, cookieStore.getURIs().size());
+        assertEquals(1, cookieStore.getCookies().size());
+        assertTrue(cookieStore.remove(uri2, cookie2));
+        assertFalse(cookieStore.remove(uri2, cookie2));
+        assertEquals(2, cookieStore.getURIs().size());
+        assertEquals(0, cookieStore.getCookies().size());
+
+        cookieStore.removeAll();
+        // expired cookies can also be deleted.
+        cookie2.setMaxAge(-34857);
+        cookieStore.add(uri2, cookie2);
+        assertTrue(cookieStore.remove(uri2, cookie2));
+        assertFalse(cookieStore.remove(uri2, cookie2));
+        assertEquals(0, cookieStore.getCookies().size());
+
+        cookie2.setMaxAge(34857);
+        cookieStore.add(uri1, cookie1);
+        cookieStore.add(uri2, cookie1);
+        cookieStore.add(uri2, cookie2);
+        assertTrue(cookieStore.remove(uri1, cookie1));
+        assertFalse(cookieStore.remove(uri1, cookie1));
+        assertTrue(cookieStore.get(uri2).contains(cookie1));
+        assertTrue(cookieStore.get(uri2).contains(cookie2));
+        assertEquals(0, cookieStore.get(uri1).size());
+        cookieStore.remove(uri2, cookie2);
+
+        cookieStore.removeAll();
+        cookieStore.add(uri2, cookie2);
+        cookieStore.add(uri1, cookie1);
+        assertEquals(2, cookieStore.getCookies().size());
+        assertFalse(cookieStore.remove(uri2, cookie1));
+        assertTrue(cookieStore.remove(uri1, cookie1));
+        assertEquals(2, cookieStore.getURIs().size());
+        assertEquals(1, cookieStore.getCookies().size());
+        assertTrue(cookieStore.getCookies().contains(cookie2));
+
+        cookieStore.removeAll();
+        URI uri3 = new URI("http://remove3.test.com");
+        URI uri4 = new URI("http://test.com");
+        HttpCookie cookie4 = new HttpCookie("cookie_name4", "cookie_value4");
+        cookie4.setDomain(".test.com");
+        cookie2.setMaxAge(-34857);
+        cookie3.setMaxAge(-22);
+        cookie4.setMaxAge(-45);
+        cookieStore.add(uri1, cookie1);
+        cookieStore.add(uri2, cookie2);
+        cookieStore.add(uri3, cookie3);
+        cookieStore.add(uri4, cookie4);
+        assertEquals(0, cookieStore.get(uri2).size());
+        assertFalse(cookieStore.remove(uri2, cookie2));
+        assertTrue(cookieStore.remove(uri3, cookie3));
+        assertFalse(cookieStore.remove(uri4, cookie4));
+    }
+
+    /**
+     * java.net.CookieStore#test_removeAll()
+     * @since 1.6
+     */
+    public void test_removeAll() throws URISyntaxException {
+        assertFalse(cookieStore.removeAll());
+
+        URI uri1 = new URI("http://removeAll1.test.com");
+        HttpCookie cookie1 = new HttpCookie("cookie_name1", "cookie_value1");
+        cookieStore.add(uri1, cookie1);
+        URI uri2 = new URI("http://removeAll2.test.com");
+        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
+        cookieStore.add(uri2, cookie2);
+
+        assertTrue(cookieStore.removeAll());
+        assertTrue(cookieStore.getURIs().isEmpty());
+        assertTrue(cookieStore.getCookies().isEmpty());
+
+        assertFalse(cookieStore.removeAll());
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        cookieManager = new CookieManager();
+        cookieStore = cookieManager.getCookieStore();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        cookieManager = null;
+        cookieStore = null;
+        super.tearDown();
+    }
+
+}
diff --git a/luni/src/test/java/libcore/java/net/AbstractCookiesTest.java b/luni/src/test/java/libcore/java/net/AbstractCookiesTest.java
deleted file mode 100644
index ab1b822..0000000
--- a/luni/src/test/java/libcore/java/net/AbstractCookiesTest.java
+++ /dev/null
@@ -1,1540 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package libcore.java.net;
-
-import com.google.mockwebserver.MockResponse;
-import com.google.mockwebserver.MockWebServer;
-import com.google.mockwebserver.RecordedRequest;
-import java.io.IOException;
-import java.net.CookieHandler;
-import java.net.CookieManager;
-import static java.net.CookiePolicy.ACCEPT_ORIGINAL_SERVER;
-
-import java.net.CookiePolicy;
-import java.net.CookieStore;
-import java.net.HttpCookie;
-import java.net.HttpURLConnection;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.RandomAccess;
-import java.util.TreeMap;
-
-import junit.framework.TestCase;
-
-public abstract class AbstractCookiesTest extends TestCase {
-
-    private static final Map<String, List<String>> EMPTY_COOKIES_MAP = Collections.emptyMap();
-
-    private CookieHandler defaultHandler;
-    private CookieManager cookieManager;
-    private CookieStore cookieStore;
-
-
-    @Override public void setUp() throws Exception {
-        super.setUp();
-        defaultHandler = CookieHandler.getDefault();
-        cookieManager = new CookieManager(createCookieStore(), null);
-        cookieStore = cookieManager.getCookieStore();
-    }
-
-    @Override public void tearDown() throws Exception {
-        CookieHandler.setDefault(defaultHandler);
-        super.tearDown();
-    }
-
-    protected abstract CookieStore createCookieStore();
-
-    public void testNetscapeResponse() throws Exception {
-        CookieManager cookieManager = new CookieManager(createCookieStore(),
-                ACCEPT_ORIGINAL_SERVER);
-        CookieHandler.setDefault(cookieManager);
-        MockWebServer server = new MockWebServer();
-        server.play();
-
-        server.enqueue(new MockResponse().addHeader("Set-Cookie: a=android; "
-                + "expires=Fri, 31-Dec-9999 23:59:59 GMT; "
-                + "path=/path; "
-                + "domain=" + server.getCookieDomain() + "; "
-                + "secure"));
-        get(server, "/path/foo");
-
-        List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
-        assertEquals(1, cookies.size());
-        HttpCookie cookie = cookies.get(0);
-        assertEquals("a", cookie.getName());
-        assertEquals("android", cookie.getValue());
-        assertEquals(null, cookie.getComment());
-        assertEquals(null, cookie.getCommentURL());
-        assertEquals(false, cookie.getDiscard());
-        assertEquals(server.getCookieDomain(), cookie.getDomain());
-        assertTrue(cookie.getMaxAge() > 100000000000L);
-        assertEquals("/path", cookie.getPath());
-        assertEquals(true, cookie.getSecure());
-        assertEquals(0, cookie.getVersion());
-    }
-
-    public void testRfc2109Response() throws Exception {
-        CookieManager cookieManager = new CookieManager(createCookieStore(),
-                ACCEPT_ORIGINAL_SERVER);
-        CookieHandler.setDefault(cookieManager);
-        MockWebServer server = new MockWebServer();
-        server.play();
-
-        server.enqueue(new MockResponse().addHeader("Set-Cookie: a=android; "
-                + "Comment=this cookie is delicious; "
-                + "Domain=" + server.getCookieDomain() + "; "
-                + "Max-Age=60; "
-                + "Path=/path; "
-                + "Secure; "
-                + "Version=1"));
-        get(server, "/path/foo");
-
-        List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
-        assertEquals(1, cookies.size());
-        HttpCookie cookie = cookies.get(0);
-        assertEquals("a", cookie.getName());
-        assertEquals("android", cookie.getValue());
-        assertEquals("this cookie is delicious", cookie.getComment());
-        assertEquals(null, cookie.getCommentURL());
-        assertEquals(false, cookie.getDiscard());
-        assertEquals(server.getCookieDomain(), cookie.getDomain());
-        assertEquals(60, cookie.getMaxAge());
-        assertEquals("/path", cookie.getPath());
-        assertEquals(true, cookie.getSecure());
-        assertEquals(1, cookie.getVersion());
-    }
-
-    public void testRfc2965Response() throws Exception {
-        CookieManager cookieManager = new CookieManager(createCookieStore(),
-                ACCEPT_ORIGINAL_SERVER);
-        CookieHandler.setDefault(cookieManager);
-        MockWebServer server = new MockWebServer();
-        server.play();
-
-        server.enqueue(new MockResponse().addHeader("Set-Cookie2: a=android; "
-                + "Comment=this cookie is delicious; "
-                + "CommentURL=http://google.com/; "
-                + "Discard; "
-                + "Domain=" + server.getCookieDomain() + "; "
-                + "Max-Age=60; "
-                + "Path=/path; "
-                + "Port=\"80,443," + server.getPort() + "\"; "
-                + "Secure; "
-                + "Version=1"));
-        get(server, "/path/foo");
-
-        List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
-        assertEquals(1, cookies.size());
-        HttpCookie cookie = cookies.get(0);
-        assertEquals("a", cookie.getName());
-        assertEquals("android", cookie.getValue());
-        assertEquals("this cookie is delicious", cookie.getComment());
-        assertEquals("http://google.com/", cookie.getCommentURL());
-        assertEquals(true, cookie.getDiscard());
-        assertEquals(server.getCookieDomain(), cookie.getDomain());
-        assertEquals(60, cookie.getMaxAge());
-        assertEquals("/path", cookie.getPath());
-        assertEquals("80,443," + server.getPort(), cookie.getPortlist());
-        assertEquals(true, cookie.getSecure());
-        assertEquals(1, cookie.getVersion());
-    }
-
-    public void testQuotedAttributeValues() throws Exception {
-        CookieManager cookieManager = new CookieManager(createCookieStore(),
-                ACCEPT_ORIGINAL_SERVER);
-
-        CookieHandler.setDefault(cookieManager);
-        MockWebServer server = new MockWebServer();
-        server.play();
-
-        server.enqueue(new MockResponse().addHeader("Set-Cookie2: a=\"android\"; "
-                + "Comment=\"this cookie is delicious\"; "
-                + "CommentURL=\"http://google.com/\"; "
-                + "Discard; "
-                + "Domain=\"" + server.getCookieDomain() + "\"; "
-                + "Max-Age=\"60\"; "
-                + "Path=\"/path\"; "
-                + "Port=\"80,443," + server.getPort() + "\"; "
-                + "Secure; "
-                + "Version=\"1\""));
-        get(server, "/path/foo");
-
-        List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
-        assertEquals(1, cookies.size());
-        HttpCookie cookie = cookies.get(0);
-        assertEquals("a", cookie.getName());
-        assertEquals("android", cookie.getValue());
-        assertEquals("this cookie is delicious", cookie.getComment());
-        assertEquals("http://google.com/", cookie.getCommentURL());
-        assertEquals(true, cookie.getDiscard());
-        assertEquals(server.getCookieDomain(), cookie.getDomain());
-        assertEquals(60, cookie.getMaxAge());
-        assertEquals("/path", cookie.getPath());
-        assertEquals("80,443," + server.getPort(), cookie.getPortlist());
-        assertEquals(true, cookie.getSecure());
-        assertEquals(1, cookie.getVersion());
-    }
-
-    public void testResponseWithMultipleCookieHeaderLines() throws Exception {
-        TestCookieStore cookieStore = new TestCookieStore();
-        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
-        cookieManager.put(new URI("http://android.com"), cookieHeaders("a=android", "b=banana"));
-        List<HttpCookie> cookies = sortedCopy(cookieStore.cookies);
-        assertEquals(2, cookies.size());
-        HttpCookie cookieA = cookies.get(0);
-        assertEquals("a", cookieA.getName());
-        assertEquals("android", cookieA.getValue());
-        HttpCookie cookieB = cookies.get(1);
-        assertEquals("b", cookieB.getName());
-        assertEquals("banana", cookieB.getValue());
-    }
-
-    public void testDomainDefaulting() throws Exception {
-        TestCookieStore cookieStore = new TestCookieStore();
-        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
-        cookieManager.put(new URI("http://android.com/"), cookieHeaders("a=android"));
-        assertEquals("android.com", cookieStore.getCookie("a").getDomain());
-    }
-
-    public void testNonMatchingDomainsRejected() throws Exception {
-        TestCookieStore cookieStore = new TestCookieStore();
-        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
-        cookieManager.put(new URI("http://android.com/"),
-                cookieHeaders("a=android;domain=google.com"));
-        assertEquals(Collections.<HttpCookie>emptyList(), cookieStore.cookies);
-    }
-
-    public void testMatchingDomainsAccepted() throws Exception {
-        TestCookieStore cookieStore = new TestCookieStore();
-        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
-        cookieManager.put(new URI("http://www.android.com/"),
-                cookieHeaders("a=android;domain=.android.com"));
-        assertEquals(".android.com", cookieStore.getCookie("a").getDomain());
-    }
-
-    public void testPathDefaulting() throws Exception {
-        TestCookieStore cookieStore = new TestCookieStore();
-        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
-        cookieManager.put(new URI("http://android.com/foo/bar"), cookieHeaders("a=android"));
-        assertEquals("/foo/", cookieStore.getCookie("a").getPath());
-        cookieManager.put(new URI("http://android.com/"), cookieHeaders("b=banana"));
-        assertEquals("/", cookieStore.getCookie("b").getPath());
-        cookieManager.put(new URI("http://android.com/foo/"), cookieHeaders("c=carrot"));
-        assertEquals("/foo/", cookieStore.getCookie("c").getPath());
-    }
-
-    public void testNonMatchingPathsRejected() throws Exception {
-        TestCookieStore cookieStore = new TestCookieStore();
-        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
-        cookieManager.put(new URI("http://android.com/foo/bar"),
-                cookieHeaders("a=android;path=/baz/bar"));
-        assertEquals("Expected to reject cookies whose path is not a prefix of the request path",
-                Collections.<HttpCookie>emptyList(), cookieStore.cookies); // RI6 fails this
-    }
-
-    public void testMatchingPathsAccepted() throws Exception {
-        TestCookieStore cookieStore = new TestCookieStore();
-        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
-        cookieManager.put(new URI("http://android.com/foo/bar/"),
-                cookieHeaders("a=android;path=/foo"));
-        assertEquals("/foo", cookieStore.getCookie("a").getPath());
-    }
-
-    public void testNoCookieHeaderSentIfNoCookiesMatch() throws IOException, URISyntaxException {
-        CookieManager cookieManager = new CookieManager(null, ACCEPT_ORIGINAL_SERVER);
-        Map<String, List<String>> cookieHeaders = cookieManager.get(
-                new URI("http://android.com/foo/bar/"), EMPTY_COOKIES_MAP);
-        assertTrue(cookieHeaders.toString(), cookieHeaders.isEmpty()
-                || (cookieHeaders.size() == 1 && cookieHeaders.get("Cookie").isEmpty()));
-    }
-
-    public void testCookieManagerGet_schemeChecks() throws Exception {
-        CookieManager cookieManager = new CookieManager(createCookieStore(), null);
-
-        cookieManager.put(new URI("http://a.com/"), cookieHeaders("a1=android"));
-        cookieManager.put(new URI("https://a.com/"), cookieHeaders("a2=android"));
-        cookieManager.put(new URI("https://a.com/"), cookieHeaders("a3=android; Secure"));
-
-        assertManagerCookiesMatch(cookieManager, "http://a.com/", "a1=android; a2=android");
-        assertManagerCookiesMatch(cookieManager, "https://a.com/",
-                "a1=android; a2=android; a3=android");
-    }
-
-    public void testCookieManagerGet_hostChecks() throws Exception {
-        CookieManager cookieManager = new CookieManager(createCookieStore(), null);
-
-        cookieManager.put(new URI("http://a.com/"), cookieHeaders("a1=android"));
-        cookieManager.put(new URI("http://b.com/"), cookieHeaders("b1=android"));
-
-        assertManagerCookiesMatch(cookieManager, "http://a.com/", "a1=android");
-        assertManagerCookiesMatch(cookieManager, "http://b.com/", "b1=android");
-    }
-
-    public void testCookieManagerGet_portChecks() throws Exception {
-        CookieManager cookieManager = new CookieManager(createCookieStore(), null);
-
-        cookieManager.put(new URI("http://a.com:443/"), cookieHeaders("a1=android"));
-        cookieManager.put(new URI("http://a.com:8080/"), cookieHeaders("a2=android"));
-        cookieManager.put(new URI("http://a.com:8080/"), cookieHeaders("a3=android; Port=8080"));
-
-        assertManagerCookiesMatch(cookieManager, "http://a.com/", "a1=android; a2=android");
-        assertManagerCookiesMatch(cookieManager, "http://a.com:8080/",
-                "a1=android; a2=android; a3=android");
-    }
-
-    public void testCookieManagerGet_pathChecks() throws Exception {
-        CookieManager cookieManager = new CookieManager(createCookieStore(), null);
-
-        cookieManager.put(new URI("http://a.com/"), cookieHeaders("a1=android"));
-        cookieManager.put(new URI("http://a.com/path1"),
-                cookieHeaders("a2=android; Path=\"/path1\""));
-        cookieManager.put(new URI("http://a.com/path2"),
-                cookieHeaders("a3=android; Path=\"/path2\""));
-
-        assertManagerCookiesMatch(cookieManager, "http://a.com/notpath", "a1=android");
-        assertManagerCookiesMatch(cookieManager, "http://a.com/path1", "a1=android; a2=android");
-    }
-
-    public void testSendingCookiesFromStore() throws Exception {
-        MockWebServer server = new MockWebServer();
-        server.enqueue(new MockResponse());
-        server.play();
-
-        CookieManager cookieManager = new CookieManager(createCookieStore(),
-                ACCEPT_ORIGINAL_SERVER);
-        HttpCookie cookieA = createCookie("a", "android", server.getCookieDomain(), "/");
-        cookieManager.getCookieStore().add(server.getUrl("/").toURI(), cookieA);
-        HttpCookie cookieB = createCookie("b", "banana", server.getCookieDomain(), "/");
-        cookieManager.getCookieStore().add(server.getUrl("/").toURI(), cookieB);
-        CookieHandler.setDefault(cookieManager);
-
-        get(server, "/");
-        RecordedRequest request = server.takeRequest();
-
-        List<String> receivedHeaders = request.getHeaders();
-        assertContains(receivedHeaders, "Cookie: $Version=\"1\"; "
-                + "a=\"android\";$Path=\"/\";$Domain=\"" + server.getCookieDomain() + "\"; "
-                + "b=\"banana\";$Path=\"/\";$Domain=\"" + server.getCookieDomain() + "\"");
-    }
-
-    public void testRedirectsDoNotIncludeTooManyCookies() throws Exception {
-        MockWebServer redirectTarget = new MockWebServer();
-        redirectTarget.enqueue(new MockResponse().setBody("A"));
-        redirectTarget.play();
-
-        MockWebServer redirectSource = new MockWebServer();
-        redirectSource.enqueue(new MockResponse()
-                .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP)
-                .addHeader("Location: " + redirectTarget.getUrl("/")));
-        redirectSource.play();
-
-        CookieManager cookieManager = new CookieManager(createCookieStore(),
-                ACCEPT_ORIGINAL_SERVER);
-        HttpCookie cookie = createCookie("c", "cookie", redirectSource.getCookieDomain(), "/");
-        String portList = Integer.toString(redirectSource.getPort());
-        cookie.setPortlist(portList);
-        cookieManager.getCookieStore().add(redirectSource.getUrl("/").toURI(), cookie);
-        CookieHandler.setDefault(cookieManager);
-
-        get(redirectSource, "/");
-        RecordedRequest request = redirectSource.takeRequest();
-
-        assertContains(request.getHeaders(), "Cookie: $Version=\"1\"; "
-                + "c=\"cookie\";$Path=\"/\";$Domain=\"" + redirectSource.getCookieDomain()
-                + "\";$Port=\"" + portList + "\"");
-
-        for (String header : redirectTarget.takeRequest().getHeaders()) {
-            if (header.startsWith("Cookie")) {
-                fail(header);
-            }
-        }
-    }
-
-    /**
-     * Test which headers show up where. The cookie manager should be notified
-     * of both user-specified and derived headers like {@code Host}. Headers
-     * named {@code Cookie} or {@code Cookie2} that are returned by the cookie
-     * manager should show up in the request and in {@code
-     * getRequestProperties}.
-     */
-    public void testHeadersSentToCookieHandler() throws IOException, InterruptedException {
-        final Map<String, List<String>> cookieHandlerHeaders = new HashMap<String, List<String>>();
-        CookieHandler.setDefault(new CookieManager(createCookieStore(), null) {
-            @Override
-            public Map<String, List<String>> get(URI uri,
-                    Map<String, List<String>> requestHeaders) throws IOException {
-                cookieHandlerHeaders.putAll(requestHeaders);
-                Map<String, List<String>> result = new HashMap<String, List<String>>();
-                result.put("Cookie", Collections.singletonList("Bar=bar"));
-                result.put("Cookie2", Collections.singletonList("Baz=baz"));
-                result.put("Quux", Collections.singletonList("quux"));
-                return result;
-            }
-        });
-        MockWebServer server = new MockWebServer();
-        server.enqueue(new MockResponse());
-        server.play();
-
-        HttpURLConnection connection = (HttpURLConnection) server.getUrl("/").openConnection();
-        assertEquals(Collections.<String, List<String>>emptyMap(),
-                connection.getRequestProperties());
-
-        connection.setRequestProperty("Foo", "foo");
-        connection.setDoOutput(true);
-        connection.getOutputStream().write(5);
-        connection.getOutputStream().close();
-        connection.getInputStream().close();
-
-        RecordedRequest request = server.takeRequest();
-
-        assertContainsAll(cookieHandlerHeaders.keySet(), "Foo");
-        assertContainsAll(cookieHandlerHeaders.keySet(),
-                "Content-Type", "User-Agent", "Connection", "Host");
-        assertFalse(cookieHandlerHeaders.containsKey("Cookie"));
-
-        /*
-         * The API specifies that calling getRequestProperties() on a connected instance should fail
-         * with an IllegalStateException, but the RI violates the spec and returns a valid map.
-         * http://www.mail-archive.com/net-dev@openjdk.java.net/msg01768.html
-         */
-        try {
-            assertContainsAll(connection.getRequestProperties().keySet(), "Foo");
-            assertContainsAll(connection.getRequestProperties().keySet(),
-                    "Content-Type", "Content-Length", "User-Agent", "Connection", "Host");
-            assertContainsAll(connection.getRequestProperties().keySet(), "Cookie", "Cookie2");
-            assertFalse(connection.getRequestProperties().containsKey("Quux"));
-        } catch (IllegalStateException expected) {
-        }
-
-        assertContainsAll(request.getHeaders(), "Foo: foo", "Cookie: Bar=bar", "Cookie2: Baz=baz");
-        assertFalse(request.getHeaders().contains("Quux: quux"));
-    }
-
-    public void testCookiesSentIgnoresCase() throws Exception {
-        CookieHandler.setDefault(new CookieManager(createCookieStore(), null) {
-            @Override public Map<String, List<String>> get(URI uri,
-                    Map<String, List<String>> requestHeaders) throws IOException {
-                Map<String, List<String>> result = new HashMap<String, List<String>>();
-                result.put("COOKIE", Collections.singletonList("Bar=bar"));
-                result.put("cooKIE2", Collections.singletonList("Baz=baz"));
-                return result;
-            }
-        });
-        MockWebServer server = new MockWebServer();
-        server. enqueue(new MockResponse());
-        server.play();
-
-        get(server, "/");
-
-        RecordedRequest request = server.takeRequest();
-        assertContainsAll(request.getHeaders(), "COOKIE: Bar=bar", "cooKIE2: Baz=baz");
-        assertFalse(request.getHeaders().contains("Quux: quux"));
-    }
-
-    /**
-     * RFC 2109 and RFC 2965 disagree here. 2109 says two equals strings match only if they are
-     * fully-qualified domain names. 2965 says two equal strings always match. We're testing for
-     * 2109 behavior because it's more widely used, it's more conservative, and it's what the RI
-     * does.
-     */
-    public void testDomainMatchesOnLocalAddresses() {
-        assertFalse(HttpCookie.domainMatches("localhost", "localhost"));
-        assertFalse(HttpCookie.domainMatches("b", "b"));
-    }
-
-    public void testDomainMatchesOnIpAddress() {
-        assertTrue(HttpCookie.domainMatches("127.0.0.1", "127.0.0.1"));
-        assertFalse(HttpCookie.domainMatches("127.0.0.1", "127.0.0.0"));
-        assertFalse(HttpCookie.domainMatches("127.0.0.1", "localhost"));
-    }
-
-    public void testDomainMatchesCaseMapping() {
-        testDomainMatchesCaseMapping(Locale.US);
-    }
-
-    public void testDomainMatchesCaseMappingExoticLocale() {
-        testDomainMatchesCaseMapping(new Locale("tr", "TR"));
-    }
-
-    private void testDomainMatchesCaseMapping(Locale locale) {
-        Locale defaultLocale = Locale.getDefault();
-        Locale.setDefault(locale);
-        try {
-            assertTrue(HttpCookie.domainMatches(".android.com", "WWW.ANDROID.COM"));
-            assertFalse(HttpCookie.domainMatches("android.com", "WWW.ANDROID.COM"));
-        } finally {
-            Locale.setDefault(defaultLocale);
-        }
-    }
-
-    /**
-     * From the spec, "If an explicitly specified value does not start with a dot, the user agent
-     * supplies a leading dot.". This prepending doesn't happen in setDomain.
-     */
-    public void testDomainNotAutomaticallyPrefixedWithDot() {
-        HttpCookie cookie = new HttpCookie("Foo", "foo");
-        cookie.setDomain("localhost");
-        assertEquals("localhost", cookie.getDomain());
-    }
-
-    public void testCookieStoreNullUris() {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        HttpCookie cookieA = createCookie("a", "android", ".android.com", "/source");
-        HttpCookie cookieB = createCookie("b", "banana", "code.google.com", "/p/android");
-
-        try {
-            cookieStore.add(null, cookieA);
-        } catch (NullPointerException expected) {
-            // the RI crashes even though the cookie does get added to the store; sigh
-            expected.printStackTrace();
-        }
-        assertEquals(Arrays.asList(cookieA), cookieStore.getCookies());
-        try {
-            cookieStore.add(null, cookieB);
-        } catch (NullPointerException expected) {
-        }
-        assertEquals(Arrays.asList(cookieA, cookieB), cookieStore.getCookies());
-
-        try {
-            cookieStore.get(null);
-            fail();
-        } catch (NullPointerException expected) {
-        }
-
-        assertEquals(Collections.<URI>emptyList(), cookieStore.getURIs());
-        assertTrue(cookieStore.remove(null, cookieA));
-        assertEquals(Arrays.asList(cookieB), cookieStore.getCookies());
-
-        assertTrue(cookieStore.removeAll());
-        assertEquals(Collections.<URI>emptyList(), cookieStore.getURIs());
-        assertEquals(Collections.<HttpCookie>emptyList(), cookieStore.getCookies());
-    }
-
-    public void testCookieStoreRemoveAll() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        cookieStore.add(new URI("http://code.google.com/"), new HttpCookie("a", "android"));
-        assertTrue(cookieStore.removeAll());
-        assertEquals(Collections.<URI>emptyList(), cookieStore.getURIs());
-        assertEquals(Collections.<HttpCookie>emptyList(), cookieStore.getCookies());
-        assertFalse("Expected removeAll() to return false when the call doesn't mutate the store",
-                cookieStore.removeAll());  // RI6 fails this
-    }
-
-    public void testCookieStoreAddAcceptsConflictingUri() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager().getCookieStore();
-        HttpCookie cookieA = createCookie("a", "android", ".android.com", "/source/");
-        cookieStore.add(new URI("http://google.com/source/"), cookieA);
-        assertEquals(Arrays.asList(cookieA), cookieStore.getCookies());
-    }
-
-    public void testCookieStoreRemoveRequiresUri() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        HttpCookie cookieA = new HttpCookie("a", "android");
-        cookieStore.add(new URI("http://android.com/source/"), cookieA);
-        assertFalse("Expected remove() to take the cookie URI into account.", // RI6 fails this
-                cookieStore.remove(new URI("http://code.google.com/"), cookieA));
-        assertEquals(Arrays.asList(cookieA), cookieStore.getCookies());
-    }
-
-    public void testCookieStoreUriUsesHttpSchemeAlways() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        cookieStore.add(new URI("https://a.com/"), new HttpCookie("a", "android"));
-        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
-    }
-
-    public void testCookieStoreUriDropsUserInfo() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        cookieStore.add(new URI("http://jesse:secret@a.com/"), new HttpCookie("a", "android"));
-        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
-    }
-
-    public void testCookieStoreUriKeepsHost() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        cookieStore.add(new URI("http://b.com/"), new HttpCookie("a", "android"));
-        assertEquals(Arrays.asList(new URI("http://b.com")), cookieStore.getURIs());
-    }
-
-    public void testCookieStoreUriDropsPort() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        cookieStore.add(new URI("http://a.com:443/"), new HttpCookie("a", "android"));
-        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
-    }
-
-    public void testCookieStoreUriDropsPath() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        cookieStore.add(new URI("http://a.com/a/"), new HttpCookie("a", "android"));
-        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
-    }
-
-    public void testCookieStoreUriDropsFragment() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        cookieStore.add(new URI("http://a.com/a/foo#fragment"), new HttpCookie("a", "android"));
-        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
-    }
-
-    public void testCookieStoreUriDropsQuery() throws URISyntaxException {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        cookieStore.add(new URI("http://a.com/a/foo?query=value"), new HttpCookie("a", "android"));
-        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
-    }
-
-    public void testCookieStoreGet() throws Exception {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        HttpCookie cookiePort1 = createCookie("a1", "android", "a.com", "/path1");
-        HttpCookie cookiePort2 = createCookie("a2", "android", "a.com", "/path2");
-        HttpCookie secureCookie = createCookie("a3", "android", "a.com", "/path3");
-        secureCookie.setSecure(true);
-        HttpCookie notSecureCookie = createCookie("a4", "android", "a.com", "/path4");
-
-        HttpCookie bCookie = createCookie("b1", "android", "b.com", "/path5");
-
-        cookieStore.add(new URI("http://a.com:443/path1"), cookiePort1);
-        cookieStore.add(new URI("http://a.com:8080/path2"), cookiePort2);
-        cookieStore.add(new URI("https://a.com:443/path3"), secureCookie);
-        cookieStore.add(new URI("https://a.com:443/path4"), notSecureCookie);
-        cookieStore.add(new URI("https://b.com:8080/path5"), bCookie);
-
-        List<HttpCookie> expectedStoreCookies = new ArrayList<>();
-        expectedStoreCookies.add(cookiePort1);
-        expectedStoreCookies.add(cookiePort2);
-        expectedStoreCookies.add(secureCookie);
-        expectedStoreCookies.add(notSecureCookie);
-
-        // The default CookieStore implementation on Android is currently responsible for matching
-        // the host/domain but not handling other cookie rules: it ignores the scheme (e.g. "secure"
-        // checks), port and path.
-        // The tests below fail on the RI. It looks like in the RI it is CookieStoreImpl that is
-        // enforcing "secure" checks.
-        assertEquals(expectedStoreCookies, cookieStore.get(new URI("http://a.com:443/anypath")));
-        assertEquals(expectedStoreCookies, cookieStore.get(new URI("http://a.com:8080/anypath")));
-        assertEquals(expectedStoreCookies, cookieStore.get(new URI("https://a.com/anypath")));
-        assertEquals(expectedStoreCookies, cookieStore.get(new URI("http://a.com/anypath")));
-    }
-
-    /**
-     * Regression test for http://b/25682357 /
-     * https://code.google.com/p/android/issues/detail?id=193475
-     * CookieStoreImpl.get(URI) not handling ports properly in the absence of an explicit cookie
-     * Domain.
-     */
-    public void testCookieStoreGetWithPort() throws Exception {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        HttpCookie cookie = new HttpCookie("theme", "light");
-        // Deliberately not setting the cookie domain or path.
-        cookieStore.add(new URI("http://a.com:12345"), cookie);
-
-        // CookieStoreImpl must ignore the port during retrieval when domain is not set.
-        assertEquals(1, cookieStore.get(new URI("http://a.com:12345/path1")).size());
-        assertEquals(1, cookieStore.get(new URI("http://a.com/path1")).size());
-    }
-
-    public void testCookieStoreGetWithSecure() throws Exception {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        HttpCookie cookie = createCookie("theme", "light", "a.com", "/path");
-        cookie.setSecure(true);
-        cookieStore.add(new URI("https://a.com/path"), cookie);
-
-        // CookieStoreImpl on Android ignores the "Secure" attribute. The RI implements the secure
-        // check in CookieStoreImpl. For safety / app compatibility, if this is changed Android
-        // should probably implement it in both places.
-        assertEquals(1, cookieStore.get(new URI("http://a.com/path")).size());
-        assertEquals(1, cookieStore.get(new URI("https://a.com/path")).size());
-    }
-
-    public void testCookieStoreEviction() throws Exception {
-        CookieStore cookieStore = new CookieManager(createCookieStore(), null).getCookieStore();
-        HttpCookie themeCookie = createCookie("theme", "light", "a.com", "/");
-        cookieStore.add(new URI("http://a.com/"), themeCookie);
-
-        HttpCookie sidCookie = createCookie("sid", "mysid", "a.com", "/");
-        cookieStore.add(new URI("http://a.com/"), sidCookie);
-
-        HttpCookie replacementThemeCookie = createCookie("theme", "dark", "a.com", "/");
-        cookieStore.add(new URI("http://a.com/"), replacementThemeCookie);
-
-        // toString() is used below to avoid confusion with assertEquals():
-        // HttpCookie.equals() is implemented so that it only checks name, path and domain
-        // attributes but we also want to check the value.
-        assertEquals(
-                "[sid=\"mysid\";$Path=\"/\";$Domain=\"a.com\", "
-                        + "theme=\"dark\";$Path=\"/\";$Domain=\"a.com\"]",
-                cookieStore.get(new URI("http://a.com/")).toString());
-
-        HttpCookie replacementSidCookie = createCookie("sid", "mynewsid", "A.cOm", "/");
-        cookieStore.add(new URI("http://a.com/"), replacementSidCookie);
-
-        assertEquals(
-                "[theme=\"dark\";$Path=\"/\";$Domain=\"a.com\", "
-                        + "sid=\"mynewsid\";$Path=\"/\";$Domain=\"a.com\"]",
-                cookieStore.get(new URI("http://a.com/")).toString());
-    }
-
-    /**
-     * CookieStoreImpl has a strict requirement on HttpCookie.equals() to enable replacement of
-     * cookies with the same name.
-     */
-    public void testCookieEquality() throws Exception {
-        HttpCookie baseCookie = createCookie("theme", "light", "a.com", "/");
-
-        // None of the attributes immediately below should affect equality otherwise CookieStoreImpl
-        // eviction will not work as intended.
-        HttpCookie valueCookie = createCookie("theme", "light", "a.com", "/");
-        valueCookie.setValue("dark");
-        valueCookie.setPortlist("1234");
-        valueCookie.setSecure(true);
-        valueCookie.setComment("comment");
-        valueCookie.setCommentURL("commentURL");
-        valueCookie.setDiscard(true);
-        valueCookie.setMaxAge(12345L);
-        valueCookie.setVersion(1);
-        assertEquals(baseCookie, valueCookie);
-
-        // Changing any of the 3 main identity attributes should render cookies unequal.
-        assertNotEquals(createCookie("theme2", "light", "a.com", "/"), baseCookie);
-        assertNotEquals(createCookie("theme", "light", "b.com", "/"), baseCookie);
-        assertNotEquals(createCookie("theme", "light", "a.com", "/path"), baseCookie);
-    }
-
-    private static void assertNotEquals(HttpCookie one, HttpCookie two) {
-        assertFalse(one.equals(two));
-        assertFalse(two.equals(one));
-    }
-
-    private void assertContains(Collection<String> collection, String element) {
-        for (String c : collection) {
-            if (c != null && c.equalsIgnoreCase(element)) {
-                return;
-            }
-        }
-        fail("No " + element + " in " + collection);
-    }
-
-    private void assertContainsAll(Collection<String> collection, String... toFind) {
-        for (String s : toFind) {
-            assertContains(collection, s);
-        }
-    }
-
-    private List<HttpCookie> sortedCopy(List<HttpCookie> cookies) {
-        List<HttpCookie> result = new ArrayList<HttpCookie>(cookies);
-        Collections.sort(result, new Comparator<HttpCookie>() {
-            public int compare(HttpCookie a, HttpCookie b) {
-                return a.getName().compareTo(b.getName());
-            }
-        });
-        return result;
-    }
-
-    private Map<String,List<String>> get(MockWebServer server, String path) throws Exception {
-        URLConnection connection = server.getUrl(path).openConnection();
-        Map<String, List<String>> headers = connection.getHeaderFields();
-        connection.getInputStream().close();
-        return headers;
-    }
-
-    private static Map<String, List<String>> cookieHeaders(String... headers) {
-        return Collections.singletonMap("Set-Cookie", Arrays.asList(headers));
-    }
-
-    static class TestCookieStore implements CookieStore {
-        private final List<HttpCookie> cookies = new ArrayList<HttpCookie>();
-
-        public void add(URI uri, HttpCookie cookie) {
-            cookies.add(cookie);
-        }
-
-        public HttpCookie getCookie(String name) {
-            for (HttpCookie cookie : cookies) {
-                if (cookie.getName().equals(name)) {
-                    return cookie;
-                }
-            }
-            throw new IllegalArgumentException("No cookie " + name + " in " + cookies);
-        }
-
-        public List<HttpCookie> get(URI uri) {
-            throw new UnsupportedOperationException();
-        }
-
-        public List<HttpCookie> getCookies() {
-            throw new UnsupportedOperationException();
-        }
-
-        public List<URI> getURIs() {
-            throw new UnsupportedOperationException();
-        }
-
-        public boolean remove(URI uri, HttpCookie cookie) {
-            throw new UnsupportedOperationException();
-        }
-
-        public boolean removeAll() {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-    private static void assertManagerCookiesMatch(CookieManager cookieManager, String url,
-        String expectedCookieRequestHeader) throws Exception {
-
-        Map<String, List<String>> cookieHeaders =
-                cookieManager.get(new URI(url), EMPTY_COOKIES_MAP);
-        if (expectedCookieRequestHeader == null) {
-            assertTrue(cookieHeaders.isEmpty());
-            return;
-        }
-
-        assertEquals(1, cookieHeaders.size());
-        List<String> actualCookieHeaderStrings = cookieHeaders.get("Cookie");
-
-        // For simplicity, we concatenate the cookie header strings if there are multiple ones.
-        String actualCookieRequestHeader = actualCookieHeaderStrings.get(0);
-        for (int i = 1; i < actualCookieHeaderStrings.size(); i++) {
-            actualCookieRequestHeader += "; " + actualCookieHeaderStrings.get(i);
-        }
-        assertEquals(expectedCookieRequestHeader, actualCookieRequestHeader);
-    }
-
-    /**
-     * Creates a well-formed cookie. The behavior when domain is unset varies between
-     * RFC 2965 and RFC 6265. CookieStoreImpl assumes these values are set "correctly" by the time
-     * it receives the HttpCookie instance.
-     */
-    private static HttpCookie createCookie(String name, String value, String domain, String path) {
-        HttpCookie cookie = new HttpCookie(name, value);
-        cookie.setDomain(domain);
-        cookie.setPath(path);
-        return cookie;
-    }
-
-    //
-    // Start of org.apache.harmony.tests.java.net.CookieManagerTest.
-    //
-
-    /**
-     * java.net.CookieStore#add(URI, HttpCookie)
-     * @since 1.6
-     */
-    public void test_add_LURI_LHttpCookie() throws URISyntaxException {
-        URI uri = new URI("http://harmony.test.unit.org");
-        HttpCookie cookie = new HttpCookie("name1", "value1");
-        cookie.setDiscard(true);
-
-        // This needn't throw. We should use the cookie's domain, if set.
-        // If no domain is set, this cookie will languish in the store until
-        // it expires.
-        cookieStore.add(null, cookie);
-
-        try {
-            cookieStore.add(uri, null);
-            fail("should throw NullPointerException");
-        } catch (NullPointerException e) {
-            // expected
-        }
-
-        try {
-            cookieStore.add(null, null);
-            fail("should throw NullPointerException");
-        } catch (NullPointerException e) {
-            // expected
-        }
-
-        cookieStore.add(uri, cookie);
-        List<HttpCookie> list = cookieStore.get(uri);
-        assertEquals(1, list.size());
-        assertTrue(list.contains(cookie));
-
-        HttpCookie cookie2 = new HttpCookie("  NaME1   ", "  TESTVALUE1   ");
-        cookieStore.add(uri, cookie2);
-        list = cookieStore.get(uri);
-        assertEquals(1, list.size());
-        assertEquals("  TESTVALUE1   ", list.get(0).getValue());
-        assertTrue(list.contains(cookie2));
-
-        // domain and path attributes works
-        HttpCookie anotherCookie = new HttpCookie("name1", "value1");
-        anotherCookie.setDomain("domain");
-        anotherCookie.setPath("Path");
-        cookieStore.add(uri, anotherCookie);
-        list = cookieStore.get(uri);
-        assertEquals(2, list.size());
-        assertNull(list.get(0).getDomain());
-        assertEquals("domain", list.get(1).getDomain());
-        assertEquals("Path", list.get(1).getPath());
-
-        URI uri2 = new URI("http://.test.unit.org");
-        HttpCookie cookie3 = new HttpCookie("NaME2", "VALUE2");
-        cookieStore.add(uri2, cookie3);
-        list = cookieStore.get(uri2);
-        assertEquals(1, list.size());
-        assertEquals("VALUE2", list.get(0).getValue());
-        list = cookieStore.getCookies();
-        assertEquals(3, list.size());
-
-        // expired cookie won't be selected.
-        HttpCookie cookie4 = new HttpCookie("cookie4", "value4");
-        cookie4.setMaxAge(-2);
-        assertTrue(cookie4.hasExpired());
-        cookieStore.add(uri2, cookie4);
-        list = cookieStore.getCookies();
-        assertEquals(3, list.size());
-        assertFalse(cookieStore.remove(uri2, cookie4));
-
-        cookie4.setMaxAge(3000);
-        cookie4.setDomain("domain");
-        cookie4.setPath("path");
-        cookieStore.add(uri2, cookie4);
-        list = cookieStore.get(uri2);
-        assertEquals(2, list.size());
-
-        cookieStore.add(uri, cookie4);
-        list = cookieStore.get(uri);
-        assertEquals(3, list.size());
-        list = cookieStore.get(uri2);
-        assertEquals(2, list.size());
-        list = cookieStore.getCookies();
-        assertEquals(4, list.size());
-
-        URI baduri = new URI("bad_url");
-        HttpCookie cookie6 = new HttpCookie("cookie5", "value5");
-        cookieStore.add(baduri, cookie6);
-        list = cookieStore.get(baduri);
-        assertTrue(list.contains(cookie6));
-    }
-
-    /**
-     * java.net.CookieStore#get(URI)
-     * @since 1.6
-     */
-    public void test_get_LURI() throws URISyntaxException {
-        try {
-            cookieStore.get(null);
-            fail("should throw NullPointerException");
-        } catch (NullPointerException e) {
-            // expected
-        }
-
-        URI uri1 = new URI("http://get.uri1.test.org");
-        List<HttpCookie> list = cookieStore.get(uri1);
-        assertTrue(list.isEmpty());
-
-        HttpCookie cookie1 = new HttpCookie("cookie_name1", "cookie_value1");
-        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
-        cookieStore.add(uri1, cookie1);
-        cookieStore.add(uri1, cookie2);
-        URI uri2 = new URI("http://get.uri2.test.org");
-        HttpCookie cookie3 = new HttpCookie("cookie_name3", "cookie_value3");
-        cookieStore.add(uri2, cookie3);
-        list = cookieStore.get(uri1);
-        assertEquals(2, list.size());
-        list = cookieStore.get(uri2);
-        assertEquals(1, list.size());
-
-        // domain-match cookies also be selected.
-        HttpCookie cookie4 = new HttpCookie("cookie_name4", "cookie_value4");
-        cookie4.setDomain(".uri1.test.org");
-        cookieStore.add(uri2, cookie4);
-        list = cookieStore.get(uri1);
-        assertEquals(3, list.size());
-
-        cookieStore.add(uri1, cookie4);
-        list = cookieStore.get(uri1);
-        assertEquals(3, list.size());
-        list = cookieStore.get(uri2);
-        assertEquals(2, list.size());
-
-        // expired cookie won't be selected.
-        HttpCookie cookie5 = new HttpCookie("cookie_name5", "cookie_value5");
-        cookie5.setMaxAge(-333);
-        assertTrue(cookie5.hasExpired());
-        cookieStore.add(uri1, cookie5);
-        list = cookieStore.get(uri1);
-        assertEquals(3, list.size());
-        assertFalse(cookieStore.remove(uri1, cookie5));
-        list = cookieStore.getCookies();
-        assertEquals(4, list.size());
-
-        cookie4.setMaxAge(-123);
-        list = cookieStore.get(uri1);
-        assertEquals(2, list.size());
-        list = cookieStore.getCookies();
-        assertEquals(3, list.size());
-        // expired cookies are also deleted even if it domain-matches the URI
-        HttpCookie cookie6 = new HttpCookie("cookie_name6", "cookie_value6");
-        cookie6.setMaxAge(-2);
-        cookie6.setDomain(".uri1.test.org");
-        cookieStore.add(uri2, cookie6);
-        list = cookieStore.get(uri1);
-        assertEquals(2, list.size());
-        assertFalse(cookieStore.remove(null, cookie6));
-
-        URI uri3 = new URI("http://get.uri3.test.org");
-        assertTrue(cookieStore.get(uri3).isEmpty());
-        URI baduri = new URI("invalid_uri");
-        assertTrue(cookieStore.get(baduri).isEmpty());
-    }
-
-    /**
-     * java.net.CookieStore#getCookies()
-     * @since 1.6
-     */
-    public void test_getCookies() throws URISyntaxException {
-        List<HttpCookie> list = cookieStore.getCookies();
-        assertTrue(list.isEmpty());
-        assertTrue(list instanceof RandomAccess);
-
-        HttpCookie cookie1 = new HttpCookie("cookie_name", "cookie_value");
-        URI uri1 = new URI("http://getcookies1.test.org");
-        cookieStore.add(uri1, cookie1);
-        list = cookieStore.getCookies();
-        assertTrue(list.contains(cookie1));
-
-        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
-        URI uri2 = new URI("http://getcookies2.test.org");
-        cookieStore.add(uri2, cookie2);
-        list = cookieStore.getCookies();
-        assertEquals(2, list.size());
-        assertTrue(list.contains(cookie1));
-        assertTrue(list.contains(cookie2));
-
-        // duplicated cookie won't be selected.
-        cookieStore.add(uri2, cookie1);
-        list = cookieStore.getCookies();
-        assertEquals(2, list.size());
-        // expired cookie won't be selected.
-        HttpCookie cookie3 = new HttpCookie("cookie_name3", "cookie_value3");
-        cookie3.setMaxAge(-1357);
-        cookieStore.add(uri1, cookie3);
-        list = cookieStore.getCookies();
-        assertEquals(2, list.size());
-
-        try {
-            list.add(new HttpCookie("readOnlyName", "readOnlyValue"));
-            fail("should throw UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-            // expected
-        }
-
-        try {
-            list.remove(new HttpCookie("readOnlyName", "readOnlyValue"));
-            fail("should throw UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-            // expected
-        }
-    }
-
-    /**
-     * java.net.CookieStore#getURIs()
-     * @since 1.6
-     */
-    public void test_getURIs() throws URISyntaxException {
-        List<URI> list = cookieStore.getURIs();
-        assertTrue(list.isEmpty());
-
-        URI uri1 = new URI("http://geturis1.test.com");
-        HttpCookie cookie1 = new HttpCookie("cookie_name1", "cookie_value1");
-        cookieStore.add(uri1, cookie1);
-        list = cookieStore.getURIs();
-        assertEquals("geturis1.test.com", list.get(0).getHost());
-
-        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
-        cookieStore.add(uri1, cookie2);
-        list = cookieStore.getURIs();
-        assertEquals(1, list.size());
-
-        URI uri2 = new URI("http://geturis2.test.com");
-        cookieStore.add(uri2, cookie2);
-        list = cookieStore.getURIs();
-        assertEquals(2, list.size());
-        assertTrue(list.contains(uri1));
-        assertTrue(list.contains(uri2));
-    }
-
-    /**
-     * java.net.CookieStore#remove(URI, HttpCookie)
-     * @since 1.6
-     */
-    public void test_remove_LURI_LHttpCookie() throws URISyntaxException {
-        URI uri1 = new URI("http://remove1.test.com");
-        HttpCookie cookie1 = new HttpCookie("cookie_name1", "cookie_value1");
-        try {
-            cookieStore.remove(uri1, null);
-            fail("should throw NullPointerException");
-        } catch (NullPointerException e) {
-            // expected
-        }
-        assertFalse(cookieStore.remove(uri1, cookie1));
-        assertFalse(cookieStore.remove(null, cookie1));
-
-        cookieStore.add(uri1, cookie1);
-        URI uri2 = new URI("http://remove2.test.com");
-        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
-        cookieStore.add(uri2, cookie2);
-        assertTrue(cookieStore.remove(uri1, cookie1));
-        assertFalse(cookieStore.remove(uri1, cookie1));
-        assertEquals(2, cookieStore.getURIs().size());
-        assertEquals(1, cookieStore.getCookies().size());
-        assertTrue(cookieStore.remove(uri2, cookie2));
-        assertFalse(cookieStore.remove(uri2, cookie2));
-        assertEquals(2, cookieStore.getURIs().size());
-        assertEquals(0, cookieStore.getCookies().size());
-
-        assertTrue(cookieStore.removeAll());
-        cookieStore.add(uri1, cookie1);
-        cookieStore.add(uri2, cookie2);
-        HttpCookie cookie3 = new HttpCookie("cookie_name3", "cookie_value3");
-        assertFalse(cookieStore.remove(null, cookie3));
-        // No guarantees on behavior if we call remove with a different
-        // uri from the one originally associated with the cookie.
-        assertFalse(cookieStore.remove(null, cookie1));
-        assertTrue(cookieStore.remove(uri1, cookie1));
-        assertFalse(cookieStore.remove(uri1, cookie1));
-
-        assertEquals(2, cookieStore.getURIs().size());
-        assertEquals(1, cookieStore.getCookies().size());
-        assertTrue(cookieStore.remove(uri2, cookie2));
-        assertFalse(cookieStore.remove(uri2, cookie2));
-        assertEquals(2, cookieStore.getURIs().size());
-        assertEquals(0, cookieStore.getCookies().size());
-
-        cookieStore.removeAll();
-        // expired cookies can also be deleted.
-        cookie2.setMaxAge(-34857);
-        cookieStore.add(uri2, cookie2);
-        assertTrue(cookieStore.remove(uri2, cookie2));
-        assertFalse(cookieStore.remove(uri2, cookie2));
-        assertEquals(0, cookieStore.getCookies().size());
-
-        cookie2.setMaxAge(34857);
-        cookieStore.add(uri1, cookie1);
-        cookieStore.add(uri2, cookie1);
-        cookieStore.add(uri2, cookie2);
-        assertTrue(cookieStore.remove(uri1, cookie1));
-        assertFalse(cookieStore.remove(uri1, cookie1));
-        assertTrue(cookieStore.get(uri2).contains(cookie1));
-        assertTrue(cookieStore.get(uri2).contains(cookie2));
-        assertEquals(0, cookieStore.get(uri1).size());
-        cookieStore.remove(uri2, cookie2);
-
-        cookieStore.removeAll();
-        cookieStore.add(uri2, cookie2);
-        cookieStore.add(uri1, cookie1);
-        assertEquals(2, cookieStore.getCookies().size());
-        assertFalse(cookieStore.remove(uri2, cookie1));
-        assertTrue(cookieStore.remove(uri1, cookie1));
-        assertEquals(2, cookieStore.getURIs().size());
-        assertEquals(1, cookieStore.getCookies().size());
-        assertTrue(cookieStore.getCookies().contains(cookie2));
-
-        cookieStore.removeAll();
-        URI uri3 = new URI("http://remove3.test.com");
-        URI uri4 = new URI("http://test.com");
-        HttpCookie cookie4 = new HttpCookie("cookie_name4", "cookie_value4");
-        cookie4.setDomain(".test.com");
-        cookie2.setMaxAge(-34857);
-        cookie3.setMaxAge(-22);
-        cookie4.setMaxAge(-45);
-        cookieStore.add(uri1, cookie1);
-        cookieStore.add(uri2, cookie2);
-        cookieStore.add(uri3, cookie3);
-        cookieStore.add(uri4, cookie4);
-        assertEquals(0, cookieStore.get(uri2).size());
-        assertFalse(cookieStore.remove(uri2, cookie2));
-        assertTrue(cookieStore.remove(uri3, cookie3));
-        assertFalse(cookieStore.remove(uri4, cookie4));
-    }
-
-    /**
-     * java.net.CookieStore#test_removeAll()
-     * @since 1.6
-     */
-    public void test_removeAll() throws URISyntaxException {
-        assertFalse(cookieStore.removeAll());
-
-        URI uri1 = new URI("http://removeAll1.test.com");
-        HttpCookie cookie1 = new HttpCookie("cookie_name1", "cookie_value1");
-        cookieStore.add(uri1, cookie1);
-        URI uri2 = new URI("http://removeAll2.test.com");
-        HttpCookie cookie2 = new HttpCookie("cookie_name2", "cookie_value2");
-        cookieStore.add(uri2, cookie2);
-
-        assertTrue(cookieStore.removeAll());
-        assertTrue(cookieStore.getURIs().isEmpty());
-        assertTrue(cookieStore.getCookies().isEmpty());
-
-        assertFalse(cookieStore.removeAll());
-    }
-
-    //
-    // Start of org.apache.harmony.tests.java.net.CookieStoreTest.
-    //
-
-    private void checkValidParams4Get(URI uri,
-                                             Map<String, List<String>> map) throws IOException {
-        CookieManager manager = new CookieManager(createCookieStore(), null);
-        try {
-            manager.get(uri, map);
-            fail("Should throw IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // expected
-        }
-
-    }
-
-    private void checkValidParams4Put(URI uri,
-                                             Map<String, List<String>> map) throws IOException {
-        CookieManager manager = new CookieManager(createCookieStore(), null);
-        try {
-            manager.put(uri, map);
-            fail("Should throw IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // expected
-        }
-
-    }
-
-    /**
-     * {@link java.net.CookieManager#get(java.net.URI, java.util.Map)} &
-     * {@link java.net.CookieManager#put(java.net.URI, java.util.Map)}
-     * IllegalArgumentException
-     * @since 1.6
-     */
-    public void test_Put_Get_LURI_LMap_exception() throws IOException,
-            URISyntaxException {
-        // get
-        checkValidParams4Get(new URI(""), null);
-        checkValidParams4Get(new URI("http://www.test.com"), null);
-        checkValidParams4Get(null, null);
-        checkValidParams4Get(null, new HashMap<String, List<String>>());
-
-        // put
-        checkValidParams4Put(new URI(""), null);
-        checkValidParams4Put(new URI("http://www.test.com"), null);
-        checkValidParams4Put(null, null);
-        checkValidParams4Put(null, new HashMap<String, List<String>>());
-    }
-
-    private static Map<String, List<String>> addCookie(String[][] cookies) {
-        Map<String, List<String>> responseHeaders = new LinkedHashMap<String, List<String>>();
-        for (int i = 0; i < cookies.length; i++) {
-            List<String> fields = new ArrayList<String>();
-            for (int j = 1; j < cookies[i].length; j += 2) {
-                fields.add(cookies[i][j]);
-            }
-            responseHeaders.put(cookies[i][0], fields);
-        }
-        return responseHeaders;
-    }
-
-    private CookieManager store(String[][] cookies,
-                                       Map<String, List<String>> responseHeaders, CookiePolicy policy)
-            throws IOException, URISyntaxException {
-        CookieManager manager = new CookieManager(createCookieStore(), policy);
-        // Put all cookies into manager
-        for (int i = 0; i < cookies.length; i++) {
-            for (int j = 2; j < cookies[i].length; j += 2) {
-                URI uri = new URI(cookies[i][j]);
-                manager.put(uri, responseHeaders);
-            }
-        }
-        return manager;
-    }
-
-    /**
-     * Unlike the RI, we flatten all matching cookies into a single Cookie header
-     * instead of sending down multiple cookie headers. Also, when no cookies match
-     * a given URI, we leave the requestHeaders unmodified.
-     *
-     * @since 1.6
-     */
-    public void test_Put_Get_LURI_LMap() throws IOException, URISyntaxException {
-        // cookie-key | (content, URI)...
-        String[][] cookies = {
-                { "Set-cookie",
-                        "Set-cookie:PREF=test;path=/;domain=.b.c;", "http://a.b.c/",
-                        "Set-cookie:PREF1=test2;path=/;domain=.beg.com;", "http://a.b.c/" },
-
-                { "Set-cookie2",
-                        "Set-cookie2:NAME1=VALUE1;path=/te;domain=.b.c;", "http://a.b.c/test" },
-
-                { "Set-cookie",
-                        "Set-cookie2:NAME=VALUE;path=/;domain=.beg.com;", "http://a.beg.com/test",
-                        "Set-cookie2:NAME1=VALUE1;path=/;domain=.beg.com;", "http://a.beg.com/test" },
-
-                { "Set-cookie2",
-                        "Set-cookie3:NAME=VALUE;path=/;domain=.test.org;", "http://a.test.org/test" },
-
-                { null,
-                        "Set-cookie3:NAME=VALUE;path=/te;domain=.test.org;", "http://a.test.org/test" },
-
-                { "Set-cookie2",
-                        "lala", "http://a.test.org/test" }
-
-        };
-
-        // requires path of cookie is the prefix of uri
-        // domain of cookie must match that of uri
-        Map<String, List<String>> responseHeaders = addCookie(new String[][] {
-                cookies[0], cookies[1] });
-        CookieManager manager = store(
-                new String[][] { cookies[0], cookies[1] }, responseHeaders,
-                null);
-
-        HashMap<String, List<String>> dummyMap = new HashMap<String, List<String>>();
-        Map<String, List<String>> map = manager.get(new URI("http://a.b.c/"),
-                dummyMap);
-
-        assertEquals(1, map.size());
-        List<String> list = map.get("Cookie");
-        assertEquals(1, list.size());
-
-        // requires path of cookie is the prefix of uri
-        map = manager.get(new URI("http://a.b.c/te"), dummyMap);
-        list = map.get("Cookie");
-        assertEquals(1, list.size());
-        assertTrue(list.get(0).contains("PREF=test"));
-        // Cookies from "/test" should *not* match the URI "/te".
-        assertFalse(list.get(0).contains("NAME=VALUE"));
-
-        // If all cookies are of version 1, then $version=1 will be added
-        // ,no matter the value cookie-key
-        responseHeaders = addCookie(new String[][] { cookies[2] });
-        manager = store(new String[][] { cookies[2] }, responseHeaders, null);
-        map = manager.get(new URI("http://a.beg.com/test"), dummyMap);
-        list = map.get("Cookie");
-        assertEquals(1, list.size());
-        assertTrue(list.get(0).startsWith("$Version=\"1\""));
-
-        // cookie-key will not have effect on determining cookie version
-        responseHeaders = addCookie(new String[][] { cookies[3] });
-        manager = store(new String[][] { cookies[3] }, responseHeaders, null);
-        map = manager.get(new URI("http://a.test.org/"), responseHeaders);
-        list = map.get("Cookie");
-        assertEquals(1, list.size());
-        assertEquals("Set-cookie3:NAME=VALUE", list.get(0));
-
-        // When key is null, no cookie can be stored/retrieved, even if policy =
-        // ACCEPT_ALL
-        responseHeaders = addCookie(new String[][] { cookies[4] });
-        manager = store(new String[][] { cookies[4] }, responseHeaders,
-                CookiePolicy.ACCEPT_ALL);
-        map = manager.get(new URI("http://a.test.org/"), responseHeaders);
-        list = map.get("Cookie");
-        assertNull(list);
-
-        // All cookies will be rejected if policy == ACCEPT_NONE
-        responseHeaders = addCookie(new String[][] { cookies[3] });
-        manager = store(new String[][] { cookies[3] }, responseHeaders,
-                CookiePolicy.ACCEPT_NONE);
-        map = manager.get(new URI("http://a.test.org/"), responseHeaders);
-        list = map.get("Cookie");
-        assertNull(list);
-
-        responseHeaders = addCookie(new String[][] { cookies[5] });
-        manager = store(new String[][] { cookies[5] }, responseHeaders,
-                CookiePolicy.ACCEPT_ALL);
-        list = map.get("Cookie");
-        assertNull(list);
-
-        try {
-            map.put(null, null);
-            fail("Should throw UnsupportedOperationException");
-        } catch (UnsupportedOperationException e) {
-            // expected
-        }
-
-    }
-
-    /**
-     * {@link java.net.CookieManager#CookieManager()}
-     * @since 1.6
-     */
-    public void test_CookieManager() {
-        CookieManager cookieManager = new CookieManager();
-        assertNotNull(cookieManager);
-        assertNotNull(cookieManager.getCookieStore());
-    }
-
-    /**
-     * {@link java.net.CookieManager#CookieManager(java.net.CookieStore, java.net.CookiePolicy)}
-     * @since 1.6
-     */
-    public void testCookieManager_LCookieStore_LCookiePolicy() {
-        class DummyStore implements CookieStore {
-            public String getName() {
-                return "A dummy store";
-            }
-
-            public void add(URI uri, HttpCookie cookie) {
-                // expected
-            }
-
-            public List<HttpCookie> get(URI uri) {
-                return null;
-            }
-
-            public List<HttpCookie> getCookies() {
-                return null;
-            }
-
-            public List<URI> getURIs() {
-                return null;
-            }
-
-            public boolean remove(URI uri, HttpCookie cookie) {
-                return false;
-            }
-
-            public boolean removeAll() {
-                return false;
-            }
-        }
-        CookieStore store = new DummyStore();
-        CookieManager cookieManager = new CookieManager(store,
-                CookiePolicy.ACCEPT_ALL);
-        assertEquals("A dummy store", ((DummyStore) cookieManager
-                .getCookieStore()).getName());
-        assertSame(store, cookieManager.getCookieStore());
-    }
-
-    /**
-     * {@link java.net.CookieManager#setCookiePolicy(java.net.CookiePolicy)}
-     * @since 1.6
-     */
-    public void test_SetCookiePolicy_LCookiePolicy() throws URISyntaxException,
-            IOException {
-
-        // Policy = ACCEPT_NONE
-        CookieManager manager = new CookieManager(createCookieStore(), null);
-        manager.setCookiePolicy(CookiePolicy.ACCEPT_NONE);
-        Map<String, List<String>> responseHeaders = new TreeMap<String, List<String>>();
-        URI uri = new URI("http://a.b.c");
-        manager.put(uri, responseHeaders);
-        Map<String, List<String>> map = manager.get(uri,
-                new HashMap<String, List<String>>());
-
-        assertEquals(0, map.size());
-
-        // Policy = ACCEPT_ALL
-        manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
-        responseHeaders = new TreeMap<String, List<String>>();
-        ArrayList<String> list = new ArrayList<String>();
-        list.add("test=null");
-        responseHeaders.put("Set-cookie", list);
-        uri = new URI("http://b.c.d");
-        manager.put(uri, responseHeaders);
-        map = manager.get(uri, new HashMap<String, List<String>>());
-        assertEquals(1, map.size());
-    }
-
-    /**
-     * {@link java.net.CookieManager#getCookieStore()}
-     * @since 1.6
-     */
-    public void test_GetCookieStore() {
-        CookieManager cookieManager = new CookieManager(createCookieStore(), null);
-        CookieStore store = cookieManager.getCookieStore();
-        assertNotNull(store);
-    }
-
-    // http://b/25763487
-    public void testCookieWithNullPath() throws Exception {
-        FakeSingleCookieStore fscs = new FakeSingleCookieStore();
-        CookieManager cm = new CookieManager(fscs, CookiePolicy.ACCEPT_ALL);
-
-        HttpCookie cookie = new HttpCookie("foo", "bar");
-        cookie.setDomain("http://www.foo.com");
-        cookie.setVersion(0);
-
-        fscs.setNextCookie(cookie);
-
-        Map<String, List<String>> cookieHeaders = cm.get(
-                new URI("http://www.foo.com/log/me/in"), Collections.EMPTY_MAP);
-
-        List<String> cookies = cookieHeaders.get("Cookie");
-        assertEquals("foo=bar", cookies.get(0));
-    }
-
-    /**
-     * A cookie store that always returns one cookie per URI (without any sort of
-     * rule matching). The cookie that's returned is provided via a call to setNextCookie
-     */
-    public static class FakeSingleCookieStore implements CookieStore {
-        private List<HttpCookie> cookies;
-
-        void setNextCookie(HttpCookie cookie) {
-            cookies = Collections.singletonList(cookie);
-        }
-
-        @Override
-        public void add(URI uri, HttpCookie cookie) {
-        }
-
-        @Override
-        public List<HttpCookie> get(URI uri) {
-            return cookies;
-        }
-
-        @Override
-        public List<HttpCookie> getCookies() {
-            return cookies;
-        }
-
-        @Override
-        public List<URI> getURIs() {
-            return null;
-        }
-
-        @Override
-        public boolean remove(URI uri, HttpCookie cookie) {
-            cookies = Collections.EMPTY_LIST;
-            return true;
-        }
-
-        @Override
-        public boolean removeAll() {
-            cookies = Collections.EMPTY_LIST;
-            return true;
-        }
-    }
-}
diff --git a/luni/src/test/java/libcore/java/net/CookiesMCompatibilityTest.java b/luni/src/test/java/libcore/java/net/CookiesMCompatibilityTest.java
deleted file mode 100644
index f84ffda..0000000
--- a/luni/src/test/java/libcore/java/net/CookiesMCompatibilityTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-
-package libcore.java.net;
-
-import java.net.CookieManager;
-import java.net.CookieStore;
-import java.net.InMemoryCookieStore;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class CookiesMCompatibilityTest extends AbstractCookiesTest {
-    @Override
-    public CookieStore createCookieStore() {
-        return new InMemoryCookieStore(23 /* VERSION_CODES.M : android marshmallow */);
-    }
-
-    public void testCookiesWithLeadingPeriod() throws Exception {
-        CookieManager cm = new CookieManager(createCookieStore(), null);
-        Map<String, List<String>> responseHeaders = new HashMap<>();
-        List<String> list = new ArrayList<String>();
-        list.add("coulomb_sess=81c112d7dabac869ffa821aa8f672df2");
-        responseHeaders.put("Set-Cookie", list);
-
-        URI uri = new URI("http://chargepoint.com");
-        cm.put(uri, responseHeaders);
-
-        Map<String, List<String>> cookies = cm.get(
-                new URI("https://webservices.chargepoint.com/backend.php/mobileapi/"),
-                responseHeaders);
-
-        assertEquals(0, cookies.size());
-    }
-}
diff --git a/luni/src/test/java/libcore/java/net/CookiesTest.java b/luni/src/test/java/libcore/java/net/CookiesTest.java
index 8fc75ef..11418d0 100644
--- a/luni/src/test/java/libcore/java/net/CookiesTest.java
+++ b/luni/src/test/java/libcore/java/net/CookiesTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2010 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -11,42 +11,803 @@
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
  */
 
 package libcore.java.net;
 
+import com.google.mockwebserver.MockResponse;
+import com.google.mockwebserver.MockWebServer;
+import com.google.mockwebserver.RecordedRequest;
+import java.io.IOException;
+import java.net.CookieHandler;
 import java.net.CookieManager;
+import static java.net.CookiePolicy.ACCEPT_ORIGINAL_SERVER;
 import java.net.CookieStore;
-import java.net.InMemoryCookieStore;
+import java.net.HttpCookie;
+import java.net.HttpURLConnection;
 import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLConnection;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
+import junit.framework.TestCase;
 
-public class CookiesTest extends AbstractCookiesTest {
-    @Override
-    public CookieStore createCookieStore() {
-        return new InMemoryCookieStore(24 /* VERSION_CODES.N : android N */);
+public class CookiesTest extends TestCase {
+
+    private static final Map<String, List<String>> EMPTY_COOKIES_MAP = Collections.emptyMap();
+
+    private CookieHandler defaultHandler;
+
+    @Override public void setUp() throws Exception {
+        super.setUp();
+        defaultHandler = CookieHandler.getDefault();
     }
 
-    public void testCookiesWithLeadingPeriod() throws Exception {
-        CookieManager cm = new CookieManager(createCookieStore(), null);
-        Map<String, List<String>> responseHeaders = new HashMap<>();
-        List<String> list = new ArrayList<String>();
-        list.add("coulomb_sess=81c112d7dabac869ffa821aa8f672df2");
-        responseHeaders.put("Set-Cookie", list);
+    @Override public void tearDown() throws Exception {
+        CookieHandler.setDefault(defaultHandler);
+        super.tearDown();
+    }
 
-        URI uri = new URI("http://chargepoint.com");
-        cm.put(uri, responseHeaders);
+    public void testNetscapeResponse() throws Exception {
+        CookieManager cookieManager = new CookieManager(null, ACCEPT_ORIGINAL_SERVER);
+        CookieHandler.setDefault(cookieManager);
+        MockWebServer server = new MockWebServer();
+        server.play();
 
-        Map<String, List<String>> cookies = cm.get(
-                new URI("https://webservices.chargepoint.com/backend.php/mobileapi/"),
-                responseHeaders);
+        server.enqueue(new MockResponse().addHeader("Set-Cookie: a=android; "
+                + "expires=Fri, 31-Dec-9999 23:59:59 GMT; "
+                + "path=/path; "
+                + "domain=" + server.getCookieDomain() + "; "
+                + "secure"));
+        get(server, "/path/foo");
 
+        List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
         assertEquals(1, cookies.size());
-        List<String> cookieList = cookies.values().iterator().next();
-        assertEquals("coulomb_sess=81c112d7dabac869ffa821aa8f672df2", cookieList.get(0));
+        HttpCookie cookie = cookies.get(0);
+        assertEquals("a", cookie.getName());
+        assertEquals("android", cookie.getValue());
+        assertEquals(null, cookie.getComment());
+        assertEquals(null, cookie.getCommentURL());
+        assertEquals(false, cookie.getDiscard());
+        assertEquals(server.getCookieDomain(), cookie.getDomain());
+        assertTrue(cookie.getMaxAge() > 100000000000L);
+        assertEquals("/path", cookie.getPath());
+        assertEquals(true, cookie.getSecure());
+        assertEquals(0, cookie.getVersion());
+    }
+
+    public void testRfc2109Response() throws Exception {
+        CookieManager cookieManager = new CookieManager(null, ACCEPT_ORIGINAL_SERVER);
+        CookieHandler.setDefault(cookieManager);
+        MockWebServer server = new MockWebServer();
+        server.play();
+
+        server.enqueue(new MockResponse().addHeader("Set-Cookie: a=android; "
+                + "Comment=this cookie is delicious; "
+                + "Domain=" + server.getCookieDomain() + "; "
+                + "Max-Age=60; "
+                + "Path=/path; "
+                + "Secure; "
+                + "Version=1"));
+        get(server, "/path/foo");
+
+        List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
+        assertEquals(1, cookies.size());
+        HttpCookie cookie = cookies.get(0);
+        assertEquals("a", cookie.getName());
+        assertEquals("android", cookie.getValue());
+        assertEquals("this cookie is delicious", cookie.getComment());
+        assertEquals(null, cookie.getCommentURL());
+        assertEquals(false, cookie.getDiscard());
+        assertEquals(server.getCookieDomain(), cookie.getDomain());
+        assertEquals(60, cookie.getMaxAge());
+        assertEquals("/path", cookie.getPath());
+        assertEquals(true, cookie.getSecure());
+        assertEquals(1, cookie.getVersion());
+    }
+
+    public void testRfc2965Response() throws Exception {
+        CookieManager cookieManager = new CookieManager(null, ACCEPT_ORIGINAL_SERVER);
+        CookieHandler.setDefault(cookieManager);
+        MockWebServer server = new MockWebServer();
+        server.play();
+
+        server.enqueue(new MockResponse().addHeader("Set-Cookie2: a=android; "
+                + "Comment=this cookie is delicious; "
+                + "CommentURL=http://google.com/; "
+                + "Discard; "
+                + "Domain=" + server.getCookieDomain() + "; "
+                + "Max-Age=60; "
+                + "Path=/path; "
+                + "Port=\"80,443," + server.getPort() + "\"; "
+                + "Secure; "
+                + "Version=1"));
+        get(server, "/path/foo");
+
+        List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
+        assertEquals(1, cookies.size());
+        HttpCookie cookie = cookies.get(0);
+        assertEquals("a", cookie.getName());
+        assertEquals("android", cookie.getValue());
+        assertEquals("this cookie is delicious", cookie.getComment());
+        assertEquals("http://google.com/", cookie.getCommentURL());
+        assertEquals(true, cookie.getDiscard());
+        assertEquals(server.getCookieDomain(), cookie.getDomain());
+        assertEquals(60, cookie.getMaxAge());
+        assertEquals("/path", cookie.getPath());
+        assertEquals("80,443," + server.getPort(), cookie.getPortlist());
+        assertEquals(true, cookie.getSecure());
+        assertEquals(1, cookie.getVersion());
+    }
+
+    public void testQuotedAttributeValues() throws Exception {
+        CookieManager cookieManager = new CookieManager(null, ACCEPT_ORIGINAL_SERVER);
+        CookieHandler.setDefault(cookieManager);
+        MockWebServer server = new MockWebServer();
+        server.play();
+
+        server.enqueue(new MockResponse().addHeader("Set-Cookie2: a=\"android\"; "
+                + "Comment=\"this cookie is delicious\"; "
+                + "CommentURL=\"http://google.com/\"; "
+                + "Discard; "
+                + "Domain=\"" + server.getCookieDomain() + "\"; "
+                + "Max-Age=\"60\"; "
+                + "Path=\"/path\"; "
+                + "Port=\"80,443," + server.getPort() + "\"; "
+                + "Secure; "
+                + "Version=\"1\""));
+        get(server, "/path/foo");
+
+        List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
+        assertEquals(1, cookies.size());
+        HttpCookie cookie = cookies.get(0);
+        assertEquals("a", cookie.getName());
+        assertEquals("android", cookie.getValue());
+        assertEquals("this cookie is delicious", cookie.getComment());
+        assertEquals("http://google.com/", cookie.getCommentURL());
+        assertEquals(true, cookie.getDiscard());
+        assertEquals(server.getCookieDomain(), cookie.getDomain());
+        assertEquals(60, cookie.getMaxAge());
+        assertEquals("/path", cookie.getPath());
+        assertEquals("80,443," + server.getPort(), cookie.getPortlist());
+        assertEquals(true, cookie.getSecure());
+        assertEquals(1, cookie.getVersion());
+    }
+
+    public void testResponseWithMultipleCookieHeaderLines() throws Exception {
+        TestCookieStore cookieStore = new TestCookieStore();
+        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
+        cookieManager.put(new URI("http://android.com"), cookieHeaders("a=android", "b=banana"));
+        List<HttpCookie> cookies = sortedCopy(cookieStore.cookies);
+        assertEquals(2, cookies.size());
+        HttpCookie cookieA = cookies.get(0);
+        assertEquals("a", cookieA.getName());
+        assertEquals("android", cookieA.getValue());
+        HttpCookie cookieB = cookies.get(1);
+        assertEquals("b", cookieB.getName());
+        assertEquals("banana", cookieB.getValue());
+    }
+
+    public void testDomainDefaulting() throws Exception {
+        TestCookieStore cookieStore = new TestCookieStore();
+        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
+        cookieManager.put(new URI("http://android.com/"), cookieHeaders("a=android"));
+        assertEquals("android.com", cookieStore.getCookie("a").getDomain());
+    }
+
+    public void testNonMatchingDomainsRejected() throws Exception {
+        TestCookieStore cookieStore = new TestCookieStore();
+        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
+        cookieManager.put(new URI("http://android.com/"),
+                cookieHeaders("a=android;domain=google.com"));
+        assertEquals(Collections.<HttpCookie>emptyList(), cookieStore.cookies);
+    }
+
+    public void testMatchingDomainsAccepted() throws Exception {
+        TestCookieStore cookieStore = new TestCookieStore();
+        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
+        cookieManager.put(new URI("http://www.android.com/"),
+                cookieHeaders("a=android;domain=.android.com"));
+        assertEquals(".android.com", cookieStore.getCookie("a").getDomain());
+    }
+
+    public void testPathDefaulting() throws Exception {
+        TestCookieStore cookieStore = new TestCookieStore();
+        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
+        cookieManager.put(new URI("http://android.com/foo/bar"), cookieHeaders("a=android"));
+        assertEquals("/foo/", cookieStore.getCookie("a").getPath());
+        cookieManager.put(new URI("http://android.com/"), cookieHeaders("b=banana"));
+        assertEquals("/", cookieStore.getCookie("b").getPath());
+        cookieManager.put(new URI("http://android.com/foo/"), cookieHeaders("c=carrot"));
+        assertEquals("/foo/", cookieStore.getCookie("c").getPath());
+    }
+
+    public void testNonMatchingPathsRejected() throws Exception {
+        TestCookieStore cookieStore = new TestCookieStore();
+        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
+        cookieManager.put(new URI("http://android.com/foo/bar"),
+                cookieHeaders("a=android;path=/baz/bar"));
+        assertEquals("Expected to reject cookies whose path is not a prefix of the request path",
+                Collections.<HttpCookie>emptyList(), cookieStore.cookies); // RI6 fails this
+    }
+
+    public void testMatchingPathsAccepted() throws Exception {
+        TestCookieStore cookieStore = new TestCookieStore();
+        CookieManager cookieManager = new CookieManager(cookieStore, ACCEPT_ORIGINAL_SERVER);
+        cookieManager.put(new URI("http://android.com/foo/bar/"),
+                cookieHeaders("a=android;path=/foo"));
+        assertEquals("/foo", cookieStore.getCookie("a").getPath());
+    }
+
+    public void testNoCookieHeaderSentIfNoCookiesMatch() throws IOException, URISyntaxException {
+        CookieManager cookieManager = new CookieManager(null, ACCEPT_ORIGINAL_SERVER);
+        Map<String, List<String>> cookieHeaders = cookieManager.get(
+                new URI("http://android.com/foo/bar/"), EMPTY_COOKIES_MAP);
+        assertTrue(cookieHeaders.toString(), cookieHeaders.isEmpty()
+                || (cookieHeaders.size() == 1 && cookieHeaders.get("Cookie").isEmpty()));
+    }
+
+    public void testCookieManagerGet_schemeChecks() throws Exception {
+        CookieManager cookieManager = new CookieManager();
+
+        cookieManager.put(new URI("http://a.com/"), cookieHeaders("a1=android"));
+        cookieManager.put(new URI("https://a.com/"), cookieHeaders("a2=android"));
+        cookieManager.put(new URI("https://a.com/"), cookieHeaders("a3=android; Secure"));
+
+        assertManagerCookiesMatch(cookieManager, "http://a.com/", "a1=android; a2=android");
+        assertManagerCookiesMatch(cookieManager, "https://a.com/",
+                "a1=android; a2=android; a3=android");
+    }
+
+    public void testCookieManagerGet_hostChecks() throws Exception {
+        CookieManager cookieManager = new CookieManager();
+
+        cookieManager.put(new URI("http://a.com/"), cookieHeaders("a1=android"));
+        cookieManager.put(new URI("http://b.com/"), cookieHeaders("b1=android"));
+
+        assertManagerCookiesMatch(cookieManager, "http://a.com/", "a1=android");
+        assertManagerCookiesMatch(cookieManager, "http://b.com/", "b1=android");
+    }
+
+    public void testCookieManagerGet_portChecks() throws Exception {
+        CookieManager cookieManager = new CookieManager();
+
+        cookieManager.put(new URI("http://a.com:443/"), cookieHeaders("a1=android"));
+        cookieManager.put(new URI("http://a.com:8080/"), cookieHeaders("a2=android"));
+        cookieManager.put(new URI("http://a.com:8080/"), cookieHeaders("a3=android; Port=8080"));
+
+        assertManagerCookiesMatch(cookieManager, "http://a.com/", "a1=android; a2=android");
+        assertManagerCookiesMatch(cookieManager, "http://a.com:8080/",
+                "a1=android; a2=android; a3=android");
+    }
+
+    public void testCookieManagerGet_pathChecks() throws Exception {
+        CookieManager cookieManager = new CookieManager();
+
+        cookieManager.put(new URI("http://a.com/"), cookieHeaders("a1=android"));
+        cookieManager.put(new URI("http://a.com/path1"),
+                cookieHeaders("a2=android; Path=\"/path1\""));
+        cookieManager.put(new URI("http://a.com/path2"),
+                cookieHeaders("a3=android; Path=\"/path2\""));
+
+        assertManagerCookiesMatch(cookieManager, "http://a.com/notpath", "a1=android");
+        assertManagerCookiesMatch(cookieManager, "http://a.com/path1", "a1=android; a2=android");
+    }
+
+    public void testSendingCookiesFromStore() throws Exception {
+        MockWebServer server = new MockWebServer();
+        server.enqueue(new MockResponse());
+        server.play();
+
+        CookieManager cookieManager = new CookieManager(null, ACCEPT_ORIGINAL_SERVER);
+        HttpCookie cookieA = createCookie("a", "android", server.getCookieDomain(), "/");
+        cookieManager.getCookieStore().add(server.getUrl("/").toURI(), cookieA);
+        HttpCookie cookieB = createCookie("b", "banana", server.getCookieDomain(), "/");
+        cookieManager.getCookieStore().add(server.getUrl("/").toURI(), cookieB);
+        CookieHandler.setDefault(cookieManager);
+
+        get(server, "/");
+        RecordedRequest request = server.takeRequest();
+
+        List<String> receivedHeaders = request.getHeaders();
+        assertContains(receivedHeaders, "Cookie: $Version=\"1\"; "
+                + "a=\"android\";$Path=\"/\";$Domain=\"" + server.getCookieDomain() + "\"; "
+                + "b=\"banana\";$Path=\"/\";$Domain=\"" + server.getCookieDomain() + "\"");
+    }
+
+    public void testRedirectsDoNotIncludeTooManyCookies() throws Exception {
+        MockWebServer redirectTarget = new MockWebServer();
+        redirectTarget.enqueue(new MockResponse().setBody("A"));
+        redirectTarget.play();
+
+        MockWebServer redirectSource = new MockWebServer();
+        redirectSource.enqueue(new MockResponse()
+                .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP)
+                .addHeader("Location: " + redirectTarget.getUrl("/")));
+        redirectSource.play();
+
+        CookieManager cookieManager = new CookieManager(null, ACCEPT_ORIGINAL_SERVER);
+        HttpCookie cookie = createCookie("c", "cookie", redirectSource.getCookieDomain(), "/");
+        String portList = Integer.toString(redirectSource.getPort());
+        cookie.setPortlist(portList);
+        cookieManager.getCookieStore().add(redirectSource.getUrl("/").toURI(), cookie);
+        CookieHandler.setDefault(cookieManager);
+
+        get(redirectSource, "/");
+        RecordedRequest request = redirectSource.takeRequest();
+
+        assertContains(request.getHeaders(), "Cookie: $Version=\"1\"; "
+                + "c=\"cookie\";$Path=\"/\";$Domain=\"" + redirectSource.getCookieDomain()
+                + "\";$Port=\"" + portList + "\"");
+
+        for (String header : redirectTarget.takeRequest().getHeaders()) {
+            if (header.startsWith("Cookie")) {
+                fail(header);
+            }
+        }
+    }
+
+    /**
+     * Test which headers show up where. The cookie manager should be notified
+     * of both user-specified and derived headers like {@code Host}. Headers
+     * named {@code Cookie} or {@code Cookie2} that are returned by the cookie
+     * manager should show up in the request and in {@code
+     * getRequestProperties}.
+     */
+    public void testHeadersSentToCookieHandler() throws IOException, InterruptedException {
+        final Map<String, List<String>> cookieHandlerHeaders = new HashMap<String, List<String>>();
+        CookieHandler.setDefault(new CookieManager() {
+            @Override
+            public Map<String, List<String>> get(URI uri,
+                    Map<String, List<String>> requestHeaders) throws IOException {
+                cookieHandlerHeaders.putAll(requestHeaders);
+                Map<String, List<String>> result = new HashMap<String, List<String>>();
+                result.put("Cookie", Collections.singletonList("Bar=bar"));
+                result.put("Cookie2", Collections.singletonList("Baz=baz"));
+                result.put("Quux", Collections.singletonList("quux"));
+                return result;
+            }
+        });
+        MockWebServer server = new MockWebServer();
+        server.enqueue(new MockResponse());
+        server.play();
+
+        HttpURLConnection connection = (HttpURLConnection) server.getUrl("/").openConnection();
+        assertEquals(Collections.<String, List<String>>emptyMap(),
+                connection.getRequestProperties());
+
+        connection.setRequestProperty("Foo", "foo");
+        connection.setDoOutput(true);
+        connection.getOutputStream().write(5);
+        connection.getOutputStream().close();
+        connection.getInputStream().close();
+
+        RecordedRequest request = server.takeRequest();
+
+        assertContainsAll(cookieHandlerHeaders.keySet(), "Foo");
+        assertContainsAll(cookieHandlerHeaders.keySet(),
+                "Content-Type", "User-Agent", "Connection", "Host");
+        assertFalse(cookieHandlerHeaders.containsKey("Cookie"));
+
+        /*
+         * The API specifies that calling getRequestProperties() on a connected instance should fail
+         * with an IllegalStateException, but the RI violates the spec and returns a valid map.
+         * http://www.mail-archive.com/net-dev@openjdk.java.net/msg01768.html
+         */
+        try {
+            assertContainsAll(connection.getRequestProperties().keySet(), "Foo");
+            assertContainsAll(connection.getRequestProperties().keySet(),
+                    "Content-Type", "Content-Length", "User-Agent", "Connection", "Host");
+            assertContainsAll(connection.getRequestProperties().keySet(), "Cookie", "Cookie2");
+            assertFalse(connection.getRequestProperties().containsKey("Quux"));
+        } catch (IllegalStateException expected) {
+        }
+
+        assertContainsAll(request.getHeaders(), "Foo: foo", "Cookie: Bar=bar", "Cookie2: Baz=baz");
+        assertFalse(request.getHeaders().contains("Quux: quux"));
+    }
+
+    public void testCookiesSentIgnoresCase() throws Exception {
+        CookieHandler.setDefault(new CookieManager() {
+            @Override public Map<String, List<String>> get(URI uri,
+                    Map<String, List<String>> requestHeaders) throws IOException {
+                Map<String, List<String>> result = new HashMap<String, List<String>>();
+                result.put("COOKIE", Collections.singletonList("Bar=bar"));
+                result.put("cooKIE2", Collections.singletonList("Baz=baz"));
+                return result;
+            }
+        });
+        MockWebServer server = new MockWebServer();
+        server. enqueue(new MockResponse());
+        server.play();
+
+        get(server, "/");
+
+        RecordedRequest request = server.takeRequest();
+        assertContainsAll(request.getHeaders(), "COOKIE: Bar=bar", "cooKIE2: Baz=baz");
+        assertFalse(request.getHeaders().contains("Quux: quux"));
+    }
+
+    /**
+     * RFC 2109 and RFC 2965 disagree here. 2109 says two equals strings match only if they are
+     * fully-qualified domain names. 2965 says two equal strings always match. We're testing for
+     * 2109 behavior because it's more widely used, it's more conservative, and it's what the RI
+     * does.
+     */
+    public void testDomainMatchesOnLocalAddresses() {
+        assertFalse(HttpCookie.domainMatches("localhost", "localhost"));
+        assertFalse(HttpCookie.domainMatches("b", "b"));
+    }
+
+    public void testDomainMatchesOnIpAddress() {
+        assertTrue(HttpCookie.domainMatches("127.0.0.1", "127.0.0.1"));
+        assertFalse(HttpCookie.domainMatches("127.0.0.1", "127.0.0.0"));
+        assertFalse(HttpCookie.domainMatches("127.0.0.1", "localhost"));
+    }
+
+    public void testDomainMatchesCaseMapping() {
+        testDomainMatchesCaseMapping(Locale.US);
+    }
+
+    public void testDomainMatchesCaseMappingExoticLocale() {
+        testDomainMatchesCaseMapping(new Locale("tr", "TR"));
+    }
+
+    private void testDomainMatchesCaseMapping(Locale locale) {
+        Locale defaultLocale = Locale.getDefault();
+        Locale.setDefault(locale);
+        try {
+            assertTrue(HttpCookie.domainMatches(".android.com", "WWW.ANDROID.COM"));
+            assertFalse(HttpCookie.domainMatches("android.com", "WWW.ANDROID.COM"));
+        } finally {
+            Locale.setDefault(defaultLocale);
+        }
+    }
+
+    /**
+     * From the spec, "If an explicitly specified value does not start with a dot, the user agent
+     * supplies a leading dot.". This prepending doesn't happen in setDomain.
+     */
+    public void testDomainNotAutomaticallyPrefixedWithDot() {
+        HttpCookie cookie = new HttpCookie("Foo", "foo");
+        cookie.setDomain("localhost");
+        assertEquals("localhost", cookie.getDomain());
+    }
+
+    public void testCookieStoreNullUris() {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        HttpCookie cookieA = createCookie("a", "android", ".android.com", "/source");
+        HttpCookie cookieB = createCookie("b", "banana", "code.google.com", "/p/android");
+
+        try {
+            cookieStore.add(null, cookieA);
+        } catch (NullPointerException expected) {
+            // the RI crashes even though the cookie does get added to the store; sigh
+            expected.printStackTrace();
+        }
+        assertEquals(Arrays.asList(cookieA), cookieStore.getCookies());
+        try {
+            cookieStore.add(null, cookieB);
+        } catch (NullPointerException expected) {
+        }
+        assertEquals(Arrays.asList(cookieA, cookieB), cookieStore.getCookies());
+
+        try {
+            cookieStore.get(null);
+            fail();
+        } catch (NullPointerException expected) {
+        }
+
+        assertEquals(Collections.<URI>emptyList(), cookieStore.getURIs());
+        assertTrue(cookieStore.remove(null, cookieA));
+        assertEquals(Arrays.asList(cookieB), cookieStore.getCookies());
+
+        assertTrue(cookieStore.removeAll());
+        assertEquals(Collections.<URI>emptyList(), cookieStore.getURIs());
+        assertEquals(Collections.<HttpCookie>emptyList(), cookieStore.getCookies());
+    }
+
+    public void testCookieStoreRemoveAll() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        cookieStore.add(new URI("http://code.google.com/"), new HttpCookie("a", "android"));
+        assertTrue(cookieStore.removeAll());
+        assertEquals(Collections.<URI>emptyList(), cookieStore.getURIs());
+        assertEquals(Collections.<HttpCookie>emptyList(), cookieStore.getCookies());
+        assertFalse("Expected removeAll() to return false when the call doesn't mutate the store",
+                cookieStore.removeAll());  // RI6 fails this
+    }
+
+    public void testCookieStoreAddAcceptsConflictingUri() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        HttpCookie cookieA = createCookie("a", "android", ".android.com", "/source/");
+        cookieStore.add(new URI("http://google.com/source/"), cookieA);
+        assertEquals(Arrays.asList(cookieA), cookieStore.getCookies());
+    }
+
+    public void testCookieStoreRemoveRequiresUri() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        HttpCookie cookieA = new HttpCookie("a", "android");
+        cookieStore.add(new URI("http://android.com/source/"), cookieA);
+        assertFalse("Expected remove() to take the cookie URI into account.", // RI6 fails this
+                cookieStore.remove(new URI("http://code.google.com/"), cookieA));
+        assertEquals(Arrays.asList(cookieA), cookieStore.getCookies());
+    }
+
+    public void testCookieStoreUriUsesHttpSchemeAlways() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        cookieStore.add(new URI("https://a.com/"), new HttpCookie("a", "android"));
+        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
+    }
+
+    public void testCookieStoreUriDropsUserInfo() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        cookieStore.add(new URI("http://jesse:secret@a.com/"), new HttpCookie("a", "android"));
+        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
+    }
+
+    public void testCookieStoreUriKeepsHost() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        cookieStore.add(new URI("http://b.com/"), new HttpCookie("a", "android"));
+        assertEquals(Arrays.asList(new URI("http://b.com")), cookieStore.getURIs());
+    }
+
+    public void testCookieStoreUriDropsPort() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        cookieStore.add(new URI("http://a.com:443/"), new HttpCookie("a", "android"));
+        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
+    }
+
+    public void testCookieStoreUriDropsPath() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        cookieStore.add(new URI("http://a.com/a/"), new HttpCookie("a", "android"));
+        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
+    }
+
+    public void testCookieStoreUriDropsFragment() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        cookieStore.add(new URI("http://a.com/a/foo#fragment"), new HttpCookie("a", "android"));
+        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
+    }
+
+    public void testCookieStoreUriDropsQuery() throws URISyntaxException {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        cookieStore.add(new URI("http://a.com/a/foo?query=value"), new HttpCookie("a", "android"));
+        assertEquals(Arrays.asList(new URI("http://a.com")), cookieStore.getURIs());
+    }
+
+    public void testCookieStoreGet() throws Exception {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        HttpCookie cookiePort1 = createCookie("a1", "android", "a.com", "/path1");
+        HttpCookie cookiePort2 = createCookie("a2", "android", "a.com", "/path2");
+        HttpCookie secureCookie = createCookie("a3", "android", "a.com", "/path3");
+        secureCookie.setSecure(true);
+        HttpCookie notSecureCookie = createCookie("a4", "android", "a.com", "/path4");
+
+        HttpCookie bCookie = createCookie("b1", "android", "b.com", "/path5");
+
+        cookieStore.add(new URI("http://a.com:443/path1"), cookiePort1);
+        cookieStore.add(new URI("http://a.com:8080/path2"), cookiePort2);
+        cookieStore.add(new URI("https://a.com:443/path3"), secureCookie);
+        cookieStore.add(new URI("https://a.com:443/path4"), notSecureCookie);
+        cookieStore.add(new URI("https://b.com:8080/path5"), bCookie);
+
+        List<HttpCookie> expectedStoreCookies = new ArrayList<>();
+        expectedStoreCookies.add(cookiePort1);
+        expectedStoreCookies.add(cookiePort2);
+        expectedStoreCookies.add(secureCookie);
+        expectedStoreCookies.add(notSecureCookie);
+
+        // The default CookieStore implementation on Android is currently responsible for matching
+        // the host/domain but not handling other cookie rules: it ignores the scheme (e.g. "secure"
+        // checks), port and path.
+        // The tests below fail on the RI. It looks like in the RI it is CookieStoreImpl that is
+        // enforcing "secure" checks.
+        assertEquals(expectedStoreCookies, cookieStore.get(new URI("http://a.com:443/anypath")));
+        assertEquals(expectedStoreCookies, cookieStore.get(new URI("http://a.com:8080/anypath")));
+        assertEquals(expectedStoreCookies, cookieStore.get(new URI("https://a.com/anypath")));
+        assertEquals(expectedStoreCookies, cookieStore.get(new URI("http://a.com/anypath")));
+    }
+
+    /**
+     * Regression test for http://b/25682357 /
+     * https://code.google.com/p/android/issues/detail?id=193475
+     * CookieStoreImpl.get(URI) not handling ports properly in the absence of an explicit cookie
+     * Domain.
+     */
+    public void testCookieStoreGetWithPort() throws Exception {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        HttpCookie cookie = new HttpCookie("theme", "light");
+        // Deliberately not setting the cookie domain or path.
+        cookieStore.add(new URI("http://a.com:12345"), cookie);
+
+        // CookieStoreImpl must ignore the port during retrieval when domain is not set.
+        assertEquals(1, cookieStore.get(new URI("http://a.com:12345/path1")).size());
+        assertEquals(1, cookieStore.get(new URI("http://a.com/path1")).size());
+    }
+
+    public void testCookieStoreGetWithSecure() throws Exception {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        HttpCookie cookie = createCookie("theme", "light", "a.com", "/path");
+        cookie.setSecure(true);
+        cookieStore.add(new URI("https://a.com/path"), cookie);
+
+        // CookieStoreImpl on Android ignores the "Secure" attribute. The RI implements the secure
+        // check in CookieStoreImpl. For safety / app compatibility, if this is changed Android
+        // should probably implement it in both places.
+        assertEquals(1, cookieStore.get(new URI("http://a.com/path")).size());
+        assertEquals(1, cookieStore.get(new URI("https://a.com/path")).size());
+    }
+
+    public void testCookieStoreEviction() throws Exception {
+        CookieStore cookieStore = new CookieManager().getCookieStore();
+        HttpCookie themeCookie = createCookie("theme", "light", "a.com", "/");
+        cookieStore.add(new URI("http://a.com/"), themeCookie);
+
+        HttpCookie sidCookie = createCookie("sid", "mysid", "a.com", "/");
+        cookieStore.add(new URI("http://a.com/"), sidCookie);
+
+        HttpCookie replacementThemeCookie = createCookie("theme", "dark", "a.com", "/");
+        cookieStore.add(new URI("http://a.com/"), replacementThemeCookie);
+
+        // toString() is used below to avoid confusion with assertEquals():
+        // HttpCookie.equals() is implemented so that it only checks name, path and domain
+        // attributes but we also want to check the value.
+        assertEquals(
+                "[sid=\"mysid\";$Path=\"/\";$Domain=\"a.com\", "
+                        + "theme=\"dark\";$Path=\"/\";$Domain=\"a.com\"]",
+                cookieStore.get(new URI("http://a.com/")).toString());
+
+        HttpCookie replacementSidCookie = createCookie("sid", "mynewsid", "A.cOm", "/");
+        cookieStore.add(new URI("http://a.com/"), replacementSidCookie);
+
+        assertEquals(
+                "[theme=\"dark\";$Path=\"/\";$Domain=\"a.com\", "
+                        + "sid=\"mynewsid\";$Path=\"/\";$Domain=\"a.com\"]",
+                cookieStore.get(new URI("http://a.com/")).toString());
+    }
+
+    /**
+     * CookieStoreImpl has a strict requirement on HttpCookie.equals() to enable replacement of
+     * cookies with the same name.
+     */
+    public void testCookieEquality() throws Exception {
+        HttpCookie baseCookie = createCookie("theme", "light", "a.com", "/");
+
+        // None of the attributes immediately below should affect equality otherwise CookieStoreImpl
+        // eviction will not work as intended.
+        HttpCookie valueCookie = createCookie("theme", "light", "a.com", "/");
+        valueCookie.setValue("dark");
+        valueCookie.setPortlist("1234");
+        valueCookie.setSecure(true);
+        valueCookie.setComment("comment");
+        valueCookie.setCommentURL("commentURL");
+        valueCookie.setDiscard(true);
+        valueCookie.setMaxAge(12345L);
+        valueCookie.setVersion(1);
+        assertEquals(baseCookie, valueCookie);
+
+        // Changing any of the 3 main identity attributes should render cookies unequal.
+        assertNotEquals(createCookie("theme2", "light", "a.com", "/"), baseCookie);
+        assertNotEquals(createCookie("theme", "light", "b.com", "/"), baseCookie);
+        assertNotEquals(createCookie("theme", "light", "a.com", "/path"), baseCookie);
+    }
+
+    private static void assertNotEquals(HttpCookie one, HttpCookie two) {
+        assertFalse(one.equals(two));
+        assertFalse(two.equals(one));
+    }
+
+    private void assertContains(Collection<String> collection, String element) {
+        for (String c : collection) {
+            if (c != null && c.equalsIgnoreCase(element)) {
+                return;
+            }
+        }
+        fail("No " + element + " in " + collection);
+    }
+
+    private void assertContainsAll(Collection<String> collection, String... toFind) {
+        for (String s : toFind) {
+            assertContains(collection, s);
+        }
+    }
+
+    private List<HttpCookie> sortedCopy(List<HttpCookie> cookies) {
+        List<HttpCookie> result = new ArrayList<HttpCookie>(cookies);
+        Collections.sort(result, new Comparator<HttpCookie>() {
+            public int compare(HttpCookie a, HttpCookie b) {
+                return a.getName().compareTo(b.getName());
+            }
+        });
+        return result;
+    }
+
+    private Map<String,List<String>> get(MockWebServer server, String path) throws Exception {
+        URLConnection connection = server.getUrl(path).openConnection();
+        Map<String, List<String>> headers = connection.getHeaderFields();
+        connection.getInputStream().close();
+        return headers;
+    }
+
+    private static Map<String, List<String>> cookieHeaders(String... headers) {
+        return Collections.singletonMap("Set-Cookie", Arrays.asList(headers));
+    }
+
+    static class TestCookieStore implements CookieStore {
+        private final List<HttpCookie> cookies = new ArrayList<HttpCookie>();
+
+        public void add(URI uri, HttpCookie cookie) {
+            cookies.add(cookie);
+        }
+
+        public HttpCookie getCookie(String name) {
+            for (HttpCookie cookie : cookies) {
+                if (cookie.getName().equals(name)) {
+                    return cookie;
+                }
+            }
+            throw new IllegalArgumentException("No cookie " + name + " in " + cookies);
+        }
+
+        public List<HttpCookie> get(URI uri) {
+            throw new UnsupportedOperationException();
+        }
+
+        public List<HttpCookie> getCookies() {
+            throw new UnsupportedOperationException();
+        }
+
+        public List<URI> getURIs() {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean remove(URI uri, HttpCookie cookie) {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean removeAll() {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    private static void assertManagerCookiesMatch(CookieManager cookieManager, String url,
+        String expectedCookieRequestHeader) throws Exception {
+
+        Map<String, List<String>> cookieHeaders =
+                cookieManager.get(new URI(url), EMPTY_COOKIES_MAP);
+        if (expectedCookieRequestHeader == null) {
+            assertTrue(cookieHeaders.isEmpty());
+            return;
+        }
+
+        assertEquals(1, cookieHeaders.size());
+        List<String> actualCookieHeaderStrings = cookieHeaders.get("Cookie");
+
+        // For simplicity, we concatenate the cookie header strings if there are multiple ones.
+        String actualCookieRequestHeader = actualCookieHeaderStrings.get(0);
+        for (int i = 1; i < actualCookieHeaderStrings.size(); i++) {
+            actualCookieRequestHeader += "; " + actualCookieHeaderStrings.get(i);
+        }
+        assertEquals(expectedCookieRequestHeader, actualCookieRequestHeader);
+    }
+
+    /**
+     * Creates a well-formed cookie. The behavior when domain is unset varies between
+     * RFC 2965 and RFC 6265. CookieStoreImpl assumes these values are set "correctly" by the time
+     * it receives the HttpCookie instance.
+     */
+    private static HttpCookie createCookie(String name, String value, String domain, String path) {
+        HttpCookie cookie = new HttpCookie(name, value);
+        cookie.setDomain(domain);
+        cookie.setPath(path);
+        return cookie;
     }
 }
diff --git a/ojluni/src/main/java/java/net/InMemoryCookieStore.java b/ojluni/src/main/java/java/net/InMemoryCookieStore.java
index 3b435c1..0734e74 100755
--- a/ojluni/src/main/java/java/net/InMemoryCookieStore.java
+++ b/ojluni/src/main/java/java/net/InMemoryCookieStore.java
@@ -26,14 +26,16 @@
 
 package java.net;
 
-import dalvik.system.VMRuntime;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
+import java.net.URI;
+import java.net.CookieStore;
+import java.net.HttpCookie;
+import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Map;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Collections;
+import java.util.Iterator;
 import java.util.concurrent.locks.ReentrantLock;
 
 /**
@@ -41,28 +43,20 @@
  *
  * @author Edward Wang
  * @since 1.6
- * @hide Visible for testing only.
  */
-public class InMemoryCookieStore implements CookieStore {
+class InMemoryCookieStore implements CookieStore {
     // the in-memory representation of cookies
     private Map<URI, List<HttpCookie>> uriIndex = null;
 
     // use ReentrantLock instead of syncronized for scalability
     private ReentrantLock lock = null;
 
-    private final boolean applyMCompatibility;
-
     /**
      * The default ctor
      */
     public InMemoryCookieStore() {
-        this(VMRuntime.getRuntime().getTargetSdkVersion());
-    }
-
-    public InMemoryCookieStore(int targetSdkVersion) {
-        uriIndex = new HashMap<>();
+        uriIndex = new HashMap<URI, List<HttpCookie>>();
         lock = new ReentrantLock(false);
-        applyMCompatibility = (targetSdkVersion <= 23);
     }
 
     /**
@@ -247,18 +241,10 @@
             return host.equalsIgnoreCase(domain);
         } else if (lengthDiff > 0) {
             // need to check H & D component
+            String H = host.substring(0, lengthDiff);
             String D = host.substring(lengthDiff);
 
-            if (applyMCompatibility) {
-                // Android M and earlier: Cookies with domain "foo.com" would not match "bar.foo.com".
-                // The RFC dictates that the user agent must treat those domains as if they had a
-                // leading period and must therefore match "bar.foo.com".
-                if (!domain.startsWith(".")) {
-                    return false;
-                }
-            } else {
-                return (D.equalsIgnoreCase(domain));
-            }
+            return (D.equalsIgnoreCase(domain));
         } else if (lengthDiff == -1) {
             // if domain is actually .host
             return (domain.charAt(0) == '.' &&