1 package redis_test
2
3 import (
4 . "github.com/bsm/ginkgo/v2"
5 . "github.com/bsm/gomega"
6
7 "github.com/redis/go-redis/v9"
8 )
9
10 var _ = Describe("UniversalClient", func() {
11 var client redis.UniversalClient
12
13 AfterEach(func() {
14 if client != nil {
15 Expect(client.Close()).To(Succeed())
16 }
17 })
18
19 It("should connect to failover servers", Label("NonRedisEnterprise"), func() {
20 client = redis.NewUniversalClient(&redis.UniversalOptions{
21 MasterName: sentinelName,
22 Addrs: sentinelAddrs,
23 })
24 Expect(client.Ping(ctx).Err()).NotTo(HaveOccurred())
25 })
26
27 It("should connect to failover cluster", Label("NonRedisEnterprise"), func() {
28 client = redis.NewUniversalClient(&redis.UniversalOptions{
29 MasterName: sentinelName,
30 RouteRandomly: true,
31 Addrs: sentinelAddrs,
32 })
33 _, ok := client.(*redis.ClusterClient)
34 Expect(ok).To(BeTrue(), "expected a ClusterClient")
35 })
36
37 It("should connect to simple servers", func() {
38 client = redis.NewUniversalClient(&redis.UniversalOptions{
39 Addrs: []string{redisAddr},
40 })
41 Expect(client.Ping(ctx).Err()).NotTo(HaveOccurred())
42 })
43
44 It("should connect to clusters", Label("NonRedisEnterprise"), func() {
45 client = redis.NewUniversalClient(&redis.UniversalOptions{
46 Addrs: cluster.addrs(),
47 })
48 Expect(client.Ping(ctx).Err()).NotTo(HaveOccurred())
49 })
50
51 It("connect to clusters with UniversalClient and UnstableResp3", Label("NonRedisEnterprise"), func() {
52 client = redis.NewUniversalClient(&redis.UniversalOptions{
53 Addrs: cluster.addrs(),
54 Protocol: 3,
55 UnstableResp3: true,
56 })
57 Expect(client.Ping(ctx).Err()).NotTo(HaveOccurred())
58 a := func() { client.FTInfo(ctx, "all").Result() }
59 Expect(a).ToNot(Panic())
60 })
61
62 It("connect to clusters with ClusterClient and UnstableResp3", Label("NonRedisEnterprise"), func() {
63 client = redis.NewClusterClient(&redis.ClusterOptions{
64 Addrs: cluster.addrs(),
65 Protocol: 3,
66 UnstableResp3: true,
67 })
68 Expect(client.Ping(ctx).Err()).NotTo(HaveOccurred())
69 a := func() { client.FTInfo(ctx, "all").Result() }
70 Expect(a).ToNot(Panic())
71 })
72
73 It("should connect to failover servers on slaves when readonly Options is ok", Label("NonRedisEnterprise"), func() {
74 client = redis.NewUniversalClient(&redis.UniversalOptions{
75 MasterName: sentinelName,
76 Addrs: sentinelAddrs,
77 ReadOnly: true,
78 })
79 Expect(client.Ping(ctx).Err()).NotTo(HaveOccurred())
80
81 roleCmd := client.Do(ctx, "ROLE")
82 role, err := roleCmd.Result()
83 Expect(err).NotTo(HaveOccurred())
84
85 roleSlice, ok := role.([]interface{})
86 Expect(ok).To(BeTrue())
87 Expect(roleSlice[0]).To(Equal("slave"))
88
89 err = client.Set(ctx, "somekey", "somevalue", 0).Err()
90 Expect(err).To(HaveOccurred())
91 })
92
93 It("should connect to clusters if IsClusterMode is set even if only a single address is provided", Label("NonRedisEnterprise"), func() {
94 client = redis.NewUniversalClient(&redis.UniversalOptions{
95 Addrs: []string{cluster.addrs()[0]},
96 IsClusterMode: true,
97 })
98 _, ok := client.(*redis.ClusterClient)
99 Expect(ok).To(BeTrue(), "expected a ClusterClient")
100 })
101
102 It("should return all slots after instantiating UniversalClient with IsClusterMode", Label("NonRedisEnterprise"), func() {
103 client = redis.NewUniversalClient(&redis.UniversalOptions{
104 Addrs: []string{cluster.addrs()[0]},
105 IsClusterMode: true,
106 })
107 Expect(client.ClusterSlots(ctx).Val()).To(HaveLen(3))
108 })
109 })
110
View as plain text