@@ -194,16 +194,28 @@ def test_global_pubsub
194194 assert_equal ( [ 'subscribe' , channel , 1 ] , pubsub . next_event ( TEST_TIMEOUT_SEC ) )
195195 Fiber . yield ( channel )
196196 Fiber . yield ( pubsub . next_event ( TEST_TIMEOUT_SEC ) )
197- pubsub . call ( 'UNSUBSCRIBE' )
198197 pubsub . close
199198 end
200199
201200 channel = sub . resume ( @client . pubsub )
202- publish_messages do |cli |
203- cli . call ( 'PUBLISH' , channel , 'hello global world' )
201+ publish_messages { |cli | cli . call ( 'PUBLISH' , channel , 'hello global world' ) }
202+ assert_equal ( [ 'message' , channel , 'hello global world' ] , sub . resume )
203+ end
204+
205+ def test_global_pubsub_without_timeout
206+ sub = Fiber . new do |pubsub |
207+ pubsub . call ( 'SUBSCRIBE' , 'my-global-not-published-channel' , 'my-global-published-channel' )
208+ want = [ %w[ subscribe my-global-not-published-channel ] , %w[ subscribe my-global-published-channel ] ]
209+ got = collect_messages ( pubsub , size : 2 , timeout : nil ) . map { |e | e . take ( 2 ) } . sort_by { |e | e [ 1 ] . to_s }
210+ assert_equal ( want , got )
211+ Fiber . yield ( 'my-global-published-channel' )
212+ Fiber . yield ( collect_messages ( pubsub , size : 1 , timeout : nil ) . first )
213+ pubsub . close
204214 end
205215
206- assert_equal ( [ 'message' , channel , 'hello global world' ] , sub . resume )
216+ channel = sub . resume ( @client . pubsub )
217+ publish_messages { |cli | cli . call ( 'PUBLISH' , channel , 'hello global published world' ) }
218+ assert_equal ( [ 'message' , channel , 'hello global published world' ] , sub . resume )
207219 end
208220
209221 def test_global_pubsub_with_multiple_channels
@@ -214,19 +226,15 @@ def test_global_pubsub_with_multiple_channels
214226
215227 sub = Fiber . new do |pubsub |
216228 pubsub . call ( 'SUBSCRIBE' , *Array . new ( 10 ) { |i | "g-chan#{ i } " } )
217- got = collect_messages ( pubsub ) . sort_by { |e | e [ 1 ] . to_s }
229+ got = collect_messages ( pubsub , size : 10 ) . sort_by { |e | e [ 1 ] . to_s }
218230 10 . times { |i | assert_equal ( [ 'subscribe' , "g-chan#{ i } " , i + 1 ] , got [ i ] ) }
219231 Fiber . yield
220- Fiber . yield ( collect_messages ( pubsub ) )
221- pubsub . call ( 'UNSUBSCRIBE' )
232+ Fiber . yield ( collect_messages ( pubsub , size : 10 ) )
222233 pubsub . close
223234 end
224235
225236 sub . resume ( @client . pubsub )
226- publish_messages do |cli |
227- cli . pipelined { |pi | 10 . times { |i | pi . call ( 'PUBLISH' , "g-chan#{ i } " , i ) } }
228- end
229-
237+ publish_messages { |cli | cli . pipelined { |pi | 10 . times { |i | pi . call ( 'PUBLISH' , "g-chan#{ i } " , i ) } } }
230238 got = sub . resume . sort_by { |e | e [ 1 ] . to_s }
231239 10 . times { |i | assert_equal ( [ 'message' , "g-chan#{ i } " , i . to_s ] , got [ i ] ) }
232240 end
@@ -243,16 +251,34 @@ def test_sharded_pubsub
243251 assert_equal ( [ 'ssubscribe' , channel , 1 ] , pubsub . next_event ( TEST_TIMEOUT_SEC ) )
244252 Fiber . yield ( channel )
245253 Fiber . yield ( pubsub . next_event ( TEST_TIMEOUT_SEC ) )
246- pubsub . call ( 'SUNSUBSCRIBE' )
247254 pubsub . close
248255 end
249256
250257 channel = sub . resume ( @client . pubsub )
251- publish_messages do |cli |
252- cli . call ( 'SPUBLISH' , channel , 'hello sharded world' )
258+ publish_messages { |cli | cli . call ( 'SPUBLISH' , channel , 'hello sharded world' ) }
259+ assert_equal ( [ 'smessage' , channel , 'hello sharded world' ] , sub . resume )
260+ end
261+
262+ def test_sharded_pubsub_without_timeout
263+ if TEST_REDIS_MAJOR_VERSION < 7
264+ skip ( 'Sharded Pub/Sub is supported by Redis 7+.' )
265+ return
253266 end
254267
255- assert_equal ( [ 'smessage' , channel , 'hello sharded world' ] , sub . resume )
268+ sub = Fiber . new do |pubsub |
269+ pubsub . call ( 'SSUBSCRIBE' , 'my-sharded-not-published-channel' )
270+ pubsub . call ( 'SSUBSCRIBE' , 'my-sharded-published-channel' )
271+ want = [ %w[ ssubscribe my-sharded-not-published-channel ] , %w[ ssubscribe my-sharded-published-channel ] ]
272+ got = collect_messages ( pubsub , size : 2 , timeout : nil ) . map { |e | e . take ( 2 ) } . sort_by { |e | e [ 1 ] . to_s }
273+ assert_equal ( want , got )
274+ Fiber . yield ( 'my-sharded-published-channel' )
275+ Fiber . yield ( collect_messages ( pubsub , size : 1 , timeout : nil ) . first )
276+ pubsub . close
277+ end
278+
279+ channel = sub . resume ( @client . pubsub )
280+ publish_messages { |cli | cli . call ( 'SPUBLISH' , channel , 'hello sharded published world' ) }
281+ assert_equal ( [ 'smessage' , channel , 'hello sharded published world' ] , sub . resume )
256282 end
257283
258284 def test_sharded_pubsub_with_multiple_channels
@@ -268,19 +294,15 @@ def test_sharded_pubsub_with_multiple_channels
268294
269295 sub = Fiber . new do |pubsub |
270296 10 . times { |i | pubsub . call ( 'SSUBSCRIBE' , "s-chan#{ i } " ) }
271- got = collect_messages ( pubsub ) . sort_by { |e | e [ 1 ] . to_s }
297+ got = collect_messages ( pubsub , size : 10 ) . sort_by { |e | e [ 1 ] . to_s }
272298 10 . times { |i | assert_equal ( [ 'ssubscribe' , "s-chan#{ i } " ] , got [ i ] . take ( 2 ) ) }
273299 Fiber . yield
274- Fiber . yield ( collect_messages ( pubsub ) )
275- pubsub . call ( 'SUNSUBSCRIBE' )
300+ Fiber . yield ( collect_messages ( pubsub , size : 10 ) )
276301 pubsub . close
277302 end
278303
279304 sub . resume ( @client . pubsub )
280- publish_messages do |cli |
281- cli . pipelined { |pi | 10 . times { |i | pi . call ( 'SPUBLISH' , "s-chan#{ i } " , i ) } }
282- end
283-
305+ publish_messages { |cli | cli . pipelined { |pi | 10 . times { |i | pi . call ( 'SPUBLISH' , "s-chan#{ i } " , i ) } } }
284306 got = sub . resume . sort_by { |e | e [ 1 ] . to_s }
285307 10 . times { |i | assert_equal ( [ 'smessage' , "s-chan#{ i } " , i . to_s ] , got [ i ] ) }
286308 end
@@ -386,7 +408,7 @@ def wait_for_replication
386408 @client &.blocking_call ( client_side_timeout , 'WAIT' , TEST_REPLICA_SIZE , server_side_timeout )
387409 end
388410
389- def collect_messages ( pubsub , max_attempts : 30 , timeout : 1.0 )
411+ def collect_messages ( pubsub , size : , max_attempts : 30 , timeout : 1.0 )
390412 messages = [ ]
391413 attempts = 0
392414 loop do
@@ -396,14 +418,9 @@ def collect_messages(pubsub, max_attempts: 30, timeout: 1.0)
396418 reply = pubsub . next_event ( timeout )
397419 break if reply . nil?
398420
399- if reply . first . is_a? ( Array )
400- messages += reply
401- else
402- messages << reply
403- end
421+ messages << reply
422+ break messages if messages . size == size
404423 end
405-
406- messages
407424 end
408425
409426 def publish_messages
0 commit comments