| /* |
| * 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.HttpCookie; |
| import java.util.List; |
| import java.util.Locale; |
| |
| public class HttpCookieTest extends TestCase { |
| private Locale locale; |
| |
| /** |
| * java.net.HttpCookie(String, String). |
| * @since 1.6 |
| */ |
| public void test_HttpCookie_LString_LString() { |
| assertNotNull(new HttpCookie("harmony_6", "test,sem")); |
| assertNotNull(new HttpCookie("harmony_6", null)); |
| assertNotNull(new HttpCookie("harmony ", null)); |
| assertEquals("harmony", new HttpCookie("harmony ", null).getName()); |
| |
| constructHttpCookie("", null); |
| |
| String value = "value"; |
| constructHttpCookie("", value); |
| |
| constructHttpCookie("harmony,", value); |
| constructHttpCookie("harmony;", value); |
| constructHttpCookie("$harmony", value); |
| constructHttpCookie("n\tame", value); |
| constructHttpCookie("n\rame", value); |
| constructHttpCookie("n\r\name", value); |
| constructHttpCookie("Comment", value); |
| constructHttpCookie("CommentURL", value); |
| constructHttpCookie("Domain", value); |
| constructHttpCookie("Discard", value); |
| constructHttpCookie("Max-Age", value); |
| constructHttpCookie(" Path ", value); |
| constructHttpCookie("Port ", value); |
| constructHttpCookie("SeCure", value); |
| constructHttpCookie("VErsion", value); |
| constructHttpCookie("expires", value); |
| constructHttpCookie("na\u0085me", value); |
| constructHttpCookie("\u2028me", value); |
| constructHttpCookie("na\u2029me", value); |
| |
| try { |
| new HttpCookie(null, value); |
| fail("Should throw NullPointerException"); |
| } catch (NullPointerException e) { |
| // expected |
| } |
| |
| try { |
| new HttpCookie("\u007f", value); |
| fail("Should throw IllegalArgumentException"); |
| } catch (IllegalArgumentException e) { |
| // expected |
| } |
| |
| HttpCookie cookie = new HttpCookie("harmony!", null); |
| assertEquals("harmony!", cookie.getName()); |
| |
| cookie = new HttpCookie("harmon$y", null); |
| assertEquals("harmon$y", cookie.getName()); |
| |
| } |
| |
| private static void constructHttpCookie(String name, String value) { |
| try { |
| new HttpCookie(name, value); |
| fail("Should throw IllegalArgumentException"); |
| } catch (IllegalArgumentException e) { |
| // expected |
| } |
| } |
| |
| /** |
| * java.net.HttpCookie#domainMatches(String, String). |
| * @since 1.6 |
| */ |
| public void test_DomainMatches() { |
| |
| /* |
| * Rule 1: A host isn't in a domain (RFC 2965 sec. 3.3.2) if: The value |
| * for the Domain attribute contains no embedded dots, and the value is |
| * not .local. |
| */ |
| boolean match = HttpCookie.domainMatches("hostname", "hostname"); |
| assertFalse(match); |
| |
| match = HttpCookie.domainMatches(".com", "test.com"); |
| assertFalse(match); |
| |
| match = HttpCookie.domainMatches(".com.", "test.com"); |
| assertFalse(match); |
| |
| // During comparison, host name is transformed to effective host name |
| // first. |
| match = HttpCookie.domainMatches(".local", "hostname"); |
| assertTrue(match); |
| |
| /* |
| * Rule 3: The request-host is a HDN (not IP address) and has the form |
| * HD, where D is the value of the Domain attribute, and H is a string |
| * that contains one or more dots. |
| */ |
| match = HttpCookie.domainMatches(".c.d", "a.b.c.d"); |
| assertTrue(match); |
| |
| match = HttpCookie.domainMatches("c.d", "a.b.c.d"); |
| assertFalse(match); |
| |
| match = HttpCookie.domainMatches(".foo.com", "y.x.foo.com"); |
| assertTrue(match); |
| |
| match = HttpCookie.domainMatches(".foo.com", "x.foo.com"); |
| assertTrue(match); |
| |
| match = HttpCookie.domainMatches(".local", "hostname.local"); |
| assertTrue(match); |
| |
| match = HttpCookie.domainMatches(".ajax.com", "a.ajax.com"); |
| assertTrue(match); |
| |
| match = HttpCookie.domainMatches(".ajax.com", "a.AJAX.com"); |
| assertTrue(match); |
| |
| match = HttpCookie.domainMatches("...", "test..."); |
| assertFalse(match); |
| |
| match = HttpCookie.domainMatches(".ajax.com", "b.a.AJAX.com"); |
| assertTrue(match); |
| |
| match = HttpCookie.domainMatches(".a", "b.a"); |
| assertFalse(match); |
| |
| // when either parameter is null |
| match = HttpCookie.domainMatches(".ajax.com", null); |
| assertFalse(match); |
| |
| match = HttpCookie.domainMatches(null, null); |
| assertFalse(match); |
| |
| match = HttpCookie.domainMatches(null, "b.a.AJAX.com"); |
| assertFalse(match); |
| } |
| |
| /** |
| * java.net.HttpCookie#getVersion(), setVersion(int). |
| * @since 1.6 |
| */ |
| public void test_Get_SetVersion() { |
| HttpCookie cookie = new HttpCookie("name", "value"); |
| assertEquals(1, cookie.getVersion()); |
| cookie.setVersion(0); |
| assertEquals(0, cookie.getVersion()); |
| cookie.setVersion(1); |
| assertEquals(1, cookie.getVersion()); |
| |
| try { |
| cookie.setVersion(-1); |
| fail("should throw IllegalArgumentException"); |
| } catch (IllegalArgumentException e) { |
| // expected |
| } |
| |
| try { |
| cookie.setVersion(2); |
| fail("should throw IllegalArgumentException"); |
| } catch (IllegalArgumentException e) { |
| // expected |
| } |
| } |
| |
| /** |
| * java.net.HttpCookie#getValue(), setValue(String) |
| * @since 1.6 |
| */ |
| public void test_Get_SetValue() { |
| HttpCookie cookie = new HttpCookie("name", "value"); |
| assertEquals("value", cookie.getValue()); |
| cookie.setValue("newValue"); |
| assertEquals("newValue", cookie.getValue()); |
| |
| cookie.setValue(null); |
| assertNull(cookie.getValue()); |
| |
| cookie.setValue("na\u64DEme"); |
| assertEquals("na\u64DEme", cookie.getValue()); |
| cookie.setVersion(0); |
| cookie.setValue("{(new value, 11)}"); |
| assertEquals("{(new value, 11)}", cookie.getValue()); |
| } |
| |
| /** |
| * java.net.HttpCookie#getName() |
| * @since 1.6 |
| */ |
| public void test_GetName() { |
| HttpCookie cookie = new HttpCookie("testName", "value"); |
| assertEquals("testName", cookie.getName()); |
| } |
| |
| /** |
| * java.net.HttpCookie#getSecure(), setSecure(boolean) |
| * @since 1.6 |
| */ |
| public void test_Get_SetSecure() { |
| HttpCookie cookie = new HttpCookie("testName", "value"); |
| assertFalse(cookie.getSecure()); |
| cookie.setVersion(0); |
| assertFalse(cookie.getSecure()); |
| |
| cookie.setSecure(true); |
| assertTrue(cookie.getSecure()); |
| cookie.setSecure(false); |
| cookie.setVersion(1); |
| assertFalse(cookie.getSecure()); |
| } |
| |
| public void test_Is_SetHttpOnly() { |
| HttpCookie cookie = new HttpCookie("testName", "value"); |
| assertFalse(cookie.isHttpOnly()); |
| |
| cookie.setHttpOnly(true); |
| assertTrue(cookie.isHttpOnly()); |
| cookie.setHttpOnly(false); |
| assertFalse(cookie.isHttpOnly()); |
| } |
| |
| /** |
| * java.net.HttpCookie#getPath(), setPath(String) |
| * @since 1.6 |
| */ |
| public void test_Get_SetPath() { |
| HttpCookie cookie = new HttpCookie("name", "test new value"); |
| assertNull(cookie.getPath()); |
| |
| cookie.setPath("{}() test,; 43!@"); |
| assertEquals("{}() test,; 43!@", cookie.getPath()); |
| |
| cookie.setPath(" test"); |
| assertEquals(" test", cookie.getPath()); |
| |
| cookie.setPath("\u63DF\u64DE"); |
| cookie.setDomain("test"); |
| assertEquals("\u63DF\u64DE", cookie.getPath()); |
| } |
| |
| /** |
| * java.net.HttpCookie#getMaxAge(), setMaxAge(long) |
| * @since 1.6 |
| */ |
| public void test_Get_SetMaxAge() { |
| HttpCookie cookie = new HttpCookie("name", "test new value"); |
| assertEquals(-1, cookie.getMaxAge()); |
| |
| cookie.setMaxAge(Long.MAX_VALUE); |
| assertEquals(Long.MAX_VALUE, cookie.getMaxAge()); |
| |
| cookie.setMaxAge(Long.MIN_VALUE); |
| cookie.setDiscard(false); |
| assertEquals(Long.MIN_VALUE, cookie.getMaxAge()); |
| } |
| |
| /** |
| * java.net.HttpCookie#getDomain(), setDomain(String) |
| * @since 1.6 |
| */ |
| public void test_Get_SetDomain() { |
| HttpCookie cookie = new HttpCookie("name", "test new value"); |
| assertNull(cookie.getDomain()); |
| |
| cookie.setDomain("a.b.d.c.com."); |
| assertEquals("a.b.d.c.com.", cookie.getDomain()); |
| |
| cookie.setDomain(" a.b.d.c.com. "); |
| assertEquals(" a.b.d.c.com. ", cookie.getDomain()); |
| |
| cookie.setPath("temp/subTemp"); |
| cookie.setDomain("xy.foo.bar.de.edu"); |
| assertEquals("xy.foo.bar.de.edu", cookie.getDomain()); |
| } |
| |
| /** |
| * java.net.HttpCookie#getPortlist(), setPortlist(String) |
| * @since 1.6 |
| */ |
| public void test_Get_SetPortlist() { |
| HttpCookie cookie = new HttpCookie("cookieName", "cookieName value"); |
| assertNull(cookie.getPortlist()); |
| |
| cookie.setPortlist("80,23,20"); |
| assertEquals("80,23,20", cookie.getPortlist()); |
| cookie.setPortlist("abcdefg1234567"); |
| cookie.setValue("cookie value again"); |
| assertEquals("abcdefg1234567", cookie.getPortlist()); |
| } |
| |
| /** |
| * java.net.HttpCookie#getDiscard(), setDiscard(boolean) |
| * @since 1.6 |
| */ |
| public void test_Get_SetDiscard() { |
| HttpCookie cookie = new HttpCookie("cookie'sName", |
| "cookie's Test value"); |
| assertFalse(cookie.getDiscard()); |
| |
| cookie.setDiscard(true); |
| assertTrue(cookie.getDiscard()); |
| cookie.setDiscard(false); |
| cookie.setMaxAge(-1); |
| assertFalse(cookie.getDiscard()); |
| } |
| |
| /** |
| * java.net.HttpCookie#getCommentURL(), setCommentURL(String) |
| * @since 1.6 |
| */ |
| public void test_Get_SetCommentURL() { |
| HttpCookie cookie = new HttpCookie("cookie'\"sName", |
| "cookie's Test value"); |
| assertNull(cookie.getCommentURL()); |
| |
| cookie.setCommentURL("http://www.test.com"); |
| assertEquals("http://www.test.com", cookie.getCommentURL()); |
| |
| cookie.setCommentURL("schema://harmony.test.org"); |
| cookie.setComment("just a comment"); |
| assertEquals("schema://harmony.test.org", cookie.getCommentURL()); |
| } |
| |
| /** |
| * java.net.HttpCookie#getComment(), setComment(String) |
| * @since 1.6 |
| */ |
| public void test_Get_SetComment() { |
| HttpCookie cookie = new HttpCookie("cookie'\"sName?", |
| "cookie's Test??!@# value"); |
| assertNull(cookie.getComment()); |
| |
| cookie.setComment(""); |
| assertEquals("", cookie.getComment()); |
| |
| cookie.setComment("cookie''s @#$!&*()"); |
| cookie.setVersion(0); |
| assertEquals("cookie''s @#$!&*()", cookie.getComment()); |
| } |
| |
| /** |
| * java.net.HttpCookie#hasExpired() |
| * @since 1.6 |
| */ |
| public void test_HasExpired() { |
| HttpCookie cookie = new HttpCookie("cookie'\"sName123456", |
| "cookie's Test?()!@# value"); |
| assertFalse(cookie.hasExpired()); |
| |
| cookie.setMaxAge(0); |
| assertTrue(cookie.hasExpired()); |
| |
| cookie.setMaxAge(Long.MAX_VALUE); |
| cookie.setVersion(0); |
| assertFalse(cookie.hasExpired()); |
| |
| cookie.setMaxAge(Long.MIN_VALUE); |
| cookie.setDiscard(false); |
| assertTrue(cookie.hasExpired()); |
| |
| cookie.setDiscard(true); |
| cookie.setMaxAge(-1); |
| assertFalse(cookie.hasExpired()); |
| } |
| |
| /** |
| * java.net.HttpCookie#equals() |
| * @since 1.6 |
| */ |
| public void test_Equals() { |
| Object obj = new Object(); |
| HttpCookie cookie = new HttpCookie("test", "testValue"); |
| HttpCookie cookie2 = new HttpCookie("TesT", "TEstValue"); |
| |
| assertFalse(cookie.equals(obj)); |
| assertFalse(cookie.equals(null)); |
| assertTrue(cookie2.equals(cookie)); |
| assertTrue(cookie.equals(cookie2)); |
| assertTrue(cookie.equals(cookie)); |
| |
| cookie.setDomain(" test"); |
| cookie2.setDomain("test"); |
| assertFalse(cookie.equals(cookie2)); |
| cookie.setDomain("TEST"); |
| assertTrue(cookie.equals(cookie2)); |
| |
| cookie.setPath("temp\\e"); |
| assertFalse(cookie.equals(cookie2)); |
| cookie2.setPath("temp\\E"); |
| assertFalse(cookie.equals(cookie2)); |
| |
| cookie.setDiscard(true); |
| cookie.setMaxAge(-1234); |
| cookie2.setPath("temp\\e"); |
| assertTrue(cookie.equals(cookie2)); |
| } |
| |
| /** |
| * java.net.HttpCookie#clone() |
| * @since 1.6 |
| */ |
| public void test_Clone() { |
| HttpCookie cookie = new HttpCookie("test", "testValue"); |
| cookie.setMaxAge(33l); |
| cookie.setComment("test comment"); |
| HttpCookie cloneCookie = (HttpCookie) cookie.clone(); |
| assertNotSame(cloneCookie, cookie); |
| assertEquals("test", cloneCookie.getName()); |
| assertEquals(33l, cloneCookie.getMaxAge()); |
| assertEquals("test comment", cloneCookie.getComment()); |
| } |
| |
| /** |
| * java.net.HttpCookie#toString() |
| * @since 1.6 |
| */ |
| public void test_ToString() { |
| HttpCookie cookie = new HttpCookie("test", "testValue"); |
| cookie.setComment("ABCd"); |
| cookie.setCommentURL("\u63DF"); |
| cookie.setDomain(".B.com"); |
| cookie.setDiscard(true); |
| cookie.setMaxAge(Integer.MAX_VALUE); |
| cookie.setPath("temp/22RuTh"); |
| cookie.setPortlist("80.562Ab"); |
| cookie.setSecure(true); |
| cookie.setVersion(1); |
| |
| assertEquals( |
| "test=\"testValue\";$Path=\"temp/22RuTh\";$Domain=\".b.com\";$Port=\"80.562Ab\"", |
| cookie.toString()); |
| |
| cookie.setPath(null); |
| assertEquals( |
| "test=\"testValue\";$Domain=\".b.com\";$Port=\"80.562Ab\"", |
| cookie.toString()); |
| cookie.setComment(null); |
| assertEquals( |
| "test=\"testValue\";$Domain=\".b.com\";$Port=\"80.562Ab\"", |
| cookie.toString()); |
| cookie.setPortlist(null); |
| assertEquals("test=\"testValue\";$Domain=\".b.com\"", cookie.toString()); |
| cookie.setDomain(null); |
| assertEquals("test=\"testValue\"", cookie.toString()); |
| |
| cookie.setVersion(0); |
| cookie.setPortlist("80,8000"); |
| assertEquals("test=testValue", cookie.toString()); |
| } |
| |
| /** |
| * java.net.HttpCookie#hashCode() |
| * @since 1.6 |
| */ |
| public void test_HashCode() { |
| HttpCookie cookie = new HttpCookie("nAmW_1", "value_1"); |
| assertEquals(-1052814577, cookie.hashCode()); |
| |
| cookie.setDomain("a.b.c.de"); |
| assertEquals(1222695220, cookie.hashCode()); |
| |
| cookie.setPath("3kmxiq;1"); |
| assertEquals(-675006347, cookie.hashCode()); |
| cookie.setPath("3KmxiQ;1"); |
| assertEquals(989616181, cookie.hashCode()); |
| |
| cookie.setValue("Vw0,22_789"); |
| assertEquals(989616181, cookie.hashCode()); |
| cookie.setComment("comment"); |
| assertEquals(989616181, cookie.hashCode()); |
| |
| cookie.setDomain(""); |
| assertEquals(-1285893616, cookie.hashCode()); |
| } |
| |
| /** |
| * java.net.HttpCookie#parse(String) for exception cases |
| * @since 1.6 |
| */ |
| public void test_Parse_exception() { |
| try { |
| HttpCookie.parse(null); |
| fail("Should throw NullPointerException"); |
| } catch (NullPointerException e) { |
| // expected |
| } |
| /* |
| * Please note that Netscape draft specification does not fully conform |
| * to the HTTP header format. Netscape draft does not specify whether |
| * multiple cookies may be sent in one header. Hence, comma character |
| * may be present in unquoted cookie value or unquoted parameter value. |
| * Refer to <a |
| * href="http://jakarta.apache.org/commons/httpclient/apidocs/org/apache/commons/httpclient/cookie/NetscapeDraftSpec.html#parse(java.lang.String,%20int,%20java.lang.String,%20boolean,%20java.lang.String)"> |
| * http://jakarta.apache.org/commons/httpclient/apidocs/org/apache/commons/httpclient/cookie/NetscapeDraftSpec.html#parse(java.lang.String,%20int,%20java.lang.String,%20boolean,%20java.lang.String) |
| * </a> |
| */ |
| // violates the cookie specification's syntax |
| checkInvalidCookie("invalid cookie name"); |
| checkInvalidCookie("Set-Cookie2:"); |
| checkInvalidCookie("name"); |
| checkInvalidCookie("$name="); |
| checkInvalidCookie("Set-Cookie2:$name="); |
| checkInvalidCookie("Set-Cookie:$"); |
| checkInvalidCookie("Set-Cookie"); |
| |
| // cookie name contains llegal characters |
| checkInvalidCookie("Set-Cookie:n,ame="); |
| checkInvalidCookie("Set-Cookie2:n\name="); |
| checkInvalidCookie("Set-Cookie2:n,ame="); |
| checkInvalidCookie("Set-Cookie2:n\tame="); |
| checkInvalidCookie("Set-Cookie2:n\rame="); |
| checkInvalidCookie("Set-Cookie2:n\r\name="); |
| checkInvalidCookie("Set-Cookie2:na\u0085me="); |
| checkInvalidCookie("Set-Cookie2:na\u2028me="); |
| checkInvalidCookie("Set-Cookie2:na\u2029me="); |
| checkInvalidCookie("Set-Cookie2:="); |
| checkInvalidCookie("Set-Cookie2:name=tes,t"); |
| |
| // 'CommentURL' is one of the tokens reserved, case-insensitive |
| checkInvalidCookie("Set-Cookie2:COmmentURL=\"lala\""); |
| |
| // check value |
| checkInvalidCookie("Set-Cookie2:val,ue"); |
| checkInvalidCookie("Set-Cookie2:name=test;comMent=sent,ence"); |
| checkInvalidCookie("Set-Cookie2:name=test;comMentUrL=u,rl"); |
| checkInvalidCookie("Set-Cookie2:name=test;Discard=fa,lse"); |
| checkInvalidCookie("Set-Cookie2:name=test;Disc,ard"); |
| checkInvalidCookie("Set-Cookie2:name=test;Domain=u,rl"); |
| checkInvalidCookie("Set-Cookie2:name=test;Path=pa,th"); |
| checkInvalidCookie("Set-Cookie2:name=test;Secure=se,cure"); |
| checkInvalidCookie("Set-Cookie2:name=test;se,cure"); |
| checkInvalidCookie("Set-Cookie2:name=test;Max-Age=se,cure"); |
| checkInvalidCookie("Set-Cookie2:name=test;Max-Age="); |
| checkInvalidCookie("Set-Cookie2:name=test;Max-Age=max-age"); |
| checkInvalidCookie("Set-Cookie2:name=test;Max-Age=1000.0"); |
| } |
| |
| /** |
| * java.net.HttpCookie#parse(String) for locales other than |
| * Locale.ENGLISH. |
| * @since 1.6 |
| */ |
| public void test_Parse_locale() { |
| Locale.setDefault(Locale.FRENCH); |
| List<HttpCookie> list = HttpCookie |
| .parse("Set-Cookie:name=test;expires=Thu, 30-Oct-2008 19:14:07 GMT;"); |
| HttpCookie cookie = list.get(0); |
| assertTrue(cookie.hasExpired()); |
| |
| Locale.setDefault(Locale.GERMAN); |
| list = HttpCookie |
| .parse("Set-Cookie:name=test;expires=Sun, 30-Oct-2005 19:14:07 GMT;"); |
| cookie = list.get(0); |
| assertTrue(cookie.hasExpired()); |
| |
| Locale.setDefault(Locale.KOREA); |
| list = HttpCookie |
| .parse("Set-Cookie:name=test;max-age=1234;expires=Sun, 30-Oct-2005 19:14:07 GMT;"); |
| cookie = list.get(0); |
| assertEquals(0, cookie.getVersion()); |
| assertEquals(1234, cookie.getMaxAge()); |
| assertFalse(cookie.hasExpired()); |
| |
| Locale.setDefault(Locale.TAIWAN); |
| list = HttpCookie |
| .parse("Set-Cookie:name=test;max-age=-12345;"); |
| cookie = list.get(0); |
| assertEquals(-12345, cookie.getMaxAge()); |
| assertTrue(cookie.hasExpired()); |
| |
| // Locale does not affect version 1 cookie. |
| Locale.setDefault(Locale.ITALIAN); |
| list = HttpCookie.parse("Set-Cookie2:name=test;max-age=1000"); |
| cookie = list.get(0); |
| assertEquals(1000, cookie.getMaxAge()); |
| assertFalse(cookie.hasExpired()); |
| } |
| |
| /** |
| * java.net.HttpCookie#parse(String) for normal cases |
| * @since 1.6 |
| */ |
| public void test_Parse() { |
| List<HttpCookie> list = HttpCookie.parse("test=\"null\""); |
| HttpCookie cookie = list.get(0); |
| // when two '"' presents, the parser ignores it. |
| assertEquals("null", cookie.getValue()); |
| assertNull(cookie.getComment()); |
| assertNull(cookie.getCommentURL()); |
| assertFalse(cookie.getDiscard()); |
| assertNull(cookie.getDomain()); |
| assertEquals(-1, cookie.getMaxAge()); |
| assertNull(cookie.getPath()); |
| assertNull(cookie.getPortlist()); |
| assertFalse(cookie.getSecure()); |
| // default version is 0 |
| assertEquals(0, cookie.getVersion()); |
| |
| list = HttpCookie.parse("Set-cookie2:name=\"tes,t\""); |
| cookie = list.get(0); |
| // when two '"' presents, the parser ignores it. |
| assertEquals("tes,t", cookie.getValue()); |
| |
| // If cookie header = Set-Cookie2, version = 1 |
| list = HttpCookie |
| .parse("Set-cookie2:test=null\";;Port=abde,82;Path=/temp;;;Discard;commentURl=http://harmonytest.org;Max-age=-10;"); |
| cookie = list.get(0); |
| assertEquals("null\"", cookie.getValue()); |
| assertEquals(1, cookie.getVersion()); |
| assertEquals("/temp", cookie.getPath()); |
| assertTrue(cookie.getDiscard()); |
| assertEquals("http://harmonytest.org", cookie.getCommentURL()); |
| assertEquals(-10l, cookie.getMaxAge()); |
| assertTrue(cookie.hasExpired()); |
| assertEquals("abde,82", cookie.getPortlist()); |
| // Version 0 cookie |
| list = HttpCookie |
| .parse("Set-Cookie:name=tes,t;Comment=version1-cookie;Discard=false;commentURL=vers\nion1-cookie-url;Domain=x.y;"); |
| cookie = list.get(0); |
| assertEquals(0, cookie.getVersion()); |
| assertEquals("tes,t", cookie.getValue()); |
| assertEquals("name", cookie.getName()); |
| assertEquals("version1-cookie", cookie.getComment()); |
| assertEquals("vers\nion1-cookie-url", cookie.getCommentURL()); |
| assertEquals("x.y", cookie.getDomain()); |
| assertTrue(cookie.getDiscard()); |
| |
| // Check value |
| checkValidValue("Set-Cookie:", "val,ue"); |
| checkValidValue("Set-Cookie:", "val\nue"); |
| checkValidValue("Set-Cookie:", "value=value"); |
| checkValidValue("Set-Cookie2:", "val\nue"); |
| checkValidValue("Set-Cookie2:", "val\u2029ue"); |
| checkValidValue("Set-Cookie2:", "value=value"); |
| |
| // Check comment |
| // In RFC 2965 '=' is mandatory, but this is not the case in RI. |
| list = HttpCookie.parse("Set-Cookie:name=tes,t;Comment;"); |
| cookie = list.get(0); |
| assertNull(cookie.getComment()); |
| |
| list = HttpCookie |
| .parse("Set-Cookie:name=tes,t;Comment=sentence;Comment=anotherSentence"); |
| cookie = list.get(0); |
| assertEquals("sentence", cookie.getComment()); |
| |
| // Check CommentURL |
| list = HttpCookie |
| .parse("Set-Cookie:name=tes,t;Commenturl;commentuRL=(la,la)"); |
| cookie = list.get(0); |
| assertEquals("(la,la)", cookie.getCommentURL()); |
| |
| // Check Domain |
| list = HttpCookie.parse("Set-Cookie:name=test;Domain=a_domain"); |
| cookie = list.get(0); |
| assertEquals("a_domain", cookie.getDomain()); |
| |
| // Check Path |
| list = HttpCookie.parse("Set-Cookie:name=test;PaTh=pa$th"); |
| cookie = list.get(0); |
| assertEquals("pa$th", cookie.getPath()); |
| |
| // Check Max-Age |
| list = HttpCookie.parse("Set-Cookie:name=test;Max-Age=1000"); |
| cookie = list.get(0); |
| assertEquals(1000, cookie.getMaxAge()); |
| |
| list = HttpCookie.parse("Set-Cookie:name=test;Max-Age=-1000"); |
| cookie = list.get(0); |
| assertEquals(-1000, cookie.getMaxAge()); |
| |
| // TODO: Uncomment when Long.parseLong() accepts numbers with a leading + |
| // list = HttpCookie.parse("Set-Cookie:name=test;max-age=+12345;"); |
| // cookie = list.get(0); |
| // assertEquals(12345, cookie.getMaxAge()); |
| |
| list = HttpCookie.parse("Set-Cookie:name=test;max-age=0;"); |
| cookie = list.get(0); |
| assertEquals(0, cookie.getMaxAge()); |
| |
| // Check portlist |
| list = HttpCookie.parse("Set-Cookie:name=tes,t;port"); |
| cookie = list.get(0); |
| assertEquals("", cookie.getPortlist()); |
| |
| list = HttpCookie.parse("Set-Cookie:name=tes,t;port="); |
| cookie = list.get(0); |
| assertEquals("", cookie.getPortlist()); |
| |
| list = HttpCookie.parse("Set-Cookie:name=tes,t;port=123 345"); |
| cookie = list.get(0); |
| assertEquals("123 345", cookie.getPortlist()); |
| |
| list = HttpCookie.parse("Set-Cookie:name=tes,t;port=123,345"); |
| cookie = list.get(0); |
| assertEquals("123,345", cookie.getPortlist()); |
| |
| // Check Secure |
| list = HttpCookie.parse("Set-Cookie:name=test;secure"); |
| cookie = list.get(0); |
| assertTrue(cookie.getSecure()); |
| |
| list = HttpCookie.parse("Set-Cookie:name=test;secure=fa"); |
| cookie = list.get(0); |
| assertTrue(cookie.getSecure()); |
| assertFalse(cookie.hasExpired()); |
| |
| list = HttpCookie.parse("Set-Cookie2:name=test;secure=false"); |
| cookie = list.get(0); |
| assertTrue(cookie.getSecure()); |
| |
| // Check expire |
| list = HttpCookie.parse("Set-Cookie:name=test;expires=2006-10-23"); |
| cookie = list.get(0); |
| assertEquals(0, cookie.getMaxAge()); |
| assertTrue(cookie.hasExpired()); |
| |
| // Also recognize invalid date |
| list = HttpCookie |
| .parse("Set-Cookie:name=test;expires=Sun, 29-Feb-1999 19:14:07 GMT"); |
| cookie = list.get(0); |
| assertTrue(cookie.getMaxAge() < 0); |
| assertTrue(cookie.hasExpired()); |
| |
| // Parse multiple cookies |
| list = HttpCookie |
| .parse("Set-Cookie2:name=test;,Set-Cookie2:name2=test2;comment=c234;"); |
| cookie = list.get(0); |
| assertEquals("name", cookie.getName()); |
| assertEquals(1, cookie.getVersion()); |
| assertEquals("test", cookie.getValue()); |
| cookie = list.get(1); |
| assertEquals(1, cookie.getVersion()); |
| // From the second cookie, the "set-cookie2" header does not take effect |
| assertEquals("Set-Cookie2:name2", cookie.getName()); |
| assertEquals("c234", cookie.getComment()); |
| |
| list = HttpCookie.parse("Set-Cookie2:name=test,name2=test2"); |
| assertEquals(1, list.get(0).getVersion()); |
| assertEquals(1, list.get(1).getVersion()); |
| |
| // Must begin with "set-cookie2" header |
| list = HttpCookie.parse("name=test,Set-Cookie2:name2=test2"); |
| cookie = list.get(0); |
| assertEquals(1, list.size()); |
| |
| HttpCookie c = HttpCookie.parse( |
| "Set-cookie:NAME2=VALUE2;path=/t;domain=.b.c;version=1").get(0); |
| assertEquals(1, c.getVersion()); |
| |
| c = HttpCookie.parse( |
| "Set-cookie2:NAME2=VALUE2;path=/t;domain=.b.c;version=0") |
| .get(0); |
| assertEquals(1, c.getVersion()); |
| |
| list = HttpCookie.parse("Set-cookie:null=;Domain=null;Port=null"); |
| cookie = list.get(0); |
| |
| assertNotNull(cookie.getValue()); |
| assertNotNull(cookie.getName()); |
| assertNotNull(cookie.getDomain()); |
| assertNotNull(cookie.getPortlist()); |
| |
| try { |
| list = HttpCookie |
| .parse("Set-Cookie:a name=tes,t;Commenturl;commentuRL=(la,la);path=hello"); |
| fail("IllegalArgumentException expected"); |
| } catch (IllegalArgumentException expected) { |
| } |
| |
| |
| list = HttpCookie |
| .parse("Set-Cookie:name=tes,t;Commenturl;commentuRL=(la,la);commentuRL=hello"); |
| cookie = list.get(0); |
| assertEquals("(la,la)", cookie.getCommentURL()); |
| |
| list = HttpCookie |
| .parse("Set-Cookie:name=tes,t;Commenturl;commentuRL=(la,la); path =hello"); |
| cookie = list.get(0); |
| assertEquals("(la,la)", cookie.getCommentURL()); |
| assertEquals("hello", cookie.getPath()); |
| |
| try { |
| list = HttpCookie |
| .parse("a Set-Cookie:name=tes,t;Commenturl;commentuRL=(la,la);path=hello"); |
| fail("IllegalArgumentException expected"); |
| } catch (IllegalArgumentException expected) { |
| } |
| } |
| |
| public void test_Parse_httpOnly() { |
| // Default is !httpOnly. |
| List<HttpCookie> list = HttpCookie.parse("Set-Cookie: SID=31d4d96e407aad42"); |
| HttpCookie cookie = list.get(0); |
| assertFalse(cookie.isHttpOnly()); |
| |
| // Well formed, simple. |
| list = HttpCookie.parse("Set-Cookie: SID=31d4d96e407aad42; HttpOnly"); |
| cookie = list.get(0); |
| assertTrue(cookie.isHttpOnly()); |
| |
| // Well formed, other attributes present. |
| list = HttpCookie.parse("Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly"); |
| cookie = list.get(0); |
| assertTrue(cookie.isHttpOnly()); |
| assertTrue(cookie.getSecure()); |
| assertEquals("/", cookie.getPath()); |
| |
| // Mangled spacing, casing and attributes that have an (ignored) value. |
| list = HttpCookie.parse("Set-Cookie:SID=31d4d96e407aad42;Path=/;secure=false;httponly=false"); |
| cookie = list.get(0); |
| assertTrue(cookie.isHttpOnly()); |
| assertTrue(cookie.getSecure()); |
| assertEquals("/", cookie.getPath()); |
| } |
| |
| /** |
| * java.net.HttpCookie#parse(String) for version conflict cases |
| * @since 1.6 |
| */ |
| public void test_Parse_versionConflict() { |
| // If attribute expires presents, cookie will be recognized as version |
| // 0. No matter header is Set-cookie or Set-cookie2 |
| List<HttpCookie> list = HttpCookie |
| .parse("Set-Cookie2:name=;expires=;discard"); |
| HttpCookie cookie = list.get(0); |
| assertEquals(0, cookie.getVersion()); |
| assertTrue(cookie.getDiscard()); |
| |
| list = HttpCookie.parse("Set-Cookie: name=value;port=80"); |
| cookie = list.get(0); |
| assertEquals(0, cookie.getVersion()); |
| assertEquals("80", cookie.getPortlist()); |
| |
| // In Set-Cookie header, max-age does not take effect when expires |
| // exists. |
| list = HttpCookie |
| .parse("Set-Cookie:name=test;expires=Tue, 27-Jan-1998 19:14:07 GMT;Max-Age=1000"); |
| cookie = list.get(0); |
| assertTrue(cookie.getMaxAge() < 0); |
| assertTrue(cookie.hasExpired()); |
| assertFalse(cookie.getDiscard()); |
| // Reverse sequence. max-age takes effect and decides the result of |
| // hasExpired() method. |
| list = HttpCookie |
| .parse("Set-Cookie:name=value;max-age=1000;expires=Tue, 17-Jan-1998 19:14:07 GMT;version=1"); |
| cookie = list.get(0); |
| assertEquals(0, cookie.getVersion()); |
| assertEquals(1000, cookie.getMaxAge()); |
| assertFalse(cookie.hasExpired()); |
| |
| // expires decides the version. Not take Set-cookie header, version into |
| // consideration if expires exists. |
| list = HttpCookie |
| .parse("Set-Cookie2:name=value;max-age=1000;version=1;expires=Tue, 17-Jan-1998 19:07:14 GMT;"); |
| cookie = list.get(0); |
| assertEquals(0, cookie.getVersion()); |
| assertEquals(1000, cookie.getMaxAge()); |
| assertFalse(cookie.hasExpired()); |
| |
| // expires does not cover other version 1 attributes. |
| list = HttpCookie |
| .parse("Set-Cookie2: name=value;expires=Sun, 27-Jan-2018 19:14:07 GMT;comment=mycomment;port=80,8080"); |
| cookie = list.get(0); |
| assertEquals(0, cookie.getVersion()); |
| assertEquals("80,8080", cookie.getPortlist()); |
| assertEquals("mycomment", cookie.getComment()); |
| |
| // When expires does not exist, version takes effect. |
| list = HttpCookie.parse("Set-Cookie:name=test;Version=1"); |
| cookie = list.get(0); |
| assertEquals(1, cookie.getVersion()); |
| assertEquals(-1, cookie.getMaxAge()); |
| list = HttpCookie.parse("Set-Cookie:name=test;vERsion=0;Version=1;versioN=0;vErsIon=1"); |
| cookie = list.get(0); |
| assertEquals(1, cookie.getVersion()); |
| |
| // When expires does not exist, max-age takes effect. |
| list = HttpCookie.parse("Set-Cookie:name=test;Max-Age=11"); |
| cookie = list.get(0); |
| assertEquals(1, cookie.getVersion()); |
| assertEquals(11, cookie.getMaxAge()); |
| // other version 1 attributes does not take effect |
| list = HttpCookie |
| .parse("Set-Cookie:name=test;comment=mycomment;commentURL=url;discard;domain=a.b.com;path=temp;port=79;secure"); |
| cookie = list.get(0); |
| assertEquals(0, cookie.getVersion()); |
| } |
| |
| /** |
| * java.net.HttpCookie#parse(String) on multiple threads |
| * Regression test for HARMONY-6307 |
| * @since 1.6 |
| */ |
| class ParseThread extends Thread { |
| public AssertionError error = null; |
| |
| public void run() { |
| try { |
| for (int i = 0; i < 200; i++) { |
| List<HttpCookie> list = HttpCookie.parse("Set-cookie:PREF=test;path=/;domain=.b.c;"); |
| assertEquals(1, list.size()); |
| HttpCookie cookie = list.get(0); |
| assertEquals(0, cookie.getVersion()); |
| assertEquals(".b.c", cookie.getDomain()); |
| } |
| } catch (AssertionError e) { |
| error = e; |
| } |
| } |
| } |
| |
| public void test_Parse_multipleThreads() throws InterruptedException { |
| ParseThread[] threads = new ParseThread[10]; |
| // create threads |
| for (int i = 0; i < threads.length; i++) { |
| threads[i] = new ParseThread(); |
| } |
| |
| // start threads |
| for (ParseThread thread : threads) { |
| thread.start(); |
| } |
| |
| // wait for threads to finish |
| for (ParseThread thread : threads) { |
| thread.join(); |
| } |
| |
| for (ParseThread thread : threads) { |
| if (thread.error != null) { |
| fail("Assertion thrown in thread " + thread + ": " + thread.error); |
| } |
| } |
| } |
| |
| private void checkValidValue(String header, String value) { |
| List<HttpCookie> list = HttpCookie |
| .parse(header + "name=" + value + ";"); |
| HttpCookie cookie = list.get(0); |
| assertEquals(value, cookie.getValue()); |
| } |
| |
| private void checkInvalidCookie(String header) { |
| try { |
| HttpCookie.parse(header); |
| fail("Should throw IllegalArgumentException"); |
| } catch (IllegalArgumentException e) { |
| // expected |
| } |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| // version 0 cookie only takes effect on Locale.ENGLISH |
| locale = Locale.getDefault(); |
| Locale.setDefault(Locale.ENGLISH); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| Locale.setDefault(locale); |
| super.tearDown(); |
| } |
| |
| } |