update README
[sunshowers.git] / test / test_io.rb
blob81862ea026a82f265dd5152bab2ef55c3584e7fc
1 # -*- encoding: binary -*-
2 require 'test/unit'
3 require 'stringio'
4 require 'sunshowers'
6 # every time something is mocked, trust levels in tests cases dimish
7 # This is not needed under Ruby 1.8
8 class MyStringIO < StringIO
9   unless instance_methods.include?(:readpartial)
10     warn "W: defining readpartial for MyStringIO RUBY_VERSION=#{RUBY_VERSION}"
12     def readpartial(length, buf = "")
13       seek(tell)
14       rv = read(length)
15       rv.nil? and raise EOFError
16       rv
17     end
18   end
19 end
21 class TestIO < Test::Unit::TestCase
23   def setup
24     @raw = MyStringIO.new("")
25     @io = Sunshowers::IO.new(@raw) # binary
26     if defined?(Encoding::Binary)
27       assert(Encoding::Binary, @io.to_io.encoding)
28     end
29   end
31   def test_gets
32     @raw.string << "\x00FOO\xff"
33     rv = @io.gets
34     assert_equal "FOO", rv
35     assert_equal Encoding::UTF_8, rv.encoding if rv.respond_to?(:encoding)
36   end
38   def test_gets_bad_utf8
39     @raw.string << "\x00\xe0\xff"
40     assert_raises(Sunshowers::ProtocolError) { @io.gets }
41   end
43   def test_gets_bad_alignment
44     @raw.string << "\x00FOO"
45     assert_nil @io.gets
46     @raw.string << "\xff"
47     rv = @io.gets
48     assert_equal "FOO", rv
49     assert_equal Encoding::UTF_8, rv.encoding if rv.respond_to?(:encoding)
50   end
52   def test_write_utf8
53     str = "hello world"
54     @io.write_utf8(str)
55     wr = @raw.string
56     assert_equal "\0#{str}\xff", wr
57     assert_equal Encoding::BINARY, wr.encoding if wr.respond_to?(:encoding)
58   end
60   def test_write_binary
61     str = "\xff\xff\x00\x00\xff"
62     expect = str.freeze
63     assert_equal Encoding::BINARY, str.encoding if str.respond_to?(:encoding)
64     @io.write_binary(str)
65     wr = @raw.string
66     assert_equal "\x80\x05#{expect}", wr
67     assert_equal Encoding::BINARY, wr.encoding if wr.respond_to?(:encoding)
68   end
70   def test_read_write_binary_big
71     @io.keep_binary = true
72     [ 127, 128, 129, 5, 200 ].each do |i|
73       str = "\x0f" * i
74       expect = str.freeze
75       assert_equal Encoding::BINARY, str.encoding if str.respond_to?(:encoding)
76       @raw.seek(0)
77       @raw.truncate(0)
78       @io.write_binary(str)
79       @raw.seek(0)
80       rd = @io.gets
81       assert_equal Encoding::BINARY, rd.encoding if str.respond_to?(:encoding)
82       assert_equal rd, expect
83     end
84   end
86   def test_write
87     str = "\xff\xff\x00\x00\xff"
88     expect = str.freeze
89     assert_equal Encoding::BINARY, str.encoding if str.respond_to?(:encoding)
90     @io.write(str)
91     wr = @raw.string
92     assert_equal "\x80\x05#{expect}", wr
93     assert_equal Encoding::BINARY, wr.encoding if wr.respond_to?(:encoding)
95     @raw.truncate(0)
96     @raw.seek(0)
97     assert_equal "", @raw.string
99     str = "hello world"
100     if str.respond_to?(:encode)
101       str.force_encoding(Encoding::UTF_8)
102       assert_equal Encoding::UTF_8, str.encoding
103     end
104     @io.write(str)
105     wr = @raw.string
106     assert_equal "\0#{str}\xff", wr
107     assert_equal Encoding::BINARY, wr.encoding if wr.respond_to?(:encoding)
108   end
110   def test_utf8_limit
111     max = Sunshowers::IO::MAX_UTF8_SIZE
112     @raw.string << "\0#{'.' * max}\xff"
113     assert_equal max, @io.gets.length
114   end
116   def test_utf8_over_limit
117     max = Sunshowers::IO::MAX_UTF8_SIZE + Sunshowers::IO::RD_SIZE
118     @raw.string << "\0#{'.' * max}\xff"
119     assert_raises(Sunshowers::ProtocolError) { @io.gets }
120   end
122   def test_binary_limit
123     @io.keep_binary = true
124     max = Sunshowers::IO::MAX_BINARY_SIZE
125     @io.write_binary('.' * max)
126     @raw.seek(0)
127     assert_equal('.' * max, @io.gets)
128   end
130   def test_binary_over_limit
131     @io.keep_binary = true
132     max = Sunshowers::IO::MAX_BINARY_SIZE + Sunshowers::IO::RD_SIZE
133     @io.write_binary('.' * max)
134     @raw.seek(0)
135     assert_raises(Sunshowers::ProtocolError) { @io.gets }
136   end