diff --git a/example_test.go b/example_test.go index ec8c151..291e5b4 100644 --- a/example_test.go +++ b/example_test.go @@ -343,11 +343,7 @@ func ExamplePubSub() { }) // Consume messages. - for { - msg, ok := <-ch - if !ok { - break - } + for msg := range ch { fmt.Println(msg.Channel, msg.Payload) } diff --git a/options.go b/options.go index 2b5bcb5..088f697 100644 --- a/options.go +++ b/options.go @@ -48,7 +48,7 @@ type Options struct { // Default is 5 seconds. DialTimeout time.Duration // Timeout for socket reads. If reached, commands will fail - // with a timeout instead of blocking. + // with a timeout instead of blocking. Use value -1 for no timeout and 0 for default. // Default is 3 seconds. ReadTimeout time.Duration // Timeout for socket writes. If reached, commands will fail diff --git a/options_test.go b/options_test.go index 211f6b1..9b806f4 100644 --- a/options_test.go +++ b/options_test.go @@ -5,6 +5,7 @@ package redis import ( "errors" "testing" + "time" ) func TestParseURL(t *testing.T) { @@ -92,3 +93,27 @@ func TestParseURL(t *testing.T) { }) } } + +// Test ReadTimeout option initialization, including special values -1 and 0. +// And also test behaviour of WriteTimeout option, when it is not explicitly set and use +// ReadTimeout value. +func TestReadTimeoutOptions(t *testing.T) { + testDataInputOutputMap := map[time.Duration]time.Duration{ + -1: 0 * time.Second, + 0: 3 * time.Second, + 1: 1 * time.Nanosecond, + 3: 3 * time.Nanosecond, + } + + for in, out := range testDataInputOutputMap { + o := &Options{ReadTimeout: in} + o.init() + if o.ReadTimeout != out { + t.Errorf("got %d instead of %d as ReadTimeout option", o.ReadTimeout, out) + } + + if o.WriteTimeout != o.ReadTimeout { + t.Errorf("got %d instead of %d as WriteTimeout option", o.WriteTimeout, o.ReadTimeout) + } + } +} diff --git a/sentinel.go b/sentinel.go index c03f264..5361a02 100644 --- a/sentinel.go +++ b/sentinel.go @@ -153,13 +153,13 @@ func (c *SentinelClient) PSubscribe(channels ...string) *PubSub { } func (c *SentinelClient) GetMasterAddrByName(name string) *StringSliceCmd { - cmd := NewStringSliceCmd("SENTINEL", "get-master-addr-by-name", name) + cmd := NewStringSliceCmd("sentinel", "get-master-addr-by-name", name) c.Process(cmd) return cmd } func (c *SentinelClient) Sentinels(name string) *SliceCmd { - cmd := NewSliceCmd("SENTINEL", "sentinels", name) + cmd := NewSliceCmd("sentinel", "sentinels", name) c.Process(cmd) return cmd }