8 class TestChunkedReader < Test::Unit::TestCase
15 @rd.sync = @wr.sync = true
20 return if $$ != @start_pid
31 cr = bin_reader("8\r\nasdfasdf\r\n8\r\nasdfasdfa#{'a' * 1024}")
33 assert_nothing_raised { a = cr.readpartial(8192) }
34 assert_equal 'asdfasdf', a
35 assert_nothing_raised { a = cr.readpartial(8192) }
36 assert_equal 'asdfasdf', a
37 assert_raises(Unicorn::HttpParserError) { cr.readpartial(8192) }
41 cr = bin_reader("0\r\n")
42 assert_raises(EOFError) { cr.readpartial(8192) }
46 cr = bin_reader("0\r\n\r\n")
47 assert_raises(EOFError) { cr.readpartial(8192) }
51 cr = bin_reader("4\r\nasdf\r\n0\r\n")
52 assert_equal 'asdf', cr.readpartial(8192)
53 assert_raises(EOFError) { cr.readpartial(8192) }
57 cr = bin_reader("6\r\nhello\n\r\n")
58 tmp = Tempfile.new('test_dd')
65 crd.sync = cwr.sync = true
71 exec('dd', 'if=/dev/urandom', 'bs=93390', 'count=16')
75 buf = crd.readpartial(16384)
77 @wr.write("#{'%x' % buf.size}\r\n#{buf}\r\n")
79 @wr.write("0\r\n\r\n")
84 assert_equal "hello\n", cr.readpartial(6)
85 sha1 = Digest::SHA1.new
88 cr.readpartial(16384, buf)
94 assert_nothing_raised { Process.waitpid(pid) }
95 sha1_file = Digest::SHA1.new
96 File.open(tmp.path, 'rb') { |fp|
97 while fp.read(16384, buf)
101 assert_equal sha1_file.hexdigest, sha1.hexdigest
105 @env['HTTP_TRAILER'] = 'Content-MD5'
106 pid = fork { @wr.syswrite("Content-MD5: asdf\r\n") }
107 cr = bin_reader("8\r\nasdfasdf\r\n8\r\nasdfasdf\r\n0\r\n")
108 assert_equal 'asdfasdf', cr.readpartial(4096)
109 assert_equal 'asdfasdf', cr.readpartial(4096)
110 assert_raises(EOFError) { cr.readpartial(4096) }
111 pid, status = Process.waitpid2(pid)
112 assert status.success?
113 assert_equal 'asdf', @env['HTTP_CONTENT_MD5']
119 buf.force_encoding(Encoding::BINARY) if buf.respond_to?(:force_encoding)
120 Unicorn::ChunkedReader.new(@env, @rd, buf)