|
|
@@ -169,6 +169,10 @@ var readTests = []struct {
|
|
|
"+PONG\r\n",
|
|
|
"PONG",
|
|
|
},
|
|
|
+ {
|
|
|
+ "+OK\n\n", // no \r
|
|
|
+ errorSentinel,
|
|
|
+ },
|
|
|
{
|
|
|
"@OK\r\n",
|
|
|
errorSentinel,
|
|
|
@@ -206,6 +210,11 @@ var readTests = []struct {
|
|
|
[]interface{}{[]byte("foo"), nil, []byte("bar")},
|
|
|
},
|
|
|
|
|
|
+ {
|
|
|
+ // "" is not a valid length
|
|
|
+ "$\r\nfoobar\r\n",
|
|
|
+ errorSentinel,
|
|
|
+ },
|
|
|
{
|
|
|
// "x" is not a valid length
|
|
|
"$x\r\nfoobar\r\n",
|
|
|
@@ -216,6 +225,11 @@ var readTests = []struct {
|
|
|
"$-2\r\n",
|
|
|
errorSentinel,
|
|
|
},
|
|
|
+ {
|
|
|
+ // "" is not a valid integer
|
|
|
+ ":\r\n",
|
|
|
+ errorSentinel,
|
|
|
+ },
|
|
|
{
|
|
|
// "x" is not a valid integer
|
|
|
":x\r\n",
|
|
|
@@ -258,6 +272,30 @@ func TestRead(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func TestReadString(t *testing.T) {
|
|
|
+ // n is value of bufio.defaultBufSize
|
|
|
+ const n = 4096
|
|
|
+
|
|
|
+ // Test read string lengths near bufio.Reader buffer boundaries.
|
|
|
+ testRanges := [][2]int{{0, 64}, {n - 64, n + 64}, {2*n - 64, 2*n + 64}}
|
|
|
+
|
|
|
+ p := make([]byte, 2*n+64)
|
|
|
+ for i := range p {
|
|
|
+ p[i] = byte('a' + i%26)
|
|
|
+ }
|
|
|
+ s := string(p)
|
|
|
+
|
|
|
+ for _, r := range testRanges {
|
|
|
+ for i := r[0]; i < r[1]; i++ {
|
|
|
+ c, _ := redis.Dial("", "", dialTestConn("+"+s[:i]+"\r\n", nil))
|
|
|
+ actual, err := c.Receive()
|
|
|
+ if err != nil || actual != s[:i] {
|
|
|
+ t.Fatalf("Receive(string len %d) -> err=%v, equal=%v", i, err, actual != s[:i])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
var testCommands = []struct {
|
|
|
args []interface{}
|
|
|
expected interface{}
|