posix_mq 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +7 -0
- data/.gitignore +14 -0
- data/.manifest +24 -0
- data/COPYING +165 -0
- data/ChangeLog +7 -0
- data/Documentation/.gitignore +5 -0
- data/Documentation/GNUmakefile +30 -0
- data/Documentation/posix-mq.rb.1.txt +153 -0
- data/GIT-VERSION-FILE +1 -0
- data/GIT-VERSION-GEN +40 -0
- data/GNUmakefile +179 -0
- data/LICENSE +16 -0
- data/NEWS +4 -0
- data/README +70 -0
- data/Rakefile +159 -0
- data/bin/posix-mq.rb +138 -0
- data/ext/posix_mq/extconf.rb +9 -0
- data/ext/posix_mq/posix_mq.c +813 -0
- data/lib/posix_mq.rb +34 -0
- data/local.mk.sample +70 -0
- data/man/man1/posix-mq.rb.1 +187 -0
- data/posix_mq.gemspec +39 -0
- data/setup.rb +1586 -0
- data/test/test_posix_mq.rb +225 -0
- metadata +88 -0
@@ -0,0 +1,225 @@
|
|
1
|
+
# -*- encoding: binary -*-
|
2
|
+
require 'test/unit'
|
3
|
+
require 'posix_mq'
|
4
|
+
require 'fcntl'
|
5
|
+
$stderr.sync = $stdout.sync = true
|
6
|
+
|
7
|
+
class Test_POSIX_MQ < Test::Unit::TestCase
|
8
|
+
|
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}"
|
11
|
+
false
|
12
|
+
else
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup
|
17
|
+
@mq = nil
|
18
|
+
@path = "/posix_mq.rb.#{Time.now.to_i}.#$$.#{rand}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def teardown
|
22
|
+
@mq or return
|
23
|
+
assert_equal @mq, @mq.unlink
|
24
|
+
assert ! @mq.closed?
|
25
|
+
assert_nil @mq.close
|
26
|
+
assert @mq.closed?
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_timed_receive
|
30
|
+
interval = 0.01
|
31
|
+
@mq = POSIX_MQ.new(@path, :rw)
|
32
|
+
assert ! @mq.nonblock?
|
33
|
+
t0 = Time.now
|
34
|
+
assert_raises(Errno::ETIMEDOUT) { @mq.receive "", interval }
|
35
|
+
elapsed = Time.now - t0
|
36
|
+
assert elapsed > interval
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_timed_send
|
40
|
+
interval = 0.01
|
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 }
|
44
|
+
t0 = Time.now
|
45
|
+
assert_raises(Errno::ETIMEDOUT) { @mq.send "B", 1, interval }
|
46
|
+
elapsed = Time.now - t0
|
47
|
+
assert elapsed > interval
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_open
|
51
|
+
POSIX_MQ.open(@path, IO::CREAT|IO::WRONLY, 0666) do |mq|
|
52
|
+
@mq = 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
|
57
|
+
assert_nil mq.close
|
58
|
+
assert_raises(IOError) { mq.close }
|
59
|
+
end
|
60
|
+
assert @mq.closed?
|
61
|
+
@mq = nil
|
62
|
+
POSIX_MQ.unlink(@path)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_name
|
66
|
+
path = "" << @path.dup
|
67
|
+
path.freeze
|
68
|
+
@mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
|
69
|
+
assert_equal path, @mq.name
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_new_readonly
|
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
|
76
|
+
assert_nil rd.close
|
77
|
+
end
|
78
|
+
|
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
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_send0_chain
|
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
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_send_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
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_send_receive_buf
|
99
|
+
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
|
104
|
+
end
|
105
|
+
|
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
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_getattr
|
113
|
+
@mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
|
114
|
+
mq_attr = @mq.attr
|
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)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_to_io
|
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) }
|
126
|
+
end if HAVE_TO_IO
|
127
|
+
|
128
|
+
def test_notify
|
129
|
+
rd, wr = IO.pipe
|
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 }
|
140
|
+
ensure
|
141
|
+
trap(:USR1, orig)
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_setattr
|
145
|
+
@mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
|
146
|
+
mq_attr = POSIX_MQ::Attr.new(IO::NONBLOCK)
|
147
|
+
@mq.attr = mq_attr
|
148
|
+
assert_equal IO::NONBLOCK, @mq.attr.flags
|
149
|
+
assert mq_attr.flags.kind_of?(Integer)
|
150
|
+
|
151
|
+
mq_attr.flags = 0
|
152
|
+
@mq.attr = mq_attr
|
153
|
+
assert_equal 0, @mq.attr.flags
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_new_nonblocking
|
157
|
+
@mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY|IO::NONBLOCK, 0666
|
158
|
+
assert @mq.nonblock?
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_new_blocking
|
162
|
+
@mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
|
163
|
+
assert ! @mq.nonblock?
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_nonblock_toggle
|
167
|
+
@mq = POSIX_MQ.new @path, IO::CREAT|IO::WRONLY, 0666
|
168
|
+
assert ! @mq.nonblock?
|
169
|
+
@mq.nonblock = true
|
170
|
+
assert @mq.nonblock?
|
171
|
+
@mq.nonblock = false
|
172
|
+
assert ! @mq.nonblock?
|
173
|
+
assert_raises(ArgumentError) { @mq.nonblock = nil }
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_new_sym_w
|
177
|
+
@mq = POSIX_MQ.new @path, :w
|
178
|
+
assert_equal IO::WRONLY, @mq.to_io.fcntl(Fcntl::F_GETFL)
|
179
|
+
end if HAVE_TO_IO
|
180
|
+
|
181
|
+
def test_new_sym_r
|
182
|
+
@mq = POSIX_MQ.new @path, :w
|
183
|
+
mq = nil
|
184
|
+
assert_nothing_raised { mq = POSIX_MQ.new @path, :r }
|
185
|
+
assert_equal IO::RDONLY, mq.to_io.fcntl(Fcntl::F_GETFL)
|
186
|
+
assert_nil mq.close
|
187
|
+
end if HAVE_TO_IO
|
188
|
+
|
189
|
+
def test_new_path_only
|
190
|
+
@mq = POSIX_MQ.new @path, :w
|
191
|
+
mq = nil
|
192
|
+
assert_nothing_raised { mq = POSIX_MQ.new @path }
|
193
|
+
assert_equal IO::RDONLY, mq.to_io.fcntl(Fcntl::F_GETFL)
|
194
|
+
assert_nil mq.close
|
195
|
+
end if HAVE_TO_IO
|
196
|
+
|
197
|
+
def test_new_sym_wr
|
198
|
+
@mq = POSIX_MQ.new @path, :rw
|
199
|
+
assert_equal IO::RDWR, @mq.to_io.fcntl(Fcntl::F_GETFL)
|
200
|
+
end if HAVE_TO_IO
|
201
|
+
|
202
|
+
def test_new_attr
|
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
|
205
|
+
assert @mq.nonblock?
|
206
|
+
assert_equal mq_attr, @mq.attr
|
207
|
+
|
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 << '.' }
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_prio_max
|
217
|
+
min_posix_mq_prio_max = 31 # defined by POSIX
|
218
|
+
assert POSIX_MQ::PRIO_MAX >= min_posix_mq_prio_max
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_open_max
|
222
|
+
assert POSIX_MQ::OPEN_MAX.kind_of?(Integer)
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: posix_mq
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ruby POSIX MQ hackers
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-01-02 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: |-
|
17
|
+
POSIX message queues allow local processes to exchange data in the form
|
18
|
+
of messages. This API is distinct from that provided by System V
|
19
|
+
message queues, but provides similar functionality.
|
20
|
+
email: ruby.posix.mq@librelist.com
|
21
|
+
executables:
|
22
|
+
- posix-mq.rb
|
23
|
+
extensions:
|
24
|
+
- ext/posix_mq/extconf.rb
|
25
|
+
extra_rdoc_files:
|
26
|
+
- README
|
27
|
+
- LICENSE
|
28
|
+
- NEWS
|
29
|
+
- ChangeLog
|
30
|
+
- lib/posix_mq.rb
|
31
|
+
- ext/posix_mq/posix_mq.c
|
32
|
+
files:
|
33
|
+
- .document
|
34
|
+
- .gitignore
|
35
|
+
- .manifest
|
36
|
+
- COPYING
|
37
|
+
- ChangeLog
|
38
|
+
- Documentation/.gitignore
|
39
|
+
- Documentation/GNUmakefile
|
40
|
+
- Documentation/posix-mq.rb.1.txt
|
41
|
+
- GIT-VERSION-FILE
|
42
|
+
- GIT-VERSION-GEN
|
43
|
+
- GNUmakefile
|
44
|
+
- LICENSE
|
45
|
+
- NEWS
|
46
|
+
- README
|
47
|
+
- Rakefile
|
48
|
+
- bin/posix-mq.rb
|
49
|
+
- ext/posix_mq/extconf.rb
|
50
|
+
- ext/posix_mq/posix_mq.c
|
51
|
+
- lib/posix_mq.rb
|
52
|
+
- local.mk.sample
|
53
|
+
- man/man1/posix-mq.rb.1
|
54
|
+
- posix_mq.gemspec
|
55
|
+
- setup.rb
|
56
|
+
- test/test_posix_mq.rb
|
57
|
+
has_rdoc: true
|
58
|
+
homepage: http://bogomips.org/ruby_posix_mq/
|
59
|
+
licenses: []
|
60
|
+
|
61
|
+
post_install_message:
|
62
|
+
rdoc_options:
|
63
|
+
- -Na
|
64
|
+
- -t
|
65
|
+
- posix_mq - POSIX Message Queues for Ruby
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
version:
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: "0"
|
79
|
+
version:
|
80
|
+
requirements: []
|
81
|
+
|
82
|
+
rubyforge_project: qrp
|
83
|
+
rubygems_version: 1.3.5
|
84
|
+
signing_key:
|
85
|
+
specification_version: 3
|
86
|
+
summary: POSIX Message Queues for Ruby
|
87
|
+
test_files:
|
88
|
+
- test/test_posix_mq.rb
|