@@ -194,16 +194,28 @@ def test_global_pubsub
194
194
assert_equal ( [ 'subscribe' , channel , 1 ] , pubsub . next_event ( TEST_TIMEOUT_SEC ) )
195
195
Fiber . yield ( channel )
196
196
Fiber . yield ( pubsub . next_event ( TEST_TIMEOUT_SEC ) )
197
- pubsub . call ( 'UNSUBSCRIBE' )
198
197
pubsub . close
199
198
end
200
199
201
200
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
204
214
end
205
215
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 )
207
219
end
208
220
209
221
def test_global_pubsub_with_multiple_channels
@@ -214,19 +226,15 @@ def test_global_pubsub_with_multiple_channels
214
226
215
227
sub = Fiber . new do |pubsub |
216
228
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 }
218
230
10 . times { |i | assert_equal ( [ 'subscribe' , "g-chan#{ i } " , i + 1 ] , got [ i ] ) }
219
231
Fiber . yield
220
- Fiber . yield ( collect_messages ( pubsub ) )
221
- pubsub . call ( 'UNSUBSCRIBE' )
232
+ Fiber . yield ( collect_messages ( pubsub , size : 10 ) )
222
233
pubsub . close
223
234
end
224
235
225
236
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 ) } } }
230
238
got = sub . resume . sort_by { |e | e [ 1 ] . to_s }
231
239
10 . times { |i | assert_equal ( [ 'message' , "g-chan#{ i } " , i . to_s ] , got [ i ] ) }
232
240
end
@@ -243,16 +251,34 @@ def test_sharded_pubsub
243
251
assert_equal ( [ 'ssubscribe' , channel , 1 ] , pubsub . next_event ( TEST_TIMEOUT_SEC ) )
244
252
Fiber . yield ( channel )
245
253
Fiber . yield ( pubsub . next_event ( TEST_TIMEOUT_SEC ) )
246
- pubsub . call ( 'SUNSUBSCRIBE' )
247
254
pubsub . close
248
255
end
249
256
250
257
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
253
266
end
254
267
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 )
256
282
end
257
283
258
284
def test_sharded_pubsub_with_multiple_channels
@@ -268,19 +294,15 @@ def test_sharded_pubsub_with_multiple_channels
268
294
269
295
sub = Fiber . new do |pubsub |
270
296
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 }
272
298
10 . times { |i | assert_equal ( [ 'ssubscribe' , "s-chan#{ i } " ] , got [ i ] . take ( 2 ) ) }
273
299
Fiber . yield
274
- Fiber . yield ( collect_messages ( pubsub ) )
275
- pubsub . call ( 'SUNSUBSCRIBE' )
300
+ Fiber . yield ( collect_messages ( pubsub , size : 10 ) )
276
301
pubsub . close
277
302
end
278
303
279
304
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 ) } } }
284
306
got = sub . resume . sort_by { |e | e [ 1 ] . to_s }
285
307
10 . times { |i | assert_equal ( [ 'smessage' , "s-chan#{ i } " , i . to_s ] , got [ i ] ) }
286
308
end
@@ -386,7 +408,7 @@ def wait_for_replication
386
408
@client &.blocking_call ( client_side_timeout , 'WAIT' , TEST_REPLICA_SIZE , server_side_timeout )
387
409
end
388
410
389
- def collect_messages ( pubsub , max_attempts : 30 , timeout : 1.0 )
411
+ def collect_messages ( pubsub , size : , max_attempts : 30 , timeout : 1.0 )
390
412
messages = [ ]
391
413
attempts = 0
392
414
loop do
@@ -396,14 +418,9 @@ def collect_messages(pubsub, max_attempts: 30, timeout: 1.0)
396
418
reply = pubsub . next_event ( timeout )
397
419
break if reply . nil?
398
420
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
404
423
end
405
-
406
- messages
407
424
end
408
425
409
426
def publish_messages
0 commit comments