88]
99
1010class MockRedis < Mocks ::Mock
11+ attr_reader :host , :port
12+ 13+ def initialize ( host , port )
14+ super ( )
15+ @host = host
16+ @port = port
17+ self . stubs ( :ping ) . returns ( 'PONG' )
18+ end
19+ 1120 def cluster ( cmd )
1221 if cmd == 'slots'
1322 [
@@ -28,7 +37,7 @@ def cluster(cmd)
2837
2938assert ( 'RedisCluster#get_cluster_nodes' ) do
3039 rc = RedisCluster . new ( HOSTS )
31- rc . define_singleton_method ( :get_redis_link ) { MockRedis . new }
40+ rc . define_singleton_method ( :get_redis_link ) { | node | MockRedis . new ( node [ :host ] , node [ :port ] ) }
3241
3342 expect = {
3443 '0000' => { host : '127.0.0.1' , port : 7000 , name : '127.0.0.1:7000@17000' , flags : [ 'master' ] } ,
@@ -44,7 +53,7 @@ def cluster(cmd)
4453
4554assert ( 'RedisCluster#cluster_nodes' ) do
4655 rc = RedisCluster . new ( HOSTS )
47- rc . define_singleton_method ( :get_redis_link ) { MockRedis . new }
56+ rc . define_singleton_method ( :get_redis_link ) { | node | MockRedis . new ( node [ :host ] , node [ :port ] ) }
4857 rc . initialize_slots_cache
4958
5059 assert_equal '0000' , rc . instance_variable_get ( '@slots' ) [ 0 ]
@@ -55,6 +64,66 @@ def cluster(cmd)
5564 assert_equal '2222' , rc . instance_variable_get ( '@slots' ) [ 16383 ]
5665end
5766
67+ assert ( 'RedisCluster#get_connection_by' ) do
68+ rc = RedisCluster . new ( HOSTS )
69+ rc . define_singleton_method ( :get_redis_link ) { |node | MockRedis . new ( node [ :host ] , node [ :port ] ) }
70+ rc . define_singleton_method ( :get_random_connection ) { MockRedis . new ( '192.0.2.1' , 6379 ) }
71+ rc . initialize_slots_cache
72+ 73+ conn = rc . get_connection_by ( 16383 )
74+ assert_equal '127.0.0.1' , conn . host
75+ assert_equal 7002 , conn . port
76+ 77+ # clear slot cache, expect get_random_connection() is called
78+ rc . instance_variable_get ( '@slots' ) [ 16383 ] = nil
79+ 80+ conn = rc . get_connection_by ( 16383 )
81+ assert_equal '192.0.2.1' , conn . host
82+ assert_equal 6379 , conn . port
83+ end
84+ 85+ assert ( 'RedisCluster#get_random_connection' ) do
86+ rc = RedisCluster . new ( HOSTS )
87+ rc . define_singleton_method ( :get_redis_link ) { |node | MockRedis . new ( node [ :host ] , node [ :port ] ) }
88+ rc . initialize_slots_cache
89+ 90+ nodes = {
91+ '1234' => { host : '192.0.2.1' , port : 7000 , name : '192.0.2.1:7000' , flags : [ 'master' ] }
92+ }
93+ rc . instance_variable_set ( '@nodes' , nodes )
94+ rc . instance_variable_get ( '@connections' ) [ '1234' ] = nil
95+ 96+ conn = rc . get_random_connection
97+ assert_equal '192.0.2.1' , conn . host
98+ assert_equal 7000 , conn . port
99+ assert_equal conn , rc . instance_variable_get ( '@connections' ) [ '1234' ]
100+ 101+ rc . instance_variable_get ( '@connections' ) [ '1234' ] . stubs ( :ping ) . returns ( nil )
102+ assert_raise ( RuntimeError ) { rc . get_random_connection }
103+ 104+ rc . instance_variable_set ( '@nodes' , { } )
105+ assert_raise ( RuntimeError ) { rc . get_random_connection }
106+ end
107+ 108+ assert ( 'RedisCluster#send_cluster_command' ) do
109+ rc = RedisCluster . new ( HOSTS )
110+ rc . define_singleton_method ( :get_redis_link ) do |node |
111+ mock = MockRedis . new ( node [ :host ] , node [ :port ] )
112+ mock . define_singleton_method ( :send ) do
113+ return '123456789' if self . port == 7002
114+ raise Redis ::ReplyError , 'MOVED 12739 127.0.0.1:7002'
115+ end
116+ mock
117+ end
118+ rc . initialize_slots_cache
119+ 120+ assert_equal '123456789' , rc . send_cluster_command ( [ :get , '123456789' ] )
121+ 122+ # set wrong node id
123+ rc . instance_variable_get ( '@slots' ) [ 12739 ] = '0000'
124+ assert_equal '123456789' , rc . send_cluster_command ( [ :get , '123456789' ] )
125+ end
126+ 58127assert ( 'RedisCluster#extract_key' ) do
59128 rc = RedisCluster . new ( HOSTS )
60129 %i( info multi exec slaveof config shutdown ) . each do |cmd |
0 commit comments