|
|
@@ -15,8 +15,8 @@
|
|
|
package redis_test
|
|
|
|
|
|
import (
|
|
|
- "bufio"
|
|
|
"bytes"
|
|
|
+ "io"
|
|
|
"math"
|
|
|
"net"
|
|
|
"os"
|
|
|
@@ -25,10 +25,27 @@ import (
|
|
|
"testing"
|
|
|
"time"
|
|
|
|
|
|
- "github.com/garyburd/redigo/internal/redistest"
|
|
|
"github.com/garyburd/redigo/redis"
|
|
|
)
|
|
|
|
|
|
+type testConn struct {
|
|
|
+ io.Reader
|
|
|
+ io.Writer
|
|
|
+}
|
|
|
+
|
|
|
+func (*testConn) Close() error { return nil }
|
|
|
+func (*testConn) LocalAddr() net.Addr { return nil }
|
|
|
+func (*testConn) RemoteAddr() net.Addr { return nil }
|
|
|
+func (*testConn) SetDeadline(t time.Time) error { return nil }
|
|
|
+func (*testConn) SetReadDeadline(t time.Time) error { return nil }
|
|
|
+func (*testConn) SetWriteDeadline(t time.Time) error { return nil }
|
|
|
+
|
|
|
+func dialTestConn(r io.Reader, w io.Writer) redis.DialOption {
|
|
|
+ return redis.DialNetDial(func(net, addr string) (net.Conn, error) {
|
|
|
+ return &testConn{Reader: r, Writer: w}, nil
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
var writeTests = []struct {
|
|
|
args []interface{}
|
|
|
expected string
|
|
|
@@ -74,14 +91,13 @@ var writeTests = []struct {
|
|
|
func TestWrite(t *testing.T) {
|
|
|
for _, tt := range writeTests {
|
|
|
var buf bytes.Buffer
|
|
|
- rw := bufio.ReadWriter{Writer: bufio.NewWriter(&buf)}
|
|
|
- c := redis.NewConnBufio(rw)
|
|
|
+ c, _ := redis.Dial("", "", dialTestConn(nil, &buf))
|
|
|
err := c.Send(tt.args[0].(string), tt.args[1:]...)
|
|
|
if err != nil {
|
|
|
t.Errorf("Send(%v) returned error %v", tt.args, err)
|
|
|
continue
|
|
|
}
|
|
|
- rw.Flush()
|
|
|
+ c.Flush()
|
|
|
actual := buf.String()
|
|
|
if actual != tt.expected {
|
|
|
t.Errorf("Send(%v) = %q, want %q", tt.args, actual, tt.expected)
|
|
|
@@ -174,11 +190,7 @@ var readTests = []struct {
|
|
|
|
|
|
func TestRead(t *testing.T) {
|
|
|
for _, tt := range readTests {
|
|
|
- rw := bufio.ReadWriter{
|
|
|
- Reader: bufio.NewReader(strings.NewReader(tt.reply)),
|
|
|
- Writer: bufio.NewWriter(nil), // writer need to support Flush
|
|
|
- }
|
|
|
- c := redis.NewConnBufio(rw)
|
|
|
+ c, _ := redis.Dial("", "", dialTestConn(strings.NewReader(tt.reply), nil))
|
|
|
actual, err := c.Receive()
|
|
|
if tt.expected == errorSentinel {
|
|
|
if err == nil {
|
|
|
@@ -258,7 +270,7 @@ var testCommands = []struct {
|
|
|
}
|
|
|
|
|
|
func TestDoCommands(t *testing.T) {
|
|
|
- c, err := redistest.Dial()
|
|
|
+ c, err := redis.DialDefaultServer()
|
|
|
if err != nil {
|
|
|
t.Fatalf("error connection to database, %v", err)
|
|
|
}
|
|
|
@@ -277,7 +289,7 @@ func TestDoCommands(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
func TestPipelineCommands(t *testing.T) {
|
|
|
- c, err := redistest.Dial()
|
|
|
+ c, err := redis.DialDefaultServer()
|
|
|
if err != nil {
|
|
|
t.Fatalf("error connection to database, %v", err)
|
|
|
}
|
|
|
@@ -303,7 +315,7 @@ func TestPipelineCommands(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
func TestBlankCommmand(t *testing.T) {
|
|
|
- c, err := redistest.Dial()
|
|
|
+ c, err := redis.DialDefaultServer()
|
|
|
if err != nil {
|
|
|
t.Fatalf("error connection to database, %v", err)
|
|
|
}
|
|
|
@@ -330,7 +342,7 @@ func TestBlankCommmand(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
func TestRecvBeforeSend(t *testing.T) {
|
|
|
- c, err := redistest.Dial()
|
|
|
+ c, err := redis.DialDefaultServer()
|
|
|
if err != nil {
|
|
|
t.Fatalf("error connection to database, %v", err)
|
|
|
}
|
|
|
@@ -351,7 +363,7 @@ func TestRecvBeforeSend(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
func TestError(t *testing.T) {
|
|
|
- c, err := redistest.Dial()
|
|
|
+ c, err := redis.DialDefaultServer()
|
|
|
if err != nil {
|
|
|
t.Fatalf("error connection to database, %v", err)
|
|
|
}
|
|
|
@@ -371,7 +383,7 @@ func TestError(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func TestReadDeadline(t *testing.T) {
|
|
|
+func TestReadTimeout(t *testing.T) {
|
|
|
l, err := net.Listen("tcp", "127.0.0.1:0")
|
|
|
if err != nil {
|
|
|
t.Fatalf("net.Listen returned %v", err)
|
|
|
@@ -392,7 +404,9 @@ func TestReadDeadline(t *testing.T) {
|
|
|
}
|
|
|
}()
|
|
|
|
|
|
- c1, err := redis.DialTimeout(l.Addr().Network(), l.Addr().String(), 0, time.Millisecond, 0)
|
|
|
+ // Do
|
|
|
+
|
|
|
+ c1, err := redis.Dial(l.Addr().Network(), l.Addr().String(), redis.DialReadTimeout(time.Millisecond))
|
|
|
if err != nil {
|
|
|
t.Fatalf("redis.Dial returned %v", err)
|
|
|
}
|
|
|
@@ -406,7 +420,9 @@ func TestReadDeadline(t *testing.T) {
|
|
|
t.Fatalf("c1.Err() = nil, expect error")
|
|
|
}
|
|
|
|
|
|
- c2, err := redis.DialTimeout(l.Addr().Network(), l.Addr().String(), 0, time.Millisecond, 0)
|
|
|
+ // Send/Flush/Receive
|
|
|
+
|
|
|
+ c2, err := redis.Dial(l.Addr().Network(), l.Addr().String(), redis.DialReadTimeout(time.Millisecond))
|
|
|
if err != nil {
|
|
|
t.Fatalf("redis.Dial returned %v", err)
|
|
|
}
|
|
|
@@ -445,77 +461,71 @@ var dialErrors = []struct {
|
|
|
"http://www.google.com",
|
|
|
"invalid redis URL scheme: http",
|
|
|
},
|
|
|
- {
|
|
|
- "redis://x:abc123@localhost",
|
|
|
- "no password is set",
|
|
|
- },
|
|
|
{
|
|
|
"redis://localhost:6379/abc123",
|
|
|
"invalid database: abc123",
|
|
|
},
|
|
|
}
|
|
|
|
|
|
-func TestDialURL(t *testing.T) {
|
|
|
+func TestDialURLErrors(t *testing.T) {
|
|
|
for _, d := range dialErrors {
|
|
|
_, err := redis.DialURL(d.rawurl)
|
|
|
if err == nil || !strings.Contains(err.Error(), d.expectedError) {
|
|
|
t.Errorf("DialURL did not return expected error (expected %v to contain %s)", err, d.expectedError)
|
|
|
}
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
+func TestDialURLPort(t *testing.T) {
|
|
|
checkPort := func(network, address string) (net.Conn, error) {
|
|
|
if address != "localhost:6379" {
|
|
|
t.Errorf("DialURL did not set port to 6379 by default (got %v)", address)
|
|
|
}
|
|
|
- return net.Dial(network, address)
|
|
|
+ return nil, nil
|
|
|
}
|
|
|
- c, err := redis.DialURL("redis://localhost", redis.DialNetDial(checkPort))
|
|
|
+ _, err := redis.DialURL("redis://localhost", redis.DialNetDial(checkPort))
|
|
|
if err != nil {
|
|
|
t.Error("dial error:", err)
|
|
|
}
|
|
|
- c.Close()
|
|
|
+}
|
|
|
|
|
|
+func TestDialURLHost(t *testing.T) {
|
|
|
checkHost := func(network, address string) (net.Conn, error) {
|
|
|
if address != "localhost:6379" {
|
|
|
t.Errorf("DialURL did not set host to localhost by default (got %v)", address)
|
|
|
}
|
|
|
- return net.Dial(network, address)
|
|
|
+ return nil, nil
|
|
|
}
|
|
|
- c, err = redis.DialURL("redis://:6379", redis.DialNetDial(checkHost))
|
|
|
+ _, err := redis.DialURL("redis://:6379", redis.DialNetDial(checkHost))
|
|
|
if err != nil {
|
|
|
t.Error("dial error:", err)
|
|
|
}
|
|
|
- c.Close()
|
|
|
+}
|
|
|
|
|
|
- // Check that the database is set correctly
|
|
|
- c1, err := redis.DialURL("redis://:6379/8")
|
|
|
- defer c1.Close()
|
|
|
+func TestDialURLPassword(t *testing.T) {
|
|
|
+ var buf bytes.Buffer
|
|
|
+ _, err := redis.DialURL("redis://x:abc123@localhost", dialTestConn(strings.NewReader("+OK\r\n"), &buf))
|
|
|
if err != nil {
|
|
|
- t.Error("Dial error:", err)
|
|
|
+ t.Error("dial error:", err)
|
|
|
}
|
|
|
- dbSize, _ := redis.Int(c1.Do("DBSIZE"))
|
|
|
- if dbSize > 0 {
|
|
|
- t.Fatal("DB 8 has existing keys; aborting test to avoid overwriting data")
|
|
|
+ expected := "*2\r\n$4\r\nAUTH\r\n$6\r\nabc123\r\n"
|
|
|
+ actual := buf.String()
|
|
|
+ if actual != expected {
|
|
|
+ t.Errorf("commands = %q, want %q", actual, expected)
|
|
|
}
|
|
|
- c1.Do("SET", "var", "val")
|
|
|
+}
|
|
|
|
|
|
- c2, err := redis.Dial("tcp", ":6379")
|
|
|
- defer c2.Close()
|
|
|
+func TestDialURLDatabase(t *testing.T) {
|
|
|
+ var buf bytes.Buffer
|
|
|
+ _, err := redis.DialURL("redis://localhost/3", dialTestConn(strings.NewReader("+OK\r\n"), &buf))
|
|
|
if err != nil {
|
|
|
t.Error("dial error:", err)
|
|
|
}
|
|
|
- _, err = c2.Do("SELECT", "8")
|
|
|
- if err != nil {
|
|
|
- t.Error(err)
|
|
|
- }
|
|
|
- got, err := redis.String(c2.Do("GET", "var"))
|
|
|
- if err != nil {
|
|
|
- t.Error(err)
|
|
|
- }
|
|
|
- if got != "val" {
|
|
|
- t.Error("DialURL did not correctly set the db.")
|
|
|
+ expected := "*2\r\n$6\r\nSELECT\r\n$1\r\n3\r\n"
|
|
|
+ actual := buf.String()
|
|
|
+ if actual != expected {
|
|
|
+ t.Errorf("commands = %q, want %q", actual, expected)
|
|
|
}
|
|
|
- _, err = c2.Do("DEL", "var")
|
|
|
}
|
|
|
|
|
|
// Connect to local instance of Redis running on the default port.
|
|
|
@@ -540,7 +550,7 @@ func ExampleDialURL() {
|
|
|
// http://redis.io/topics/transactions for information on how Redis handles
|
|
|
// errors in a transaction.
|
|
|
func TestExecError(t *testing.T) {
|
|
|
- c, err := redistest.Dial()
|
|
|
+ c, err := redis.DialDefaultServer()
|
|
|
if err != nil {
|
|
|
t.Fatalf("error connection to database, %v", err)
|
|
|
}
|
|
|
@@ -548,6 +558,7 @@ func TestExecError(t *testing.T) {
|
|
|
|
|
|
// Execute commands that fail before EXEC is called.
|
|
|
|
|
|
+ c.Do("DEL", "k0")
|
|
|
c.Do("ZADD", "k0", 0, 0)
|
|
|
c.Send("MULTI")
|
|
|
c.Send("NOTACOMMAND", "k0", 0, 0)
|
|
|
@@ -560,6 +571,7 @@ func TestExecError(t *testing.T) {
|
|
|
// Execute commands that fail after EXEC is called. The first command
|
|
|
// returns an error.
|
|
|
|
|
|
+ c.Do("DEL", "k1")
|
|
|
c.Do("ZADD", "k1", 0, 0)
|
|
|
c.Send("MULTI")
|
|
|
c.Send("HSET", "k1", 0, 0)
|
|
|
@@ -583,7 +595,7 @@ func TestExecError(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
if _, ok := vs[1].([]byte); !ok {
|
|
|
- t.Fatalf("second result is type %T, expected []byte", vs[2])
|
|
|
+ t.Fatalf("second result is type %T, expected []byte", vs[1])
|
|
|
}
|
|
|
|
|
|
// Execute commands that fail after EXEC is called. The second command
|
|
|
@@ -618,7 +630,7 @@ func TestExecError(t *testing.T) {
|
|
|
|
|
|
func BenchmarkDoEmpty(b *testing.B) {
|
|
|
b.StopTimer()
|
|
|
- c, err := redistest.Dial()
|
|
|
+ c, err := redis.DialDefaultServer()
|
|
|
if err != nil {
|
|
|
b.Fatal(err)
|
|
|
}
|
|
|
@@ -633,7 +645,7 @@ func BenchmarkDoEmpty(b *testing.B) {
|
|
|
|
|
|
func BenchmarkDoPing(b *testing.B) {
|
|
|
b.StopTimer()
|
|
|
- c, err := redistest.Dial()
|
|
|
+ c, err := redis.DialDefaultServer()
|
|
|
if err != nil {
|
|
|
b.Fatal(err)
|
|
|
}
|