|
|
@@ -19,6 +19,7 @@ import (
|
|
|
"bytes"
|
|
|
"math"
|
|
|
"net"
|
|
|
+ "os"
|
|
|
"reflect"
|
|
|
"strings"
|
|
|
"testing"
|
|
|
@@ -422,6 +423,101 @@ func TestReadDeadline(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+var dialErrors = []struct {
|
|
|
+ rawurl string
|
|
|
+ expectedError string
|
|
|
+}{
|
|
|
+ {
|
|
|
+ "localhost",
|
|
|
+ "invalid redis URL scheme",
|
|
|
+ },
|
|
|
+ // The error message for invalid hosts is diffferent in different
|
|
|
+ // versions of Go, so just check that there is an error message.
|
|
|
+ {
|
|
|
+ "redis://weird url",
|
|
|
+ "",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "redis://foo:bar:baz",
|
|
|
+ "",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "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) {
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+ c, err := redis.DialURL("redis://localhost", redis.DialNetDial(checkPort))
|
|
|
+ if err != nil {
|
|
|
+ t.Error("dial error:", err)
|
|
|
+ }
|
|
|
+ c.Close()
|
|
|
+
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+ c, 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()
|
|
|
+ if err != nil {
|
|
|
+ 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")
|
|
|
+ }
|
|
|
+ c1.Do("SET", "var", "val")
|
|
|
+
|
|
|
+ c2, err := redis.Dial("tcp", ":6379")
|
|
|
+ defer c2.Close()
|
|
|
+ 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.")
|
|
|
+ }
|
|
|
+ _, err = c2.Do("DEL", "var")
|
|
|
+}
|
|
|
+
|
|
|
// Connect to local instance of Redis running on the default port.
|
|
|
func ExampleDial(x int) {
|
|
|
c, err := redis.Dial("tcp", ":6379")
|
|
|
@@ -431,6 +527,15 @@ func ExampleDial(x int) {
|
|
|
defer c.Close()
|
|
|
}
|
|
|
|
|
|
+// Connect to remote instance of Redis using a URL.
|
|
|
+func ExampleDialURL() {
|
|
|
+ c, err := redis.DialURL(os.Getenv("REDIS_URL"))
|
|
|
+ if err != nil {
|
|
|
+ // handle connection error
|
|
|
+ }
|
|
|
+ defer c.Close()
|
|
|
+}
|
|
|
+
|
|
|
// TextExecError tests handling of errors in a transaction. See
|
|
|
// http://redis.io/topics/transactions for information on how Redis handles
|
|
|
// errors in a transaction.
|