1 # -*- encoding: binary -*-
6 $stderr.sync = $stdout.sync = true
8 class Test_POSIX_MQ < Test::Unit::TestCase
10 HAVE_TO_IO = if POSIX_MQ.instance_methods.grep(/\Ato_io\z/).empty?
11 warn "POSIX_MQ#to_io not supported on this platform: #{RUBY_PLATFORM}"
19 @path = "/posix_mq.rb.#{Time.now.to_i}.#$$.#{rand}"
24 assert_equal @mq, @mq.unlink
30 def test_timed_receive
32 @mq = POSIX_MQ.new(@path, :rw)
33 assert ! @mq.nonblock?
35 assert_raises(Errno::ETIMEDOUT) { @mq.receive "", interval }
36 elapsed = Time.now - t0
37 assert elapsed > interval
42 @mq = POSIX_MQ.new(@path, :rw, 0666, POSIX_MQ::Attr[0, 1, 1, 0])
43 assert ! @mq.nonblock?
44 assert_nothing_raised { @mq.send "A", 1, interval }
46 assert_raises(Errno::ETIMEDOUT) { @mq.send "B", 1, interval }
47 elapsed = Time.now - t0
48 assert elapsed > interval
52 POSIX_MQ.open(@path, IO::CREAT|IO::WRONLY, 0666) do |mq|
54 assert mq.kind_of?(POSIX_MQ)
55 assert_equal @path, mq.name
56 assert_nil mq.send("HI", 0)
57 assert_equal 1, mq.attr.curmsgs
59 assert_raises(IOError) { mq.close }
63 POSIX_MQ.unlink(@path)
67 path = "" << @path.dup
69 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
70 assert_equal path, @mq.name
74 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
75 rd = POSIX_MQ.new @path, IO::RDONLY
76 assert_equal @mq.name, rd.name
80 def test_send0_receive
81 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
82 assert_equal(@mq, @mq << "hello")
83 assert_equal [ "hello", 0 ], @mq.receive
87 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
88 @mq << "hello" << "world"
89 assert_equal [ "hello", 0 ], @mq.receive
90 assert_equal [ "world", 0 ], @mq.receive
94 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
95 assert_nil @mq.send("hello", 0)
96 assert_equal [ "hello", 0 ], @mq.receive
99 def test_send_receive_buf
101 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
102 assert_nil @mq.send("hello", 0)
103 assert_equal [ "hello", 0 ], @mq.receive(buf)
104 assert_equal "hello", buf
107 def test_send_receive_prio
108 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
109 assert_nil @mq.send("hello", 2)
110 assert_equal [ "hello", 2 ], @mq.receive
114 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
116 assert_equal POSIX_MQ::Attr, mq_attr.class
117 assert mq_attr.flags.kind_of?(Integer)
118 assert mq_attr.maxmsg.kind_of?(Integer)
119 assert mq_attr.msgsize.kind_of?(Integer)
120 assert mq_attr.curmsgs.kind_of?(Integer)
124 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
125 assert @mq.to_io.kind_of?(IO)
126 assert_nothing_raised { IO.select([@mq], nil, nil, 0) }
131 orig = trap(:USR1) { wr.syswrite('.') }
132 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
133 assert_nothing_raised { @mq.notify = :SIGUSR1 }
134 assert_nothing_raised { @mq.send("hello", 0) }
135 assert_equal [[rd], [], []], IO.select([rd], nil, nil, 10)
136 assert_equal '.', rd.sysread(1)
137 assert_nil(@mq.notify = nil)
138 assert_nothing_raised { @mq.send("hello", 0) }
139 assert_nil IO.select([rd], nil, nil, 0.1)
145 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666
146 assert_nothing_raised { @mq.notify = false }
157 _, status = Process.waitpid2(pid)
158 assert status.success?, status.inspect
162 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
163 mq_attr = POSIX_MQ::Attr.new(IO::NONBLOCK)
165 assert_equal IO::NONBLOCK, @mq.attr.flags
166 assert mq_attr.flags.kind_of?(Integer)
170 assert_equal 0, @mq.attr.flags
173 def test_new_nonblocking
174 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY|IO::NONBLOCK, 0666
178 def test_new_blocking
179 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
180 assert ! @mq.nonblock?
183 def test_nonblock_toggle
184 @mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
185 assert ! @mq.nonblock?
189 assert ! @mq.nonblock?
190 assert_raises(ArgumentError) { @mq.nonblock = nil }
194 @mq = POSIX_MQ.new @path, :w
195 assert_equal IO::WRONLY, @mq.to_io.fcntl(Fcntl::F_GETFL)
199 @mq = POSIX_MQ.new @path, :w
201 assert_nothing_raised { mq = POSIX_MQ.new @path, :r }
202 assert_equal IO::RDONLY, mq.to_io.fcntl(Fcntl::F_GETFL)
206 def test_new_path_only
207 @mq = POSIX_MQ.new @path, :w
209 assert_nothing_raised { mq = POSIX_MQ.new @path }
210 assert_equal IO::RDONLY, mq.to_io.fcntl(Fcntl::F_GETFL)
215 @mq = POSIX_MQ.new @path, :rw
216 assert_equal IO::RDWR, @mq.to_io.fcntl(Fcntl::F_GETFL)
220 mq_attr = POSIX_MQ::Attr.new(IO::NONBLOCK, 1, 1, 0)
221 @mq = POSIX_MQ.new @path, IO::CREAT|IO::RDWR, 0666, mq_attr
223 assert_equal mq_attr, @mq.attr
225 assert_raises(Errno::EAGAIN) { @mq.receive }
226 assert_raises(Errno::EMSGSIZE) { @mq << '..' }
227 assert_nothing_raised { @mq << '.' }
228 assert_equal [ '.', 0 ], @mq.receive
229 assert_nothing_raised { @mq << '.' }
230 assert_raises(Errno::EAGAIN) { @mq << '.' }
234 min_posix_mq_prio_max = 31 # defined by POSIX
235 assert POSIX_MQ::PRIO_MAX >= min_posix_mq_prio_max
239 assert POSIX_MQ::OPEN_MAX.kind_of?(Integer)
242 def test_notify_block_replace
244 @mq = POSIX_MQ.new(@path, :rw)
245 assert_nothing_raised { @mq.notify { |mq| q << mq } }
247 assert_equal POSIX_MQ, q.pop.class
248 assert_equal "hi", @mq.receive.first
249 assert_nothing_raised { @mq.notify { |mq| q << "hi" } }
251 assert_equal "hi", q.pop
254 def test_notify_thread
256 @mq = POSIX_MQ.new(@path, :rw)
257 @mq.notify_thread = thr = Thread.new { sleep }
259 @mq.notify { |mq| q << Thread.current }
262 assert x.instance_of?(Thread)
263 assert Thread.current != x