@@ -253,13 +253,58 @@ def test_sentinel_retries
253253 assert_match ( /No sentinels available/ , ex . message )
254254 end
255255
256+ def test_sentinel_nearest
257+ sentinels = [ { :host => "127.0.0.1" , :port => 26381 } ]
258+
259+ master = { :role => lambda { [ "master" ] } , :node_id => lambda { [ "master" ] } , :ping => lambda { [ "OK" ] } }
260+ s1 = { :role => lambda { [ "slave" ] } , :node_id => lambda { [ "1" ] } , :ping => lambda { sleep 0.1 ; [ "OK" ] } }
261+ s2 = { :role => lambda { [ "slave" ] } , :node_id => lambda { [ "2" ] } , :ping => lambda { sleep 0.2 ; [ "OK" ] } }
262+ s3 = { :role => lambda { [ "slave" ] } , :node_id => lambda { [ "3" ] } , :ping => lambda { sleep 0.3 ; [ "OK" ] } }
263+
264+ 5 . times do
265+ RedisMock . start ( master ) do |master_port |
266+ RedisMock . start ( s1 ) do |s1_port |
267+ RedisMock . start ( s2 ) do |s2_port |
268+ RedisMock . start ( s3 ) do |s3_port |
269+
270+ sentinel = lambda do |port |
271+ {
272+ :sentinel => lambda do |command , *args |
273+ case command
274+ when "master"
275+ %W[ role-reported master ip 127.0.0.1 port #{ master_port } ]
276+ when "slaves"
277+ [
278+ %W[ master-link-status down ip 127.0.0.1 port #{ s1_port } ] ,
279+ %W[ master-link-status ok ip 127.0.0.1 port #{ s2_port } ] ,
280+ %W[ master-link-status ok ip 127.0.0.1 port #{ s3_port } ]
281+ ] . shuffle
282+ else
283+ [ "127.0.0.1" , port . to_s ]
284+ end
285+ end
286+ }
287+ end
288+
289+ RedisMock . start ( sentinel . call ( master_port ) ) do |sen_port |
290+ sentinels [ 0 ] [ :port ] = sen_port
291+ redis = Redis . new ( :url => "redis://master1" , :sentinels => sentinels , :role => :nearest )
292+ assert_equal [ "master" ] , redis . node_id
293+ end
294+ end
295+ end
296+ end
297+ end
298+ end
299+ end
300+
256301 def test_sentinel_nearest_slave
257302 sentinels = [ { :host => "127.0.0.1" , :port => 26381 } ]
258303
259304 master = { :role => lambda { [ "master" ] } }
260- s1 = { :role => lambda { [ "slave" ] } , :slave_id => lambda { [ "1" ] } , :ping => lambda { [ "OK" ] } }
261- s2 = { :role => lambda { [ "slave" ] } , :slave_id => lambda { [ "2" ] } , :ping => lambda { sleep 0.1 ; [ "OK" ] } }
262- s3 = { :role => lambda { [ "slave" ] } , :slave_id => lambda { [ "3" ] } , :ping => lambda { sleep 0.2 ; [ "OK" ] } }
305+ s1 = { :role => lambda { [ "slave" ] } , :node_id => lambda { [ "1" ] } , :ping => lambda { [ "OK" ] } }
306+ s2 = { :role => lambda { [ "slave" ] } , :node_id => lambda { [ "2" ] } , :ping => lambda { sleep 0.1 ; [ "OK" ] } }
307+ s3 = { :role => lambda { [ "slave" ] } , :node_id => lambda { [ "3" ] } , :ping => lambda { sleep 0.2 ; [ "OK" ] } }
263308
264309 5 . times do
265310 RedisMock . start ( master ) do |master_port |
@@ -287,7 +332,7 @@ def test_sentinel_nearest_slave
287332 RedisMock . start ( sentinel . call ( master_port ) ) do |sen_port |
288333 sentinels [ 0 ] [ :port ] = sen_port
289334 redis = Redis . new ( :url => "redis://master1" , :sentinels => sentinels , :role => :nearest_slave )
290- assert_equal redis . slave_id , [ "2" ]
335+ assert_equal redis . node_id , [ "2" ]
291336 end
292337 end
293338 end
0 commit comments