1 # -*- encoding: binary -*-
5 $stderr.sync = $stdout.sync = true
7 class Test_POSIX_MQ < Test::Unit::TestCase
9 HAVE_TO_IO = if POSIX_MQ.instance_methods.grep(/\Ato_io\z/).empty?
10 warn "POSIX_MQ#to_io not supported on this platform: #{RUBY_PLATFORM}"
18 @path = "/posix_mq.rb.#{Time.now.to_i}.#$$.#{rand}"
23 assert_equal @mq, @mq.unlink
29 def test_timed_receive
31 @mq = POSIX_MQ.new(@path, :rw)
32 assert ! @mq.nonblock?
34 assert_raises(Errno::ETIMEDOUT) { @mq.receive "", interval }
35 elapsed = Time.now - t0
36 assert elapsed > interval
41 @mq = POSIX_MQ.new(@path, :rw, 0666, POSIX_MQ::Attr[0, 1, 1, 0])
42 assert ! @mq.nonblock?
43 assert_nothing_raised { @mq.send "A", 1, interval }
45 assert_raises(Errno::ETIMEDOUT) { @mq.send "B", 1, interval }
46 elapsed = Time.now - t0
47 assert elapsed > interval
51 POSIX_MQ.open(@path, IO::CREAT|IO::WRONLY, 0666) do |mq|
53 assert mq.kind_of?(POSIX_MQ)
54 assert_equal @path, mq.name
55 assert_nil mq.send("HI", 0)
56 assert_equal 1, mq.attr.curmsgs
58 assert_raises(IOError) { mq.close }
62 POSIX_MQ.unlink(@path)
66 path = "" << @path.dup
68 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
69 assert_equal path, @mq.name
73 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
74 rd = POSIX_MQ.new @path, IO::RDONLY
75 assert_equal @mq.name, rd.name
79 def test_send0_receive
80 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
81 assert_equal(@mq, @mq << "hello")
82 assert_equal [ "hello", 0 ], @mq.receive
86 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
87 @mq << "hello" << "world"
88 assert_equal [ "hello", 0 ], @mq.receive
89 assert_equal [ "world", 0 ], @mq.receive
93 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
94 assert_nil @mq.send("hello", 0)
95 assert_equal [ "hello", 0 ], @mq.receive
98 def test_send_receive_buf
100 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
101 assert_nil @mq.send("hello", 0)
102 assert_equal [ "hello", 0 ], @mq.receive(buf)
103 assert_equal "hello", buf
106 def test_send_receive_prio
107 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
108 assert_nil @mq.send("hello", 2)
109 assert_equal [ "hello", 2 ], @mq.receive
113 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
115 assert_equal POSIX_MQ::Attr, mq_attr.class
116 assert mq_attr.flags.kind_of?(Integer)
117 assert mq_attr.maxmsg.kind_of?(Integer)
118 assert mq_attr.msgsize.kind_of?(Integer)
119 assert mq_attr.curmsgs.kind_of?(Integer)
123 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
124 assert @mq.to_io.kind_of?(IO)
125 assert_nothing_raised { IO.select([@mq], nil, nil, 0) }
130 orig = trap(:USR1) { wr.syswrite('.') }
131 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
132 assert_nothing_raised { @mq.notify = :SIGUSR1 }
133 assert_nothing_raised { @mq.send("hello", 0) }
134 assert_equal [[rd], [], []], IO.select([rd], nil, nil, 10)
135 assert_equal '.', rd.sysread(1)
136 assert_nil(@mq.notify = nil)
137 assert_nothing_raised { @mq.send("hello", 0) }
138 assert_nil IO.select([rd], nil, nil, 0.1)
139 assert_raises(Errno::EBUSY) { @mq.notify = :USR1 }
145 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
146 mq_attr = POSIX_MQ::Attr.new(IO::NONBLOCK)
148 assert_equal IO::NONBLOCK, @mq.attr.flags
149 assert mq_attr.flags.kind_of?(Integer)
153 assert_equal 0, @mq.attr.flags
156 def test_new_nonblocking
157 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY|IO::NONBLOCK, 0666
161 def test_new_blocking
162 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
163 assert ! @mq.nonblock?
166 def test_nonblock_toggle
167 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
168 assert ! @mq.nonblock?
172 assert ! @mq.nonblock?
173 assert_raises(ArgumentError) { @mq.nonblock = nil }
177 @mq = POSIX_MQ.new @path, :w
178 assert_equal IO::WRONLY, @mq.to_io.fcntl(Fcntl::F_GETFL)
182 @mq = POSIX_MQ.new @path, :w
184 assert_nothing_raised { mq = POSIX_MQ.new @path, :r }
185 assert_equal IO::RDONLY, mq.to_io.fcntl(Fcntl::F_GETFL)
189 def test_new_path_only
190 @mq = POSIX_MQ.new @path, :w
192 assert_nothing_raised { mq = POSIX_MQ.new @path }
193 assert_equal IO::RDONLY, mq.to_io.fcntl(Fcntl::F_GETFL)
198 @mq = POSIX_MQ.new @path, :rw
199 assert_equal IO::RDWR, @mq.to_io.fcntl(Fcntl::F_GETFL)
203 mq_attr = POSIX_MQ::Attr.new(IO::NONBLOCK, 1, 1, 0)
204 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666, mq_attr
206 assert_equal mq_attr, @mq.attr
208 assert_raises(Errno::EAGAIN) { @mq.receive }
209 assert_raises(Errno::EMSGSIZE) { @mq << '..' }
210 assert_nothing_raised { @mq << '.' }
211 assert_equal [ '.', 0 ], @mq.receive
212 assert_nothing_raised { @mq << '.' }
213 assert_raises(Errno::EAGAIN) { @mq << '.' }
217 min_posix_mq_prio_max = 31 # defined by POSIX
218 assert POSIX_MQ::PRIO_MAX >= min_posix_mq_prio_max
222 assert POSIX_MQ::OPEN_MAX.kind_of?(Integer)