ffi-rzmq 1.0.3 → 2.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +5 -6
- data/AUTHORS.txt +7 -1
- data/History.txt +79 -0
- data/README.rdoc +67 -29
- data/Rakefile +15 -0
- data/examples/README.rdoc +1 -3
- data/examples/{v3api/latency_measurement.rb → latency_measurement.rb} +1 -2
- data/examples/{v3api/local_lat.rb → local_lat.rb} +1 -1
- data/examples/{v3api/local_lat_poll.rb → local_lat_poll.rb} +4 -4
- data/examples/{v3api/local_throughput.rb → local_throughput.rb} +1 -1
- data/examples/{v3api/pub.rb → pub.rb} +1 -1
- data/examples/{v2api/publish_subscribe.rb → publish_subscribe.rb} +2 -2
- data/examples/{v2api/remote_lat.rb → remote_lat.rb} +1 -1
- data/examples/{v3api/remote_throughput.rb → remote_throughput.rb} +4 -3
- data/examples/repreq_over_curve.rb +60 -0
- data/examples/{v2api/reqrep_poll.rb → reqrep_poll.rb} +3 -4
- data/examples/{v2api/request_response.rb → request_response.rb} +1 -2
- data/examples/{v3api/sub.rb → sub.rb} +1 -2
- data/examples/{v3api/throughput_measurement.rb → throughput_measurement.rb} +1 -1
- data/examples/{v3api/xreqxrep_poll.rb → xreqxrep_poll.rb} +6 -7
- data/ffi-rzmq.gemspec +4 -4
- data/lib/ffi-rzmq/context.rb +26 -54
- data/lib/ffi-rzmq/device.rb +8 -4
- data/lib/ffi-rzmq/exceptions.rb +3 -0
- data/lib/ffi-rzmq/message.rb +24 -30
- data/lib/ffi-rzmq/poll.rb +5 -16
- data/lib/ffi-rzmq/poll_item.rb +0 -1
- data/lib/ffi-rzmq/socket.rb +132 -282
- data/lib/ffi-rzmq/util.rb +28 -36
- data/lib/ffi-rzmq/version.rb +1 -1
- data/lib/ffi-rzmq.rb +3 -3
- data/lib/io_extensions.rb +1 -1
- data/spec/context_spec.rb +18 -23
- data/spec/device_spec.rb +13 -12
- data/spec/message_spec.rb +13 -13
- data/spec/multipart_spec.rb +11 -11
- data/spec/nonblocking_recv_spec.rb +22 -22
- data/spec/poll_spec.rb +49 -49
- data/spec/pushpull_spec.rb +12 -11
- data/spec/reqrep_spec.rb +11 -11
- data/spec/socket_spec.rb +110 -197
- data/spec/spec_helper.rb +3 -11
- data/spec/support/generate_keys_and_certs.rb +41 -0
- data/spec/support/test.crt +26 -13
- data/spec/support/test.key +49 -13
- data/spec/util_spec.rb +29 -0
- data/travis_build_script.sh +27 -0
- metadata +83 -104
- data/examples/v2api/latency_measurement.rb +0 -139
- data/examples/v2api/local_lat.rb +0 -58
- data/examples/v2api/local_lat_poll.rb +0 -66
- data/examples/v2api/local_throughput.rb +0 -58
- data/examples/v2api/pub.rb +0 -46
- data/examples/v2api/remote_throughput.rb +0 -39
- data/examples/v2api/sub.rb +0 -74
- data/examples/v2api/throughput_measurement.rb +0 -138
- data/examples/v2api/xreqxrep_poll.rb +0 -93
- data/examples/v3api/publish_subscribe.rb +0 -82
- data/examples/v3api/remote_lat.rb +0 -71
- data/examples/v3api/reqrep_poll.rb +0 -62
- data/examples/v3api/request_response.rb +0 -40
- data/lib/ffi-rzmq/constants.rb +0 -187
- data/lib/ffi-rzmq/libc.rb +0 -19
- data/lib/ffi-rzmq/libzmq.rb +0 -283
data/spec/poll_spec.rb
CHANGED
@@ -8,7 +8,7 @@ module ZMQ
|
|
8
8
|
include APIHelper
|
9
9
|
|
10
10
|
it "should allocate a PollItems instance" do
|
11
|
-
PollItems.
|
11
|
+
expect(PollItems).to receive(:new)
|
12
12
|
Poller.new
|
13
13
|
end
|
14
14
|
|
@@ -23,30 +23,30 @@ module ZMQ
|
|
23
23
|
let(:fd) { 1 }
|
24
24
|
|
25
25
|
it "returns false when given a nil pollable" do
|
26
|
-
poller.register(nil, ZMQ::POLLIN).
|
26
|
+
expect(poller.register(nil, ZMQ::POLLIN)).to be_falsy
|
27
27
|
end
|
28
28
|
|
29
29
|
it "returns false when given 0 for +events+ (e.g. no registration)" do
|
30
|
-
poller.register(pollable, 0).
|
30
|
+
expect(poller.register(pollable, 0)).to be_falsy
|
31
31
|
end
|
32
32
|
|
33
33
|
it "returns the default registered event value when given a valid pollable" do
|
34
|
-
poller.register(pollable).
|
34
|
+
expect(poller.register(pollable)).to eq(ZMQ::POLLIN | ZMQ::POLLOUT)
|
35
35
|
end
|
36
36
|
|
37
37
|
it "returns the registered event value when given a pollable responding to socket (ZMQ::Socket)" do
|
38
|
-
pollable.
|
39
|
-
poller.register(pollable, ZMQ::POLLIN).
|
38
|
+
expect(pollable).to receive(:socket).and_return(socket)
|
39
|
+
expect(poller.register(pollable, ZMQ::POLLIN)).to eq ZMQ::POLLIN
|
40
40
|
end
|
41
41
|
|
42
42
|
it "returns the registered event value when given a pollable responding to file descriptor (IO, BasicSocket)" do
|
43
|
-
pollable.
|
44
|
-
poller.register(pollable, ZMQ::POLLIN).
|
43
|
+
expect(pollable).to receive(:posix_fileno).and_return(fd)
|
44
|
+
expect(poller.register(pollable, ZMQ::POLLIN)).to eq(ZMQ::POLLIN)
|
45
45
|
end
|
46
46
|
|
47
47
|
it "returns the registered event value when given a pollable responding to io (SSLSocket)" do
|
48
|
-
pollable.
|
49
|
-
poller.register(pollable, ZMQ::POLLIN).
|
48
|
+
expect(pollable).to receive(:io).and_return(io)
|
49
|
+
expect(poller.register(pollable, ZMQ::POLLIN)).to eq(ZMQ::POLLIN)
|
50
50
|
end
|
51
51
|
|
52
52
|
end
|
@@ -60,49 +60,49 @@ module ZMQ
|
|
60
60
|
let(:fd) { 1 }
|
61
61
|
|
62
62
|
it "returns true when deregistered pollable from event" do
|
63
|
-
pollable.
|
63
|
+
expect(pollable).to receive(:socket).at_least(:once).and_return(socket)
|
64
64
|
poller.register(pollable)
|
65
|
-
poller.deregister(pollable, ZMQ::POLLIN).
|
65
|
+
expect(poller.deregister(pollable, ZMQ::POLLIN)).to eq(true)
|
66
66
|
end
|
67
67
|
|
68
68
|
it "returns false when pollable not registered" do
|
69
|
-
poller.deregister(pollable, ZMQ::POLLIN).
|
69
|
+
expect(poller.deregister(pollable, ZMQ::POLLIN)).to eq(false)
|
70
70
|
end
|
71
71
|
|
72
72
|
it "returns false when pollable not registered for deregistered event" do
|
73
|
-
pollable.
|
73
|
+
expect(pollable).to receive(:socket).at_least(:once).and_return(socket)
|
74
74
|
poller.register(pollable, ZMQ::POLLOUT)
|
75
|
-
poller.deregister(pollable, ZMQ::POLLIN).
|
75
|
+
expect(poller.deregister(pollable, ZMQ::POLLIN)).to eq(false)
|
76
76
|
end
|
77
77
|
|
78
78
|
it "deletes pollable when no events left" do
|
79
79
|
poller.register(pollable, ZMQ::POLLIN)
|
80
|
-
poller.deregister(pollable, ZMQ::POLLIN).
|
81
|
-
poller.size.
|
80
|
+
expect(poller.deregister(pollable, ZMQ::POLLIN)).to eq(true)
|
81
|
+
expect(poller.size).to eq 0
|
82
82
|
end
|
83
83
|
|
84
84
|
it "deletes closed pollable responding to socket (ZMQ::Socket)" do
|
85
|
-
pollable.
|
85
|
+
expect(pollable).to receive(:socket).and_return(socket)
|
86
86
|
poller.register(pollable)
|
87
|
-
pollable.
|
88
|
-
poller.deregister(pollable, ZMQ::POLLIN).
|
89
|
-
poller.size.
|
87
|
+
expect(pollable).to receive(:socket).and_return(nil)
|
88
|
+
expect(poller.deregister(pollable, ZMQ::POLLIN)).to eq(true)
|
89
|
+
expect(poller.size).to eq 0
|
90
90
|
end
|
91
91
|
|
92
92
|
it "deletes closed pollable responding to fileno (IO, BasicSocket)" do
|
93
|
-
pollable.
|
93
|
+
expect(pollable).to receive(:posix_fileno).and_return(fd)
|
94
94
|
poller.register(pollable)
|
95
|
-
pollable.
|
96
|
-
poller.deregister(pollable, ZMQ::POLLIN).
|
97
|
-
poller.size.
|
95
|
+
expect(pollable).to receive(:closed?).and_return(true)
|
96
|
+
expect(poller.deregister(pollable, ZMQ::POLLIN)).to eq(true)
|
97
|
+
expect(poller.size).to eq 0
|
98
98
|
end
|
99
99
|
|
100
100
|
it "deletes closed pollable responding to io (SSLSocket)" do
|
101
|
-
pollable.
|
101
|
+
expect(pollable).to receive(:io).at_least(:once).and_return(io)
|
102
102
|
poller.register(pollable)
|
103
|
-
io.
|
104
|
-
poller.deregister(pollable, ZMQ::POLLIN).
|
105
|
-
poller.size.
|
103
|
+
expect(io).to receive(:closed?).and_return(true)
|
104
|
+
expect(poller.deregister(pollable, ZMQ::POLLIN)).to eq(true)
|
105
|
+
expect(poller.size).to eq 0
|
106
106
|
end
|
107
107
|
|
108
108
|
end
|
@@ -123,7 +123,7 @@ module ZMQ
|
|
123
123
|
end
|
124
124
|
|
125
125
|
it "should return false for an unregistered socket (i.e. not found)" do
|
126
|
-
@poller.delete(@socket).
|
126
|
+
expect(@poller.delete(@socket)).to eq(false)
|
127
127
|
end
|
128
128
|
|
129
129
|
it "returns true for a sucessfully deleted socket when only 1 is registered" do
|
@@ -131,7 +131,7 @@ module ZMQ
|
|
131
131
|
socket1.setsockopt(LINGER, 0)
|
132
132
|
|
133
133
|
@poller.register socket1
|
134
|
-
@poller.delete(socket1).
|
134
|
+
expect(@poller.delete(socket1)).to eq(true)
|
135
135
|
socket1.close
|
136
136
|
end
|
137
137
|
|
@@ -143,7 +143,7 @@ module ZMQ
|
|
143
143
|
|
144
144
|
@poller.register socket1
|
145
145
|
@poller.register socket2
|
146
|
-
@poller.delete(socket2).
|
146
|
+
expect(@poller.delete(socket2)).to eq(true)
|
147
147
|
socket1.close
|
148
148
|
socket2.close
|
149
149
|
end
|
@@ -154,7 +154,7 @@ module ZMQ
|
|
154
154
|
|
155
155
|
@poller.register socket1
|
156
156
|
socket1.close
|
157
|
-
@poller.delete(socket1).
|
157
|
+
expect(@poller.delete(socket1)).to eq(true)
|
158
158
|
end
|
159
159
|
|
160
160
|
end
|
@@ -177,12 +177,12 @@ module ZMQ
|
|
177
177
|
after(:each) { @sockets.each(&:close) }
|
178
178
|
|
179
179
|
it "returns 0 when there are no sockets to poll" do
|
180
|
-
@poller.poll(100).
|
180
|
+
expect(@poller.poll(100)).to eq 0
|
181
181
|
end
|
182
182
|
|
183
183
|
it "returns 0 when there is a single socket to poll and no events" do
|
184
184
|
@poller.register(@sockets.first, 0)
|
185
|
-
@poller.poll(100).
|
185
|
+
expect(@poller.poll(100)).to eq 0
|
186
186
|
end
|
187
187
|
|
188
188
|
it "returns 1 when there is a read event on a socket" do
|
@@ -190,7 +190,7 @@ module ZMQ
|
|
190
190
|
@poller.register_readable(last)
|
191
191
|
|
192
192
|
first.send_string('test')
|
193
|
-
@poller.poll(1000).
|
193
|
+
expect(@poller.poll(1000)).to eq 1
|
194
194
|
end
|
195
195
|
|
196
196
|
it "returns 1 when there is a read event on one socket and the second socket has been removed from polling" do
|
@@ -200,7 +200,7 @@ module ZMQ
|
|
200
200
|
|
201
201
|
first.send_string('test')
|
202
202
|
@poller.deregister_writable(first)
|
203
|
-
@poller.poll(1000).
|
203
|
+
expect(@poller.poll(1000)).to eq 1
|
204
204
|
end
|
205
205
|
|
206
206
|
it "works with BasiSocket" do
|
@@ -214,12 +214,12 @@ module ZMQ
|
|
214
214
|
|
215
215
|
client.send("message", 0)
|
216
216
|
|
217
|
-
@poller.poll.
|
218
|
-
@poller.readables.
|
219
|
-
@poller.writables.
|
217
|
+
expect(@poller.poll).to eq 2
|
218
|
+
expect(@poller.readables).to eq [s]
|
219
|
+
expect(@poller.writables).to eq [client]
|
220
220
|
|
221
221
|
msg = s.read_nonblock(7)
|
222
|
-
msg.
|
222
|
+
expect(msg).to eq "message"
|
223
223
|
end
|
224
224
|
|
225
225
|
it "works with IO objects" do
|
@@ -229,12 +229,12 @@ module ZMQ
|
|
229
229
|
|
230
230
|
w.write("message")
|
231
231
|
|
232
|
-
@poller.poll.
|
233
|
-
@poller.readables.
|
234
|
-
@poller.writables.
|
232
|
+
expect(@poller.poll).to eq 2
|
233
|
+
expect(@poller.readables).to eq [r]
|
234
|
+
expect(@poller.writables).to eq [w]
|
235
235
|
|
236
236
|
msg = r.read(7)
|
237
|
-
msg.
|
237
|
+
expect(msg).to eq "message"
|
238
238
|
end
|
239
239
|
|
240
240
|
it "works with SSLSocket" do
|
@@ -262,12 +262,12 @@ module ZMQ
|
|
262
262
|
|
263
263
|
client.write("message")
|
264
264
|
|
265
|
-
@poller.poll.
|
266
|
-
@poller.readables.
|
267
|
-
@poller.writables.
|
265
|
+
expect(@poller.poll).to eq 2
|
266
|
+
expect(@poller.readables).to eq [s]
|
267
|
+
expect(@poller.writables).to eq [client]
|
268
268
|
|
269
269
|
msg = s.read(7)
|
270
|
-
msg.
|
270
|
+
expect(msg).to eq "message"
|
271
271
|
end
|
272
272
|
end
|
273
273
|
|
data/spec/pushpull_spec.rb
CHANGED
@@ -35,7 +35,7 @@ module ZMQ
|
|
35
35
|
received = ''
|
36
36
|
rc = @pull.recv_string received
|
37
37
|
assert_ok(rc)
|
38
|
-
received.
|
38
|
+
expect(received).to eq(string)
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should receive an exact string copy of the message sent when receiving in non-blocking mode and using Message objects directly" do
|
@@ -44,12 +44,12 @@ module ZMQ
|
|
44
44
|
|
45
45
|
poll_it_for_read(@pull) do
|
46
46
|
rc = @push.sendmsg sent_message
|
47
|
-
|
47
|
+
expect(rc).to eq(string.size)
|
48
48
|
end
|
49
49
|
|
50
|
-
rc = @pull.recvmsg received_message, ZMQ::
|
51
|
-
|
52
|
-
received_message.copy_out_string.
|
50
|
+
rc = @pull.recvmsg received_message, ZMQ::DONTWAIT
|
51
|
+
expect(rc).to eq(string.size)
|
52
|
+
expect(received_message.copy_out_string).to eq(string)
|
53
53
|
end
|
54
54
|
|
55
55
|
|
@@ -71,20 +71,21 @@ module ZMQ
|
|
71
71
|
sockets << @pull
|
72
72
|
|
73
73
|
sockets.each do |socket|
|
74
|
-
|
74
|
+
thr = Thread.new do
|
75
75
|
buffer = ''
|
76
76
|
rc = socket.recv_string buffer
|
77
|
-
|
77
|
+
expect(rc).to eq(buffer.size)
|
78
78
|
mutex.synchronize { received << buffer }
|
79
79
|
socket.close
|
80
80
|
end
|
81
|
+
threads << thr
|
81
82
|
end
|
82
|
-
|
83
|
+
|
83
84
|
count.times { @push.send_string(string) }
|
84
85
|
|
85
86
|
threads.each {|t| t.join}
|
86
87
|
|
87
|
-
received.find_all {|r| r == string}.length.
|
88
|
+
expect(received.find_all {|r| r == string}.length).to eq(count)
|
88
89
|
end
|
89
90
|
|
90
91
|
it "should receive a single message for each message sent when using a single shared socket protected by a mutex" do
|
@@ -98,7 +99,7 @@ module ZMQ
|
|
98
99
|
buffer = ''
|
99
100
|
rc = 0
|
100
101
|
mutex.synchronize { rc = @pull.recv_string buffer }
|
101
|
-
|
102
|
+
expect(rc).to eq(buffer.size)
|
102
103
|
mutex.synchronize { received << buffer }
|
103
104
|
end
|
104
105
|
end
|
@@ -107,7 +108,7 @@ module ZMQ
|
|
107
108
|
|
108
109
|
threads.each {|t| t.join}
|
109
110
|
|
110
|
-
received.find_all {|r| r == string}.length.
|
111
|
+
expect(received.find_all {|r| r == string}.length).to eq(count)
|
111
112
|
end
|
112
113
|
|
113
114
|
end # @context ping-pong
|
data/spec/reqrep_spec.rb
CHANGED
@@ -40,25 +40,25 @@ module ZMQ
|
|
40
40
|
|
41
41
|
it "should receive an exact string copy of the string message sent" do
|
42
42
|
rc, received_message = send_ping(string)
|
43
|
-
received_message.
|
43
|
+
expect(received_message).to eq(string)
|
44
44
|
end
|
45
45
|
|
46
46
|
it "should generate a EFSM error when sending via the REQ socket twice in a row without an intervening receive operation" do
|
47
47
|
send_ping(string)
|
48
48
|
rc = @ping.send_string(string)
|
49
|
-
rc.
|
50
|
-
Util.errno.
|
49
|
+
expect(rc).to eq(-1)
|
50
|
+
expect(Util.errno).to eq(ZMQ::EFSM)
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should receive an exact copy of the sent message using Message objects directly" do
|
54
54
|
received_message = Message.new
|
55
55
|
|
56
56
|
rc = @ping.sendmsg(Message.new(string))
|
57
|
-
|
57
|
+
expect(rc).to eq(string.size)
|
58
58
|
rc = @pong.recvmsg received_message
|
59
|
-
|
59
|
+
expect(rc).to eq(string.size)
|
60
60
|
|
61
|
-
received_message.copy_out_string.
|
61
|
+
expect(received_message.copy_out_string).to eq(string)
|
62
62
|
end
|
63
63
|
|
64
64
|
it "should receive an exact copy of the sent message using Message objects directly in non-blocking mode" do
|
@@ -66,14 +66,14 @@ module ZMQ
|
|
66
66
|
received_message = Message.new
|
67
67
|
|
68
68
|
poll_it_for_read(@pong) do
|
69
|
-
rc = @ping.sendmsg(Message.new(string), ZMQ::
|
70
|
-
|
69
|
+
rc = @ping.sendmsg(Message.new(string), ZMQ::DONTWAIT)
|
70
|
+
expect(rc).to eq(string.size)
|
71
71
|
end
|
72
72
|
|
73
|
-
rc = @pong.recvmsg received_message, ZMQ::
|
74
|
-
|
73
|
+
rc = @pong.recvmsg received_message, ZMQ::DONTWAIT
|
74
|
+
expect(rc).to eq(string.size)
|
75
75
|
|
76
|
-
received_message.copy_out_string.
|
76
|
+
expect(received_message.copy_out_string).to eq(string)
|
77
77
|
end
|
78
78
|
|
79
79
|
end # context ping-pong
|