diff options
| author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-10-28 12:17:54 +0000 |
|---|---|---|
| committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-10-28 12:17:54 +0000 |
| commit | 605102f3cb3c1a3e12a6df6adfebd88498da95fe (patch) | |
| tree | d38b81bc1afb6fa3fc3795883a01becefa71f69a /test/ruby | |
| parent | 9b663af885784659e61819021095d98603e7d9de (diff) | |
merge from trunk (r19984, r19985, r19991-r19998)
* io.c (extract_binmode): new function to extract binmode/textmode
options from hash.
* io.c (rb_io_extract_modeenc): use above function.
* io.c (rb_io_s_pipe): recognize binmode/textmode options.
* io.c (make_readconv): now can specify the size of cbuf.
* io.c (read_all, appendline, io_getc, rb_io_ungetc): follow above
change.
* win32/win32.c (rb_w32_pipe_exec): internal fds should be always
binmode.
* test/ruby/test_file.rb (test_each_char_extended_file,
test_getbyte_extended_file): add tests.
* test/ruby/test_file.rb (test_*_extended_file): test in default/text/
binary mode.
* test/ruby/test_file.rb (test_para_gets_extended_file): output file
should be binmode.
* 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.
* test/ruby/test_io.rb (test_sysopen): should specify the mode of
IO::for_fd if F_GETFL is not available.
* test/ruby/test_io_m17n.rb (test_getc_invalid3): should set binmode if
enc is not compatible with ASCII.
* test/ruby/test_require.rb (test_require_too_long_filename): too long
commandline may be rejected by OS.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@19999 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/ruby')
| -rw-r--r-- | test/ruby/test_file.rb | 74 | ||||
| -rw-r--r-- | test/ruby/test_io.rb | 138 | ||||
| -rw-r--r-- | test/ruby/test_io_m17n.rb | 2 | ||||
| -rw-r--r-- | test/ruby/test_require.rb | 14 |
4 files changed, 149 insertions, 79 deletions
diff --git a/test/ruby/test_file.rb b/test/ruby/test_file.rb index f6fcf89a14..0732c76a82 100644 --- a/test/ruby/test_file.rb +++ b/test/ruby/test_file.rb @@ -65,40 +65,70 @@ class TestFile < Test::Unit::TestCase end def test_read_all_extended_file - f = Tempfile.new("test-extended-file") - assert_nil(f.getc) - open(f.path, "w") {|g| g.print "a" } - assert_equal("a", f.read) + [nil, {:textmode=>true}, {:binmode=>true}].each do |mode| + f = Tempfile.new("test-extended-file", mode) + assert_nil(f.getc) + open(f.path, "w") {|g| g.print "a" } + assert_equal("a", f.read, "mode = <#{mode}>") + end end def test_gets_extended_file - f = Tempfile.new("test-extended-file") - assert_nil(f.getc) - open(f.path, "w") {|g| g.print "a" } - assert_equal("a", f.gets("a")) + [nil, {:textmode=>true}, {:binmode=>true}].each do |mode| + f = Tempfile.new("test-extended-file", mode) + assert_nil(f.getc) + open(f.path, "w") {|g| g.print "a" } + assert_equal("a", f.gets("a"), "mode = <#{mode}>") + end end def test_gets_para_extended_file - f = Tempfile.new("test-extended-file") - assert_nil(f.getc) - open(f.path, "w") {|g| g.print "\na" } - assert_equal("a", f.gets("")) + [nil, {:textmode=>true}, {:binmode=>true}].each do |mode| + f = Tempfile.new("test-extended-file", mode) + assert_nil(f.getc) + open(f.path, "wb") {|g| g.print "\na" } + assert_equal("a", f.gets(""), "mode = <#{mode}>") + end + end + + def test_each_char_extended_file + [nil, {:textmode=>true}, {:binmode=>true}].each do |mode| + f = Tempfile.new("test-extended-file", mode) + assert_nil(f.getc) + open(f.path, "w") {|g| g.print "a" } + result = [] + f.each_char {|b| result << b } + assert_equal([?a], result, "mode = <#{mode}>") + end end def test_each_byte_extended_file - f = Tempfile.new("test-extended-file") - assert_nil(f.getc) - open(f.path, "w") {|g| g.print "a" } - result = [] - f.each_byte {|b| result << b.chr } - assert_equal([?a], result) + [nil, {:textmode=>true}, {:binmode=>true}].each do |mode| + f = Tempfile.new("test-extended-file", mode) + assert_nil(f.getc) + open(f.path, "w") {|g| g.print "a" } + result = [] + f.each_byte {|b| result << b.chr } + assert_equal([?a], result, "mode = <#{mode}>") + end end def test_getc_extended_file - f = Tempfile.new("test-extended-file") - assert_nil(f.getc) - open(f.path, "w") {|g| g.print "a" } - assert_equal(?a, f.getc) + [nil, {:textmode=>true}, {:binmode=>true}].each do |mode| + f = Tempfile.new("test-extended-file", mode) + assert_nil(f.getc) + open(f.path, "w") {|g| g.print "a" } + assert_equal(?a, f.getc, "mode = <#{mode}>") + end + end + + def test_getbyte_extended_file + [nil, {:textmode=>true}, {:binmode=>true}].each do |mode| + f = Tempfile.new("test-extended-file", mode) + assert_nil(f.getc) + open(f.path, "w") {|g| g.print "a" } + assert_equal(?a, f.getbyte.chr, "mode = <#{mode}>") + end end def test_s_chown diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index 4305293a3d..34a8d017c0 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -1,5 +1,6 @@ require 'test/unit' require 'tmpdir' +require "fcntl" require 'io/nonblock' require 'socket' require 'stringio' @@ -8,6 +9,19 @@ require 'tempfile' require_relative 'envutil' 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 # default_rs r, w = IO.pipe @@ -236,18 +250,20 @@ class TestIO < Test::Unit::TestCase assert_equal(content[1,1], r.read) } - with_read_pipe("abc") {|r1| - assert_equal("a", r1.getc) - with_pipe {|r2, w2| - w2.nonblock = true - s = w2.syswrite("a" * 100000) - t = Thread.new { sleep 0.1; r2.read } - ret = IO.copy_stream(r1, w2) - w2.close - assert_equal(2, ret) - assert_equal("a" * s + "bc", t.value) + if have_nonblock? + with_read_pipe("abc") {|r1| + assert_equal("a", r1.getc) + with_pipe {|r2, w2| + w2.nonblock = true + s = w2.syswrite("a" * 100000) + t = Thread.new { sleep 0.1; r2.read } + ret = IO.copy_stream(r1, w2) + w2.close + assert_equal(2, ret) + assert_equal("a" * s + "bc", t.value) + } } - } + end bigcontent = "abc" * 123456 File.open("bigsrc", "w") {|f| f << bigcontent } @@ -266,15 +282,19 @@ class TestIO < Test::Unit::TestCase assert_equal(bigcontent[100, 30000], File.read("bigdst")) File.open("bigsrc") {|f| - assert_equal(0, f.pos) - ret = IO.copy_stream(f, "bigdst", nil, 10) - assert_equal(bigcontent.bytesize-10, ret) - assert_equal(bigcontent[10..-1], File.read("bigdst")) - assert_equal(0, f.pos) - ret = IO.copy_stream(f, "bigdst", 40, 30) - assert_equal(40, ret) - assert_equal(bigcontent[30, 40], File.read("bigdst")) - assert_equal(0, f.pos) + begin + assert_equal(0, f.pos) + ret = IO.copy_stream(f, "bigdst", nil, 10) + assert_equal(bigcontent.bytesize-10, ret) + assert_equal(bigcontent[10..-1], File.read("bigdst")) + assert_equal(0, f.pos) + ret = IO.copy_stream(f, "bigdst", 40, 30) + assert_equal(40, ret) + 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| @@ -285,19 +305,21 @@ class TestIO < Test::Unit::TestCase megacontent = "abc" * 1234567 File.open("megasrc", "w") {|f| f << megacontent } - with_pipe {|r1, w1| - with_pipe {|r2, w2| - t1 = Thread.new { w1 << megacontent; w1.close } - t2 = Thread.new { r2.read } - r1.nonblock = true - w2.nonblock = true - ret = IO.copy_stream(r1, w2) - assert_equal(megacontent.bytesize, ret) - w2.close - t1.join - assert_equal(megacontent, t2.value) + if have_nonblock? + with_pipe {|r1, w1| + with_pipe {|r2, w2| + t1 = Thread.new { w1 << megacontent; w1.close } + t2 = Thread.new { r2.read } + r1.nonblock = true + w2.nonblock = true + ret = IO.copy_stream(r1, w2) + assert_equal(megacontent.bytesize, ret) + w2.close + t1.join + assert_equal(megacontent, t2.value) + } } - } + end with_pipe {|r1, w1| with_pipe {|r2, w2| @@ -323,15 +345,19 @@ class TestIO < Test::Unit::TestCase def test_copy_stream_rbuf mkcdtmpdir { - with_pipe {|r, w| - File.open("foo", "w") {|f| f << "abcd" } - File.open("foo") {|f| - f.read(1) - assert_equal(3, IO.copy_stream(f, w, 10, 1)) + begin + with_pipe {|r, w| + File.open("foo", "w") {|f| f << "abcd" } + File.open("foo") {|f| + f.read(1) + assert_equal(3, IO.copy_stream(f, w, 10, 1)) + } + w.close + assert_equal("bcd", r.read) } - w.close - assert_equal("bcd", r.read) - } + rescue NotImplementedError + skip "pread(2) is not implemtented." + end } end @@ -410,15 +436,17 @@ class TestIO < Test::Unit::TestCase megacontent = "abc" * 1234567 File.open("megasrc", "w") {|f| f << megacontent } - with_socketpair {|s1, s2| - t = Thread.new { s2.read } - s1.nonblock = true - ret = IO.copy_stream("megasrc", s1) - assert_equal(megacontent.bytesize, ret) - s1.close - result = t.value - assert_equal(megacontent, result) - } + if have_nonblock? + with_socketpair {|s1, s2| + t = Thread.new { s2.read } + s1.nonblock = true + ret = IO.copy_stream("megasrc", s1) + assert_equal(megacontent.bytesize, ret) + s1.close + result = t.value + assert_equal(megacontent, result) + } + end } end @@ -695,6 +723,7 @@ class TestIO < Test::Unit::TestCase end def test_write_nonblock + skip "IO#write_nonblock is not supported on file/pipe." if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM pipe(proc do |w| w.write_nonblock(1) w.close @@ -874,6 +903,7 @@ class TestIO < Test::Unit::TestCase def test_bytes pipe(proc do |w| + w.binmode w.puts "foo" w.puts "bar" w.puts "baz" @@ -904,11 +934,13 @@ class TestIO < Test::Unit::TestCase def test_readbyte pipe(proc do |w| + w.binmode w.puts "foo" w.puts "bar" w.puts "baz" w.close end, proc do |r| + r.binmode (%w(f o o) + ["\n"] + %w(b a r) + ["\n"] + %w(b a z) + ["\n"]).each do |c| assert_equal(c.ord, r.readbyte) end @@ -931,7 +963,7 @@ class TestIO < Test::Unit::TestCase end def test_close_on_exec - # xxx + skip "IO\#close_on_exec is not implemented." unless have_close_on_exec? ruby do |f| assert_equal(false, f.close_on_exec?) f.close_on_exec = true @@ -1022,7 +1054,11 @@ class TestIO < Test::Unit::TestCase fd = IO.sysopen(t.path, "w", 0666) assert_kind_of(Integer, fd) - f = IO.for_fd(fd) + if defined?(Fcntl::F_GETFL) + f = IO.for_fd(fd) + else + f = IO.for_fd(fd, 0666) + end f.write("FOO\n") f.close diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb index 8b7c3363d1..71299181ec 100644 --- a/test/ruby/test_io_m17n.rb +++ b/test/ruby/test_io_m17n.rb @@ -677,7 +677,7 @@ EOT end def test_getc_invalid3 - with_pipe("utf-16le:euc-jp") {|r, w| + with_pipe("utf-16le:euc-jp", binmode: true) {|r, w| before1 = "\x42\x30".force_encoding("utf-16le") before2 = "\x44\x30".force_encoding("utf-16le") invalid = "\x00\xd8".force_encoding("utf-16le") diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb index a5f453a055..4048ba038d 100644 --- a/test/ruby/test_require.rb +++ b/test/ruby/test_require.rb @@ -27,11 +27,15 @@ class TestRequire < Test::Unit::TestCase end INPUT - assert_in_out_err(["-S", "foo/" * 10000 + "foo"], "") do |r, e| - assert_equal([], r) - assert_operator(2, :<=, e.size) - assert_equal("openpath: pathname too long (ignored)", e.first) - assert_match(/\(LoadError\)/, e.last) + begin + assert_in_out_err(["-S", "foo/" * 10000 + "foo"], "") do |r, e| + assert_equal([], r) + assert_operator(2, :<=, e.size) + assert_equal("openpath: pathname too long (ignored)", e.first) + assert_match(/\(LoadError\)/, e.last) + end + rescue Errno::EINVAL + # too long commandline may be blocked by OS. end end |
