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
37 assert_equal "a", @rd.kgio_read(0x1000, a)
39 assert_equal "." * 0x1000, b
42 def test_read_shared_2
46 assert_equal "a", @rd.kgio_read(0x1000, b)
48 assert_equal "." * 0x1000, a
52 assert_equal "", @rd.kgio_tryread(0)
54 assert_equal buf.object_id, @rd.kgio_tryread(0, buf).object_id
58 def test_tryread_shared
62 assert_equal "a", @rd.kgio_tryread(0x1000, b)
64 assert_equal "." * 0x1000, a
67 def test_tryread_shared_2
71 assert_equal "a", @rd.kgio_tryread(0x1000, a)
73 assert_equal "." * 0x1000, b
78 assert_nil @rd.kgio_read(5)
81 def test_read_bang_eof
85 assert false, "should never get here (line:#{__LINE__})"
87 assert_equal [], e.backtrace
93 assert_nil @rd.kgio_tryread(5)
99 loop { @wr.kgio_write "HI" }
100 rescue Errno::EPIPE, Errno::ECONNRESET => e
101 assert_equal [], e.backtrace
104 assert false, "should never get here (line:#{__LINE__})"
107 def test_trywrite_closed
110 loop { @wr.kgio_trywrite "HI" }
111 rescue Errno::EPIPE, Errno::ECONNRESET => e
112 assert_equal [], e.backtrace
115 assert false, "should never get here (line:#{__LINE__})"
118 def test_trywrite_full
119 buf = "\302\251" * 1024 * 1024
121 dig = Digest::SHA1.new
126 dig.update(@rd.readpartial(4096, buf2))
137 rv = @wr.kgio_trywrite(wr)
142 assert false, "should never get here line=#{__LINE__}"
144 IO.select(nil, [ @wr ])
152 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
156 assert_equal nil, @wr.kgio_write(10)
157 assert_equal "10", @rd.kgio_read(2)
160 def test_trywrite_conv
161 assert_equal nil, @wr.kgio_trywrite(10)
162 assert_equal "10", @rd.kgio_tryread(2)
165 def test_tryread_empty
166 assert_equal :wait_readable, @rd.kgio_tryread(1)
169 def test_read_too_much
170 assert_equal nil, @wr.kgio_write("hi")
171 assert_equal "hi", @rd.kgio_read(4)
174 def test_tryread_too_much
175 assert_equal nil, @wr.kgio_trywrite("hi")
176 assert_equal "hi", @rd.kgio_tryread(4)
180 assert_equal nil, @wr.kgio_write("hi")
181 assert_equal "h", @rd.kgio_read(1)
182 assert_equal "i", @rd.kgio_read(1)
185 def test_tryread_short
186 assert_equal nil, @wr.kgio_trywrite("hi")
187 assert_equal "h", @rd.kgio_tryread(1)
188 assert_equal "i", @rd.kgio_tryread(1)
191 def test_read_extra_buf
193 tmp_object_id = tmp.object_id
194 assert_equal nil, @wr.kgio_write("hi")
195 rv = @rd.kgio_read(2, tmp)
196 assert_equal "hi", rv
197 assert_equal rv.object_id, tmp.object_id
198 assert_equal tmp_object_id, rv.object_id
201 def test_trywrite_return_wait_writable
203 tmp << @wr.kgio_trywrite("HI") until tmp[-1] == :wait_writable
204 assert :wait_writable === tmp[-1]
205 assert(!(:wait_readable === tmp[-1]))
206 assert_equal :wait_writable, tmp.pop
208 penultimate = tmp.pop
209 assert(penultimate == "I" || penultimate == nil)
211 tmp.each { |count| assert_equal nil, count }
214 def test_tryread_extra_buf_eagain_clears_buffer
216 rv = @rd.kgio_tryread(2, tmp)
217 assert_equal :wait_readable, rv
221 def test_tryread_extra_buf_eof_clears_buffer
224 assert_nil @rd.kgio_tryread(2, tmp)
228 def test_monster_trywrite
229 buf = RANDOM_BLOB.dup
230 rv = @wr.kgio_trywrite(buf)
231 assert_kind_of String, rv
232 assert rv.size < buf.size
234 assert_equal(buf, @rd.read(buf.size - rv.size) + rv)
237 def test_monster_write
238 buf = RANDOM_BLOB.dup
239 thr = Thread.new { @wr.kgio_write(buf) }
241 readed = @rd.read(buf.size)
244 assert_equal buf, readed
247 def test_monster_write_wait_writable
248 @wr.instance_variable_set :@nr, 0
249 def @wr.kgio_wait_writable
251 IO.select(nil, [self])
253 buf = "." * 1024 * 1024 * 10
254 thr = Thread.new { @wr.kgio_write(buf) }
255 readed = @rd.read(buf.size)
258 assert_equal buf, readed
259 assert @wr.instance_variable_get(:@nr) > 0
262 def test_wait_readable_ruby_default
266 thr = Thread.new { sleep 1; @wr.write "HELLO" }
267 assert_nothing_raised do
268 foo = @rd.kgio_read(5)
269 elapsed = Time.now - t0
271 assert elapsed >= 1.0, "elapsed: #{elapsed}"
272 assert_equal "HELLO", foo
274 assert_equal 5, thr.value
277 def test_wait_writable_ruby_default
281 nr += @wr.write_nonblock(buf)
288 thr = Thread.new { sleep 1; @rd.readpartial(nr) }
289 assert_nothing_raised do
290 foo = @wr.kgio_write("HELLO")
291 elapsed = Time.now - t0
295 assert elapsed >= 1.0, "elapsed: #{elapsed}"
297 assert(String === foo || foo == nil)
298 assert_kind_of String, thr.value
301 def test_wait_readable_method
302 def @rd.kgio_wait_readable
303 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
307 foo = @rd.kgio_read(5)
309 rescue RuntimeError => e
310 assert_equal("Hello", e.message)
312 assert_equal "HI", @rd.instance_variable_get(:@z)
316 def test_tryread_wait_readable_method
317 def @rd.kgio_wait_readable
320 assert_equal :wait_readable, @rd.kgio_tryread(5)
323 def test_trywrite_wait_readable_method
324 def @wr.kgio_wait_writable
329 10000.times { tmp << @wr.kgio_trywrite(buf) }
330 assert_equal :wait_writable, tmp.pop
333 def test_wait_writable_method
334 def @wr.kgio_wait_writable
335 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
339 loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
341 rescue RuntimeError => e
342 assert_equal("Hello", e.message)
345 assert_equal "HI", @wr.instance_variable_get(:@z)