rbczmq 0.1
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/.gitignore +23 -0
- data/.travis.yml +19 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +19 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +247 -0
- data/Rakefile +67 -0
- data/examples/loop.rb +109 -0
- data/examples/poller.rb +37 -0
- data/examples/pub_sub.rb +101 -0
- data/examples/push_pull.rb +104 -0
- data/examples/req_rep.rb +100 -0
- data/ext/czmq.tar.gz +0 -0
- data/ext/rbczmq/context.c +280 -0
- data/ext/rbczmq/context.h +26 -0
- data/ext/rbczmq/extconf.rb +138 -0
- data/ext/rbczmq/frame.c +401 -0
- data/ext/rbczmq/frame.h +24 -0
- data/ext/rbczmq/jruby.h +22 -0
- data/ext/rbczmq/loop.c +413 -0
- data/ext/rbczmq/loop.h +24 -0
- data/ext/rbczmq/message.c +620 -0
- data/ext/rbczmq/message.h +24 -0
- data/ext/rbczmq/poller.c +308 -0
- data/ext/rbczmq/poller.h +29 -0
- data/ext/rbczmq/pollitem.c +251 -0
- data/ext/rbczmq/pollitem.h +25 -0
- data/ext/rbczmq/rbczmq_ext.c +198 -0
- data/ext/rbczmq/rbczmq_ext.h +94 -0
- data/ext/rbczmq/rbczmq_prelude.h +22 -0
- data/ext/rbczmq/rubinius.h +24 -0
- data/ext/rbczmq/ruby18.h +43 -0
- data/ext/rbczmq/ruby19.h +15 -0
- data/ext/rbczmq/socket.c +1570 -0
- data/ext/rbczmq/socket.h +136 -0
- data/ext/rbczmq/timer.c +110 -0
- data/ext/rbczmq/timer.h +23 -0
- data/ext/zeromq.tar.gz +0 -0
- data/lib/rbczmq.rb +3 -0
- data/lib/zmq.rb +77 -0
- data/lib/zmq/context.rb +50 -0
- data/lib/zmq/default_handler.rb +16 -0
- data/lib/zmq/frame.rb +11 -0
- data/lib/zmq/handler.rb +76 -0
- data/lib/zmq/loop.rb +131 -0
- data/lib/zmq/message.rb +9 -0
- data/lib/zmq/poller.rb +22 -0
- data/lib/zmq/pollitem.rb +31 -0
- data/lib/zmq/socket.rb +125 -0
- data/lib/zmq/socket/dealer.rb +33 -0
- data/lib/zmq/socket/pair.rb +39 -0
- data/lib/zmq/socket/pub.rb +30 -0
- data/lib/zmq/socket/pull.rb +29 -0
- data/lib/zmq/socket/push.rb +32 -0
- data/lib/zmq/socket/rep.rb +37 -0
- data/lib/zmq/socket/req.rb +37 -0
- data/lib/zmq/socket/router.rb +38 -0
- data/lib/zmq/socket/sub.rb +27 -0
- data/lib/zmq/timer.rb +12 -0
- data/lib/zmq/version.rb +5 -0
- data/perf/pair.rb +7 -0
- data/perf/pair/local.rb +22 -0
- data/perf/pair/remote.rb +25 -0
- data/perf/pub_sub.rb +7 -0
- data/perf/pub_sub/local.rb +22 -0
- data/perf/pub_sub/remote.rb +25 -0
- data/perf/push_pull.rb +7 -0
- data/perf/push_pull/local.rb +21 -0
- data/perf/push_pull/remote.rb +25 -0
- data/perf/req_rep.rb +7 -0
- data/perf/req_rep/local.rb +35 -0
- data/perf/req_rep/remote.rb +28 -0
- data/perf/runner.rb +142 -0
- data/rbczmq.gemspec +22 -0
- data/test/helper.rb +21 -0
- data/test/socket/test_dealer_socket.rb +14 -0
- data/test/socket/test_pair_socket.rb +24 -0
- data/test/socket/test_pair_sockets.rb +74 -0
- data/test/socket/test_pub_socket.rb +17 -0
- data/test/socket/test_pub_sub_sockets.rb +87 -0
- data/test/socket/test_pull_socket.rb +17 -0
- data/test/socket/test_push_pull_sockets.rb +81 -0
- data/test/socket/test_push_socket.rb +17 -0
- data/test/socket/test_rep_socket.rb +25 -0
- data/test/socket/test_req_rep_sockets.rb +42 -0
- data/test/socket/test_req_socket.rb +27 -0
- data/test/socket/test_router_socket.rb +14 -0
- data/test/socket/test_routing.rb +66 -0
- data/test/socket/test_sub_socket.rb +17 -0
- data/test/test_context.rb +86 -0
- data/test/test_frame.rb +78 -0
- data/test/test_handler.rb +28 -0
- data/test/test_loop.rb +252 -0
- data/test/test_message.rb +201 -0
- data/test/test_poller.rb +154 -0
- data/test/test_pollitem.rb +78 -0
- data/test/test_socket.rb +403 -0
- data/test/test_threading.rb +34 -0
- data/test/test_timer.rb +37 -0
- data/test/test_zmq.rb +62 -0
- metadata +208 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'helper')
|
4
|
+
|
5
|
+
class TestPushSocket < ZmqTestCase
|
6
|
+
def test_behavior
|
7
|
+
ctx = ZMQ::Context.new
|
8
|
+
sock = ctx.socket(:PUSH)
|
9
|
+
assert_equal ZMQ::PUSH, sock.type
|
10
|
+
assert_equal "PUSH socket", sock.to_s
|
11
|
+
assert_raises ZMQ::Error do
|
12
|
+
sock.recv
|
13
|
+
end
|
14
|
+
ensure
|
15
|
+
ctx.destroy
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'helper')
|
4
|
+
|
5
|
+
class TestRepSocket < ZmqTestCase
|
6
|
+
def test_behavior
|
7
|
+
ctx = ZMQ::Context.new
|
8
|
+
sock = ctx.socket(:REP)
|
9
|
+
assert_equal ZMQ::REP, sock.type
|
10
|
+
assert_equal "REP socket", sock.to_s
|
11
|
+
ensure
|
12
|
+
ctx.destroy
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_flow
|
16
|
+
ctx = ZMQ::Context.new
|
17
|
+
sock = ctx.socket(:REP)
|
18
|
+
sock.bind("inproc://test.rep-sock-flow")
|
19
|
+
assert_raises ZMQ::Error do
|
20
|
+
sock.send_frame(ZMQ::Frame("frame"), ZMQ::Frame::MORE)
|
21
|
+
end
|
22
|
+
ensure
|
23
|
+
ctx.destroy
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'helper')
|
4
|
+
|
5
|
+
class TestReqRepSockets < ZmqTestCase
|
6
|
+
def test_flow
|
7
|
+
ctx = ZMQ::Context.new
|
8
|
+
rep = ctx.bind(:REP, "inproc://test.req-rep-flow")
|
9
|
+
ctx.connect(:REQ, "inproc://test.req-rep-flow")
|
10
|
+
begin
|
11
|
+
rep.send("message")
|
12
|
+
rescue ZMQ::Error => e
|
13
|
+
assert_match(/REP sockets allows only an alternating sequence of receive and subsequent send calls. Please assert that you're not sending \/ receiving out of band data when using the REQ \/ REP socket pairs./, e.message)
|
14
|
+
end
|
15
|
+
ensure
|
16
|
+
ctx.destroy
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_transfer
|
20
|
+
ctx = ZMQ::Context.new
|
21
|
+
rep = ctx.bind(:REP, "inproc://test.req-rep-transfer")
|
22
|
+
req = ctx.connect(:REQ, "inproc://test.req-rep-transfer")
|
23
|
+
req.send("message")
|
24
|
+
assert_equal "message", rep.recv
|
25
|
+
ensure
|
26
|
+
ctx.destroy
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_distribution
|
30
|
+
ctx = ZMQ::Context.new
|
31
|
+
rep = ctx.bind(:REP, "inproc://test.req-rep-distribution")
|
32
|
+
thread = Thread.new do
|
33
|
+
req = ctx.connect(:REQ, "inproc://test.req-rep-distribution")
|
34
|
+
req.send_frame ZMQ::Frame("message")
|
35
|
+
req.close
|
36
|
+
end
|
37
|
+
thread.join
|
38
|
+
assert_equal ZMQ::Frame("message"), rep.recv_frame
|
39
|
+
ensure
|
40
|
+
ctx.destroy
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'helper')
|
4
|
+
|
5
|
+
class TestReqSocket < ZmqTestCase
|
6
|
+
def test_behavior
|
7
|
+
ctx = ZMQ::Context.new
|
8
|
+
sock = ctx.socket(:REQ)
|
9
|
+
assert_equal ZMQ::REQ, sock.type
|
10
|
+
assert_equal "REQ socket", sock.to_s
|
11
|
+
ensure
|
12
|
+
ctx.destroy
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_flow
|
16
|
+
ctx = ZMQ::Context.new
|
17
|
+
rep = ctx.socket(:REP)
|
18
|
+
rep.bind("inproc://test.req-sock-flow")
|
19
|
+
sock = ctx.socket(:REQ)
|
20
|
+
sock.connect("inproc://test.req-sock-flow")
|
21
|
+
assert_raises ZMQ::Error do
|
22
|
+
sock.send_frame(ZMQ::Frame("frame"), ZMQ::Frame::MORE)
|
23
|
+
end
|
24
|
+
ensure
|
25
|
+
ctx.destroy
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'helper')
|
4
|
+
|
5
|
+
class TestRouterSocket < ZmqTestCase
|
6
|
+
def test_behavior
|
7
|
+
ctx = ZMQ::Context.new
|
8
|
+
sock = ctx.socket(:ROUTER)
|
9
|
+
assert_equal ZMQ::ROUTER, sock.type
|
10
|
+
assert_equal "ROUTER socket", sock.to_s
|
11
|
+
ensure
|
12
|
+
ctx.destroy
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'helper')
|
4
|
+
|
5
|
+
class TestRouting < ZmqTestCase
|
6
|
+
def test_flow
|
7
|
+
ctx = ZMQ::Context.new
|
8
|
+
router = ctx.bind(:ROUTER, "inproc://test.routing-flow")
|
9
|
+
dealer = ctx.socket(:DEALER)
|
10
|
+
dealer.identity = "xyz"
|
11
|
+
dealer.connect("inproc://test.routing-flow")
|
12
|
+
|
13
|
+
router.sendm("xyz")
|
14
|
+
router.send("request")
|
15
|
+
assert_equal "request", dealer.recv
|
16
|
+
|
17
|
+
dealer.send("reply")
|
18
|
+
assert_equal "xyz", router.recv
|
19
|
+
assert_equal "reply", router.recv
|
20
|
+
ensure
|
21
|
+
ctx.destroy
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_transfer
|
25
|
+
ctx = ZMQ::Context.new
|
26
|
+
router = ctx.bind(:ROUTER, "inproc://test.routing-transfer")
|
27
|
+
dealer = ctx.socket(:DEALER)
|
28
|
+
dealer.identity = "xyz"
|
29
|
+
dealer.connect("inproc://test.routing-transfer")
|
30
|
+
|
31
|
+
router.send_frame ZMQ::Frame("xyz"), ZMQ::Frame::MORE
|
32
|
+
router.send_frame ZMQ::Frame("request")
|
33
|
+
|
34
|
+
assert_equal ZMQ::Frame("request"), dealer.recv_frame
|
35
|
+
|
36
|
+
req = ZMQ::Message.new
|
37
|
+
req.push ZMQ::Frame("request")
|
38
|
+
req.push ZMQ::Frame("xyz")
|
39
|
+
router.send_message req
|
40
|
+
|
41
|
+
msg = dealer.recv_message
|
42
|
+
assert_equal ZMQ::Frame("request"), msg.pop
|
43
|
+
ensure
|
44
|
+
ctx.destroy
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_distribution
|
48
|
+
ctx = ZMQ::Context.new
|
49
|
+
router = ctx.bind(:ROUTER, "inproc://test.routing-distribution")
|
50
|
+
thread = Thread.new do
|
51
|
+
dealer = ctx.socket(:DEALER)
|
52
|
+
dealer.identity = "xyz"
|
53
|
+
dealer.connect("inproc://test.routing-distribution")
|
54
|
+
frame = dealer.recv_frame
|
55
|
+
dealer.close
|
56
|
+
frame
|
57
|
+
end
|
58
|
+
|
59
|
+
sleep 0.5 # "slow joiner" syndrome
|
60
|
+
router.send_frame ZMQ::Frame("xyz"), ZMQ::Frame::MORE
|
61
|
+
router.send_frame ZMQ::Frame("message")
|
62
|
+
assert_equal ZMQ::Frame("message"), thread.value
|
63
|
+
ensure
|
64
|
+
ctx.destroy
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'helper')
|
4
|
+
|
5
|
+
class TestSubSocket < ZmqTestCase
|
6
|
+
def test_behavior
|
7
|
+
ctx = ZMQ::Context.new
|
8
|
+
sock = ctx.socket(:SUB)
|
9
|
+
assert_equal ZMQ::SUB, sock.type
|
10
|
+
assert_equal "SUB socket", sock.to_s
|
11
|
+
assert_raises ZMQ::Error do
|
12
|
+
sock.send("message")
|
13
|
+
end
|
14
|
+
ensure
|
15
|
+
ctx.destroy
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
4
|
+
|
5
|
+
class TestZmqContext < ZmqTestCase
|
6
|
+
def test_context
|
7
|
+
ctx = ZMQ::Context.new
|
8
|
+
assert_instance_of ZMQ::Context, ctx
|
9
|
+
assert_raises(ZMQ::Error) do
|
10
|
+
ZMQ::Context.new
|
11
|
+
end
|
12
|
+
assert_equal ctx, ZMQ.context
|
13
|
+
ensure
|
14
|
+
assert_nil ctx.destroy
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_destroyed_context
|
18
|
+
ctx = ZMQ::Context.new
|
19
|
+
ctx.destroy
|
20
|
+
assert_raises ZMQ::Error do
|
21
|
+
ctx.iothreads = 2
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_context_with_iothreads
|
26
|
+
ctx = ZMQ::Context.new(2)
|
27
|
+
assert_instance_of ZMQ::Context, ctx
|
28
|
+
assert_raises(ZMQ::Error) do
|
29
|
+
ZMQ::Context.new
|
30
|
+
end
|
31
|
+
assert_equal ctx, ZMQ.context
|
32
|
+
ensure
|
33
|
+
assert_nil ctx.destroy
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_iothreads
|
37
|
+
ctx = ZMQ::Context.new
|
38
|
+
assert_raises TypeError do
|
39
|
+
ctx.iothreads = :invalid
|
40
|
+
end
|
41
|
+
ctx.iothreads = 2
|
42
|
+
assert_raises ZMQ::Error do
|
43
|
+
ctx.iothreads = -2
|
44
|
+
end
|
45
|
+
ensure
|
46
|
+
ctx.destroy
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_linger
|
50
|
+
ctx = ZMQ::Context.new
|
51
|
+
assert_raises TypeError do
|
52
|
+
ctx.linger = :invalid
|
53
|
+
end
|
54
|
+
ctx.linger = 10
|
55
|
+
assert_raises ZMQ::Error do
|
56
|
+
ctx.linger = -2
|
57
|
+
end
|
58
|
+
ensure
|
59
|
+
ctx.destroy
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_bind_connect
|
63
|
+
ctx = ZMQ::Context.new
|
64
|
+
rep = ctx.bind(:REP, "inproc://test.bind_connect")
|
65
|
+
req = ctx.connect(:REQ, "inproc://test.bind_connect")
|
66
|
+
req.send('success')
|
67
|
+
assert_equal 'success', rep.recv
|
68
|
+
ensure
|
69
|
+
ctx.destroy
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_socket
|
73
|
+
ctx = ZMQ::Context.new
|
74
|
+
assert_raises TypeError do
|
75
|
+
ctx.socket("invalid")
|
76
|
+
end
|
77
|
+
socket = ctx.socket(ZMQ::REP)
|
78
|
+
assert_instance_of ZMQ::Socket::Rep, socket
|
79
|
+
assert_nil socket.close
|
80
|
+
socket = ctx.socket(:REP)
|
81
|
+
assert_instance_of ZMQ::Socket::Rep, socket
|
82
|
+
assert_nil socket.close
|
83
|
+
ensure
|
84
|
+
ctx.destroy
|
85
|
+
end
|
86
|
+
end
|
data/test/test_frame.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
4
|
+
|
5
|
+
class TestZmqFrame < ZmqTestCase
|
6
|
+
def test_alloc
|
7
|
+
frame = ZMQ::Frame("message")
|
8
|
+
assert_instance_of ZMQ::Frame, frame
|
9
|
+
assert_nil frame.destroy
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_destroyed_frame
|
13
|
+
frame = ZMQ::Frame("message")
|
14
|
+
frame.destroy
|
15
|
+
assert_raises ZMQ::Error do
|
16
|
+
frame.data
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_alloc_empty
|
21
|
+
frame = ZMQ::Frame.new
|
22
|
+
assert_equal 0, frame.size
|
23
|
+
frame.destroy
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_size
|
27
|
+
assert_equal 7, ZMQ::Frame("message").size
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_data
|
31
|
+
frame = ZMQ::Frame("message")
|
32
|
+
assert_equal "message", frame.data
|
33
|
+
assert_equal "message", frame.to_s
|
34
|
+
assert_equal "message", frame.to_str
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_dup
|
38
|
+
frame = ZMQ::Frame("message")
|
39
|
+
dup_frame = frame.dup
|
40
|
+
assert_not_equal dup_frame.object_id, frame.object_id
|
41
|
+
assert_equal frame.data, dup_frame.data
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_strhex
|
45
|
+
frame = ZMQ::Frame("message")
|
46
|
+
assert_equal "6D657373616765", frame.strhex
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_data_equals
|
50
|
+
frame = ZMQ::Frame("message")
|
51
|
+
assert frame.data_equals?("message")
|
52
|
+
assert !frame.data_equals?("msg")
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_equals
|
56
|
+
frame = ZMQ::Frame("message")
|
57
|
+
assert_equal frame, ZMQ::Frame("message")
|
58
|
+
assert_not_equal frame, ZMQ::Frame("msg")
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_compare
|
62
|
+
frame = ZMQ::Frame("message")
|
63
|
+
assert frame > ZMQ::Frame("msg")
|
64
|
+
assert ZMQ::Frame("msg") < ZMQ::Frame("message")
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_print
|
68
|
+
frame = ZMQ::Frame("message")
|
69
|
+
assert_nil frame.print
|
70
|
+
assert_nil frame.print("prefix")
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_reset
|
74
|
+
frame = ZMQ::Frame("message")
|
75
|
+
frame.reset("msg")
|
76
|
+
assert_equal "msg", frame.data
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
4
|
+
|
5
|
+
class TestZmqHandler < ZmqTestCase
|
6
|
+
def test_expects_pollitem
|
7
|
+
assert_raises TypeError do
|
8
|
+
ZMQ::Handler.new(:socket)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_readable_writable_contracts
|
13
|
+
handler = ZMQ::Handler.new(ZMQ::Pollitem(STDIN))
|
14
|
+
assert_raises NotImplementedError do
|
15
|
+
handler.on_readable
|
16
|
+
end
|
17
|
+
assert_raises NotImplementedError do
|
18
|
+
handler.on_writable
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_error
|
23
|
+
handler = ZMQ::Handler.new(ZMQ::Pollitem(STDIN))
|
24
|
+
assert_raises StandardError do
|
25
|
+
handler.on_error(StandardError.new)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/test/test_loop.rb
ADDED
@@ -0,0 +1,252 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
4
|
+
|
5
|
+
class TestZmqLoop < ZmqTestCase
|
6
|
+
def test_alloc
|
7
|
+
lp = ZMQ::Loop.new
|
8
|
+
assert_instance_of ZMQ::Loop, lp
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_destroyed
|
12
|
+
lp = ZMQ::Loop.new
|
13
|
+
lp.destroy
|
14
|
+
assert_raises ZMQ::Error do
|
15
|
+
lp.start
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_run_and_stop
|
20
|
+
ctx = ZMQ::Context.new
|
21
|
+
ZMQ::Loop.run do
|
22
|
+
assert !ZL.running?
|
23
|
+
ZL.add_oneshot_timer(0.2) do
|
24
|
+
ZL.stop
|
25
|
+
end
|
26
|
+
ZL.add_oneshot_timer(0.1) do
|
27
|
+
assert ZL.running?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
ensure
|
31
|
+
ctx.destroy
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_callback_stops_event_loop
|
35
|
+
ctx = ZMQ::Context.new
|
36
|
+
ret = ZMQ::Loop.run do
|
37
|
+
ZL.add_oneshot_timer(0.2){ false }
|
38
|
+
end
|
39
|
+
assert_equal(-1, ret)
|
40
|
+
ensure
|
41
|
+
ctx.destroy
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_callback_error_stops_event_loop
|
45
|
+
ctx = ZMQ::Context.new
|
46
|
+
assert_raises RuntimeError do
|
47
|
+
ret = ZMQ::Loop.run do
|
48
|
+
ZL.add_oneshot_timer(0.2){ raise("stop!") }
|
49
|
+
end
|
50
|
+
assert_equal(-1, ret)
|
51
|
+
end
|
52
|
+
ensure
|
53
|
+
ctx.destroy
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_add_periodic_timer
|
57
|
+
ctx = ZMQ::Context.new
|
58
|
+
fired = 0
|
59
|
+
ZMQ::Loop.run do
|
60
|
+
ZL.add_periodic_timer(0.1) do
|
61
|
+
fired += 1
|
62
|
+
fired < 3
|
63
|
+
end
|
64
|
+
end
|
65
|
+
assert_equal 3, fired
|
66
|
+
ensure
|
67
|
+
ctx.destroy
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_add_timer
|
71
|
+
ctx = ZMQ::Context.new
|
72
|
+
fired, timer = 0, nil
|
73
|
+
ZMQ::Loop.run do
|
74
|
+
timer = ZL.add_timer(0.1, 5) do
|
75
|
+
fired += 1
|
76
|
+
fired < 5
|
77
|
+
end
|
78
|
+
end
|
79
|
+
assert_instance_of ZMQ::Timer, timer
|
80
|
+
assert_equal 5, fired
|
81
|
+
ensure
|
82
|
+
ctx.destroy
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_cancel_timer
|
86
|
+
ctx = ZMQ::Context.new
|
87
|
+
fired = 0
|
88
|
+
ZMQ::Loop.run do
|
89
|
+
timer = ZL.add_timer(0.1, 5) do
|
90
|
+
fired += 1
|
91
|
+
fired < 5
|
92
|
+
end
|
93
|
+
assert ZL.cancel_timer(timer)
|
94
|
+
ZL.add_oneshot_timer(0.1){ false }
|
95
|
+
end
|
96
|
+
assert_equal 0, fired
|
97
|
+
ensure
|
98
|
+
ctx.destroy
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_cancel_timer_instance
|
102
|
+
ctx = ZMQ::Context.new
|
103
|
+
fired = 0
|
104
|
+
timer = ZMQ::Timer.new(0.1, 2){ fired += 1 }
|
105
|
+
ZMQ::Loop.run do
|
106
|
+
ZL.register_timer(timer)
|
107
|
+
ZL.add_oneshot_timer(0.3){ false }
|
108
|
+
timer.cancel
|
109
|
+
end
|
110
|
+
assert_equal 0, fired
|
111
|
+
ensure
|
112
|
+
ctx.destroy
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_add_oneshot_timer
|
116
|
+
ctx = ZMQ::Context.new
|
117
|
+
ret = ZMQ::Loop.run do
|
118
|
+
ZL.add_oneshot_timer(0.2){ false }
|
119
|
+
end
|
120
|
+
assert_equal(-1, ret)
|
121
|
+
ensure
|
122
|
+
ctx.destroy
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_run_in_thread
|
126
|
+
ctx = ZMQ::Context.new
|
127
|
+
t = Thread.new do
|
128
|
+
ZMQ::Loop.run do
|
129
|
+
ZL.add_oneshot_timer(0.2){ false }
|
130
|
+
end
|
131
|
+
:done
|
132
|
+
end
|
133
|
+
assert_equal :done, t.value
|
134
|
+
ensure
|
135
|
+
ctx.destroy
|
136
|
+
end
|
137
|
+
|
138
|
+
class LoopBreaker < ZMQ::Handler
|
139
|
+
def on_readable
|
140
|
+
p :on_readable
|
141
|
+
false
|
142
|
+
end
|
143
|
+
|
144
|
+
def on_writable
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_register_sockets
|
149
|
+
ctx = ZMQ::Context.new
|
150
|
+
ret = ZMQ::Loop.run do
|
151
|
+
s1 = ctx.socket(:PAIR)
|
152
|
+
s2 = ctx.socket(:PAIR)
|
153
|
+
s3 = ctx.socket(:PAIR)
|
154
|
+
ZL.bind(s1, "inproc://test.loop-register", LoopBreaker)
|
155
|
+
ZL.connect(s2, "inproc://test.loop-register")
|
156
|
+
s2.send("message")
|
157
|
+
assert_raises ZMQ::Error do
|
158
|
+
ZL.register(s3)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
assert_equal(-1, ret)
|
162
|
+
ensure
|
163
|
+
ctx.destroy
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_register_ios
|
167
|
+
r, w = IO.pipe
|
168
|
+
ret = ZMQ::Loop.run do
|
169
|
+
ZL.register_readable(r, LoopBreaker)
|
170
|
+
ZL.register_writable(w)
|
171
|
+
w.write("message")
|
172
|
+
end
|
173
|
+
assert_equal(-1, ret)
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_register_ruby_sockets
|
177
|
+
server = TCPServer.new("127.0.0.1", 0)
|
178
|
+
f, port, host, addr = server.addr
|
179
|
+
client = TCPSocket.new("127.0.0.1", port)
|
180
|
+
s = server.accept
|
181
|
+
ret = ZMQ::Loop.run do
|
182
|
+
ZL.register_readable(s, LoopBreaker)
|
183
|
+
ZL.register_writable(client)
|
184
|
+
client.send("message", 0)
|
185
|
+
end
|
186
|
+
assert_equal(-1, ret)
|
187
|
+
end
|
188
|
+
|
189
|
+
class FailHandler < ZMQ::Handler
|
190
|
+
def on_readable
|
191
|
+
p :on_readable
|
192
|
+
raise "fail"
|
193
|
+
end
|
194
|
+
|
195
|
+
def on_writable
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_raise_from_socket_callback
|
200
|
+
ctx = ZMQ::Context.new
|
201
|
+
assert_raises RuntimeError do
|
202
|
+
ret = ZMQ::Loop.run do
|
203
|
+
s1 = ctx.socket(:PAIR)
|
204
|
+
s2 = ctx.socket(:PAIR)
|
205
|
+
ZL.bind(s1, "inproc://test.loop-raise_from_socket_callback", FailHandler)
|
206
|
+
ZL.connect(s2, "inproc://test.loop-raise_from_socket_callback")
|
207
|
+
s2.send("message")
|
208
|
+
end
|
209
|
+
assert_equal(-1, ret)
|
210
|
+
end
|
211
|
+
ensure
|
212
|
+
ctx.destroy
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_raise_from_io_callback
|
216
|
+
assert_raises RuntimeError do
|
217
|
+
ret = ZMQ::Loop.run do
|
218
|
+
r, w = IO.pipe
|
219
|
+
ZL.register_readable(r, FailHandler)
|
220
|
+
ZL.register_writable(w)
|
221
|
+
w.write("message")
|
222
|
+
end
|
223
|
+
assert_equal(-1, ret)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_raise_on_invalid_handler
|
228
|
+
ctx = ZMQ::Context.new
|
229
|
+
assert_raises RuntimeError do
|
230
|
+
ret = ZMQ::Loop.run do
|
231
|
+
s1 = ctx.socket(:PAIR)
|
232
|
+
s2 = ctx.socket(:PAIR)
|
233
|
+
ZL.bind(s1, "inproc://test.loop-raise_on_invalid_handler", FailHandler)
|
234
|
+
ZL.connect(s2, "inproc://test.loop-raise_on_invalid_handler")
|
235
|
+
s2.send("message")
|
236
|
+
end
|
237
|
+
assert_equal(-1, ret)
|
238
|
+
end
|
239
|
+
ensure
|
240
|
+
ctx.destroy
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_double_stop
|
244
|
+
ctx = ZMQ::Context.new
|
245
|
+
assert_raises ZMQ::Error do
|
246
|
+
lp = ZMQ::Loop.new
|
247
|
+
lp.stop
|
248
|
+
end
|
249
|
+
ensure
|
250
|
+
ctx.destroy
|
251
|
+
end
|
252
|
+
end
|