1 # -*- encoding: binary -*-
8 module LibReadWriteTest
9 RANDOM_BLOB = File.open("/dev/urandom") { |fp| fp.read(10 * 1024 * 1024) }
12 assert_nothing_raised do
13 @rd.close if defined?(@rd) && ! @rd.closed?
14 @wr.close if defined?(@wr) && ! @wr.closed?
19 assert_nil @wr.kgio_write("")
22 def test_trywrite_empty
23 assert_nil @wr.kgio_trywrite("")
27 assert_equal "", @rd.kgio_read(0)
29 assert_equal buf.object_id, @rd.kgio_read(0, buf).object_id
34 assert_equal "", @rd.kgio_tryread(0)
36 assert_equal buf.object_id, @rd.kgio_tryread(0, buf).object_id
42 assert_nil @rd.kgio_read(5)
45 def test_read_bang_eof
49 assert false, "should never get here (line:#{__LINE__})"
51 assert_equal [], e.backtrace
57 assert_nil @rd.kgio_tryread(5)
63 loop { @wr.kgio_write "HI" }
64 rescue Errno::EPIPE, Errno::ECONNRESET => e
65 assert_equal [], e.backtrace
68 assert false, "should never get here (line:#{__LINE__})"
71 def test_trywrite_closed
74 loop { @wr.kgio_trywrite "HI" }
75 rescue Errno::EPIPE, Errno::ECONNRESET => e
76 assert_equal [], e.backtrace
79 assert false, "should never get here (line:#{__LINE__})"
82 def test_trywrite_full
83 buf = "\302\251" * 1024 * 1024
85 dig = Digest::SHA1.new
90 dig.update(@rd.readpartial(4096, buf2))
101 rv = @wr.kgio_trywrite(wr)
106 assert false, "should never get here line=#{__LINE__}"
108 IO.select(nil, [ @wr ])
116 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
120 assert_equal nil, @wr.kgio_write(10)
121 assert_equal "10", @rd.kgio_read(2)
124 def test_trywrite_conv
125 assert_equal nil, @wr.kgio_trywrite(10)
126 assert_equal "10", @rd.kgio_tryread(2)
129 def test_tryread_empty
130 assert_equal :wait_readable, @rd.kgio_tryread(1)
133 def test_read_too_much
134 assert_equal nil, @wr.kgio_write("hi")
135 assert_equal "hi", @rd.kgio_read(4)
138 def test_tryread_too_much
139 assert_equal nil, @wr.kgio_trywrite("hi")
140 assert_equal "hi", @rd.kgio_tryread(4)
144 assert_equal nil, @wr.kgio_write("hi")
145 assert_equal "h", @rd.kgio_read(1)
146 assert_equal "i", @rd.kgio_read(1)
149 def test_tryread_short
150 assert_equal nil, @wr.kgio_trywrite("hi")
151 assert_equal "h", @rd.kgio_tryread(1)
152 assert_equal "i", @rd.kgio_tryread(1)
155 def test_read_extra_buf
157 tmp_object_id = tmp.object_id
158 assert_equal nil, @wr.kgio_write("hi")
159 rv = @rd.kgio_read(2, tmp)
160 assert_equal "hi", rv
161 assert_equal rv.object_id, tmp.object_id
162 assert_equal tmp_object_id, rv.object_id
165 def test_trywrite_return_wait_writable
167 tmp << @wr.kgio_trywrite("HI") until tmp[-1] == :wait_writable
168 assert :wait_writable === tmp[-1]
169 assert(!(:wait_readable === tmp[-1]))
170 assert_equal :wait_writable, tmp.pop
172 penultimate = tmp.pop
173 assert(penultimate == "I" || penultimate == nil)
175 tmp.each { |count| assert_equal nil, count }
178 def test_tryread_extra_buf_eagain_clears_buffer
180 rv = @rd.kgio_tryread(2, tmp)
181 assert_equal :wait_readable, rv
185 def test_tryread_extra_buf_eof_clears_buffer
188 assert_nil @rd.kgio_tryread(2, tmp)
192 def test_monster_trywrite
193 buf = RANDOM_BLOB.dup
194 rv = @wr.kgio_trywrite(buf)
195 assert_kind_of String, rv
196 assert rv.size < buf.size
198 assert_equal(buf, @rd.read(buf.size - rv.size) + rv)
201 def test_monster_write
202 buf = RANDOM_BLOB.dup
203 thr = Thread.new { @wr.kgio_write(buf) }
205 readed = @rd.read(buf.size)
208 assert_equal buf, readed
211 def test_monster_write_wait_writable
212 @wr.instance_variable_set :@nr, 0
213 def @wr.kgio_wait_writable
215 IO.select(nil, [self])
217 buf = "." * 1024 * 1024 * 10
218 thr = Thread.new { @wr.kgio_write(buf) }
219 readed = @rd.read(buf.size)
222 assert_equal buf, readed
223 assert @wr.instance_variable_get(:@nr) > 0
226 def test_wait_readable_ruby_default
230 thr = Thread.new { sleep 1; @wr.write "HELLO" }
231 assert_nothing_raised do
232 foo = @rd.kgio_read(5)
233 elapsed = Time.now - t0
235 assert elapsed >= 1.0, "elapsed: #{elapsed}"
236 assert_equal "HELLO", foo
238 assert_equal 5, thr.value
241 def test_wait_writable_ruby_default
245 nr += @wr.write_nonblock(buf)
252 thr = Thread.new { sleep 1; @rd.readpartial(nr) }
253 assert_nothing_raised do
254 foo = @wr.kgio_write("HELLO")
255 elapsed = Time.now - t0
259 assert elapsed >= 1.0, "elapsed: #{elapsed}"
261 assert(String === foo || foo == nil)
262 assert_kind_of String, thr.value
265 def test_wait_readable_method
266 def @rd.kgio_wait_readable
267 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
271 foo = @rd.kgio_read(5)
273 rescue RuntimeError => e
274 assert_equal("Hello", e.message)
276 assert_equal "HI", @rd.instance_variable_get(:@z)
280 def test_tryread_wait_readable_method
281 def @rd.kgio_wait_readable
284 assert_equal :wait_readable, @rd.kgio_tryread(5)
287 def test_trywrite_wait_readable_method
288 def @wr.kgio_wait_writable
293 10000.times { tmp << @wr.kgio_trywrite(buf) }
294 assert_equal :wait_writable, tmp.pop
297 def test_wait_writable_method
298 def @wr.kgio_wait_writable
299 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
303 loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
305 rescue RuntimeError => e
306 assert_equal("Hello", e.message)
309 assert_equal "HI", @wr.instance_variable_get(:@z)