1require "test/unit"
2require "webrick/cookie"
3
4class TestWEBrickCookie < Test::Unit::TestCase
5  def test_new
6    cookie = WEBrick::Cookie.new("foo","bar")
7    assert_equal("foo", cookie.name)
8    assert_equal("bar", cookie.value)
9    assert_equal("foo=bar", cookie.to_s)
10  end
11
12  def test_time
13    cookie = WEBrick::Cookie.new("foo","bar")
14    t = 1000000000
15    cookie.max_age = t
16    assert_match(t.to_s, cookie.to_s)
17
18    cookie = WEBrick::Cookie.new("foo","bar")
19    t = Time.at(1000000000)
20    cookie.expires = t
21    assert_equal(Time, cookie.expires.class)
22    assert_equal(t, cookie.expires)
23    ts = t.httpdate
24    cookie.expires = ts
25    assert_equal(Time, cookie.expires.class)
26    assert_equal(t, cookie.expires)
27    assert_match(ts, cookie.to_s)
28  end
29
30  def test_parse
31    data = ""
32    data << '$Version="1"; '
33    data << 'Customer="WILE_E_COYOTE"; $Path="/acme"; '
34    data << 'Part_Number="Rocket_Launcher_0001"; $Path="/acme"; '
35    data << 'Shipping="FedEx"; $Path="/acme"'
36    cookies = WEBrick::Cookie.parse(data)
37    assert_equal(3, cookies.size)
38    assert_equal(1, cookies[0].version)
39    assert_equal("Customer", cookies[0].name)
40    assert_equal("WILE_E_COYOTE", cookies[0].value)
41    assert_equal("/acme", cookies[0].path)
42    assert_equal(1, cookies[1].version)
43    assert_equal("Part_Number", cookies[1].name)
44    assert_equal("Rocket_Launcher_0001", cookies[1].value)
45    assert_equal(1, cookies[2].version)
46    assert_equal("Shipping", cookies[2].name)
47    assert_equal("FedEx", cookies[2].value)
48
49    data = "hoge=moge; __div__session=9865ecfd514be7f7"
50    cookies = WEBrick::Cookie.parse(data)
51    assert_equal(0, cookies[0].version)
52    assert_equal("hoge", cookies[0].name)
53    assert_equal("moge", cookies[0].value)
54    assert_equal("__div__session", cookies[1].name)
55    assert_equal("9865ecfd514be7f7", cookies[1].value)
56  end
57
58  def test_parse_no_whitespace
59    data = [
60      '$Version="1"; ',
61      'Customer="WILE_E_COYOTE";$Path="/acme";', # no SP between cookie-string
62      'Part_Number="Rocket_Launcher_0001";$Path="/acme";', # no SP between cookie-string
63      'Shipping="FedEx";$Path="/acme"'
64    ].join
65    cookies = WEBrick::Cookie.parse(data)
66    assert_equal(1, cookies.size)
67  end
68
69  def test_parse_too_much_whitespaces
70    # According to RFC6265,
71    #   cookie-string = cookie-pair *( ";" SP cookie-pair )
72    # So single 0x20 is needed after ';'. We allow multiple spaces here for
73    # compatibility with older WEBrick versions.
74    data = [
75      '$Version="1"; ',
76      'Customer="WILE_E_COYOTE";$Path="/acme";     ', # no SP between cookie-string
77      'Part_Number="Rocket_Launcher_0001";$Path="/acme";     ', # no SP between cookie-string
78      'Shipping="FedEx";$Path="/acme"'
79    ].join
80    cookies = WEBrick::Cookie.parse(data)
81    assert_equal(3, cookies.size)
82  end
83
84  def test_parse_set_cookie
85    data = %(Customer="WILE_E_COYOTE"; Version="1"; Path="/acme")
86    cookie = WEBrick::Cookie.parse_set_cookie(data)
87    assert_equal("Customer", cookie.name)
88    assert_equal("WILE_E_COYOTE", cookie.value)
89    assert_equal(1, cookie.version)
90    assert_equal("/acme", cookie.path)
91
92    data = %(Shipping="FedEx"; Version="1"; Path="/acme"; Secure)
93    cookie = WEBrick::Cookie.parse_set_cookie(data)
94    assert_equal("Shipping", cookie.name)
95    assert_equal("FedEx", cookie.value)
96    assert_equal(1, cookie.version)
97    assert_equal("/acme", cookie.path)
98    assert_equal(true, cookie.secure)
99  end
100
101  def test_parse_set_cookies
102    data = %(Shipping="FedEx"; Version="1"; Path="/acme"; Secure)
103    data << %(, CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT; path=/; Secure)
104    data << %(, name="Aaron"; Version="1"; path="/acme")
105    cookies = WEBrick::Cookie.parse_set_cookies(data)
106    assert_equal(3, cookies.length)
107
108    fed_ex = cookies.find { |c| c.name == 'Shipping' }
109    assert_not_nil(fed_ex)
110    assert_equal("Shipping", fed_ex.name)
111    assert_equal("FedEx", fed_ex.value)
112    assert_equal(1, fed_ex.version)
113    assert_equal("/acme", fed_ex.path)
114    assert_equal(true, fed_ex.secure)
115
116    name = cookies.find { |c| c.name == 'name' }
117    assert_not_nil(name)
118    assert_equal("name", name.name)
119    assert_equal("Aaron", name.value)
120    assert_equal(1, name.version)
121    assert_equal("/acme", name.path)
122
123    customer = cookies.find { |c| c.name == 'CUSTOMER' }
124    assert_not_nil(customer)
125    assert_equal("CUSTOMER", customer.name)
126    assert_equal("WILE_E_COYOTE", customer.value)
127    assert_equal(0, customer.version)
128    assert_equal("/", customer.path)
129    assert_equal(Time.utc(1999, 11, 9, 23, 12, 40), customer.expires)
130  end
131end
132