From 77b4efa55f2b6e7a3e3e091608d66d1acd63d6d2 Mon Sep 17 00:00:00 2001 From: tidwall Date: Tue, 27 Sep 2022 14:06:24 -0700 Subject: [PATCH] Better FOLLOW/MONITOR tests --- tests/follower_test.go | 46 +++++++++++++------------ tests/monitor_test.go | 77 ++++++++++++++++++++++++++++++++++++++++++ tests/tests_test.go | 3 +- 3 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 tests/monitor_test.go diff --git a/tests/follower_test.go b/tests/follower_test.go index e7f565b8..97d44add 100644 --- a/tests/follower_test.go +++ b/tests/follower_test.go @@ -21,6 +21,8 @@ func follower_follow_test(mc *mockServer) error { Do("SET", "mykey", "truck4", "POINT", 10, 10).OK(), Do("SET", "mykey", "truck5", "POINT", 10, 10).OK(), Do("SET", "mykey", "truck6", "POINT", 10, 10).OK(), + Do("CONFIG", "SET", "requirepass", "1234").OK(), + Do("AUTH", "1234").OK(), ) if err != nil { return err @@ -31,34 +33,36 @@ func follower_follow_test(mc *mockServer) error { Do("GET", "mykey2", "truck1").Str(`{"type":"Point","coordinates":[10,10]}`), Do("GET", "mykey2", "truck2").Str(`{"type":"Point","coordinates":[10,10]}`), + Do("CONFIG", "SET", "leaderauth", "1234").OK(), Do("FOLLOW", "localhost", mc.port).OK(), - Do("GET", "mykey2", "truck1").Err("catching up to leader"), - Sleep(time.Second), - Do("GET", "mykey2", "truck1").Err(``), - Do("GET", "mykey2", "truck2").Err(``), + Do("GET", "mykey", "truck1").Err("catching up to leader"), + Sleep(time.Second/2), + + Do("GET", "mykey", "truck1").Err(`{"type":"Point","coordinates":[10,10]}`), + Do("GET", "mykey", "truck2").Err(`{"type":"Point","coordinates":[10,10]}`), ) if err != nil { return err } - // err = mc.DoBatch( - // Do("SET", "mykey", "truck7", "POINT", 10, 10).OK(), - // Do("SET", "mykey", "truck8", "POINT", 10, 10).OK(), - // Do("SET", "mykey", "truck9", "POINT", 10, 10).OK(), - // ) - // if err != nil { - // return err - // } + err = mc.DoBatch( + Do("SET", "mykey", "truck7", "POINT", 10, 10).OK(), + Do("SET", "mykey", "truck8", "POINT", 10, 10).OK(), + Do("SET", "mykey", "truck9", "POINT", 10, 10).OK(), + ) + if err != nil { + return err + } - // err = mc2.DoBatch( - // Sleep(time.Second/2), - // Do("GET", "mykey1", "truck7").Str(`{"type":"Point","coordinates":[10,10]}`), - // Do("GET", "mykey1", "truck8").Str(`{"type":"Point","coordinates":[10,10]}`), - // Do("GET", "mykey1", "truck9").Str(`{"type":"Point","coordinates":[10,10]}`), - // ) - // if err != nil { - // return err - // } + err = mc2.DoBatch( + Sleep(time.Second/2), + Do("GET", "mykey", "truck7").Str(`{"type":"Point","coordinates":[10,10]}`), + Do("GET", "mykey", "truck8").Str(`{"type":"Point","coordinates":[10,10]}`), + Do("GET", "mykey", "truck9").Str(`{"type":"Point","coordinates":[10,10]}`), + ) + if err != nil { + return err + } return nil } diff --git a/tests/monitor_test.go b/tests/monitor_test.go new file mode 100644 index 00000000..32818430 --- /dev/null +++ b/tests/monitor_test.go @@ -0,0 +1,77 @@ +package tests + +import ( + "fmt" + "strings" + "sync" + + "github.com/gomodule/redigo/redis" +) + +func subTestMonitor(g *testGroup) { + g.regSubTest("monitor", follower_monitor_test) +} + +func follower_monitor_test(mc *mockServer) error { + N := 1000 + ch := make(chan error) + var wg sync.WaitGroup + wg.Add(1) + go func() { + ch <- func() error { + conn, err := redis.Dial("tcp", fmt.Sprintf("localhost:%d", mc.port)) + if err != nil { + wg.Done() + return err + } + defer conn.Close() + s, err := redis.String(conn.Do("MONITOR")) + if err != nil { + wg.Done() + return err + } + if s != "OK" { + wg.Done() + return fmt.Errorf("expected '%s', got '%s'", "OK", s) + } + wg.Done() + + for i := 0; i < N; i++ { + s, err := redis.String(conn.Receive()) + if err != nil { + return err + } + ex := fmt.Sprintf(`"mykey" "%d"`, i) + if !strings.Contains(s, ex) { + return fmt.Errorf("expected '%s', got '%s'", ex, s) + } + } + return nil + }() + }() + + wg.Wait() + + conn, err := redis.Dial("tcp", fmt.Sprintf("localhost:%d", mc.port)) + if err != nil { + return err + } + defer conn.Close() + + for i := 0; i < N; i++ { + s, err := redis.String(conn.Do("SET", "mykey", i, "POINT", 10, 10)) + if err != nil { + return err + } + if s != "OK" { + return fmt.Errorf("expected '%s', got '%s'", "OK", s) + } + } + + err = <-ch + if err != nil { + err = fmt.Errorf("monitor client: %w", err) + } + + return err +} diff --git a/tests/tests_test.go b/tests/tests_test.go index 0546236b..7298426c 100644 --- a/tests/tests_test.go +++ b/tests/tests_test.go @@ -54,8 +54,9 @@ func TestIntegration(t *testing.T) { regTestGroup("info", subTestInfo) regTestGroup("timeouts", subTestTimeout) regTestGroup("metrics", subTestMetrics) - regTestGroup("aof", subTestAOF) regTestGroup("follower", subTestFollower) + regTestGroup("aof", subTestAOF) + regTestGroup("monitor", subTestMonitor) runTestGroups(t) }