...
1 package redis_test
2
3 import (
4 "github.com/go-redis/redis"
5
6 . "github.com/onsi/ginkgo"
7 . "github.com/onsi/gomega"
8 )
9
10 var _ = Describe("Sentinel", func() {
11 var client *redis.Client
12
13 BeforeEach(func() {
14 client = redis.NewFailoverClient(&redis.FailoverOptions{
15 MasterName: sentinelName,
16 SentinelAddrs: []string{":" + sentinelPort},
17 })
18 Expect(client.FlushDB().Err()).NotTo(HaveOccurred())
19 })
20
21 AfterEach(func() {
22 Expect(client.Close()).NotTo(HaveOccurred())
23 })
24
25 It("should facilitate failover", func() {
26
27 err := client.Set("foo", "master", 0).Err()
28 Expect(err).NotTo(HaveOccurred())
29
30
31 val, err := sentinelMaster.Get("foo").Result()
32 Expect(err).NotTo(HaveOccurred())
33 Expect(val).To(Equal("master"))
34
35
36 ch := client.Subscribe("foo").Channel()
37
38
39 Eventually(func() string {
40 return sentinelSlave1.Get("foo").Val()
41 }, "1s", "100ms").Should(Equal("master"))
42 Eventually(func() string {
43 return sentinelSlave2.Get("foo").Val()
44 }, "1s", "100ms").Should(Equal("master"))
45
46
47 Eventually(func() string {
48 return sentinel.Info().Val()
49 }, "10s", "100ms").Should(ContainSubstring("slaves=2"))
50
51
52 sentinelMaster.Shutdown()
53 Eventually(func() error {
54 return sentinelMaster.Ping().Err()
55 }, "5s", "100ms").Should(HaveOccurred())
56
57
58 Eventually(func() string {
59 return sentinelSlave1.Info().Val() + sentinelSlave2.Info().Val()
60 }, "30s", "1s").Should(ContainSubstring("role:master"))
61
62
63 Eventually(func() error {
64 return client.Get("foo").Err()
65 }, "5s", "100ms").ShouldNot(HaveOccurred())
66
67
68 err = client.Publish("foo", "hello").Err()
69 Expect(err).NotTo(HaveOccurred())
70
71 var msg *redis.Message
72 Eventually(ch, "5s").Should(Receive(&msg))
73 Expect(msg.Channel).To(Equal("foo"))
74 Expect(msg.Payload).To(Equal("hello"))
75 })
76
77 It("supports DB selection", func() {
78 Expect(client.Close()).NotTo(HaveOccurred())
79
80 client = redis.NewFailoverClient(&redis.FailoverOptions{
81 MasterName: sentinelName,
82 SentinelAddrs: []string{":" + sentinelPort},
83 DB: 1,
84 })
85 err := client.Ping().Err()
86 Expect(err).NotTo(HaveOccurred())
87 })
88 })
89
View as plain text