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