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