mirror of https://github.com/ledisdb/ledisdb.git
commit
04ef7a83f2
|
@ -280,6 +280,10 @@ func (w *respWriter) writeArray(lst []interface{}) {
|
||||||
w.writeBulk(nil)
|
w.writeBulk(nil)
|
||||||
case int64:
|
case int64:
|
||||||
w.writeInteger(v)
|
w.writeInteger(v)
|
||||||
|
case string:
|
||||||
|
w.writeStatus(v)
|
||||||
|
case error:
|
||||||
|
w.writeError(v)
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("invalid array type %T %v", lst[i], v))
|
panic(fmt.Sprintf("invalid array type %T %v", lst[i], v))
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRespWriter(t *testing.T) {
|
||||||
|
for _, fixture := range []struct {
|
||||||
|
v interface{}
|
||||||
|
e string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
v: errors.New("Some error"),
|
||||||
|
//e: "-Some error\r\n", // as described at http://redis.io/topics/protocol
|
||||||
|
e: "- Some error\r\n", // actual
|
||||||
|
},
|
||||||
|
{
|
||||||
|
v: "Some status",
|
||||||
|
e: "+Some status\r\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
v: int64(42),
|
||||||
|
e: ":42\r\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
v: []byte("ultimate answer"),
|
||||||
|
e: "$15\r\nultimate answer\r\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
v: []interface{}{[]byte("aaa"), []byte("bbb"), int64(42)},
|
||||||
|
e: "*3\r\n$3\r\naaa\r\n$3\r\nbbb\r\n:42\r\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
v: [][]byte{[]byte("test"), nil, []byte("zzz")},
|
||||||
|
e: "*3\r\n$4\r\ntest\r\n$-1\r\n$3\r\nzzz\r\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
v: nil,
|
||||||
|
e: "$-1\r\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
v: []interface{}{[]interface{}{int64(1), int64(2), int64(3)}, []interface{}{"Foo", errors.New("Bar")}},
|
||||||
|
//e: "*2\r\n*3\r\n:1\r\n:2\r\n:3\r\n*2\r\n+Foo\r\n-Bar\r\n",
|
||||||
|
e: "*2\r\n*3\r\n:1\r\n:2\r\n:3\r\n*2\r\n+Foo\r\n- Bar\r\n",
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
w := new(respWriter)
|
||||||
|
var b bytes.Buffer
|
||||||
|
w.buff = bufio.NewWriter(&b)
|
||||||
|
switch v := fixture.v.(type) {
|
||||||
|
case error:
|
||||||
|
w.writeError(v)
|
||||||
|
case string:
|
||||||
|
w.writeStatus(v)
|
||||||
|
case int64:
|
||||||
|
w.writeInteger(v)
|
||||||
|
case []byte:
|
||||||
|
w.writeBulk(v)
|
||||||
|
case []interface{}:
|
||||||
|
w.writeArray(v)
|
||||||
|
case [][]byte:
|
||||||
|
w.writeSliceArray(v)
|
||||||
|
default:
|
||||||
|
w.writeBulk(b.Bytes())
|
||||||
|
}
|
||||||
|
w.flush()
|
||||||
|
if b.String() != fixture.e {
|
||||||
|
t.Errorf("respWriter, actual: %v, expected: %v", []byte(b.String()), []byte(fixture.e))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -84,7 +84,11 @@ func (w *luaWriter) writeSliceArray(lst [][]byte) {
|
||||||
|
|
||||||
w.l.CreateTable(len(lst), 0)
|
w.l.CreateTable(len(lst), 0)
|
||||||
for i, v := range lst {
|
for i, v := range lst {
|
||||||
|
if v == nil {
|
||||||
|
w.l.PushBoolean(false)
|
||||||
|
} else {
|
||||||
w.l.PushString(hack.String(v))
|
w.l.PushString(hack.String(v))
|
||||||
|
}
|
||||||
w.l.RawSeti(-2, i+1)
|
w.l.RawSeti(-2, i+1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,15 @@ var testScript5 = `
|
||||||
return ledis.call("PING")
|
return ledis.call("PING")
|
||||||
`
|
`
|
||||||
|
|
||||||
|
var testScript6 = `
|
||||||
|
ledis.call('hmset', 'zzz', 1, 2, 5, 42)
|
||||||
|
local a = ledis.call('hmget', 'zzz', 1, 2, 5, 42)
|
||||||
|
for i = 1, 5 do
|
||||||
|
a[i] = type(a[i])
|
||||||
|
end
|
||||||
|
return a
|
||||||
|
`
|
||||||
|
|
||||||
func TestLuaCall(t *testing.T) {
|
func TestLuaCall(t *testing.T) {
|
||||||
cfg := config.NewConfigDefault()
|
cfg := config.NewConfigDefault()
|
||||||
cfg.Addr = ":11188"
|
cfg.Addr = ":11188"
|
||||||
|
@ -187,5 +196,29 @@ func TestLuaCall(t *testing.T) {
|
||||||
t.Fatal(fmt.Sprintf("%v %T", v, v))
|
t.Fatal(fmt.Sprintf("%v %T", v, v))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = app.script.l.DoString(testScript6)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
v = luaReplyToLedisReply(l)
|
||||||
|
vv := v.([]interface{})
|
||||||
|
expected := []string{
|
||||||
|
"string",
|
||||||
|
"boolean",
|
||||||
|
"string",
|
||||||
|
"boolean",
|
||||||
|
"nil",
|
||||||
|
}
|
||||||
|
if len(expected) != len(vv) {
|
||||||
|
t.Fatalf("length different: %d, %d", len(expected), len(vv))
|
||||||
|
}
|
||||||
|
for i, r := range vv {
|
||||||
|
s := string(r.([]byte))
|
||||||
|
if s != expected[i] {
|
||||||
|
t.Errorf("reply[%d] expected: %s, actual: %s", i, expected[i], s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
luaClient.db = nil
|
luaClient.db = nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue