funl 0.9 → 0.10
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.
- checksums.yaml +4 -4
- data/bench/funl-bench.rb +3 -3
- data/bench/msg-rate.rb +4 -4
- data/lib/funl/blobber.rb +1 -1
- data/lib/funl/client.rb +4 -4
- data/lib/funl/history-client.rb +1 -1
- data/lib/funl/message-sequencer-nio.rb +5 -7
- data/lib/funl/message-sequencer-select.rb +5 -7
- data/lib/funl/message-sequencer.rb +5 -5
- data/lib/funl/message.rb +12 -12
- data/lib/funl/stream.rb +1 -1
- data/lib/funl/subscription-tracker.rb +1 -1
- data/lib/funl/version.rb +1 -1
- data/test/test-client-sequencer.rb +3 -3
- data/test/test-client.rb +10 -10
- data/test/test-message-sequencer.rb +10 -10
- data/test/test-message.rb +10 -10
- data/test/test-reflect.rb +7 -7
- data/test/test-stream.rb +4 -4
- data/test/test-subscribe.rb +31 -31
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c491fc8d90f7485317ebbcba49cecff09a44fce4
|
4
|
+
data.tar.gz: 7d3b5410cd213fb3fe2726468b7de706271e1763
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11d75b5b52d65820eb8d4ada2aee92760b19c37c956cea4dc6b168a2b20d653b82ef024b151ea4f0531b5f84404bd003e713208456922cef489081243b97125c
|
7
|
+
data.tar.gz: b25d03eed8d97b812107e9aaf3bb5974094dea2d47510e2e3063a1e85f3f93d05197e8144c4c2c109303a33b6c9629b899516c8660da1dd1fc6e06dc81d0b834
|
data/bench/funl-bench.rb
CHANGED
@@ -12,7 +12,7 @@ class BenchmarkTask
|
|
12
12
|
@name = name
|
13
13
|
@params = params
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def inspect
|
17
17
|
ps = params.map{|k,v| "#{k}: #{v}" }
|
18
18
|
pstr = ps.empty? ? "" : " " + ps.join(', ')
|
@@ -103,10 +103,10 @@ class BenchmarkEnv
|
|
103
103
|
task.run method(:make_stream)
|
104
104
|
t1 = Process.times
|
105
105
|
@mseq_ctrl << "dt"
|
106
|
-
|
106
|
+
|
107
107
|
@mseq_ctrl.read
|
108
108
|
dt = @mseq_ctrl.read
|
109
|
-
|
109
|
+
|
110
110
|
time = t1.utime + t1.stime - (t0.utime + t0.stime)
|
111
111
|
printf "%6.3f %6.3f | %p\n", time, dt, task
|
112
112
|
rescue => ex
|
data/bench/msg-rate.rb
CHANGED
@@ -6,7 +6,7 @@ class MessageRateBenchmarkTask < BenchmarkTask
|
|
6
6
|
n_msg = params[:n_msg] || 10
|
7
7
|
n_cli = params[:n_cli] || 2
|
8
8
|
cycle_sender = params[:cycle_sender] || false
|
9
|
-
|
9
|
+
|
10
10
|
streams = n_cli.times.map {|i| make_stream[i]}
|
11
11
|
threads = n_cli.times.map do |i|
|
12
12
|
Thread.new do
|
@@ -15,14 +15,14 @@ class MessageRateBenchmarkTask < BenchmarkTask
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
n_msg.times do |i|
|
20
20
|
stream = cycle_sender ? streams[i % n_cli] : streams[0]
|
21
21
|
stream <<
|
22
22
|
Message[client: "1", local: i, global: nil, delta: nil,
|
23
23
|
tags: nil, blob: nil]
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
threads.each {|th| th.join}
|
27
27
|
end
|
28
28
|
end
|
@@ -39,7 +39,7 @@ if __FILE__ == $0
|
|
39
39
|
# b_sel << MessageRateBenchmarkTask.new("msg rate", n_msg: 1000, n_cli: 100)
|
40
40
|
|
41
41
|
b_sel.run
|
42
|
-
|
42
|
+
|
43
43
|
puts
|
44
44
|
|
45
45
|
b_nio = BenchmarkEnv.new("msg-rate", mseq_class: MessageSequencerNio)
|
data/lib/funl/blobber.rb
CHANGED
data/lib/funl/client.rb
CHANGED
@@ -37,7 +37,7 @@ module Funl
|
|
37
37
|
@seq = client_stream_for(seq)
|
38
38
|
@cseq = client_stream_for(cseq)
|
39
39
|
@arcio = arc
|
40
|
-
|
40
|
+
|
41
41
|
@sub_tracker = SubscriptionTracker.new(self)
|
42
42
|
end
|
43
43
|
|
@@ -49,7 +49,7 @@ module Funl
|
|
49
49
|
yield if block_given?
|
50
50
|
seq_read_greeting
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
def subscribed_all
|
54
54
|
@sub_tracker.subscribed_all
|
55
55
|
end
|
@@ -88,7 +88,7 @@ module Funl
|
|
88
88
|
def unsubscribe_all
|
89
89
|
@sub_tracker.unsubscribe_all
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
# Maintain subscription status. Must be called by the user (or subclass)
|
93
93
|
# of this class, most likely in the thread created by #start.
|
94
94
|
def handle_ack ack
|
@@ -96,7 +96,7 @@ module Funl
|
|
96
96
|
op_type, tags = ack.control_op
|
97
97
|
@sub_tracker.update op_type, tags
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
def cseq_read_client_id
|
101
101
|
log.debug "getting client_id from cseq"
|
102
102
|
@client_id = cseq.read["client_id"]
|
data/lib/funl/history-client.rb
CHANGED
@@ -5,31 +5,29 @@ module Funl
|
|
5
5
|
class MessageSequencerNio < MessageSequencer
|
6
6
|
private
|
7
7
|
|
8
|
-
attr_reader :selector
|
9
|
-
|
10
8
|
def init_selector
|
11
9
|
@selector = NIO::Selector.new
|
12
10
|
if server
|
13
|
-
monitor = selector.register server, :r
|
11
|
+
monitor = @selector.register server, :r
|
14
12
|
monitor.value = proc {accept_conn}
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|
18
16
|
def register_stream stream
|
19
|
-
monitor = selector.register stream, :r
|
17
|
+
monitor = @selector.register stream, :r
|
20
18
|
monitor.value = proc {read_conn stream}
|
21
19
|
end
|
22
20
|
|
23
21
|
def deregister_stream stream
|
24
|
-
selector.deregister stream
|
22
|
+
@selector.deregister stream
|
25
23
|
end
|
26
24
|
|
27
25
|
def registered_stream? stream
|
28
|
-
selector.registered? stream
|
26
|
+
@selector.registered? stream
|
29
27
|
end
|
30
28
|
|
31
29
|
def select_streams
|
32
|
-
selector.select do |monitor|
|
30
|
+
@selector.select do |monitor|
|
33
31
|
monitor.value.call(monitor)
|
34
32
|
end
|
35
33
|
end
|
@@ -4,26 +4,24 @@ module Funl
|
|
4
4
|
class MessageSequencerSelect < MessageSequencer
|
5
5
|
private
|
6
6
|
|
7
|
-
attr_reader :streams
|
8
|
-
|
9
7
|
def init_selector
|
10
8
|
@streams = []
|
11
9
|
end
|
12
10
|
|
13
11
|
def register_stream stream
|
14
|
-
streams << stream
|
12
|
+
@streams << stream
|
15
13
|
end
|
16
14
|
|
17
15
|
def deregister_stream stream
|
18
|
-
streams.delete stream
|
16
|
+
@streams.delete stream
|
19
17
|
end
|
20
|
-
|
18
|
+
|
21
19
|
def registered_stream? stream
|
22
|
-
streams.include? stream
|
20
|
+
@streams.include? stream
|
23
21
|
end
|
24
22
|
|
25
23
|
def select_streams
|
26
|
-
readables, _ = select [server,
|
24
|
+
readables, _ = select [server, *@streams]
|
27
25
|
|
28
26
|
readables.each do |readable|
|
29
27
|
case readable
|
@@ -22,12 +22,12 @@ module Funl
|
|
22
22
|
def self.new *a
|
23
23
|
if self == MessageSequencer
|
24
24
|
require 'funl/message-sequencer-select'
|
25
|
-
MessageSequencerSelect.new
|
25
|
+
MessageSequencerSelect.new(*a)
|
26
26
|
else
|
27
27
|
super
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def initialize server, *conns, log: Logger.new($stderr),
|
32
32
|
stream_type: ObjectStream::MSGPACK_TYPE,
|
33
33
|
message_class: Message,
|
@@ -47,7 +47,7 @@ module Funl
|
|
47
47
|
conns.each do |conn|
|
48
48
|
try_conn conn
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
@subscribers_to_all = [] # [conn, ...]
|
52
52
|
@subscribers = Hash.new {|h, tag| h[tag] = []} # tag => [conn, ...]
|
53
53
|
@tags = Hash.new {|h, conn| h[conn] = []} # conn => [tag, ...]
|
@@ -72,7 +72,7 @@ module Funl
|
|
72
72
|
def wait
|
73
73
|
server_thread.join
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
def run
|
77
77
|
loop do
|
78
78
|
select_streams
|
@@ -130,7 +130,7 @@ module Funl
|
|
130
130
|
case op_type
|
131
131
|
when SUBSCRIBE_ALL
|
132
132
|
@subscribers_to_all |= [stream]
|
133
|
-
|
133
|
+
|
134
134
|
when SUBSCRIBE
|
135
135
|
tags.each do |tag|
|
136
136
|
@subscribers[tag] |= [stream]
|
data/lib/funl/message.rb
CHANGED
@@ -26,16 +26,16 @@ module Funl
|
|
26
26
|
|
27
27
|
# Application-defined payload data. See blobber.rb.
|
28
28
|
attr_accessor :blob
|
29
|
-
|
29
|
+
|
30
30
|
def initialize(*args)
|
31
31
|
@client_id, @local_tick, @global_tick, @delta, @tags, @blob = *args
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def self.[](
|
35
35
|
client: nil, local: nil, global: nil, delta: nil, tags: nil, blob: nil)
|
36
36
|
new client, local, global, delta, tags, blob
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
def self.control op_type, *args
|
40
40
|
Message.new.tap {|m| m.client_id = [op_type, *args]}
|
41
41
|
end
|
@@ -44,7 +44,7 @@ module Funl
|
|
44
44
|
def control?
|
45
45
|
@client_id.kind_of? Array
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
# Array of [op_type, *args] for the control operation.
|
49
49
|
def control_op
|
50
50
|
@client_id
|
@@ -60,7 +60,7 @@ module Funl
|
|
60
60
|
].join(", ")
|
61
61
|
"<Message: #{s}#{t}>"
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
def to_a
|
65
65
|
[@client_id, @local_tick, @global_tick, @delta, @tags, @blob]
|
66
66
|
end
|
@@ -75,11 +75,11 @@ module Funl
|
|
75
75
|
@blob = other.blob
|
76
76
|
end
|
77
77
|
alias eql? ==
|
78
|
-
|
78
|
+
|
79
79
|
def hash
|
80
80
|
@client_id.hash ^ @local_tick.hash ^ @global_tick.hash
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
# Call with Packer, nil, or IO. If +pk+ is nil, returns string. If +pk+ is
|
84
84
|
# a Packer, returns the Packer, which will need to be flushed. If +pk+ is
|
85
85
|
# IO, returns nil.
|
@@ -94,28 +94,28 @@ module Funl
|
|
94
94
|
pk.write @tags
|
95
95
|
pk.write @blob
|
96
96
|
return pk
|
97
|
-
|
97
|
+
|
98
98
|
else # nil or IO
|
99
99
|
MessagePack.pack(self, pk)
|
100
100
|
end
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
def to_json
|
104
104
|
to_a.to_json
|
105
105
|
end
|
106
106
|
|
107
107
|
def self.from_serialized ary
|
108
|
-
new
|
108
|
+
new(*ary)
|
109
109
|
end
|
110
110
|
|
111
111
|
def self.from_msgpack(src)
|
112
112
|
case src
|
113
113
|
when MessagePack::Unpacker
|
114
114
|
new(*src.read)
|
115
|
-
|
115
|
+
|
116
116
|
when IO, StringIO
|
117
117
|
from_msgpack(MessagePack::Unpacker.new(src))
|
118
|
-
|
118
|
+
|
119
119
|
else # String
|
120
120
|
from_msgpack(MessagePack::Unpacker.new.feed(src))
|
121
121
|
end
|
data/lib/funl/stream.rb
CHANGED
data/lib/funl/version.rb
CHANGED
@@ -13,11 +13,11 @@ class TestClientSequencer < Minitest::Test
|
|
13
13
|
@log = Logger.new($stderr)
|
14
14
|
log.level = Logger::WARN
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def teardown
|
18
18
|
FileUtils.remove_entry @dir
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def test_initial_conns
|
22
22
|
as = []; bs = []
|
23
23
|
3.times {a, b = UNIXSocket.pair; as << a; bs << b}
|
@@ -28,7 +28,7 @@ class TestClientSequencer < Minitest::Test
|
|
28
28
|
assert_equal i, client_id
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def test_later_conns
|
33
33
|
svr = UNIXServer.new(@path)
|
34
34
|
cseq = Funl::ClientSequencer.new svr, log: log
|
data/test/test-client.rb
CHANGED
@@ -22,31 +22,31 @@ class TestClient < Minitest::Test
|
|
22
22
|
@cseq_sock = UNIXServer.new(@cseq_path)
|
23
23
|
@cseq = ClientSequencer.new @cseq_sock, log: log
|
24
24
|
@cseq.start
|
25
|
-
|
25
|
+
|
26
26
|
@seq_sock = UNIXServer.new(@seq_path)
|
27
27
|
@seq = MessageSequencer.new @seq_sock, log: log
|
28
28
|
@seq.start
|
29
|
-
|
29
|
+
|
30
30
|
@client = Client.new(
|
31
31
|
seq: UNIXSocket.new(@seq_path),
|
32
32
|
cseq: UNIXSocket.new(@cseq_path),
|
33
33
|
log: log)
|
34
|
-
|
34
|
+
|
35
35
|
@client.start
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def teardown
|
39
39
|
cseq.stop rescue nil
|
40
40
|
seq.stop rescue nil
|
41
41
|
FileUtils.remove_entry @dir
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
def test_client_state_at_start
|
45
45
|
assert_equal(0, client.client_id)
|
46
46
|
assert_equal(0, client.start_tick)
|
47
47
|
assert_equal(Funl::Blobber::MSGPACK_TYPE, client.blob_type)
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
def test_subscription_tracking
|
51
51
|
Thread.new do
|
52
52
|
client.subscribe ["foo"]
|
@@ -55,7 +55,7 @@ class TestClient < Minitest::Test
|
|
55
55
|
ack = client.seq.read
|
56
56
|
assert ack.control?
|
57
57
|
assert_equal 0, ack.global_tick
|
58
|
-
|
58
|
+
|
59
59
|
assert_equal [], client.subscribed_tags
|
60
60
|
client.handle_ack ack
|
61
61
|
Thread.pass
|
@@ -68,7 +68,7 @@ class TestClient < Minitest::Test
|
|
68
68
|
ack = client.seq.read
|
69
69
|
assert ack.control?
|
70
70
|
assert_equal 0, ack.global_tick
|
71
|
-
|
71
|
+
|
72
72
|
assert_equal ["foo"], client.subscribed_tags
|
73
73
|
client.handle_ack ack
|
74
74
|
Thread.pass
|
@@ -81,7 +81,7 @@ class TestClient < Minitest::Test
|
|
81
81
|
ack = client.seq.read
|
82
82
|
assert ack.control?
|
83
83
|
assert_equal 0, ack.global_tick
|
84
|
-
|
84
|
+
|
85
85
|
assert_equal false, client.subscribed_all
|
86
86
|
client.handle_ack ack
|
87
87
|
Thread.pass
|
@@ -93,7 +93,7 @@ class TestClient < Minitest::Test
|
|
93
93
|
ack = client.seq.read
|
94
94
|
assert ack.control?
|
95
95
|
assert_equal 0, ack.global_tick
|
96
|
-
|
96
|
+
|
97
97
|
assert_equal true, client.subscribed_all
|
98
98
|
client.handle_ack ack
|
99
99
|
Thread.pass
|
@@ -17,7 +17,7 @@ require 'minitest/autorun'
|
|
17
17
|
|
18
18
|
class TestMessageSequencer < Minitest::Test
|
19
19
|
attr_reader :log
|
20
|
-
|
20
|
+
|
21
21
|
def mseq_class; MessageSequencer; end
|
22
22
|
|
23
23
|
def setup
|
@@ -27,11 +27,11 @@ class TestMessageSequencer < Minitest::Test
|
|
27
27
|
log.level = Logger::WARN
|
28
28
|
@n_clients = 3
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def teardown
|
32
32
|
FileUtils.remove_entry @dir
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def test_initial_conns
|
36
36
|
as = []; bs = []
|
37
37
|
@n_clients.times {a, b = UNIXSocket.pair; as << a; bs << b}
|
@@ -43,7 +43,7 @@ class TestMessageSequencer < Minitest::Test
|
|
43
43
|
assert_equal 0, global_tick
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def test_later_conns
|
48
48
|
stream_type = ObjectStream::MSGPACK_TYPE
|
49
49
|
svr = UNIXServer.new(@path)
|
@@ -53,7 +53,7 @@ class TestMessageSequencer < Minitest::Test
|
|
53
53
|
mseq.start
|
54
54
|
sleep
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
log.progname = "client"
|
58
58
|
streams = (0...@n_clients).map do
|
59
59
|
conn = UNIXSocket.new(@path)
|
@@ -70,30 +70,30 @@ class TestMessageSequencer < Minitest::Test
|
|
70
70
|
|
71
71
|
stream
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
m1 = Message[
|
75
75
|
client: 0, local: 12, global: 34,
|
76
76
|
delta: 1, tags: ["foo"], blob: "BLOB"]
|
77
77
|
send_msg(src: streams[0], message: m1, dst: streams, expected_tick: 1)
|
78
|
-
|
78
|
+
|
79
79
|
if @n_clients > 1
|
80
80
|
m2 = Message[
|
81
81
|
client: 1, local: 23, global: 45,
|
82
82
|
delta: 4, tags: ["bar"], blob: "BLOB"]
|
83
83
|
send_msg(src: streams[1], message: m2, dst: streams, expected_tick: 2)
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
ensure
|
87
87
|
Process.kill "TERM", pid if pid
|
88
88
|
end
|
89
89
|
|
90
90
|
def send_msg(src: nil, message: nil, dst: nil, expected_tick: nil)
|
91
91
|
src << message
|
92
|
-
|
92
|
+
|
93
93
|
replies = dst.map do |stream|
|
94
94
|
stream.read
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
assert_equal @n_clients, replies.size
|
98
98
|
|
99
99
|
replies.each do |r|
|
data/test/test-message.rb
CHANGED
@@ -7,7 +7,7 @@ require 'minitest/autorun'
|
|
7
7
|
|
8
8
|
class TestMessage < Minitest::Test
|
9
9
|
attr_reader :m, :sio
|
10
|
-
|
10
|
+
|
11
11
|
def setup
|
12
12
|
@m = Funl::Message.new
|
13
13
|
m.client_id = 12
|
@@ -17,55 +17,55 @@ class TestMessage < Minitest::Test
|
|
17
17
|
m.tags = [ "aaa", "bbb" ]
|
18
18
|
m.blob = "BLOB"
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def test_from_serialized
|
22
22
|
a = m.to_a
|
23
23
|
m2 = Funl::Message.from_serialized a
|
24
24
|
assert_equal(m, m2)
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def test_to_msgpack
|
28
28
|
assert_kind_of(String, m.to_msgpack(nil))
|
29
29
|
assert_kind_of(String, m.to_msgpack)
|
30
30
|
assert_equal(MessagePack.pack(m), m.to_msgpack(nil))
|
31
31
|
assert_equal(MessagePack.pack(m), m.to_msgpack)
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def test_to_msgpack_packer
|
35
35
|
pk = MessagePack::Packer.new
|
36
36
|
assert_kind_of(MessagePack::Packer, m.to_msgpack(pk))
|
37
37
|
assert_equal(pk, m.to_msgpack(pk))
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
def test_to_msgpack_io
|
41
41
|
src, dst = UNIXSocket.pair
|
42
42
|
assert_nil(m.to_msgpack(src))
|
43
43
|
src.close
|
44
44
|
assert_equal(MessagePack.pack(m), dst.read)
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def test_pack_io
|
48
48
|
src, dst = UNIXSocket.pair
|
49
49
|
MessagePack.pack(m, src)
|
50
50
|
src.close
|
51
51
|
assert_equal(MessagePack.pack(m), dst.read)
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def test_pack_unpack
|
55
55
|
assert_equal(m.to_a, MessagePack.unpack(MessagePack.pack(m)))
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
def test_from_msgpack_str
|
59
59
|
assert_equal(m, Funl::Message.from_msgpack(MessagePack.pack(m)))
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
def test_from_msgpack_stringio
|
63
63
|
sio = StringIO.new
|
64
64
|
MessagePack.pack(m, sio)
|
65
65
|
sio.rewind
|
66
66
|
assert_equal(m, Funl::Message.from_msgpack(sio))
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
def test_from_msgpack_io
|
70
70
|
src, dst = UNIXSocket.pair
|
71
71
|
MessagePack.pack(m, src)
|
data/test/test-reflect.rb
CHANGED
@@ -11,7 +11,7 @@ class TestReflect < Minitest::Test
|
|
11
11
|
def setup
|
12
12
|
@log = Logger.new($stderr)
|
13
13
|
log.level = Logger::WARN
|
14
|
-
|
14
|
+
|
15
15
|
client_socks = []
|
16
16
|
server_socks = []
|
17
17
|
2.times do
|
@@ -19,21 +19,21 @@ class TestReflect < Minitest::Test
|
|
19
19
|
client_socks << cl
|
20
20
|
server_socks << sv
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
dummy, _ = UNIXSocket.pair
|
24
24
|
|
25
25
|
@mseq = MessageSequencer.new dummy, *server_socks, log: log
|
26
26
|
mseq.start
|
27
|
-
|
27
|
+
|
28
28
|
@streams = client_socks.each_with_index.map do |s,i|
|
29
29
|
stream = ObjectStreamWrapper.new(s, type: mseq.stream_type)
|
30
30
|
stream.write_to_outbox({"client_id" => "client #{i}"})
|
31
|
-
|
31
|
+
stream.read["tick"]
|
32
32
|
stream.expect Message
|
33
33
|
stream
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def teardown
|
38
38
|
mseq.stop rescue nil
|
39
39
|
end
|
@@ -45,14 +45,14 @@ class TestReflect < Minitest::Test
|
|
45
45
|
assert ack.control?
|
46
46
|
assert_equal 0, ack.global_tick
|
47
47
|
reflect = true
|
48
|
-
|
48
|
+
|
49
49
|
snd << Message[
|
50
50
|
client: 0, local: 1, global: 0, delta: 1,
|
51
51
|
tags: [reflect, "bar"], blob: ""]
|
52
52
|
snd << Message[
|
53
53
|
client: 0, local: 2, global: 0, delta: 2,
|
54
54
|
tags: [reflect, "foo"], blob: ""]
|
55
|
-
|
55
|
+
|
56
56
|
m = rcv.read
|
57
57
|
assert_equal 2, m.global_tick
|
58
58
|
assert_equal ["foo"], m.tags
|
data/test/test-stream.rb
CHANGED
@@ -7,7 +7,7 @@ require 'minitest/autorun'
|
|
7
7
|
|
8
8
|
class TestStream < Minitest::Test
|
9
9
|
include Funl::Stream
|
10
|
-
|
10
|
+
|
11
11
|
attr_reader :client_id
|
12
12
|
attr_reader :stream_type
|
13
13
|
attr_reader :message_class
|
@@ -23,16 +23,16 @@ class TestStream < Minitest::Test
|
|
23
23
|
|
24
24
|
@sio = StringIO.new
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def test_greeting
|
28
28
|
client = client_stream_for @sio
|
29
29
|
client.write "message"
|
30
|
-
|
30
|
+
|
31
31
|
@sio.rewind
|
32
32
|
|
33
33
|
server = server_stream_for @sio
|
34
34
|
m = server.read
|
35
|
-
|
35
|
+
|
36
36
|
assert_equal "message", m
|
37
37
|
assert_equal "client #{client_id}", server.peer_name
|
38
38
|
end
|
data/test/test-subscribe.rb
CHANGED
@@ -11,7 +11,7 @@ class TestSubscribe < Minitest::Test
|
|
11
11
|
def setup
|
12
12
|
@log = Logger.new($stderr)
|
13
13
|
log.level = Logger::WARN
|
14
|
-
|
14
|
+
|
15
15
|
client_socks = []
|
16
16
|
server_socks = []
|
17
17
|
2.times do
|
@@ -19,21 +19,21 @@ class TestSubscribe < Minitest::Test
|
|
19
19
|
client_socks << cl
|
20
20
|
server_socks << sv
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
dummy, _ = UNIXSocket.pair
|
24
24
|
|
25
25
|
@mseq = MessageSequencer.new dummy, *server_socks, log: log
|
26
26
|
mseq.start
|
27
|
-
|
27
|
+
|
28
28
|
@streams = client_socks.each_with_index.map do |s,i|
|
29
29
|
stream = ObjectStreamWrapper.new(s, type: mseq.stream_type)
|
30
30
|
stream.write_to_outbox({"client_id" => "client #{i}"})
|
31
|
-
|
31
|
+
stream.read["tick"]
|
32
32
|
stream.expect Message
|
33
33
|
stream
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def teardown
|
38
38
|
mseq.stop rescue nil
|
39
39
|
end
|
@@ -44,19 +44,19 @@ class TestSubscribe < Minitest::Test
|
|
44
44
|
ack = rcv.read
|
45
45
|
assert ack.control?
|
46
46
|
assert_equal 0, ack.global_tick
|
47
|
-
|
47
|
+
|
48
48
|
snd << Message[
|
49
49
|
client: 0, local: 0, global: 0, delta: 1,
|
50
50
|
tags: ["bar"], blob: ""]
|
51
51
|
snd << Message[
|
52
52
|
client: 0, local: 0, global: 0, delta: 2,
|
53
53
|
tags: ["foo"], blob: ""]
|
54
|
-
|
54
|
+
|
55
55
|
m = rcv.read
|
56
56
|
assert_equal 2, m.global_tick
|
57
57
|
assert_equal ["foo"], m.tags
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
def test_multiple_tag
|
61
61
|
snd, rcv = @streams
|
62
62
|
rcv << Message.control(SUBSCRIBE, ["foo", "bar"])
|
@@ -64,14 +64,14 @@ class TestSubscribe < Minitest::Test
|
|
64
64
|
assert ack.control?
|
65
65
|
assert_equal 0, ack.global_tick
|
66
66
|
assert_equal ["foo", "bar"], ack.control_op[1]
|
67
|
-
|
67
|
+
|
68
68
|
snd << Message[
|
69
69
|
client: 0, local: 0, global: 0, delta: 1,
|
70
70
|
tags: ["bar"], blob: ""]
|
71
71
|
snd << Message[
|
72
72
|
client: 0, local: 0, global: 0, delta: 2,
|
73
73
|
tags: ["foo"], blob: ""]
|
74
|
-
|
74
|
+
|
75
75
|
m = rcv.read
|
76
76
|
assert_equal 1, m.global_tick
|
77
77
|
assert_equal ["bar"], m.tags
|
@@ -79,9 +79,9 @@ class TestSubscribe < Minitest::Test
|
|
79
79
|
assert_equal 2, m.global_tick
|
80
80
|
assert_equal ["foo"], m.tags
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
def test_multiple_receiver
|
84
|
-
snd, rcv = @streams
|
84
|
+
snd, rcv = @streams; rcv = nil
|
85
85
|
@streams.each do |stream|
|
86
86
|
stream << Message.control(SUBSCRIBE, ["foo"])
|
87
87
|
ack = stream.read
|
@@ -89,11 +89,11 @@ class TestSubscribe < Minitest::Test
|
|
89
89
|
assert_equal 0, ack.global_tick
|
90
90
|
assert_equal ["foo"], ack.control_op[1]
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
snd << Message[
|
94
94
|
client: 0, local: 0, global: 0, delta: 1,
|
95
95
|
tags: ["foo"], blob: ""]
|
96
|
-
|
96
|
+
|
97
97
|
@streams.each do |stream|
|
98
98
|
m = stream.read
|
99
99
|
assert_equal 1, m.global_tick
|
@@ -108,11 +108,11 @@ class TestSubscribe < Minitest::Test
|
|
108
108
|
assert ack.control?
|
109
109
|
assert_equal 0, ack.global_tick
|
110
110
|
assert_equal ["foo"], ack.control_op[1]
|
111
|
-
|
111
|
+
|
112
112
|
snd << Message[
|
113
113
|
client: 0, local: 0, global: 0, delta: 1,
|
114
114
|
tags: ["foo"], blob: ""]
|
115
|
-
|
115
|
+
|
116
116
|
m = rcv.read
|
117
117
|
assert_equal 1, m.global_tick
|
118
118
|
assert_equal ["foo"], m.tags
|
@@ -122,27 +122,27 @@ class TestSubscribe < Minitest::Test
|
|
122
122
|
assert ack.control?
|
123
123
|
assert_equal 1, ack.global_tick
|
124
124
|
assert_equal ["foo"], ack.control_op[1]
|
125
|
-
|
125
|
+
|
126
126
|
snd << Message[
|
127
127
|
client: 0, local: 0, global: 0, delta: 1,
|
128
128
|
tags: ["foo"], blob: ""]
|
129
129
|
Thread.pass
|
130
|
-
|
130
|
+
|
131
131
|
rcv << Message.control(SUBSCRIBE, ["foo"])
|
132
132
|
ack = rcv.read
|
133
133
|
assert ack.control?
|
134
134
|
assert_equal 2, ack.global_tick
|
135
135
|
assert_equal ["foo"], ack.control_op[1]
|
136
|
-
|
136
|
+
|
137
137
|
snd << Message[
|
138
138
|
client: 0, local: 0, global: 0, delta: 1,
|
139
139
|
tags: ["foo"], blob: ""]
|
140
|
-
|
140
|
+
|
141
141
|
m = rcv.read
|
142
142
|
assert_equal 3, m.global_tick
|
143
143
|
assert_equal ["foo"], m.tags
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
def test_subscribe_all
|
147
147
|
snd, rcv = @streams
|
148
148
|
rcv << Message.control(SUBSCRIBE_ALL)
|
@@ -150,11 +150,11 @@ class TestSubscribe < Minitest::Test
|
|
150
150
|
assert ack.control?
|
151
151
|
assert_equal 0, ack.global_tick
|
152
152
|
assert_equal nil, ack.control_op[1]
|
153
|
-
|
153
|
+
|
154
154
|
snd << Message[
|
155
155
|
client: 0, local: 0, global: 0, delta: 1,
|
156
156
|
tags: ["foo"], blob: ""]
|
157
|
-
|
157
|
+
|
158
158
|
m = rcv.read
|
159
159
|
assert_equal 1, m.global_tick
|
160
160
|
assert_equal ["foo"], m.tags
|
@@ -164,27 +164,27 @@ class TestSubscribe < Minitest::Test
|
|
164
164
|
assert ack.control?
|
165
165
|
assert_equal 1, ack.global_tick
|
166
166
|
assert_equal nil, ack.control_op[1]
|
167
|
-
|
167
|
+
|
168
168
|
snd << Message[
|
169
169
|
client: 0, local: 0, global: 0, delta: 1,
|
170
170
|
tags: ["foo"], blob: ""]
|
171
171
|
Thread.pass
|
172
|
-
|
172
|
+
|
173
173
|
rcv << Message.control(SUBSCRIBE_ALL)
|
174
174
|
ack = rcv.read
|
175
175
|
assert ack.control?
|
176
176
|
assert_equal 2, ack.global_tick
|
177
177
|
assert_equal nil, ack.control_op[1]
|
178
|
-
|
178
|
+
|
179
179
|
snd << Message[
|
180
180
|
client: 0, local: 0, global: 0, delta: 1,
|
181
181
|
tags: ["foo"], blob: ""]
|
182
|
-
|
182
|
+
|
183
183
|
m = rcv.read
|
184
184
|
assert_equal 3, m.global_tick
|
185
185
|
assert_equal ["foo"], m.tags
|
186
186
|
end
|
187
|
-
|
187
|
+
|
188
188
|
def test_redundant_subscribe
|
189
189
|
snd, rcv = @streams
|
190
190
|
2.times do
|
@@ -192,19 +192,19 @@ class TestSubscribe < Minitest::Test
|
|
192
192
|
ack = rcv.read
|
193
193
|
assert ack.control?
|
194
194
|
end
|
195
|
-
|
195
|
+
|
196
196
|
snd << Message[
|
197
197
|
client: 0, local: 0, global: 0, delta: 1,
|
198
198
|
tags: ["foo"], blob: "1"]
|
199
199
|
snd << Message[
|
200
200
|
client: 0, local: 0, global: 0, delta: 2,
|
201
201
|
tags: ["foo"], blob: "2"]
|
202
|
-
|
202
|
+
|
203
203
|
m = rcv.read
|
204
204
|
assert_equal 1, m.global_tick
|
205
205
|
assert_equal ["foo"], m.tags
|
206
206
|
assert_equal "1", m.blob
|
207
|
-
|
207
|
+
|
208
208
|
m = rcv.read
|
209
209
|
assert_equal 2, m.global_tick
|
210
210
|
assert_equal ["foo"], m.tags
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: funl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.10'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel VanderWerf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: object-stream
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '1.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '1.0'
|
41
41
|
description: Sequences messages.
|
42
42
|
email: vjoel@users.sourceforge.net
|
43
43
|
executables: []
|
@@ -88,9 +88,9 @@ require_paths:
|
|
88
88
|
- lib
|
89
89
|
required_ruby_version: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
|
-
- - "
|
91
|
+
- - "~>"
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version: '0'
|
93
|
+
version: '2.0'
|
94
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
95
|
requirements:
|
96
96
|
- - ">="
|
@@ -98,17 +98,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
98
|
version: '0'
|
99
99
|
requirements: []
|
100
100
|
rubyforge_project:
|
101
|
-
rubygems_version: 2.
|
101
|
+
rubygems_version: 2.4.1
|
102
102
|
signing_key:
|
103
103
|
specification_version: 4
|
104
104
|
summary: Sequences messages
|
105
105
|
test_files:
|
106
|
-
- test/test-message-sequencer.rb
|
107
|
-
- test/test-client-sequencer.rb
|
108
106
|
- test/test-reflect.rb
|
109
|
-
- test/test-message.rb
|
110
107
|
- test/test-stream.rb
|
108
|
+
- test/test-message.rb
|
109
|
+
- test/test-message-sequencer.rb
|
111
110
|
- test/test-subscribe.rb
|
112
111
|
- test/test-client.rb
|
112
|
+
- test/test-client-sequencer.rb
|
113
113
|
- test/test-blobber.rb
|
114
114
|
has_rdoc:
|