From c4fbc1d3368734838fd3004dc0b38a8c862e080d Mon Sep 17 00:00:00 2001
From: antirez <antirez@gmail.com>
Date: Tue, 18 Feb 2014 11:38:49 +0100
Subject: [PATCH] Sentinel test: info fields, master-slave setup, fixes.

---
 tests/sentinel-tests/00-base.tcl |  4 +++
 tests/sentinel.tcl               | 57 +++++++++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/tests/sentinel-tests/00-base.tcl b/tests/sentinel-tests/00-base.tcl
index c148e416..2eb5de34 100644
--- a/tests/sentinel-tests/00-base.tcl
+++ b/tests/sentinel-tests/00-base.tcl
@@ -3,3 +3,7 @@ test "Sentinels aren't monitoring any master" {
         assert {[S $id sentinel masters] eq {}}
     }
 }
+
+test "Sentinels can start monitoring a master" {
+    create_redis_master_slave_cluster 3
+}
diff --git a/tests/sentinel.tcl b/tests/sentinel.tcl
index d8efff6b..38243abd 100644
--- a/tests/sentinel.tcl
+++ b/tests/sentinel.tcl
@@ -47,7 +47,12 @@ proc spawn_instance {type base_port count} {
         close $cfg
 
         # Finally exec it and remember the pid for later cleanup.
-        set sentinel_pid [exec ../../src/redis-sentinel $cfgfile &]
+        if {$type eq "redis"} {
+            set prgname redis-server
+        } else {
+            set prgname redis-sentinel
+        }
+        set sentinel_pid [exec ../../src/${prgname} $cfgfile &]
         lappend ::pids $sentinel_pid
 
         # Check availability
@@ -133,6 +138,26 @@ proc R {n args} {
     [dict get $r link] {*}$args
 }
 
+proc get_info_field {info field} {
+    set fl [string length $field]
+    append field :
+    foreach line [split $info "\n"] {
+        set line [string trim $line "\r\n "]
+        if {[string range $line 0 $fl] eq $field} {
+            return [string range $line [expr {$fl+1}] end]
+        }
+    }
+    return {}
+}
+
+proc SI {n field} {
+    get_info_field [S $n info] $field
+}
+
+proc RI {n field} {
+    get_info_field [R $n info] $field
+}
+
 # Iterate over IDs of sentinel or redis instances.
 proc foreach_sentinel_id {idvar code} {
     upvar 1 $idvar id
@@ -148,6 +173,36 @@ proc foreach_redis_id {idvar code} {
     }
 }
 
+# Get the specific attribute of the specified instance type, id.
+proc get_instance_attrib {type id attrib} {
+    dict get [lindex [set ::${type}_instances] $id] $attrib
+}
+
+# Create a master-slave cluster of the given number of total instances.
+# The first instance "0" is the master, all others are configured as
+# slaves.
+proc create_redis_master_slave_cluster n {
+    foreach_redis_id id {
+        if {$id == 0} {
+            # Our master.
+            R $id flushall
+            R $id slaveof no one
+        } elseif {$id < $n} {
+            R $id slaveof [get_instance_attrib redis 0 host] \
+                          [get_instance_attrib redis 0 port]
+        } else {
+            # Instances not part of the cluster.
+            R $id slaveof no one
+        }
+    }
+    # Wait for all the slaves to sync.
+    wait_for_condition 100 50 {
+        [RI 0 connected_slaves] == ($n-1)
+    } else {
+        fail "Unable to create a master-slaves cluster."
+    }
+}
+
 if {[catch main e]} {
     puts $::errorInfo
     cleanup