2014-05-16 11:03:23 +04:00
|
|
|
package server
|
2014-05-06 13:37:58 +04:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2014-06-22 06:39:23 +04:00
|
|
|
"github.com/siddontang/ledisdb/client/go/ledis"
|
2014-05-06 13:37:58 +04:00
|
|
|
"strconv"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestHash(t *testing.T) {
|
|
|
|
c := getTestConn()
|
|
|
|
defer c.Close()
|
|
|
|
|
|
|
|
key := []byte("a")
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hset", key, 1, 0)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 1 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hexists", key, 1)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 1 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hexists", key, -1)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 0 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hget", key, 1)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 0 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hset", key, 1, 1)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 0 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hget", key, 1)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 1 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hlen", key)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 1 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func testHashArray(ay []interface{}, checkValues ...int) error {
|
|
|
|
if len(ay) != len(checkValues) {
|
|
|
|
return fmt.Errorf("invalid return number %d != %d", len(ay), len(checkValues))
|
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < len(ay); i++ {
|
|
|
|
if ay[i] == nil && checkValues[i] != 0 {
|
|
|
|
return fmt.Errorf("must nil")
|
|
|
|
} else if ay[i] != nil {
|
|
|
|
v, ok := ay[i].([]byte)
|
|
|
|
if !ok {
|
|
|
|
return fmt.Errorf("invalid return data %d %v :%T", i, ay[i], ay[i])
|
|
|
|
}
|
|
|
|
|
|
|
|
d, _ := strconv.Atoi(string(v))
|
|
|
|
|
|
|
|
if d != checkValues[i] {
|
|
|
|
return fmt.Errorf("invalid data %d %s != %d", i, v, checkValues[i])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestHashM(t *testing.T) {
|
|
|
|
c := getTestConn()
|
|
|
|
defer c.Close()
|
|
|
|
|
|
|
|
key := []byte("b")
|
2014-06-22 06:39:23 +04:00
|
|
|
if ok, err := ledis.String(c.Do("hmset", key, 1, 1, 2, 2, 3, 3)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if ok != OK {
|
|
|
|
t.Fatal(ok)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hlen", key)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 3 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if v, err := ledis.MultiBulk(c.Do("hmget", key, 1, 2, 3, 4)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else {
|
|
|
|
if err := testHashArray(v, 1, 2, 3, 0); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hdel", key, 1, 2, 3, 4)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 3 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hlen", key)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 0 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if v, err := ledis.MultiBulk(c.Do("hmget", key, 1, 2, 3, 4)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else {
|
|
|
|
if err := testHashArray(v, 0, 0, 0, 0); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hlen", key)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 0 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestHashIncr(t *testing.T) {
|
|
|
|
c := getTestConn()
|
|
|
|
defer c.Close()
|
|
|
|
|
|
|
|
key := []byte("c")
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hincrby", key, 1, 1)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 1 {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hlen", key)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 1 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hincrby", key, 1, 10)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 11 {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hlen", key)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 1 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hincrby", key, 1, -11)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 0 {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestHashGetAll(t *testing.T) {
|
|
|
|
c := getTestConn()
|
|
|
|
defer c.Close()
|
|
|
|
|
|
|
|
key := []byte("d")
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if ok, err := ledis.String(c.Do("hmset", key, 1, 1, 2, 2, 3, 3)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if ok != OK {
|
|
|
|
t.Fatal(ok)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if v, err := ledis.MultiBulk(c.Do("hgetall", key)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else {
|
|
|
|
if err := testHashArray(v, 1, 1, 2, 2, 3, 3); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if v, err := ledis.MultiBulk(c.Do("hkeys", key)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else {
|
|
|
|
if err := testHashArray(v, 1, 2, 3); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if v, err := ledis.MultiBulk(c.Do("hvals", key)); err != nil {
|
2014-05-06 13:37:58 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else {
|
|
|
|
if err := testHashArray(v, 1, 2, 3); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hclear", key)); err != nil {
|
2014-05-12 11:08:59 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 3 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
|
|
|
|
2014-06-22 06:39:23 +04:00
|
|
|
if n, err := ledis.Int(c.Do("hlen", key)); err != nil {
|
2014-05-12 11:08:59 +04:00
|
|
|
t.Fatal(err)
|
|
|
|
} else if n != 0 {
|
|
|
|
t.Fatal(n)
|
|
|
|
}
|
2014-05-06 13:37:58 +04:00
|
|
|
}
|
2014-07-27 21:58:55 +04:00
|
|
|
|
|
|
|
func TestHashErrorParams(t *testing.T) {
|
|
|
|
c := getTestConn()
|
|
|
|
defer c.Close()
|
|
|
|
|
|
|
|
if _, err := c.Do("hset", "test_hset"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hget", "test_hget"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hexists", "test_hexists"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hdel", "test_hdel"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hlen", "test_hlen", "a"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hincrby", "test_hincrby"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hmset", "test_hmset"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hmset", "test_hmset", "f1", "v1", "f2"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hmget", "test_hget"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hgetall"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hkeys"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hvals"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hclear"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hclear", "test_hclear", "a"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hmclear"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hexpire", "test_hexpire"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hexpireat", "test_hexpireat"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("httl"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, err := c.Do("hpersist"); err == nil || err.Error() != SErrCmdParams {
|
|
|
|
t.Fatal("invalid err of %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|