tests: remove assert_nothing_raised (part 2)
[unicorn.git] / test / unit / test_stream_input.rb
blob1a07ec3ae24a2cbeb22b8b7f5d9e84ff5f774e9a
1 # -*- encoding: binary -*-
3 require 'test/unit'
4 require 'digest/sha1'
5 require 'unicorn'
7 class TestStreamInput < Test::Unit::TestCase
8   def setup
9     @rs = $/
10     @env = {}
11     @rd, @wr = Kgio::UNIXSocket.pair
12     @rd.sync = @wr.sync = true
13     @start_pid = $$
14   end
16   def teardown
17     return if $$ != @start_pid
18     $/ = @rs
19     @rd.close rescue nil
20     @wr.close rescue nil
21     Process.waitall
22   end
24   def test_read_negative
25     r = init_request('hello')
26     si = Unicorn::StreamInput.new(@rd, r)
27     assert_raises(ArgumentError) { si.read(-1) }
28     assert_equal 'hello', si.read
29   end
31   def test_read_small
32     r = init_request('hello')
33     si = Unicorn::StreamInput.new(@rd, r)
34     assert_equal 'hello', si.read
35     assert_equal '', si.read
36     assert_nil si.read(5)
37     assert_nil si.gets
38   end
40   def test_gets_oneliner
41     r = init_request('hello')
42     si = Unicorn::StreamInput.new(@rd, r)
43     assert_equal 'hello', si.gets
44     assert_nil si.gets
45   end
47   def test_gets_multiline
48     r = init_request("a\nb\n\n")
49     si = Unicorn::StreamInput.new(@rd, r)
50     assert_equal "a\n", si.gets
51     assert_equal "b\n", si.gets
52     assert_equal "\n", si.gets
53     assert_nil si.gets
54   end
56   def test_gets_empty_rs
57     $/ = nil
58     r = init_request("a\nb\n\n")
59     si = Unicorn::StreamInput.new(@rd, r)
60     assert_equal "a\nb\n\n", si.gets
61     assert_nil si.gets
62   end
64   def test_read_with_equal_len
65     r = init_request("abcde")
66     si = Unicorn::StreamInput.new(@rd, r)
67     assert_equal "abcde", si.read(5)
68     assert_nil si.read(5)
69   end
71   def test_big_body_multi
72     r = init_request('.', Unicorn::Const::MAX_BODY + 1)
73     si = Unicorn::StreamInput.new(@rd, r)
74     assert_equal Unicorn::Const::MAX_BODY, @parser.content_length
75     assert ! @parser.body_eof?
76     nr = Unicorn::Const::MAX_BODY / 4
77     pid = fork {
78       @rd.close
79       nr.times { @wr.write('....') }
80       @wr.close
81     }
82     @wr.close
83     assert_equal '.', si.read(1)
84     nr.times { |x|
85       assert_equal '....', si.read(4), "nr=#{x}"
86     }
87     assert_nil si.read(1)
88     pid, status = Process.waitpid2(pid)
89     assert status.success?
90   end
92   def test_gets_long
93     r = init_request("hello", 5 + (4096 * 4 * 3) + "#$/foo#$/".size)
94     si = Unicorn::StreamInput.new(@rd, r)
95     status = line = nil
96     pid = fork {
97       @rd.close
98       3.times { @wr.write("ffff" * 4096) }
99       @wr.write "#$/foo#$/"
100       @wr.close
101     }
102     @wr.close
103     line = si.gets
104     assert_equal(4096 * 4 * 3 + 5 + $/.size, line.size)
105     assert_equal("hello" << ("ffff" * 4096 * 3) << "#$/", line)
106     line = si.gets
107     assert_equal "foo#$/", line
108     assert_nil si.gets
109     pid, status = Process.waitpid2(pid)
110     assert status.success?
111   end
113   def test_read_with_buffer
114     r = init_request('hello')
115     si = Unicorn::StreamInput.new(@rd, r)
116     buf = ''
117     rv = si.read(4, buf)
118     assert_equal 'hell', rv
119     assert_equal 'hell', buf
120     assert_equal rv.object_id, buf.object_id
121     assert_equal 'o', si.read
122     assert_equal nil, si.read(5, buf)
123   end
125   def test_read_with_buffer_clobbers
126     r = init_request('hello')
127     si = Unicorn::StreamInput.new(@rd, r)
128     buf = 'foo'
129     assert_equal 'hello', si.read(nil, buf)
130     assert_equal 'hello', buf
131     assert_equal '', si.read(nil, buf)
132     assert_equal '', buf
133     buf = 'asdf'
134     assert_nil si.read(5, buf)
135     assert_equal '', buf
136   end
138   def test_read_zero
139     r = init_request('hello')
140     si = Unicorn::StreamInput.new(@rd, r)
141     assert_equal '', si.read(0)
142     buf = 'asdf'
143     rv = si.read(0, buf)
144     assert_equal rv.object_id, buf.object_id
145     assert_equal '', buf
146     assert_equal 'hello', si.read
147     assert_nil si.read(5)
148     assert_equal '', si.read(0)
149     buf = 'hello'
150     rv = si.read(0, buf)
151     assert_equal rv.object_id, buf.object_id
152     assert_equal '', rv
153   end
155   def test_gets_read_mix
156     r = init_request("hello\nasdfasdf")
157     si = Unicorn::StreamInput.new(@rd, r)
158     assert_equal "hello\n", si.gets
159     assert_equal "asdfasdf", si.read(9)
160     assert_nil si.read(9)
161   end
163   def test_gets_read_mix_chunked
164     r = @parser = Unicorn::HttpParser.new
165     body = "6\r\nhello"
166     @buf = "POST / HTTP/1.1\r\n" \
167            "Host: localhost\r\n" \
168            "Transfer-Encoding: chunked\r\n" \
169            "\r\n#{body}"
170     assert_equal @env, @parser.headers(@env, @buf)
171     assert_equal body, @buf
172     si = Unicorn::StreamInput.new(@rd, r)
173     @wr.syswrite "\n\r\n"
174     assert_equal "hello\n", si.gets
175     @wr.syswrite "8\r\nasdfasdf\r\n"
176     assert_equal"asdfasdf", si.read(9) + si.read(9)
177     @wr.syswrite "0\r\n\r\n"
178     assert_nil si.read(9)
179   end
181   def test_gets_read_mix_big
182     r = init_request("hello\n#{'.' * 65536}")
183     si = Unicorn::StreamInput.new(@rd, r)
184     assert_equal "hello\n", si.gets
185     assert_equal '.' * 16384, si.read(16384)
186     assert_equal '.' * 16383, si.read(16383)
187     assert_equal '.' * 16384, si.read(16384)
188     assert_equal '.' * 16385, si.read(16385)
189     assert_nil si.gets
190   end
192   def init_request(body, size = nil)
193     @parser = Unicorn::HttpParser.new
194     body = body.to_s.freeze
195     @buf = "POST / HTTP/1.1\r\n" \
196            "Host: localhost\r\n" \
197            "Content-Length: #{size || body.size}\r\n" \
198            "\r\n#{body}"
199     assert_equal @env, @parser.headers(@env, @buf)
200     assert_equal body, @buf
201     @parser
202   end