forked from redis/redis-rb
-
Notifications
You must be signed in to change notification settings - Fork 1
/
publish_subscribe_test.rb
158 lines (121 loc) · 2.86 KB
/
publish_subscribe_test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# encoding: UTF-8
require File.expand_path("./helper", File.dirname(__FILE__))
setup do
init Redis.new(OPTIONS)
end
test "SUBSCRIBE and UNSUBSCRIBE" do |r|
listening = false
wire = Wire.new do
r.subscribe("foo") do |on|
on.subscribe do |channel, total|
@subscribed = true
@t1 = total
end
on.message do |channel, message|
if message == "s1"
r.unsubscribe
@message = message
end
end
on.unsubscribe do |channel, total|
@unsubscribed = true
@t2 = total
end
listening = true
end
end
Wire.pass while !listening
Redis.new(OPTIONS).publish("foo", "s1")
wire.join
assert @subscribed
assert 1 == @t1
assert @unsubscribed
assert 0 == @t2
assert "s1" == @message
end
test "PSUBSCRIBE and PUNSUBSCRIBE" do |r|
listening = false
wire = Wire.new do
r.psubscribe("f*") do |on|
on.psubscribe do |pattern, total|
@subscribed = true
@t1 = total
end
on.pmessage do |pattern, channel, message|
if message == "s1"
r.punsubscribe
@message = message
end
end
on.punsubscribe do |pattern, total|
@unsubscribed = true
@t2 = total
end
listening = true
end
end
Wire.pass while !listening
Redis.new(OPTIONS).publish("foo", "s1")
wire.join
assert @subscribed
assert 1 == @t1
assert @unsubscribed
assert 0 == @t2
assert "s1" == @message
end
test "SUBSCRIBE within SUBSCRIBE" do |r|
listening = false
@channels = []
wire = Wire.new do
r.subscribe("foo") do |on|
on.subscribe do |channel, total|
@channels << channel
r.subscribe("bar") if channel == "foo"
r.unsubscribe if channel == "bar"
end
listening = true
end
end
Wire.pass while !listening
Redis.new(OPTIONS).publish("foo", "s1")
wire.join
assert ["foo", "bar"] == @channels
end
test "other commands within a SUBSCRIBE" do |r|
assert_raise RuntimeError do
r.subscribe("foo") do |on|
on.subscribe do |channel, total|
r.set("bar", "s2")
end
end
end
end
test "SUBSCRIBE without a block" do |r|
assert_raise LocalJumpError do
r.subscribe("foo")
end
end
test "UNSUBSCRIBE without a SUBSCRIBE" do |r|
assert_raise RuntimeError do
r.unsubscribe
end
assert_raise RuntimeError do
r.punsubscribe
end
end
test "SUBSCRIBE past a timeout" do |r|
# For some reason, a thread here doesn't reproduce the issue.
sleep = %{sleep #{OPTIONS[:timeout] + 1}}
publish = %{echo "publish foo bar\r\n" | nc localhost #{OPTIONS[:port]}}
cmd = [sleep, publish].join("; ")
IO.popen(cmd, "r+") do |pipe|
received = false
r.subscribe "foo" do |on|
on.message do |channel, message|
received = true
r.unsubscribe
end
end
assert received
end
end