mirror of
https://github.com/HDT3213/godis.git
synced 2025-10-05 16:57:06 +08:00
161 lines
3.9 KiB
Go
161 lines
3.9 KiB
Go
package db
|
|
|
|
import (
|
|
"github.com/hdt3213/godis/config"
|
|
"github.com/hdt3213/godis/datastruct/utils"
|
|
"io/ioutil"
|
|
"os"
|
|
"path"
|
|
"strconv"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestAof(t *testing.T) {
|
|
tmpDir, err := ioutil.TempDir("", "godis")
|
|
if err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
aofFilename := path.Join(tmpDir, "a.aof")
|
|
defer func() {
|
|
_ = os.Remove(aofFilename)
|
|
}()
|
|
config.Properties = &config.PropertyHolder{
|
|
AppendOnly: true,
|
|
AppendFilename: aofFilename,
|
|
}
|
|
aofWriteDB := MakeDB()
|
|
size := 10
|
|
keys := make([]string, 0)
|
|
cursor := 0
|
|
for i := 0; i < size; i++ {
|
|
key := strconv.Itoa(cursor)
|
|
cursor++
|
|
Set(aofWriteDB, toArgs(key, RandString(8), "EX", "10000"))
|
|
keys = append(keys, key)
|
|
}
|
|
for i := 0; i < size; i++ {
|
|
key := strconv.Itoa(cursor)
|
|
cursor++
|
|
RPush(aofWriteDB, toArgs(key, RandString(8)))
|
|
keys = append(keys, key)
|
|
}
|
|
for i := 0; i < size; i++ {
|
|
key := strconv.Itoa(cursor)
|
|
cursor++
|
|
HSet(aofWriteDB, toArgs(key, RandString(8), RandString(8)))
|
|
keys = append(keys, key)
|
|
}
|
|
for i := 0; i < size; i++ {
|
|
key := strconv.Itoa(cursor)
|
|
cursor++
|
|
SAdd(aofWriteDB, toArgs(key, RandString(8)))
|
|
keys = append(keys, key)
|
|
}
|
|
for i := 0; i < size; i++ {
|
|
key := strconv.Itoa(cursor)
|
|
cursor++
|
|
ZAdd(aofWriteDB, toArgs(key, "10", RandString(8)))
|
|
keys = append(keys, key)
|
|
}
|
|
aofWriteDB.Close() // wait for aof finished
|
|
aofReadDB := MakeDB() // start new db and read aof file
|
|
for _, key := range keys {
|
|
expect, ok := aofWriteDB.Get(key)
|
|
if !ok {
|
|
t.Errorf("key not found in origin: %s", key)
|
|
continue
|
|
}
|
|
actual, ok := aofReadDB.Get(key)
|
|
if !ok {
|
|
t.Errorf("key not found: %s", key)
|
|
continue
|
|
}
|
|
expectData := EntityToCmd(key, expect).ToBytes()
|
|
actualData := EntityToCmd(key, actual).ToBytes()
|
|
if !utils.BytesEquals(expectData, actualData) {
|
|
t.Errorf("wrong value of key: %s", key)
|
|
}
|
|
}
|
|
aofReadDB.Close()
|
|
}
|
|
|
|
func TestRewriteAOF(t *testing.T) {
|
|
tmpDir, err := ioutil.TempDir("", "godis")
|
|
if err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
aofFilename := path.Join(tmpDir, "a.aof")
|
|
defer func() {
|
|
_ = os.Remove(aofFilename)
|
|
}()
|
|
config.Properties = &config.PropertyHolder{
|
|
AppendOnly: true,
|
|
AppendFilename: aofFilename,
|
|
}
|
|
aofWriteDB := MakeDB()
|
|
size := 1
|
|
keys := make([]string, 0)
|
|
cursor := 0
|
|
for i := 0; i < size; i++ {
|
|
key := "str" + strconv.Itoa(cursor)
|
|
cursor++
|
|
Set(aofWriteDB, toArgs(key, RandString(8)))
|
|
Set(aofWriteDB, toArgs(key, RandString(8)))
|
|
keys = append(keys, key)
|
|
}
|
|
for i := 0; i < size; i++ {
|
|
key := "list" + strconv.Itoa(cursor)
|
|
cursor++
|
|
RPush(aofWriteDB, toArgs(key, RandString(8)))
|
|
RPush(aofWriteDB, toArgs(key, RandString(8)))
|
|
keys = append(keys, key)
|
|
}
|
|
for i := 0; i < size; i++ {
|
|
key := "hash" + strconv.Itoa(cursor)
|
|
cursor++
|
|
field := RandString(8)
|
|
HSet(aofWriteDB, toArgs(key, field, RandString(8)))
|
|
HSet(aofWriteDB, toArgs(key, field, RandString(8)))
|
|
keys = append(keys, key)
|
|
}
|
|
for i := 0; i < size; i++ {
|
|
key := "set" + strconv.Itoa(cursor)
|
|
cursor++
|
|
member := RandString(8)
|
|
SAdd(aofWriteDB, toArgs(key, member))
|
|
SAdd(aofWriteDB, toArgs(key, member))
|
|
keys = append(keys, key)
|
|
}
|
|
for i := 0; i < size; i++ {
|
|
key := "zset" + strconv.Itoa(cursor)
|
|
cursor++
|
|
ZAdd(aofWriteDB, toArgs(key, "10", RandString(8)))
|
|
keys = append(keys, key)
|
|
}
|
|
time.Sleep(time.Second) // wait for async goroutine finish its job
|
|
aofWriteDB.aofRewrite()
|
|
aofWriteDB.Close() // wait for aof finished
|
|
aofReadDB := MakeDB() // start new db and read aof file
|
|
for _, key := range keys {
|
|
expect, ok := aofWriteDB.Get(key)
|
|
if !ok {
|
|
t.Errorf("key not found in origin: %s", key)
|
|
continue
|
|
}
|
|
actual, ok := aofReadDB.Get(key)
|
|
if !ok {
|
|
t.Errorf("key not found: %s", key)
|
|
continue
|
|
}
|
|
expectData := EntityToCmd(key, expect).ToBytes()
|
|
actualData := EntityToCmd(key, actual).ToBytes()
|
|
if !utils.BytesEquals(expectData, actualData) {
|
|
t.Errorf("wrong value of key: %s", key)
|
|
}
|
|
}
|
|
aofReadDB.Close()
|
|
}
|