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