Fix test.

This commit is contained in:
Vladimir Mihailenco 2015-11-22 14:44:38 +02:00
parent f130ab6161
commit b6b689904a
6 changed files with 36 additions and 29 deletions

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"math/rand" "math/rand"
"net" "net"
"reflect"
"strings" "strings"
"testing" "testing"
@ -116,23 +117,23 @@ func startCluster(scenario *clusterScenario) error {
// Wait until all nodes have consistent info // Wait until all nodes have consistent info
for _, client := range scenario.clients { for _, client := range scenario.clients {
err := eventually(func() error { err := eventually(func() error {
s := client.ClusterNodes().Val() res, err := client.ClusterSlots().Result()
nodes := strings.Split(s, "\n") if err != nil {
if len(nodes) < 6 { return err
return fmt.Errorf("got %d nodes, wanted 6", len(nodes))
} }
for _, node := range nodes { wanted := []redis.ClusterSlotInfo{
if node == "" { {0, 4999, []string{"127.0.0.1:8220", "127.0.0.1:8223"}},
continue {5000, 9999, []string{"127.0.0.1:8221", "127.0.0.1:8224"}},
} {10000, 16383, []string{"127.0.0.1:8222", "127.0.0.1:8225"}},
parts := strings.Split(node, " ") }
var flags string loop:
if len(parts) >= 3 { for _, info := range res {
flags = parts[2] for _, info2 := range wanted {
} if reflect.DeepEqual(info, info2) {
if !strings.Contains(flags, "master") && !strings.Contains(flags, "slave") { continue loop
return fmt.Errorf("node flags are %q", flags) }
} }
return fmt.Errorf("cluster did not reach consistent state (%v)", res)
} }
return nil return nil
}, 10*time.Second) }, 10*time.Second)

View File

@ -20,10 +20,8 @@ var _ = Describe("Commands", func() {
BeforeEach(func() { BeforeEach(func() {
client = redis.NewClient(&redis.Options{ client = redis.NewClient(&redis.Options{
Addr: redisAddr, Addr: redisAddr,
ReadTimeout: 500 * time.Millisecond, PoolTimeout: 30 * time.Second,
WriteTimeout: 500 * time.Millisecond,
PoolTimeout: 30 * time.Second,
}) })
}) })
@ -81,13 +79,10 @@ var _ = Describe("Commands", func() {
err := client.ClientPause(time.Second).Err() err := client.ClientPause(time.Second).Err()
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Consistently(func() error { start := time.Now()
return client.Ping().Err() err = client.Ping().Err()
}, "400ms").Should(HaveOccurred()) // pause time - read timeout Expect(err).NotTo(HaveOccurred())
Expect(time.Now()).To(BeTemporally("~", start.Add(time.Second), 800*time.Millisecond))
Eventually(func() error {
return client.Ping().Err()
}, "1s").ShouldNot(HaveOccurred())
}) })
It("should ClientSetName and ClientGetName", func() { It("should ClientSetName and ClientGetName", func() {

View File

@ -238,6 +238,7 @@ func ExamplePubSub_Receive() {
} }
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
// ReceiveTimeout is a low level API. Use ReceiveMessage instead.
msgi, err := pubsub.ReceiveTimeout(100 * time.Millisecond) msgi, err := pubsub.ReceiveTimeout(100 * time.Millisecond)
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -80,6 +80,9 @@ func (c *PubSub) PSubscribe(patterns ...string) error {
} }
func remove(ss []string, es ...string) []string { func remove(ss []string, es ...string) []string {
if len(es) == 0 {
return ss[:0]
}
for _, e := range es { for _, e := range es {
for i, s := range ss { for i, s := range ss {
if s == e { if s == e {
@ -231,7 +234,9 @@ func (c *PubSub) Receive() (interface{}, error) {
} }
func (c *PubSub) reconnect() { func (c *PubSub) reconnect() {
// Close current connection.
c.connPool.Remove(nil) // nil to force removal c.connPool.Remove(nil) // nil to force removal
if len(c.channels) > 0 { if len(c.channels) > 0 {
if err := c.Subscribe(c.channels...); err != nil { if err := c.Subscribe(c.channels...); err != nil {
log.Printf("redis: Subscribe failed: %s", err) log.Printf("redis: Subscribe failed: %s", err)

View File

@ -2,6 +2,7 @@ package redis_test
import ( import (
"net" "net"
"sync"
"time" "time"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
@ -261,19 +262,23 @@ var _ = Describe("PubSub", func() {
writeErr: errTimeout, writeErr: errTimeout,
}) })
var wg sync.WaitGroup
wg.Add(1)
go func() { go func() {
defer GinkgoRecover() defer GinkgoRecover()
defer wg.Done()
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
n, err := client.Publish("mychannel", "hello").Result() err := client.Publish("mychannel", "hello").Err()
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(n).To(Equal(int64(2)))
}() }()
msg, err := pubsub.ReceiveMessage() msg, err := pubsub.ReceiveMessage()
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(msg.Channel).To(Equal("mychannel")) Expect(msg.Channel).To(Equal("mychannel"))
Expect(msg.Payload).To(Equal("hello")) Expect(msg.Payload).To(Equal("hello"))
wg.Wait()
}) })
}) })

View File

@ -56,7 +56,7 @@ var _ = Describe("Redis ring", func() {
// Ring needs 5 * heartbeat time to detect that node is down. // Ring needs 5 * heartbeat time to detect that node is down.
// Give it more to be sure. // Give it more to be sure.
heartbeat := 100 * time.Millisecond heartbeat := 100 * time.Millisecond
time.Sleep(5*heartbeat + 2*heartbeat) time.Sleep(2 * 5 * heartbeat)
setRingKeys() setRingKeys()