44using System ;
55using System . Collections . Concurrent ;
66using System . Collections . Generic ;
7+ using System . Diagnostics ;
78using System . IO ;
89using System . Net ;
910using System . Reflection ;
1213using StackExchange . Redis ;
1314using StackExchange . Redis . Maintenance ;
1415using StackExchange . Redis . Profiling ;
16+ using Xunit ;
1517
1618namespace Microsoft . AspNetCore . SignalR . Tests ;
1719
@@ -244,6 +246,8 @@ public class TestRedisServer
244246
245247 public long Publish ( RedisChannel channel , RedisValue message , CommandFlags flags = CommandFlags . None )
246248 {
249+ AssertRedisChannel ( channel ) ;
250+
247251 if ( _subscriptions . TryGetValue ( channel , out var handlers ) )
248252 {
249253 lock ( handlers )
@@ -260,6 +264,8 @@ public long Publish(RedisChannel channel, RedisValue message, CommandFlags flags
260264
261265 public void Subscribe ( ChannelMessageQueue messageQueue , int subscriberId , CommandFlags flags = CommandFlags . None )
262266 {
267+ AssertRedisChannel ( messageQueue . Channel ) ;
268+
263269 Action < RedisChannel , RedisValue > handler = ( channel , value ) =>
264270 {
265271 // Workaround for https://github.com/StackExchange/StackExchange.Redis/issues/969
@@ -280,6 +286,8 @@ public void Subscribe(ChannelMessageQueue messageQueue, int subscriberId, Comman
280286
281287 public void Unsubscribe ( RedisChannel channel , int subscriberId , CommandFlags flags = CommandFlags . None )
282288 {
289+ AssertRedisChannel ( channel ) ;
290+
283291 if ( _subscriptions . TryGetValue ( channel , out var list ) )
284292 {
285293 lock ( list )
@@ -288,6 +296,11 @@ public void Unsubscribe(RedisChannel channel, int subscriberId, CommandFlags fla
288296 }
289297 }
290298 }
299+
300+ internal static void AssertRedisChannel ( RedisChannel channel )
301+ {
302+ Assert . False ( channel . IsPattern ) ;
303+ }
291304}
292305
293306public class TestSubscriber : ISubscriber
@@ -333,11 +346,15 @@ public Task<TimeSpan> PingAsync(CommandFlags flags = CommandFlags.None)
333346
334347 public long Publish ( RedisChannel channel , RedisValue message , CommandFlags flags = CommandFlags . None )
335348 {
349+ TestRedisServer . AssertRedisChannel ( channel ) ;
350+
336351 return _server . Publish ( channel , message , flags ) ;
337352 }
338353
339354 public async Task < long > PublishAsync ( RedisChannel channel , RedisValue message , CommandFlags flags = CommandFlags . None )
340355 {
356+ TestRedisServer . AssertRedisChannel ( channel ) ;
357+
341358 await Task . Yield ( ) ;
342359 return Publish ( channel , message , flags ) ;
343360 }
@@ -349,6 +366,8 @@ public void Subscribe(RedisChannel channel, Action<RedisChannel, RedisValue> han
349366
350367 public Task SubscribeAsync ( RedisChannel channel , Action < RedisChannel , RedisValue > handler , CommandFlags flags = CommandFlags . None )
351368 {
369+ TestRedisServer . AssertRedisChannel ( channel ) ;
370+
352371 Subscribe ( channel , handler , flags ) ;
353372 return Task . CompletedTask ;
354373 }
@@ -365,6 +384,8 @@ public bool TryWait(Task task)
365384
366385 public void Unsubscribe ( RedisChannel channel , Action < RedisChannel , RedisValue > handler = null , CommandFlags flags = CommandFlags . None )
367386 {
387+ TestRedisServer . AssertRedisChannel ( channel ) ;
388+
368389 _server . Unsubscribe ( channel , _id , flags ) ;
369390 }
370391
@@ -380,6 +401,8 @@ public Task UnsubscribeAllAsync(CommandFlags flags = CommandFlags.None)
380401
381402 public Task UnsubscribeAsync ( RedisChannel channel , Action < RedisChannel , RedisValue > handler = null , CommandFlags flags = CommandFlags . None )
382403 {
404+ TestRedisServer . AssertRedisChannel ( channel ) ;
405+
383406 Unsubscribe ( channel , handler , flags ) ;
384407 return Task . CompletedTask ;
385408 }
@@ -401,6 +424,8 @@ public void WaitAll(params Task[] tasks)
401424
402425 public ChannelMessageQueue Subscribe ( RedisChannel channel , CommandFlags flags = CommandFlags . None )
403426 {
427+ TestRedisServer . AssertRedisChannel ( channel ) ;
428+
404429 // Workaround for https://github.com/StackExchange/StackExchange.Redis/issues/969
405430 var redisSubscriberType = typeof ( RedisChannel ) . Assembly . GetType ( "StackExchange.Redis.RedisSubscriber" ) ;
406431 var ctor = typeof ( ChannelMessageQueue ) . GetConstructor ( BindingFlags . Instance | BindingFlags . NonPublic ,
@@ -414,6 +439,8 @@ public ChannelMessageQueue Subscribe(RedisChannel channel, CommandFlags flags =
414439
415440 public Task < ChannelMessageQueue > SubscribeAsync ( RedisChannel channel , CommandFlags flags = CommandFlags . None )
416441 {
442+ TestRedisServer . AssertRedisChannel ( channel ) ;
443+
417444 var t = Subscribe ( channel , flags ) ;
418445 return Task . FromResult ( t ) ;
419446 }
0 commit comments