summaryrefslogtreecommitdiff
path: root/test/ruby
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-28 12:17:54 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-28 12:17:54 +0000
commit605102f3cb3c1a3e12a6df6adfebd88498da95fe (patch)
treed38b81bc1afb6fa3fc3795883a01becefa71f69a /test/ruby
parent9b663af885784659e61819021095d98603e7d9de (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.rb74
-rw-r--r--test/ruby/test_io.rb138
-rw-r--r--test/ruby/test_io_m17n.rb2
-rw-r--r--test/ruby/test_require.rb14
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