|
| 1 | +package exporter |
| 2 | + |
| 3 | +import ( |
| 4 | + "os" |
| 5 | + "slices" |
| 6 | + "testing" |
| 7 | +) |
| 8 | + |
| 9 | +func TestNodesGetClusterNodes(t *testing.T) { |
| 10 | + if os.Getenv("TEST_REDIS_CLUSTER_MASTER_URI") == "" { |
| 11 | + t.Skipf("TEST_REDIS_CLUSTER_MASTER_URI not set - skipping") |
| 12 | + } |
| 13 | + |
| 14 | + host := os.Getenv("TEST_REDIS_CLUSTER_MASTER_URI") |
| 15 | + e, _ := NewRedisExporter(host, Options{}) |
| 16 | + c, err := e.connectToRedisCluster() |
| 17 | + if err != nil { |
| 18 | + t.Fatalf("connectToRedisCluster() err: %s", err) |
| 19 | + } |
| 20 | + defer c.Close() |
| 21 | + |
| 22 | + nodes, err := e.getClusterNodes(c) |
| 23 | + if err != nil { |
| 24 | + t.Fatalf("getClusterNodes() err: %s", err) |
| 25 | + } |
| 26 | + |
| 27 | + tsts := []struct { |
| 28 | + node string |
| 29 | + ok bool |
| 30 | + }{ |
| 31 | + {node: "127.0.0.1:7003", ok: true}, |
| 32 | + {node: "127.0.0.1:7002", ok: true}, |
| 33 | + {node: "127.0.0.1:7005", ok: true}, |
| 34 | + {node: "127.0.0.1:7001", ok: true}, |
| 35 | + {node: "127.0.0.1:7004", ok: true}, |
| 36 | + {node: "127.0.0.1:7000", ok: true}, |
| 37 | + |
| 38 | + {node: "", ok: false}, |
| 39 | + {node: " ", ok: false}, |
| 40 | + {node: "127.0.0.1", ok: false}, |
| 41 | + {node: "127.0.0.1:8000", ok: false}, |
| 42 | + } |
| 43 | + |
| 44 | + for _, tst := range tsts { |
| 45 | + t.Run(tst.node, func(t *testing.T) { |
| 46 | + found := slices.Contains(nodes, tst.node) |
| 47 | + if found != tst.ok { |
| 48 | + t.Errorf("Test failed for node: %s expected: %t, got: %t", tst.node, tst.ok, found) |
| 49 | + } |
| 50 | + }) |
| 51 | + } |
| 52 | +} |
| 53 | + |
| 54 | +func TestParseClusterNodeString(t *testing.T) { |
| 55 | + tsts := []struct { |
| 56 | + line string |
| 57 | + node string |
| 58 | + ok bool |
| 59 | + }{ |
| 60 | + // The following are examples of the output of the CLUSTER NODES command. |
| 61 | + // https://redis.io/docs/latest/commands/cluster-nodes/ |
| 62 | + {line: "07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004,hostname4 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected", node: "127.0.0.1:30004", ok: true}, |
| 63 | + {line: "67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 127.0.0.1:30002@31002,hostname2 master - 0 1426238316232 2 connected 5461-10922", node: "127.0.0.1:30002", ok: true}, |
| 64 | + {line: "292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 127.0.0.1:30003@31003,hostname3 master - 0 1426238318243 3 connected 10923-16383", node: "127.0.0.1:30003", ok: true}, |
| 65 | + {line: "6ec23923021cf3ffec47632106199cb7f496ce01 127.0.0.1:30005@31005,hostname5 slave 67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 0 1426238316232 5 connected", node: "127.0.0.1:30005", ok: true}, |
| 66 | + {line: "824fe116063bc5fcf9f4ffd895bc17aee7731ac3 127.0.0.1:30006@31006,hostname6 slave 292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 0 1426238317741 6 connected", node: "127.0.0.1:30006", ok: true}, |
| 67 | + {line: "e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001,hostname1 myself,master - 0 0 1 connected 0-5460", node: "127.0.0.1:30001", ok: true}, |
| 68 | + {line: "e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001 myself,master - 0 0 1 connected 0-5460", node: "127.0.0.1:30001", ok: true}, |
| 69 | + |
| 70 | + {line: "07c37dfeb235213a872192d90877d0cd55635b91", ok: false}, |
| 71 | + {line: "07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004,hostname4 slave", ok: false}, |
| 72 | + {line: "127.0.0.1:30005,hostname5", ok: false}, |
| 73 | + } |
| 74 | + |
| 75 | + for _, tst := range tsts { |
| 76 | + t.Run(tst.line, func(t *testing.T) { |
| 77 | + node, ok := parseClusterNodeString(tst.line) |
| 78 | + |
| 79 | + if ok != tst.ok { |
| 80 | + t.Errorf("Test failed for line: %s", tst.line) |
| 81 | + return |
| 82 | + } |
| 83 | + if node != tst.node { |
| 84 | + t.Errorf("Node not matching, expected: %s, got: %s", tst.node, node) |
| 85 | + return |
| 86 | + } |
| 87 | + }) |
| 88 | + } |
| 89 | +} |
0 commit comments