* test/ruby/test_io.rb (test_copy_stream, test_copy_stream_socket): skip some

tests if there isn't IO#nonblock=.
* test/ruby/test_io.rb (test_close_on_exec): skip if there isn't
  IO#close_on_exec=.
* test/ruby/test_io.rb (test_bytes, test_readbyte): depend on binmode.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19992 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
usa 2008-10-28 09:41:30 +00:00
parent fdc4287e87
commit 04e19b5587

View File

@ -8,6 +8,19 @@ require 'tempfile'
require_relative 'envutil' require_relative 'envutil'
class TestIO < Test::Unit::TestCase class TestIO < Test::Unit::TestCase
def have_close_on_exec?
begin
$stdin.close_on_exec?
true
rescue NotImplementedError
false
end
end
def have_nonblock?
IO.instance_methods.index(:"nonblock=")
end
def test_gets_rs def test_gets_rs
# default_rs # default_rs
r, w = IO.pipe r, w = IO.pipe
@ -236,18 +249,20 @@ class TestIO < Test::Unit::TestCase
assert_equal(content[1,1], r.read) assert_equal(content[1,1], r.read)
} }
with_read_pipe("abc") {|r1| if have_nonblock?
assert_equal("a", r1.getc) with_read_pipe("abc") {|r1|
with_pipe {|r2, w2| assert_equal("a", r1.getc)
w2.nonblock = true with_pipe {|r2, w2|
s = w2.syswrite("a" * 100000) w2.nonblock = true
t = Thread.new { sleep 0.1; r2.read } s = w2.syswrite("a" * 100000)
ret = IO.copy_stream(r1, w2) t = Thread.new { sleep 0.1; r2.read }
w2.close ret = IO.copy_stream(r1, w2)
assert_equal(2, ret) w2.close
assert_equal("a" * s + "bc", t.value) assert_equal(2, ret)
assert_equal("a" * s + "bc", t.value)
}
} }
} end
bigcontent = "abc" * 123456 bigcontent = "abc" * 123456
File.open("bigsrc", "w") {|f| f << bigcontent } File.open("bigsrc", "w") {|f| f << bigcontent }
@ -266,15 +281,19 @@ class TestIO < Test::Unit::TestCase
assert_equal(bigcontent[100, 30000], File.read("bigdst")) assert_equal(bigcontent[100, 30000], File.read("bigdst"))
File.open("bigsrc") {|f| File.open("bigsrc") {|f|
assert_equal(0, f.pos) begin
ret = IO.copy_stream(f, "bigdst", nil, 10) assert_equal(0, f.pos)
assert_equal(bigcontent.bytesize-10, ret) ret = IO.copy_stream(f, "bigdst", nil, 10)
assert_equal(bigcontent[10..-1], File.read("bigdst")) assert_equal(bigcontent.bytesize-10, ret)
assert_equal(0, f.pos) assert_equal(bigcontent[10..-1], File.read("bigdst"))
ret = IO.copy_stream(f, "bigdst", 40, 30) assert_equal(0, f.pos)
assert_equal(40, ret) ret = IO.copy_stream(f, "bigdst", 40, 30)
assert_equal(bigcontent[30, 40], File.read("bigdst")) assert_equal(40, ret)
assert_equal(0, f.pos) assert_equal(bigcontent[30, 40], File.read("bigdst"))
assert_equal(0, f.pos)
rescue NotImplementedError
#skip "pread(2) is not implemtented."
end
} }
with_pipe {|r, w| with_pipe {|r, w|
@ -285,19 +304,21 @@ class TestIO < Test::Unit::TestCase
megacontent = "abc" * 1234567 megacontent = "abc" * 1234567
File.open("megasrc", "w") {|f| f << megacontent } File.open("megasrc", "w") {|f| f << megacontent }
with_pipe {|r1, w1| if have_nonblock?
with_pipe {|r2, w2| with_pipe {|r1, w1|
t1 = Thread.new { w1 << megacontent; w1.close } with_pipe {|r2, w2|
t2 = Thread.new { r2.read } t1 = Thread.new { w1 << megacontent; w1.close }
r1.nonblock = true t2 = Thread.new { r2.read }
w2.nonblock = true r1.nonblock = true
ret = IO.copy_stream(r1, w2) w2.nonblock = true
assert_equal(megacontent.bytesize, ret) ret = IO.copy_stream(r1, w2)
w2.close assert_equal(megacontent.bytesize, ret)
t1.join w2.close
assert_equal(megacontent, t2.value) t1.join
assert_equal(megacontent, t2.value)
}
} }
} end
with_pipe {|r1, w1| with_pipe {|r1, w1|
with_pipe {|r2, w2| with_pipe {|r2, w2|
@ -323,15 +344,19 @@ class TestIO < Test::Unit::TestCase
def test_copy_stream_rbuf def test_copy_stream_rbuf
mkcdtmpdir { mkcdtmpdir {
with_pipe {|r, w| begin
File.open("foo", "w") {|f| f << "abcd" } with_pipe {|r, w|
File.open("foo") {|f| File.open("foo", "w") {|f| f << "abcd" }
f.read(1) File.open("foo") {|f|
assert_equal(3, IO.copy_stream(f, w, 10, 1)) f.read(1)
assert_equal(3, IO.copy_stream(f, w, 10, 1))
}
w.close
assert_equal("bcd", r.read)
} }
w.close rescue NotImplementedError
assert_equal("bcd", r.read) skip "pread(2) is not implemtented."
} end
} }
end end
@ -410,15 +435,17 @@ class TestIO < Test::Unit::TestCase
megacontent = "abc" * 1234567 megacontent = "abc" * 1234567
File.open("megasrc", "w") {|f| f << megacontent } File.open("megasrc", "w") {|f| f << megacontent }
with_socketpair {|s1, s2| if have_nonblock?
t = Thread.new { s2.read } with_socketpair {|s1, s2|
s1.nonblock = true t = Thread.new { s2.read }
ret = IO.copy_stream("megasrc", s1) s1.nonblock = true
assert_equal(megacontent.bytesize, ret) ret = IO.copy_stream("megasrc", s1)
s1.close assert_equal(megacontent.bytesize, ret)
result = t.value s1.close
assert_equal(megacontent, result) result = t.value
} assert_equal(megacontent, result)
}
end
} }
end end
@ -874,6 +901,7 @@ class TestIO < Test::Unit::TestCase
def test_bytes def test_bytes
pipe(proc do |w| pipe(proc do |w|
w.binmode
w.puts "foo" w.puts "foo"
w.puts "bar" w.puts "bar"
w.puts "baz" w.puts "baz"
@ -904,11 +932,13 @@ class TestIO < Test::Unit::TestCase
def test_readbyte def test_readbyte
pipe(proc do |w| pipe(proc do |w|
w.binmode
w.puts "foo" w.puts "foo"
w.puts "bar" w.puts "bar"
w.puts "baz" w.puts "baz"
w.close w.close
end, proc do |r| end, proc do |r|
r.binmode
(%w(f o o) + ["\n"] + %w(b a r) + ["\n"] + %w(b a z) + ["\n"]).each do |c| (%w(f o o) + ["\n"] + %w(b a r) + ["\n"] + %w(b a z) + ["\n"]).each do |c|
assert_equal(c.ord, r.readbyte) assert_equal(c.ord, r.readbyte)
end end
@ -931,7 +961,7 @@ class TestIO < Test::Unit::TestCase
end end
def test_close_on_exec def test_close_on_exec
# xxx skip "IO\#close_on_exec is not implemented." unless have_close_on_exec?
ruby do |f| ruby do |f|
assert_equal(false, f.close_on_exec?) assert_equal(false, f.close_on_exec?)
f.close_on_exec = true f.close_on_exec = true