initial commit + release
[kgio.git] / test / lib_read_write.rb
blob7fd24d56097d313854ae48f07f9357e7fca0a03b
1 require 'test/unit'
2 require 'io/nonblock'
3 $-w = true
4 require 'kgio'
6 module LibReadWriteTest
7   def teardown
8     assert_nothing_raised do
9       @rd.close unless @rd.closed?
10       @wr.close unless @wr.closed?
11     end
12     assert_nothing_raised do
13       Kgio.wait_readable = Kgio.wait_writable = nil
14     end
15   end
17   def test_read_eof
18     @wr.close
19     assert_raises(EOFError) { @rd.kgio_read 5 }
20   end
22   def test_write_closed
23     @rd.close
24     assert_raises(Errno::EPIPE) { @wr.kgio_write "HI" }
25   end
27   def test_write_conv
28     assert_equal nil, @wr.kgio_write(10)
29     assert_equal "10", @rd.kgio_read(2)
30   end
32   def test_read_empty
33     assert_equal Kgio::WaitReadable, @rd.kgio_read(1)
34   end
36   def test_read_too_much
37     assert_equal nil, @wr.kgio_write("hi")
38     assert_equal "hi", @rd.kgio_read(4)
39   end
41   def test_read_short
42     assert_equal nil, @wr.kgio_write("hi")
43     assert_equal "h", @rd.kgio_read(1)
44     assert_equal "i", @rd.kgio_read(1)
45   end
47   def test_read_extra_buf
48     tmp = ""
49     tmp_object_id = tmp.object_id
50     assert_equal nil, @wr.kgio_write("hi")
51     rv = @rd.kgio_read(2, tmp)
52     assert_equal "hi", rv
53     assert_equal rv.object_id, tmp.object_id
54     assert_equal tmp_object_id, rv.object_id
55   end
57   def test_write_return_wait_writable
58     tmp = []
59     tmp << @wr.kgio_write("HI") until tmp[-1] == Kgio::WaitWritable
60     assert_equal Kgio::WaitWritable, tmp.pop
61     assert tmp.size > 0
62     penultimate = tmp.pop
63     assert(penultimate == "I" || penultimate == nil)
64     assert tmp.size > 0
65     tmp.each { |count| assert_equal nil, count }
66   end
68   def test_monster_write
69     buf = "." * 1024 * 1024 * 10
70     rv = @wr.kgio_write(buf)
71     assert_kind_of String, rv
72     assert rv.size < buf.size
73     assert_equal(buf, (rv + @rd.read(buf.size - rv.size)))
74   end
76   def test_wait_readable_ruby_default
77     def @rd.ruby
78       raise RuntimeError, "Hello"
79     end
80     assert_nothing_raised { Kgio.wait_readable = :ruby }
81     elapsed = 0
82     foo = nil
83     t0 = Time.now
84     thr = Thread.new { sleep 1; @wr.write "HELLO" }
85     assert_nothing_raised do
86       foo = @rd.kgio_read(5)
87       elapsed = Time.now - t0
88     end
89     assert elapsed >= 1.0
90     assert_equal "HELLO", foo
91     thr.join
92     assert_equal 5, thr.value
93   end
95   def test_wait_writable_ruby_default
96     def @wr.ruby
97       raise RuntimeError, "Hello"
98     end
99     buf = "." * 512
100     nr = 0
101     begin
102       nr += @wr.write_nonblock(buf)
103     rescue Errno::EAGAIN
104       break
105     end while true
106     assert_nothing_raised { Kgio.wait_writable = :ruby }
107     elapsed = 0
108     foo = nil
109     t0 = Time.now
110     thr = Thread.new { sleep 1; @rd.readpartial(nr) }
111     assert_nothing_raised do
112       foo = @wr.kgio_write("HELLO")
113       elapsed = Time.now - t0
114     end
115     assert_nil foo
116     assert elapsed >= 1.0
117     assert(String === foo || foo == nil)
118     assert_kind_of String, thr.value
119   end
121   def test_wait_readable_method
122     def @rd.moo
123       defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
124     end
125     assert_nothing_raised { Kgio.wait_readable = :moo }
126     foo = nil
127     begin
128       foo = @rd.kgio_read(5)
129       assert false
130     rescue RuntimeError => e
131       assert_equal("Hello", e.message)
132     end
133     assert_equal "HI", @rd.instance_variable_get(:@z)
134     assert_nil foo
135   end
137   def test_wait_writable_method
138     def @wr.moo
139       defined?(@z) ? raise(RuntimeError, "Hello") : @z = "HI"
140     end
141     assert_nothing_raised { Kgio.wait_writable = :moo }
142     n = []
143     begin
144       loop { n << @wr.kgio_write("HIHIHIHIHIHI") }
145       assert false
146     rescue RuntimeError => e
147       assert_equal("Hello", e.message)
148     end
149     assert n.size > 0
150     assert_equal "HI", @wr.instance_variable_get(:@z)
151   end