test/lib_read_write.rb in kgio-2.7.4 vs test/lib_read_write.rb in kgio-2.8.0

- old
+ new

@@ -19,10 +19,18 @@ def test_trywrite_empty assert_nil @wr.kgio_trywrite("") end + def test_writev_empty + assert_nil @wr.kgio_writev([]) + end + + def test_trywritev_empty + assert_nil @wr.kgio_trywritev([]) + end + def test_read_zero assert_equal "", @rd.kgio_read(0) buf = "foo" assert_equal buf.object_id, @rd.kgio_read(0, buf).object_id assert_equal "", buf @@ -114,10 +122,32 @@ return end assert false, "should never get here (line:#{__LINE__})" end + def test_writev_closed + @rd.close + begin + loop { @wr.kgio_writev ["HI"] } + rescue Errno::EPIPE, Errno::ECONNRESET => e + assert_equal [], e.backtrace + return + end + assert false, "should never get here (line:#{__LINE__})" + end + + def test_trywritev_closed + @rd.close + begin + loop { @wr.kgio_trywritev ["HI"] } + rescue Errno::EPIPE, Errno::ECONNRESET => e + assert_equal [], e.backtrace + return + end + assert false, "should never get here (line:#{__LINE__})" + end + def test_trywrite_full buf = "\302\251" * 1024 * 1024 buf2 = "" dig = Digest::SHA1.new t = Thread.new do @@ -151,10 +181,47 @@ @wr.close t.join assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value end + def test_trywritev_full + buf = ["\302\251" * 128] * 8 * 1024 + buf2 = "" + dig = Digest::SHA1.new + t = Thread.new do + sleep 1 + nr = 0 + begin + dig.update(@rd.readpartial(4096, buf2)) + nr += buf2.size + rescue EOFError + break + rescue => e + end while true + dig.hexdigest + end + 50.times do + wr = buf + begin + rv = @wr.kgio_trywritev(wr) + case rv + when Array + wr = rv + when :wait_readable + assert false, "should never get here line=#{__LINE__}" + when :wait_writable + IO.select(nil, [ @wr ]) + else + wr = false + end + end while wr + end + @wr.close + t.join + assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value + end + def test_write_conv assert_equal nil, @wr.kgio_write(10) assert_equal "10", @rd.kgio_read(2) end @@ -173,10 +240,11 @@ assert_equal "hi", @rd.kgio_read(4) end def test_tryread_too_much assert_equal nil, @wr.kgio_trywrite("hi") + assert_equal @rd, @rd.kgio_wait_readable assert_equal "hi", @rd.kgio_tryread(4) end def test_read_short assert_equal nil, @wr.kgio_write("hi") @@ -212,10 +280,23 @@ assert(penultimate == "I" || penultimate == nil) assert tmp.size > 0 tmp.each { |count| assert_equal nil, count } end + def test_trywritev_return_wait_writable + tmp = [] + tmp << @wr.kgio_trywritev(["HI"]) until tmp[-1] == :wait_writable + assert :wait_writable === tmp[-1] + assert(!(:wait_readable === tmp[-1])) + assert_equal :wait_writable, tmp.pop + assert tmp.size > 0 + penultimate = tmp.pop + assert(penultimate == "I" || penultimate == nil) + assert tmp.size > 0 + tmp.each { |count| assert_equal nil, count } + end + def test_tryread_extra_buf_eagain_clears_buffer tmp = "hello world" rv = @rd.kgio_tryread(2, tmp) assert_equal :wait_readable, rv assert_equal "", tmp @@ -246,21 +327,69 @@ thr.join assert_nil thr.value assert_equal buf, readed end + def test_monster_trywritev + buf, start = [], 0 + while start < RANDOM_BLOB.size + s = RANDOM_BLOB[start, 1000] + start += s.size + buf << s + end + rv = @wr.kgio_trywritev(buf) + assert_kind_of Array, rv + rv = rv.join + assert rv.size < RANDOM_BLOB.size + @rd.nonblock = false + assert_equal(RANDOM_BLOB, @rd.read(RANDOM_BLOB.size - rv.size) + rv) + end + + def test_monster_writev + buf, start = [], 0 + while start < RANDOM_BLOB.size + s = RANDOM_BLOB[start, 10000] + start += s.size + buf << s + end + thr = Thread.new { @wr.kgio_writev(buf) } + @rd.nonblock = false + readed = @rd.read(RANDOM_BLOB.size) + thr.join + assert_nil thr.value + assert_equal RANDOM_BLOB, readed + end + def test_monster_write_wait_writable @wr.instance_variable_set :@nr, 0 def @wr.kgio_wait_writable @nr += 1 IO.select(nil, [self]) end buf = "." * 1024 * 1024 * 10 thr = Thread.new { @wr.kgio_write(buf) } + Thread.pass until thr.stop? readed = @rd.read(buf.size) thr.join assert_nil thr.value assert_equal buf, readed + assert @wr.instance_variable_get(:@nr) > 0 + end + + def test_monster_writev_wait_writable + @wr.instance_variable_set :@nr, 0 + def @wr.kgio_wait_writable + @nr += 1 + IO.select(nil, [self]) + end + buf = ["." * 1024] * 1024 * 10 + buf_size = buf.inject(0){|c, s| c + s.size} + thr = Thread.new { @wr.kgio_writev(buf) } + Thread.pass until thr.stop? + readed = @rd.read(buf_size) + thr.join + assert_nil thr.value + assert_equal buf.join, readed assert @wr.instance_variable_get(:@nr) > 0 end def test_wait_readable_ruby_default elapsed = 0