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 unless @rd.closed?
14 @wr.close unless @wr.closed?
19 assert_equal "", @rd.kgio_read(0)
21 assert_equal buf.object_id, @rd.kgio_read(0, buf).object_id
26 assert_equal "", @rd.kgio_tryread(0)
28 assert_equal buf.object_id, @rd.kgio_tryread(0, buf).object_id
34 assert_nil @rd.kgio_read(5)
37 def test_read_bang_eof
41 assert false, "should never get here (line:#{__LINE__})"
43 assert_equal [], e.backtrace
49 assert_nil @rd.kgio_tryread(5)
55 loop { @wr.kgio_write "HI" }
56 rescue Errno::EPIPE, Errno::ECONNRESET => e
57 assert_equal [], e.backtrace
60 assert false, "should never get here (line:#{__LINE__})"
63 def test_trywrite_closed
66 loop { @wr.kgio_trywrite "HI" }
67 rescue Errno::EPIPE, Errno::ECONNRESET => e
68 assert_equal [], e.backtrace
71 assert false, "should never get here (line:#{__LINE__})"
74 def test_trywrite_full
75 buf = "\302\251" * 1024 * 1024
77 dig = Digest::SHA1.new
82 dig.update(@rd.readpartial(4096, buf2))
93 rv = @wr.kgio_trywrite(wr)
98 assert false, "should never get here line=#{__LINE__}"
100 IO.select(nil, [ @wr ])
108 assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
112 assert_equal nil, @wr.kgio_write(10)
113 assert_equal "10", @rd.kgio_read(2)
116 def test_trywrite_conv
117 assert_equal nil, @wr.kgio_trywrite(10)
118 assert_equal "10", @rd.kgio_tryread(2)
121 def test_tryread_empty
122 assert_equal :wait_readable, @rd.kgio_tryread(1)
125 def test_read_too_much
126 assert_equal nil, @wr.kgio_write("hi")
127 assert_equal "hi", @rd.kgio_read(4)
130 def test_tryread_too_much
131 assert_equal nil, @wr.kgio_trywrite("hi")
132 assert_equal "hi", @rd.kgio_tryread(4)
136 assert_equal nil, @wr.kgio_write("hi")
137 assert_equal "h", @rd.kgio_read(1)
138 assert_equal "i", @rd.kgio_read(1)
141 def test_tryread_short
142 assert_equal nil, @wr.kgio_trywrite("hi")
143 assert_equal "h", @rd.kgio_tryread(1)
144 assert_equal "i", @rd.kgio_tryread(1)
147 def test_read_extra_buf
149 tmp_object_id = tmp.object_id
150 assert_equal nil, @wr.kgio_write("hi")
151 rv = @rd.kgio_read(2, tmp)
152 assert_equal "hi", rv
153 assert_equal rv.object_id, tmp.object_id
154 assert_equal tmp_object_id, rv.object_id
157 def test_trywrite_return_wait_writable
159 tmp << @wr.kgio_trywrite("HI") until tmp[-1] == :wait_writable
160 assert :wait_writable === tmp[-1]
161 assert(!(:wait_readable === tmp[-1]))
162 assert_equal :wait_writable, tmp.pop
164 penultimate = tmp.pop
165 assert(penultimate == "I" || penultimate == nil)
167 tmp.each { |count| assert_equal nil, count }
170 def test_tryread_extra_buf_eagain_clears_buffer
172 rv = @rd.kgio_tryread(2, tmp)
173 assert_equal :wait_readable, rv
177 def test_tryread_extra_buf_eof_clears_buffer
180 assert_nil @rd.kgio_tryread(2, tmp)
184 def test_monster_trywrite
185 buf = RANDOM_BLOB.dup
186 rv = @wr.kgio_trywrite(buf)
187 assert_kind_of String, rv
188 assert rv.size < buf.size
190 assert_equal(buf, @rd.read(buf.size - rv.size) + rv)
193 def test_monster_write
194 buf = RANDOM_BLOB.dup
195 thr = Thread.new { @wr.kgio_write(buf) }
197 readed = @rd.read(buf.size)
200 assert_equal buf, readed
203 def test_monster_write_wait_writable
204 @wr.instance_variable_set :@nr, 0
205 def @wr.kgio_wait_writable
207 IO.select(nil, [self])
209 buf = "." * 1024 * 1024 * 10
210 thr = Thread.new { @wr.kgio_write(buf) }
211 readed = @rd.read(buf.size)
214 assert_equal buf, readed
215 assert @wr.instance_variable_get(:@nr) > 0
218 def test_wait_readable_ruby_default
222 thr = Thread.new { sleep 1; @wr.write "HELLO" }
223 assert_nothing_raised do
224 foo = @rd.kgio_read(5)
225 elapsed = Time.now - t0
227 assert elapsed >= 1.0, "elapsed: #{elapsed}"
228 assert_equal "HELLO", foo
230 assert_equal 5, thr.value
233 def test_wait_writable_ruby_default
237 nr += @wr.write_nonblock(buf)
244 thr = Thread.new { sleep 1; @rd.readpartial(nr) }
245 assert_nothing_raised do
246 foo = @wr.kgio_write("HELLO")
247 elapsed = Time.now - t0
251 assert elapsed >= 1.0, "elapsed: #{elapsed}"
253 assert(String === foo || foo == nil)
254 assert_kind_of String, thr.value
257 def test_wait_readable_method
258 def @rd.kgio_wait_readable
259 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
263 foo = @rd.kgio_read(5)
265 rescue RuntimeError => e
266 assert_equal("Hello", e.message)
268 assert_equal "HI", @rd.instance_variable_get(:@z)
272 def test_tryread_wait_readable_method
273 def @rd.kgio_wait_readable
276 assert_equal :wait_readable, @rd.kgio_tryread(5)
279 def test_trywrite_wait_readable_method
280 def @wr.kgio_wait_writable
285 10000.times { tmp << @wr.kgio_trywrite(buf) }
286 assert_equal :wait_writable, tmp.pop
289 def test_wait_writable_method
290 def @wr.kgio_wait_writable
291 defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
295 loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
297 rescue RuntimeError => e
298 assert_equal("Hello", e.message)
301 assert_equal "HI", @wr.instance_variable_get(:@z)