mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* test/ruby/test_io.rb (pipe): run reader thread and writer thread.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18260 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
995e44e050
commit
d866ba69a1
2 changed files with 85 additions and 57 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
Tue Jul 29 22:55:34 2008 Yusuke Endoh <mame@tsg.ne.jp>
|
||||||
|
|
||||||
|
* test/ruby/test_io.rb (pipe): run reader thread and writer thread.
|
||||||
|
|
||||||
Tue Jul 29 21:38:08 2008 Yusuke Endoh <mame@tsg.ne.jp>
|
Tue Jul 29 21:38:08 2008 Yusuke Endoh <mame@tsg.ne.jp>
|
||||||
|
|
||||||
* ext/bigdecimal/bigdecimal.c (Init_bigdecimal): fix typo.
|
* ext/bigdecimal/bigdecimal.c (Init_bigdecimal): fix typo.
|
||||||
|
|
|
@ -557,14 +557,16 @@ class TestIO < Test::Unit::TestCase
|
||||||
end.join
|
end.join
|
||||||
end
|
end
|
||||||
|
|
||||||
def pipe
|
def pipe(wp, rp)
|
||||||
r, w = IO.pipe
|
r, w = IO.pipe
|
||||||
Timeout.timeout(10) do
|
rt = Thread.new { rp.call(r) }
|
||||||
yield(r, w)
|
wt = Thread.new { wp.call(w) }
|
||||||
end
|
flunk("timeout") unless rt.join(10) && wt.join(10)
|
||||||
ensure
|
ensure
|
||||||
r.close unless !r || r.closed?
|
r.close unless !r || r.closed?
|
||||||
w.close unless !w || w.closed?
|
w.close unless !w || w.closed?
|
||||||
|
(rt.kill; rt.join) if rt
|
||||||
|
(wt.kill; wt.join) if wt
|
||||||
end
|
end
|
||||||
|
|
||||||
def pipe2(&b)
|
def pipe2(&b)
|
||||||
|
@ -594,16 +596,20 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_ungetc2
|
def test_ungetc2
|
||||||
pipe do |r, w|
|
f = false
|
||||||
r.ungetc("0" * 10000)
|
pipe(proc do |w|
|
||||||
|
0 until f
|
||||||
w.write("1" * 10000)
|
w.write("1" * 10000)
|
||||||
w.close
|
w.close
|
||||||
|
end, proc do |r|
|
||||||
|
r.ungetc("0" * 10000)
|
||||||
|
f = true
|
||||||
assert_equal("0" * 10000 + "1" * 10000, r.read)
|
assert_equal("0" * 10000 + "1" * 10000, r.read)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_write_non_writable
|
def test_write_non_writable
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_raise(IOError) do
|
assert_raise(IOError) do
|
||||||
r.write "foobarbaz"
|
r.write "foobarbaz"
|
||||||
end
|
end
|
||||||
|
@ -629,7 +635,7 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_inspect
|
def test_inspect
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert(r.inspect =~ /^#<IO:0x[0-9a-f]+>$/)
|
assert(r.inspect =~ /^#<IO:0x[0-9a-f]+>$/)
|
||||||
assert_raise(SecurityError) do
|
assert_raise(SecurityError) do
|
||||||
safe_4 { r.inspect }
|
safe_4 { r.inspect }
|
||||||
|
@ -638,18 +644,19 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_readpartial
|
def test_readpartial
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
w.write "foobarbaz"
|
w.write "foobarbaz"
|
||||||
w.close
|
w.close
|
||||||
|
end, proc do |r|
|
||||||
assert_raise(ArgumentError) { r.readpartial(-1) }
|
assert_raise(ArgumentError) { r.readpartial(-1) }
|
||||||
assert_equal("fooba", r.readpartial(5))
|
assert_equal("fooba", r.readpartial(5))
|
||||||
r.readpartial(5, s = "")
|
r.readpartial(5, s = "")
|
||||||
assert_equal("rbaz", s)
|
assert_equal("rbaz", s)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_readpartial_error
|
def test_readpartial_error
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
s = ""
|
s = ""
|
||||||
t = Thread.new { r.readpartial(5, s) }
|
t = Thread.new { r.readpartial(5, s) }
|
||||||
0 until s.size == 5
|
0 until s.size == 5
|
||||||
|
@ -661,18 +668,19 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_read
|
def test_read
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
w.write "foobarbaz"
|
w.write "foobarbaz"
|
||||||
w.close
|
w.close
|
||||||
|
end, proc do |r|
|
||||||
assert_raise(ArgumentError) { r.read(-1) }
|
assert_raise(ArgumentError) { r.read(-1) }
|
||||||
assert_equal("fooba", r.read(5))
|
assert_equal("fooba", r.read(5))
|
||||||
r.read(nil, s = "")
|
r.read(nil, s = "")
|
||||||
assert_equal("rbaz", s)
|
assert_equal("rbaz", s)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_read_error
|
def test_read_error
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
s = ""
|
s = ""
|
||||||
t = Thread.new { r.read(5, s) }
|
t = Thread.new { r.read(5, s) }
|
||||||
0 until s.size == 5
|
0 until s.size == 5
|
||||||
|
@ -684,20 +692,22 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_write_nonblock
|
def test_write_nonblock
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
w.write_nonblock(1)
|
w.write_nonblock(1)
|
||||||
w.close
|
w.close
|
||||||
|
end, proc do |r|
|
||||||
assert_equal("1", r.read)
|
assert_equal("1", r.read)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_gets
|
def test_gets
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
w.write "foobarbaz"
|
w.write "foobarbaz"
|
||||||
w.close
|
w.close
|
||||||
|
end, proc do |r|
|
||||||
assert_equal("", r.gets(0))
|
assert_equal("", r.gets(0))
|
||||||
assert_equal("foobarbaz", r.gets(9))
|
assert_equal("foobarbaz", s = r.gets(9))
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_close_read
|
def test_close_read
|
||||||
|
@ -709,14 +719,14 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_close_read_pipe
|
def test_close_read_pipe
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
r.close_read
|
r.close_read
|
||||||
assert_raise(Errno::EPIPE) { w.write "foobarbaz" }
|
assert_raise(Errno::EPIPE) { w.write "foobarbaz" }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_close_read_security_error
|
def test_close_read_security_error
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_raise(SecurityError) do
|
assert_raise(SecurityError) do
|
||||||
safe_4 { r.close_read }
|
safe_4 { r.close_read }
|
||||||
end
|
end
|
||||||
|
@ -724,7 +734,7 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_close_read_non_readable
|
def test_close_read_non_readable
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_raise(IOError) do
|
assert_raise(IOError) do
|
||||||
w.close_read
|
w.close_read
|
||||||
end
|
end
|
||||||
|
@ -740,7 +750,7 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_close_write_security_error
|
def test_close_write_security_error
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_raise(SecurityError) do
|
assert_raise(SecurityError) do
|
||||||
safe_4 { r.close_write }
|
safe_4 { r.close_write }
|
||||||
end
|
end
|
||||||
|
@ -748,7 +758,7 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_close_write_non_readable
|
def test_close_write_non_readable
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_raise(IOError) do
|
assert_raise(IOError) do
|
||||||
r.close_write
|
r.close_write
|
||||||
end
|
end
|
||||||
|
@ -802,111 +812,119 @@ class TestIO < Test::Unit::TestCase
|
||||||
assert_equal("nil,1,2,2,1001,1001,1001,1,2,3,3", f.read.chomp.gsub("\n", ","))
|
assert_equal("nil,1,2,2,1001,1001,1001,1,2,3,3", f.read.chomp.gsub("\n", ","))
|
||||||
end
|
end
|
||||||
|
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
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|
|
||||||
r.gets; assert_equal(1, $.)
|
r.gets; assert_equal(1, $.)
|
||||||
r.gets; assert_equal(2, $.)
|
r.gets; assert_equal(2, $.)
|
||||||
r.lineno = 1000; assert_equal(2, $.)
|
r.lineno = 1000; assert_equal(2, $.)
|
||||||
r.gets; assert_equal(1001, $.)
|
r.gets; assert_equal(1001, $.)
|
||||||
r.gets; assert_equal(1001, $.)
|
r.gets; assert_equal(1001, $.)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_readline
|
def test_readline
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
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|
|
||||||
r.readline; assert_equal(1, $.)
|
r.readline; assert_equal(1, $.)
|
||||||
r.readline; assert_equal(2, $.)
|
r.readline; assert_equal(2, $.)
|
||||||
r.lineno = 1000; assert_equal(2, $.)
|
r.lineno = 1000; assert_equal(2, $.)
|
||||||
r.readline; assert_equal(1001, $.)
|
r.readline; assert_equal(1001, $.)
|
||||||
assert_raise(EOFError) { r.readline }
|
assert_raise(EOFError) { r.readline }
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_each_char
|
def test_each_char
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
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|
|
||||||
a = []
|
a = []
|
||||||
r.each_char {|c| a << c }
|
r.each_char {|c| a << c }
|
||||||
assert_equal(%w(f o o) + ["\n"] + %w(b a r) + ["\n"] + %w(b a z) + ["\n"], a)
|
assert_equal(%w(f o o) + ["\n"] + %w(b a r) + ["\n"] + %w(b a z) + ["\n"], a)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_lines
|
def test_lines
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
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|
|
||||||
e = r.lines
|
e = r.lines
|
||||||
assert_equal("foo\n", e.next)
|
assert_equal("foo\n", e.next)
|
||||||
assert_equal("bar\n", e.next)
|
assert_equal("bar\n", e.next)
|
||||||
assert_equal("baz\n", e.next)
|
assert_equal("baz\n", e.next)
|
||||||
assert_raise(StopIteration) { e.next }
|
assert_raise(StopIteration) { e.next }
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_bytes
|
def test_bytes
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
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|
|
||||||
e = r.bytes
|
e = r.bytes
|
||||||
(%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, e.next)
|
assert_equal(c.ord, e.next)
|
||||||
end
|
end
|
||||||
assert_raise(StopIteration) { e.next }
|
assert_raise(StopIteration) { e.next }
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_chars
|
def test_chars
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
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|
|
||||||
e = r.chars
|
e = r.chars
|
||||||
(%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, e.next)
|
assert_equal(c, e.next)
|
||||||
end
|
end
|
||||||
assert_raise(StopIteration) { e.next }
|
assert_raise(StopIteration) { e.next }
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_readbyte
|
def test_readbyte
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
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|
|
||||||
(%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
|
||||||
assert_raise(EOFError) { r.readbyte }
|
assert_raise(EOFError) { r.readbyte }
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_readchar
|
def test_readchar
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
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|
|
||||||
(%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, r.readchar)
|
assert_equal(c, r.readchar)
|
||||||
end
|
end
|
||||||
assert_raise(EOFError) { r.readchar }
|
assert_raise(EOFError) { r.readchar }
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_close_on_exec
|
def test_close_on_exec
|
||||||
|
@ -919,7 +937,7 @@ class TestIO < Test::Unit::TestCase
|
||||||
assert_equal(false, f.close_on_exec?)
|
assert_equal(false, f.close_on_exec?)
|
||||||
end
|
end
|
||||||
|
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_equal(false, r.close_on_exec?)
|
assert_equal(false, r.close_on_exec?)
|
||||||
r.close_on_exec = true
|
r.close_on_exec = true
|
||||||
assert_equal(true, r.close_on_exec?)
|
assert_equal(true, r.close_on_exec?)
|
||||||
|
@ -935,7 +953,7 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_close_security_error
|
def test_close_security_error
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_raise(SecurityError) do
|
assert_raise(SecurityError) do
|
||||||
safe_4 { r.close }
|
safe_4 { r.close }
|
||||||
end
|
end
|
||||||
|
@ -1034,7 +1052,7 @@ class TestIO < Test::Unit::TestCase
|
||||||
def test_reopen
|
def test_reopen
|
||||||
t = make_tempfile
|
t = make_tempfile
|
||||||
|
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_raise(SecurityError) do
|
assert_raise(SecurityError) do
|
||||||
safe_4 { r.reopen(t.path) }
|
safe_4 { r.reopen(t.path) }
|
||||||
end
|
end
|
||||||
|
@ -1070,11 +1088,12 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_printf
|
def test_printf
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
printf(w, "foo %s baz\n", "bar")
|
printf(w, "foo %s baz\n", "bar")
|
||||||
w.close_write
|
w.close_write
|
||||||
|
end, proc do |r|
|
||||||
assert_equal("foo bar baz\n", r.read)
|
assert_equal("foo bar baz\n", r.read)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_print
|
def test_print
|
||||||
|
@ -1084,13 +1103,14 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_putc
|
def test_putc
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
w.putc "A"
|
w.putc "A"
|
||||||
w.putc "BC"
|
w.putc "BC"
|
||||||
w.putc 68
|
w.putc 68
|
||||||
w.close_write
|
w.close_write
|
||||||
|
end, proc do |r|
|
||||||
assert_equal("ABD", r.read)
|
assert_equal("ABD", r.read)
|
||||||
end
|
end)
|
||||||
|
|
||||||
assert_in_out_err([], "putc 65", %w(A), [])
|
assert_in_out_err([], "putc 65", %w(A), [])
|
||||||
end
|
end
|
||||||
|
@ -1098,19 +1118,21 @@ class TestIO < Test::Unit::TestCase
|
||||||
def test_puts_recursive_array
|
def test_puts_recursive_array
|
||||||
a = ["foo"]
|
a = ["foo"]
|
||||||
a << a
|
a << a
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
w.puts a
|
w.puts a
|
||||||
w.close
|
w.close
|
||||||
|
end, proc do |r|
|
||||||
assert_equal("foo\n[...]\n", r.read)
|
assert_equal("foo\n[...]\n", r.read)
|
||||||
end
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_display
|
def test_display
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
"foo".display(w)
|
"foo".display(w)
|
||||||
w.close
|
w.close
|
||||||
|
end, proc do |r|
|
||||||
assert_equal("foo", r.read)
|
assert_equal("foo", r.read)
|
||||||
end
|
end)
|
||||||
|
|
||||||
assert_in_out_err([], "'foo'.display", %w(foo), [])
|
assert_in_out_err([], "'foo'.display", %w(foo), [])
|
||||||
end
|
end
|
||||||
|
@ -1132,7 +1154,7 @@ class TestIO < Test::Unit::TestCase
|
||||||
|
|
||||||
assert_equal("foo\nbar\nbaz\n", File.read(t.path))
|
assert_equal("foo\nbar\nbaz\n", File.read(t.path))
|
||||||
|
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_raise(RuntimeError) do
|
assert_raise(RuntimeError) do
|
||||||
o = Object.new
|
o = Object.new
|
||||||
class << o; self; end.instance_eval do
|
class << o; self; end.instance_eval do
|
||||||
|
@ -1142,16 +1164,18 @@ class TestIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
pipe do |r, w|
|
pipe(proc do |w|
|
||||||
r, w = IO.new(r), IO.new(w)
|
w = IO.new(w)
|
||||||
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|
|
||||||
|
r = IO.new(r)
|
||||||
assert_equal("foo\nbar\nbaz\n", r.read)
|
assert_equal("foo\nbar\nbaz\n", r.read)
|
||||||
end
|
end)
|
||||||
|
|
||||||
pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
assert_raise(ArgumentError) { IO.new(r, "r+") }
|
assert_raise(ArgumentError) { IO.new(r, "r+") }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue