package ssdb import ( "fmt" "github.com/garyburd/redigo/redis" "strconv" "testing" ) func testListIndex(key []byte, index int64, v int) error { c := getTestConn() defer c.Close() n, err := redis.Int(c.Do("lindex", key, index)) if err == redis.ErrNil && v != 0 { return fmt.Errorf("must nil") } else if err != nil && err != redis.ErrNil { return err } else if n != v { return fmt.Errorf("index err number %d != %d", n, v) } return nil } func testListRange(key []byte, start int64, stop int64, checkValues ...int) error { c := getTestConn() defer c.Close() vs, err := redis.MultiBulk(c.Do("lrange", key, start, stop)) if err != nil { return err } if len(vs) != len(checkValues) { return fmt.Errorf("invalid return number %d != %d", len(vs), len(checkValues)) } var n int for i, v := range vs { if d, ok := v.([]byte); ok { n, err = strconv.Atoi(string(d)) if err != nil { return err } else if n != checkValues[i] { return fmt.Errorf("invalid data %d: %d != %d", i, n, checkValues[i]) } } else { return fmt.Errorf("invalid data %v %T", v, v) } } return nil } func testPrintList(key []byte) { it := testApp.db.Iterator(encode_list_key(key, listMinSeq), encode_list_key(key, listMaxSeq), 0, 0, -1) for ; it.Valid(); it.Next() { k, seq, _ := decode_list_key(it.Key()) println(string(k), "seq ", seq, "value:", string(it.Value())) } println("end ---------------------") } func TestList(t *testing.T) { startTestApp() c := getTestConn() defer c.Close() key := []byte("a") if n, err := redis.Int(c.Do("lpush", key, 1)); err != nil { t.Fatal(err) } else if n != 1 { t.Fatal(n) } if n, err := redis.Int(c.Do("rpush", key, 2)); err != nil { t.Fatal(err) } else if n != 2 { t.Fatal(n) } if n, err := redis.Int(c.Do("rpush", key, 3)); err != nil { t.Fatal(err) } else if n != 3 { t.Fatal(n) } if n, err := redis.Int(c.Do("llen", key)); err != nil { t.Fatal(err) } else if n != 3 { t.Fatal(n) } //for redis-cli a 1 2 3 // 127.0.0.1:6379> lrange a 0 0 // 1) "1" if err := testListRange(key, 0, 0, 1); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a 0 1 // 1) "1" // 2) "2" if err := testListRange(key, 0, 1, 1, 2); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a 0 5 // 1) "1" // 2) "2" // 3) "3" if err := testListRange(key, 0, 5, 1, 2, 3); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a -1 5 // 1) "3" if err := testListRange(key, -1, 5, 3); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a -5 -1 // 1) "1" // 2) "2" // 3) "3" if err := testListRange(key, -5, -1, 1, 2, 3); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a -2 -1 // 1) "2" // 2) "3" if err := testListRange(key, -2, -1, 2, 3); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a -1 -2 // (empty list or set) if err := testListRange(key, -1, -2); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a -1 2 // 1) "3" if err := testListRange(key, -1, 2, 3); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a -5 5 // 1) "1" // 2) "2" // 3) "3" if err := testListRange(key, -5, 5, 1, 2, 3); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a -1 0 // (empty list or set) if err := testListRange(key, -1, 0); err != nil { t.Fatal(err) } if err := testListRange([]byte("empty list"), 0, 100); err != nil { t.Fatal(err) } // 127.0.0.1:6379> lrange a -1 -1 // 1) "3" if err := testListRange(key, -1, -1, 3); err != nil { t.Fatal(err) } if err := testListIndex(key, -1, 3); err != nil { t.Fatal(err) } if err := testListIndex(key, 0, 1); err != nil { t.Fatal(err) } if err := testListIndex(key, 1, 2); err != nil { t.Fatal(err) } if err := testListIndex(key, 2, 3); err != nil { t.Fatal(err) } if err := testListIndex(key, 5, 0); err != nil { t.Fatal(err) } if err := testListIndex(key, -1, 3); err != nil { t.Fatal(err) } if err := testListIndex(key, -2, 2); err != nil { t.Fatal(err) } if err := testListIndex(key, -3, 1); err != nil { t.Fatal(err) } } func TestListMPush(t *testing.T) { startTestApp() c := getTestConn() defer c.Close() key := []byte("b") if n, err := redis.Int(c.Do("rpush", key, 1, 2, 3)); err != nil { t.Fatal(err) } else if n != 3 { t.Fatal(n) } if err := testListRange(key, 0, 3, 1, 2, 3); err != nil { t.Fatal(err) } if n, err := redis.Int(c.Do("lpush", key, 1, 2, 3)); err != nil { t.Fatal(err) } else if n != 6 { t.Fatal(n) } if err := testListRange(key, 0, 6, 3, 2, 1, 1, 2, 3); err != nil { t.Fatal(err) } } func TestPop(t *testing.T) { startTestApp() c := getTestConn() defer c.Close() key := []byte("c") if n, err := redis.Int(c.Do("rpush", key, 1, 2, 3, 4, 5, 6)); err != nil { t.Fatal(err) } else if n != 6 { t.Fatal(n) } if v, err := redis.Int(c.Do("lpop", key)); err != nil { t.Fatal(err) } else if v != 1 { t.Fatal(v) } if v, err := redis.Int(c.Do("rpop", key)); err != nil { t.Fatal(err) } else if v != 6 { t.Fatal(v) } if n, err := redis.Int(c.Do("lpush", key, 1)); err != nil { t.Fatal(err) } else if n != 5 { t.Fatal(n) } if err := testListRange(key, 0, 5, 1, 2, 3, 4, 5); err != nil { t.Fatal(err) } for i := 1; i <= 5; i++ { if v, err := redis.Int(c.Do("lpop", key)); err != nil { t.Fatal(err) } else if v != i { t.Fatal(v) } } if n, err := redis.Int(c.Do("llen", key)); err != nil { t.Fatal(err) } else if n != 0 { t.Fatal(n) } }