11using System ;
2+ using System . ComponentModel ;
23using Moq ;
34using NewLife ;
45using NewLife . Data ;
@@ -11,6 +12,7 @@ namespace XUnitTestRocketMQ;
1112public class NameClientTests
1213{
1314 [ Fact ]
15+ [ DisplayName ( "GetRouteInfo_解析标准JSON格式的路由信息" ) ]
1416 public void GetRouteInfo ( )
1517 {
1618 var target = """
@@ -38,6 +40,7 @@ public void GetRouteInfo()
3840 }
3941
4042 [ Fact ]
43+ [ DisplayName ( "GetRouteInfo_解析整数Key的brokerAddrs格式" ) ]
4144 public void GetRouteInfo2 ( )
4245 {
4346 var target = """
@@ -63,4 +66,93 @@ public void GetRouteInfo2()
6366 Assert . Single ( broker . Addresses ) ;
6467 Assert . Equal ( "10.2.3.117:10911" , broker . Addresses [ 0 ] ) ;
6568 }
69+
70+ [ Fact ]
71+ [ DisplayName ( "GetRouteInfo_非零topicSysFlag正确解析" ) ]
72+ public void GetRouteInfo_NonZeroTopicSysFlag ( )
73+ {
74+ var target = """
75+ {"brokerDatas":[{"brokerAddrs":{"0":"10.0.0.1:10911"},"brokerName":"broker-b","cluster":"TestCluster","enableActingMaster":false}],"filterServerTable":{},"queueDatas":[{"brokerName":"broker-b","perm":6,"readQueueNums":4,"topicSysFlag":3,"writeQueueNums":4}]}
76+ """ ;
77+
78+ var pb = new Producer ( ) ;
79+ var nc = new Mock < NameClient > ( "clientId" , pb ) { CallBase = true } ;
80+ nc . Setup ( e => e . Invoke ( RequestCode . GET_ROUTEINTO_BY_TOPIC , null , It . IsAny < Object > ( ) , false ) )
81+ . Returns ( new Command { Payload = ( ArrayPacket ) target . GetBytes ( ) } ) ;
82+
83+ var client = nc . Object ;
84+ var brokers = client . GetRouteInfo ( "test_topic" ) ;
85+ Assert . Single ( brokers ) ;
86+ Assert . Equal ( 3 , brokers [ 0 ] . TopicSynFlag ) ;
87+ }
88+
89+ [ Fact ]
90+ [ DisplayName ( "GetRouteInfo_指定topic时缓存路由信息可通过GetTopicBrokers获取" ) ]
91+ public void GetRouteInfo_WithTopic_CachesResult ( )
92+ {
93+ var target = """
94+ {"brokerDatas":[{"brokerAddrs":{"0":"10.0.0.1:10911"},"brokerName":"broker-a","cluster":"DefaultCluster","enableActingMaster":false}],"filterServerTable":{},"queueDatas":[{"brokerName":"broker-a","perm":6,"readQueueNums":8,"topicSysFlag":0,"writeQueueNums":8}]}
95+ """ ;
96+
97+ var pb = new Producer ( ) ;
98+ var nc = new Mock < NameClient > ( "clientId" , pb ) { CallBase = true } ;
99+ nc . Setup ( e => e . Invoke ( RequestCode . GET_ROUTEINTO_BY_TOPIC , null , It . IsAny < Object > ( ) , false ) )
100+ . Returns ( new Command { Payload = ( ArrayPacket ) target . GetBytes ( ) } ) ;
101+
102+ var client = nc . Object ;
103+ client . GetRouteInfo ( "my_topic" ) ;
104+
105+ // 缓存应可通过 GetTopicBrokers 取回
106+ var cached = client . GetTopicBrokers ( "my_topic" ) ;
107+ Assert . NotNull ( cached ) ;
108+ Assert . Single ( cached ) ;
109+ Assert . Equal ( "broker-a" , cached [ 0 ] . Name ) ;
110+ }
111+
112+ [ Fact ]
113+ [ DisplayName ( "GetRouteInfo_null_topic不缓存且不抛出异常" ) ]
114+ public void GetRouteInfo_NullTopic_DoesNotThrow ( )
115+ {
116+ var target = """
117+ {"brokerDatas":[{"brokerAddrs":{"0":"10.0.0.1:10911"},"brokerName":"broker-a","cluster":"DefaultCluster","enableActingMaster":false}],"filterServerTable":{},"queueDatas":[{"brokerName":"broker-a","perm":6,"readQueueNums":8,"topicSysFlag":0,"writeQueueNums":8}]}
118+ """ ;
119+
120+ var pb = new Producer ( ) ;
121+ var nc = new Mock < NameClient > ( "clientId" , pb ) { CallBase = true } ;
122+ nc . Setup ( e => e . Invoke ( RequestCode . GET_ROUTEINTO_BY_TOPIC , null , It . IsAny < Object > ( ) , false ) )
123+ . Returns ( new Command { Payload = ( ArrayPacket ) target . GetBytes ( ) } ) ;
124+
125+ var client = nc . Object ;
126+ // null topic 不应抛出 ArgumentNullException
127+ var brokers = client . GetRouteInfo ( null ) ;
128+ Assert . Single ( brokers ) ;
129+ Assert . Equal ( "broker-a" , brokers [ 0 ] . Name ) ;
130+ }
131+
132+ [ Fact ]
133+ [ DisplayName ( "GetRouteInfo_Master地址排首位_Slave地址正确解析" ) ]
134+ public void GetRouteInfo_MasterSlave_Addresses ( )
135+ {
136+ var target = """
137+ {"brokerDatas":[{"brokerAddrs":{"0":"10.0.0.1:10911","1":"10.0.0.2:10911"},"brokerName":"broker-a","cluster":"DefaultCluster","enableActingMaster":false}],"filterServerTable":{},"queueDatas":[{"brokerName":"broker-a","perm":6,"readQueueNums":8,"topicSysFlag":0,"writeQueueNums":8}]}
138+ """ ;
139+
140+ var pb = new Producer ( ) ;
141+ var nc = new Mock < NameClient > ( "clientId" , pb ) { CallBase = true } ;
142+ nc . Setup ( e => e . Invoke ( RequestCode . GET_ROUTEINTO_BY_TOPIC , null , It . IsAny < Object > ( ) , false ) )
143+ . Returns ( new Command { Payload = ( ArrayPacket ) target . GetBytes ( ) } ) ;
144+
145+ var client = nc . Object ;
146+ var brokers = client . GetRouteInfo ( null ) ;
147+ Assert . Single ( brokers ) ;
148+
149+ var broker = brokers [ 0 ] ;
150+ Assert . Equal ( "10.0.0.1:10911" , broker . MasterAddress ) ;
151+ Assert . Single ( broker . SlaveAddresses ) ;
152+ Assert . Equal ( "10.0.0.2:10911" , broker . SlaveAddresses [ 0 ] ) ;
153+ // Master 地址排在第一位
154+ Assert . Equal ( "10.0.0.1:10911" , broker . Addresses [ 0 ] ) ;
155+ Assert . Equal ( 2 , broker . Addresses . Length ) ;
156+ Assert . True ( broker . IsMaster ) ;
157+ }
66158}
0 commit comments