@@ -14,7 +14,7 @@ public class ProductVariantUnitTests(ITestOutputHelper log)
1414 public async Task DetectProductVariant ( ProductVariant variant )
1515 {
1616 using var serverObj = new ProductServer ( variant , log ) ;
17- using var conn = await serverObj . ConnectAsync ( ) ;
17+ using var conn = await serverObj . ConnectAsync ( withPubSub : false ) ;
1818 var serverApi = conn . GetServer ( conn . GetEndPoints ( ) . First ( ) ) ;
1919 serverApi . Ping ( ) ;
2020 var reportedProduct = serverApi . GetProductVariant ( out var reportedVersion ) ;
@@ -30,14 +30,64 @@ public async Task DetectProductVariant(ProductVariant variant)
3030 }
3131 }
3232
33- private sealed class ProductServer ( ProductVariant variant , ITestOutputHelper log ) : InProcessTestServer ( log )
33+ [ Theory ]
34+ [ InlineData ( ProductVariant . Redis , ServerType . Standalone , true ) ]
35+ [ InlineData ( ProductVariant . Redis , ServerType . Cluster , false ) ]
36+ [ InlineData ( ProductVariant . Garnet , ServerType . Standalone , true ) ]
37+ [ InlineData ( ProductVariant . Garnet , ServerType . Cluster , false ) ]
38+ [ InlineData ( ProductVariant . Valkey , ServerType . Standalone , true ) ]
39+ [ InlineData ( ProductVariant . Valkey , ServerType . Cluster , true ) ]
40+ public async Task MultiDbSupportMatchesProductVariantAndServerType ( ProductVariant variant , ServerType serverType , bool supportsMultiDb )
41+ {
42+ using var serverObj = new ProductServer ( variant , log , serverType ) ;
43+ await using var conn = await serverObj . ConnectAsync ( withPubSub : false ) ;
44+
45+ var serverApi = conn . GetServer ( conn . GetEndPoints ( ) . First ( ) ) ;
46+ await serverApi . PingAsync ( ) ;
47+ Assert . Equal ( serverType , serverApi . ServerType ) ;
48+ Assert . Equal ( variant , serverApi . GetProductVariant ( out _ ) ) ;
49+
50+ RedisKey key = $ "multidb:{ variant } :{ serverType } ";
51+ const string db0Value = "db0" ;
52+ const string db1Value = "db1" ;
53+ var db0 = conn . GetDatabase ( 0 ) ;
54+
55+ var db1 = conn . GetDatabase ( 1 ) ;
56+
57+ await db0 . StringSetAsync ( key , db0Value ) ;
58+
59+ if ( supportsMultiDb )
60+ {
61+ await db1 . StringSetAsync ( key , db1Value ) ;
62+ Assert . Equal ( db0Value , ( string ? ) await db0 . StringGetAsync ( key ) ) ;
63+ Assert . Equal ( db1Value , ( string ? ) await db1 . StringGetAsync ( key ) ) ;
64+ }
65+ else
66+ {
67+ var ex = await Assert . ThrowsAsync < RedisConnectionException > ( ( ) => db1 . StringSetAsync ( key , db1Value ) ) ;
68+ var inner = Assert . IsType < RedisCommandException > ( ex . InnerException ) ;
69+ Assert . Contains ( "cannot switch to database: 1" , inner . Message ) ;
70+ Assert . Equal ( db0Value , ( string ? ) await db0 . StringGetAsync ( key ) ) ;
71+ }
72+ }
73+
74+ private sealed class ProductServer : InProcessTestServer
3475 {
76+ private readonly ProductVariant _variant ;
77+
78+ public ProductServer ( ProductVariant variant , ITestOutputHelper log , ServerType serverType = ServerType . Standalone )
79+ : base ( log )
80+ {
81+ _variant = variant ;
82+ ServerType = serverType ;
83+ }
84+
3585 protected override void Info ( StringBuilder sb , string section )
3686 {
3787 base . Info ( sb , section ) ;
3888 if ( section is "Server" )
3989 {
40- switch ( variant )
90+ switch ( _variant )
4191 {
4292 case ProductVariant . Garnet :
4393 sb . AppendLine ( "garnet_version:1.2.3-preview4" ) ;
@@ -49,5 +99,18 @@ protected override void Info(StringBuilder sb, string section)
4999 }
50100 }
51101 }
102+
103+ protected override bool SupportMultiDb ( out string err )
104+ {
105+ switch ( _variant )
106+ {
107+ case ProductVariant . Valkey :
108+ // support multiple databases even on cluster
109+ err = "" ;
110+ return true ;
111+ default :
112+ return base . SupportMultiDb ( out err ) ;
113+ }
114+ }
52115 }
53116}
0 commit comments