mirror of https://github.com/ledisdb/ledisdb.git
173 lines
3.0 KiB
Go
173 lines
3.0 KiB
Go
package ledis
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
var m sync.Mutex
|
|
|
|
func TestKvExpire(t *testing.T) {
|
|
db := getTestDB()
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
k := []byte("ttl_a")
|
|
ek := []byte("ttl_b")
|
|
db.Set(k, []byte("1"))
|
|
|
|
if ok, _ := db.Expire(k, 10); ok != 1 {
|
|
t.Fatal(ok)
|
|
}
|
|
|
|
// err - expire on an inexisting key
|
|
if ok, _ := db.Expire(ek, 10); ok != 0 {
|
|
t.Fatal(ok)
|
|
}
|
|
|
|
// err - duration is zero
|
|
if ok, err := db.Expire(k, 0); err == nil || ok != 0 {
|
|
t.Fatal(fmt.Sprintf("res = %d, err = %s", ok, err))
|
|
}
|
|
|
|
// err - duration is negative
|
|
if ok, err := db.Expire(k, -10); err == nil || ok != 0 {
|
|
t.Fatal(fmt.Sprintf("res = %d, err = %s", ok, err))
|
|
}
|
|
}
|
|
|
|
func TestKvExpireAt(t *testing.T) {
|
|
db := getTestDB()
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
k := []byte("ttl_a")
|
|
ek := []byte("ttl_b")
|
|
db.Set(k, []byte("1"))
|
|
|
|
now := time.Now().Unix()
|
|
|
|
if ok, _ := db.ExpireAt(k, now+5); ok != 1 {
|
|
t.Fatal(ok)
|
|
}
|
|
|
|
// err - expire on an inexisting key
|
|
if ok, _ := db.ExpireAt(ek, now+5); ok != 0 {
|
|
t.Fatal(ok)
|
|
}
|
|
|
|
// err - expire with the current time
|
|
if ok, err := db.ExpireAt(k, now); err == nil || ok != 0 {
|
|
t.Fatal(fmt.Sprintf("res = %d, err = %s", ok, err))
|
|
}
|
|
|
|
// err - expire with the time before
|
|
if ok, err := db.ExpireAt(k, now-5); err == nil || ok != 0 {
|
|
t.Fatal(fmt.Sprintf("res = %d, err = %s", ok, err))
|
|
}
|
|
}
|
|
|
|
func TestKvTTL(t *testing.T) {
|
|
db := getTestDB()
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
k := []byte("ttl_a")
|
|
ek := []byte("ttl_b")
|
|
|
|
db.Set(k, []byte("1"))
|
|
db.Expire(k, 2)
|
|
|
|
if tRemain, _ := db.TTL(k); tRemain != 2 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
|
|
// err - check ttl on an inexisting key
|
|
if tRemain, _ := db.TTL(ek); tRemain != -1 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
|
|
db.Del(k)
|
|
if tRemain, _ := db.TTL(k); tRemain != -1 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
}
|
|
|
|
func TestKvExpCompose(t *testing.T) {
|
|
db := getTestDB()
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
k0 := []byte("ttl_a")
|
|
k1 := []byte("ttl_b")
|
|
k2 := []byte("ttl_c")
|
|
|
|
db.Set(k0, k0)
|
|
db.Set(k1, k1)
|
|
db.Set(k2, k2)
|
|
|
|
db.Expire(k0, 5)
|
|
db.Expire(k1, 2)
|
|
db.Expire(k2, 60)
|
|
|
|
if tRemain, _ := db.TTL(k0); tRemain != 5 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
if tRemain, _ := db.TTL(k1); tRemain != 2 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
if tRemain, _ := db.TTL(k2); tRemain != 60 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
|
|
// after 1 sec
|
|
time.Sleep(1 * time.Second)
|
|
if tRemain, _ := db.TTL(k0); tRemain != 4 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
if tRemain, _ := db.TTL(k1); tRemain != 1 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
|
|
// after 2 sec
|
|
time.Sleep(2 * time.Second)
|
|
if tRemain, _ := db.TTL(k1); tRemain != -1 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
if v, _ := db.Get(k1); v != nil {
|
|
t.Fatal(v)
|
|
}
|
|
|
|
if tRemain, _ := db.TTL(k0); tRemain != 2 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
if v, _ := db.Get(k0); v == nil {
|
|
t.Fatal(v)
|
|
}
|
|
|
|
// refresh the expiration of key
|
|
if tRemain, _ := db.TTL(k2); !(0 < tRemain && tRemain < 60) {
|
|
t.Fatal(tRemain)
|
|
}
|
|
|
|
if ok, _ := db.Expire(k2, 100); ok != 1 {
|
|
t.Fatal(false)
|
|
}
|
|
|
|
if tRemain, _ := db.TTL(k2); tRemain != 100 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
|
|
// expire an inexisting key
|
|
if ok, _ := db.Expire(k1, 10); ok == 1 {
|
|
t.Fatal(false)
|
|
}
|
|
if tRemain, _ := db.TTL(k1); tRemain != -1 {
|
|
t.Fatal(tRemain)
|
|
}
|
|
|
|
return
|
|
}
|