blob: 9092f26d45ff4f9a3489099801c99cf2368132f5 [file] [log] [blame]
/* 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;
}
}
}