1require 'net/http' 2require 'test/unit' 3 4class HTTPHeaderTest < Test::Unit::TestCase 5 6 class C 7 include Net::HTTPHeader 8 def initialize 9 initialize_http_header({}) 10 end 11 attr_accessor :body 12 end 13 14 def setup 15 @c = C.new 16 end 17 18 def test_size 19 assert_equal 0, @c.size 20 @c['a'] = 'a' 21 assert_equal 1, @c.size 22 @c['b'] = 'b' 23 assert_equal 2, @c.size 24 @c['b'] = 'b' 25 assert_equal 2, @c.size 26 @c['c'] = 'c' 27 assert_equal 3, @c.size 28 end 29 30 def test_ASET 31 @c['My-Header'] = 'test string' 32 @c['my-Header'] = 'test string' 33 @c['My-header'] = 'test string' 34 @c['my-header'] = 'test string' 35 @c['MY-HEADER'] = 'test string' 36 assert_equal 1, @c.size 37 38 @c['AaA'] = 'aaa' 39 @c['aaA'] = 'aaa' 40 @c['AAa'] = 'aaa' 41 assert_equal 2, @c.length 42 end 43 44 def test_AREF 45 @c['My-Header'] = 'test string' 46 assert_equal 'test string', @c['my-header'] 47 assert_equal 'test string', @c['MY-header'] 48 assert_equal 'test string', @c['my-HEADER'] 49 50 @c['Next-Header'] = 'next string' 51 assert_equal 'next string', @c['next-header'] 52 end 53 54 def test_add_field 55 @c.add_field 'My-Header', 'a' 56 assert_equal 'a', @c['My-Header'] 57 assert_equal ['a'], @c.get_fields('My-Header') 58 @c.add_field 'My-Header', 'b' 59 assert_equal 'a, b', @c['My-Header'] 60 assert_equal ['a', 'b'], @c.get_fields('My-Header') 61 @c.add_field 'My-Header', 'c' 62 assert_equal 'a, b, c', @c['My-Header'] 63 assert_equal ['a', 'b', 'c'], @c.get_fields('My-Header') 64 @c.add_field 'My-Header', 'd, d' 65 assert_equal 'a, b, c, d, d', @c['My-Header'] 66 assert_equal ['a', 'b', 'c', 'd, d'], @c.get_fields('My-Header') 67 end 68 69 def test_get_fields 70 @c['My-Header'] = 'test string' 71 assert_equal ['test string'], @c.get_fields('my-header') 72 assert_equal ['test string'], @c.get_fields('My-header') 73 assert_equal ['test string'], @c.get_fields('my-Header') 74 75 assert_nil @c.get_fields('not-found') 76 assert_nil @c.get_fields('Not-Found') 77 78 @c.get_fields('my-header').push 'junk' 79 assert_equal ['test string'], @c.get_fields('my-header') 80 @c.get_fields('my-header').clear 81 assert_equal ['test string'], @c.get_fields('my-header') 82 end 83 84 def test_delete 85 @c['My-Header'] = 'test' 86 assert_equal 'test', @c['My-Header'] 87 assert_nil @c['not-found'] 88 @c.delete 'My-Header' 89 assert_nil @c['My-Header'] 90 assert_nil @c['not-found'] 91 @c.delete 'My-Header' 92 @c.delete 'My-Header' 93 assert_nil @c['My-Header'] 94 assert_nil @c['not-found'] 95 end 96 97 def test_each 98 @c['My-Header'] = 'test' 99 @c.each do |k, v| 100 assert_equal 'my-header', k 101 assert_equal 'test', v 102 end 103 @c.each do |k, v| 104 assert_equal 'my-header', k 105 assert_equal 'test', v 106 end 107 end 108 109 def test_each_key 110 @c['My-Header'] = 'test' 111 @c.each_key do |k| 112 assert_equal 'my-header', k 113 end 114 @c.each_key do |k| 115 assert_equal 'my-header', k 116 end 117 end 118 119 def test_each_value 120 @c['My-Header'] = 'test' 121 @c.each_value do |v| 122 assert_equal 'test', v 123 end 124 @c.each_value do |v| 125 assert_equal 'test', v 126 end 127 end 128 129 def test_canonical_each 130 @c['my-header'] = ['a', 'b'] 131 @c.canonical_each do |k,v| 132 assert_equal 'My-Header', k 133 assert_equal 'a, b', v 134 end 135 end 136 137 def test_each_capitalized 138 @c['my-header'] = ['a', 'b'] 139 @c.each_capitalized do |k,v| 140 assert_equal 'My-Header', k 141 assert_equal 'a, b', v 142 end 143 end 144 145 def test_key? 146 @c['My-Header'] = 'test' 147 assert_equal true, @c.key?('My-Header') 148 assert_equal true, @c.key?('my-header') 149 assert_equal false, @c.key?('Not-Found') 150 assert_equal false, @c.key?('not-found') 151 assert_equal false, @c.key?('') 152 assert_equal false, @c.key?('x' * 1024) 153 end 154 155 def test_to_hash 156 end 157 158 def test_range 159 try_range([1..5], '1-5') 160 try_invalid_range('5-1') 161 try_range([234..567], '234-567') 162 try_range([-5..-1], '-5') 163 try_invalid_range('-0') 164 try_range([1..-1], '1-') 165 try_range([0..0,-1..-1], '0-0,-1') 166 try_range([1..2, 3..4], '1-2,3-4') 167 try_range([1..2, 3..4], '1-2 , 3-4') 168 try_range([1..2, 1..4], '1-2,1-4') 169 170 try_invalid_range('invalid') 171 try_invalid_range(' 12-') 172 try_invalid_range('12- ') 173 try_invalid_range('123-abc') 174 try_invalid_range('abc-123') 175 end 176 177 def try_range(r, s) 178 @c['range'] = "bytes=#{s}" 179 assert_equal r, @c.range 180 end 181 182 def try_invalid_range(s) 183 @c['range'] = "bytes=#{s}" 184 assert_raise(Net::HTTPHeaderSyntaxError, s){ @c.range } 185 end 186 187 def test_range= 188 @c.range = 0..499 189 assert_equal 'bytes=0-499', @c['range'] 190 @c.range = 0...500 191 assert_equal 'bytes=0-499', @c['range'] 192 @c.range = 300 193 assert_equal 'bytes=0-299', @c['range'] 194 @c.range = -400 195 assert_equal 'bytes=-400', @c['range'] 196 @c.set_range 0, 500 197 assert_equal 'bytes=0-499', @c['range'] 198 end 199 200 def test_content_range 201 end 202 203 def test_range_length 204 @c['Content-Range'] = "bytes 0-499/1000" 205 assert_equal 500, @c.range_length 206 @c['Content-Range'] = "bytes 1-500/1000" 207 assert_equal 500, @c.range_length 208 @c['Content-Range'] = "bytes 1-1/1000" 209 assert_equal 1, @c.range_length 210 end 211 212 def test_chunked? 213 try_chunked true, 'chunked' 214 try_chunked true, ' chunked ' 215 try_chunked true, '(OK)chunked' 216 217 try_chunked false, 'not-chunked' 218 try_chunked false, 'chunked-but-not-chunked' 219 end 220 221 def try_chunked(bool, str) 222 @c['transfer-encoding'] = str 223 assert_equal bool, @c.chunked? 224 end 225 226 def test_content_length 227 @c.delete('content-length') 228 assert_nil @c['content-length'] 229 230 try_content_length 500, '500' 231 try_content_length 10000_0000_0000, '1000000000000' 232 try_content_length 123, ' 123' 233 try_content_length 1, '1 23' 234 try_content_length 500, '(OK)500' 235 assert_raise(Net::HTTPHeaderSyntaxError, 'here is no digit, but') { 236 @c['content-length'] = 'no digit' 237 @c.content_length 238 } 239 end 240 241 def try_content_length(len, str) 242 @c['content-length'] = str 243 assert_equal len, @c.content_length 244 end 245 246 def test_content_length= 247 @c.content_length = 0 248 assert_equal 0, @c.content_length 249 @c.content_length = 1 250 assert_equal 1, @c.content_length 251 @c.content_length = 999 252 assert_equal 999, @c.content_length 253 @c.content_length = 10000000000000 254 assert_equal 10000000000000, @c.content_length 255 end 256 257 def test_content_type 258 assert_nil @c.content_type 259 @c.content_type = 'text/html' 260 assert_equal 'text/html', @c.content_type 261 @c.content_type = 'application/pdf' 262 assert_equal 'application/pdf', @c.content_type 263 @c.set_content_type 'text/html', {'charset' => 'iso-2022-jp'} 264 assert_equal 'text/html', @c.content_type 265 @c.content_type = 'text' 266 assert_equal 'text', @c.content_type 267 end 268 269 def test_main_type 270 assert_nil @c.main_type 271 @c.content_type = 'text/html' 272 assert_equal 'text', @c.main_type 273 @c.content_type = 'application/pdf' 274 assert_equal 'application', @c.main_type 275 @c.set_content_type 'text/html', {'charset' => 'iso-2022-jp'} 276 assert_equal 'text', @c.main_type 277 @c.content_type = 'text' 278 assert_equal 'text', @c.main_type 279 end 280 281 def test_sub_type 282 assert_nil @c.sub_type 283 @c.content_type = 'text/html' 284 assert_equal 'html', @c.sub_type 285 @c.content_type = 'application/pdf' 286 assert_equal 'pdf', @c.sub_type 287 @c.set_content_type 'text/html', {'charset' => 'iso-2022-jp'} 288 assert_equal 'html', @c.sub_type 289 @c.content_type = 'text' 290 assert_nil @c.sub_type 291 end 292 293 def test_type_params 294 assert_equal({}, @c.type_params) 295 @c.content_type = 'text/html' 296 assert_equal({}, @c.type_params) 297 @c.content_type = 'application/pdf' 298 assert_equal({}, @c.type_params) 299 @c.set_content_type 'text/html', {'charset' => 'iso-2022-jp'} 300 assert_equal({'charset' => 'iso-2022-jp'}, @c.type_params) 301 @c.content_type = 'text' 302 assert_equal({}, @c.type_params) 303 end 304 305 def test_set_content_type 306 end 307 308 def test_form_data= 309 @c.form_data = {"cmd"=>"search", "q"=>"ruby", "max"=>"50"} 310 assert_equal 'application/x-www-form-urlencoded', @c.content_type 311 assert_equal %w( cmd=search max=50 q=ruby ), @c.body.split('&').sort 312 end 313 314 def test_set_form_data 315 @c.set_form_data "cmd"=>"search", "q"=>"ruby", "max"=>"50" 316 assert_equal 'application/x-www-form-urlencoded', @c.content_type 317 assert_equal %w( cmd=search max=50 q=ruby ), @c.body.split('&').sort 318 319 @c.set_form_data "cmd"=>"search", "q"=>"ruby", "max"=>50 320 assert_equal 'application/x-www-form-urlencoded', @c.content_type 321 assert_equal %w( cmd=search max=50 q=ruby ), @c.body.split('&').sort 322 323 @c.set_form_data({"cmd"=>"search", "q"=>"ruby", "max"=>"50"}, ';') 324 assert_equal 'application/x-www-form-urlencoded', @c.content_type 325 assert_equal %w( cmd=search max=50 q=ruby ), @c.body.split(';').sort 326 end 327 328 def test_basic_auth 329 end 330 331 def test_proxy_basic_auth 332 end 333 334end 335