2014-09-22 13:50:51 +04:00
|
|
|
package rpl
|
2014-09-15 18:42:25 +04:00
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"testing"
|
2014-09-17 13:54:04 +04:00
|
|
|
"time"
|
2014-09-15 18:42:25 +04:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestGoLevelDBStore(t *testing.T) {
|
|
|
|
// Create a test dir
|
|
|
|
dir, err := ioutil.TempDir("", "wal")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
defer os.RemoveAll(dir)
|
|
|
|
|
|
|
|
// New level
|
2014-10-16 05:35:35 +04:00
|
|
|
l, err := NewGoLevelDBStore(dir, 0)
|
2014-09-15 18:42:25 +04:00
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
defer l.Close()
|
|
|
|
|
|
|
|
testLogs(t, l)
|
|
|
|
}
|
|
|
|
|
2014-09-22 13:50:51 +04:00
|
|
|
func testLogs(t *testing.T, l LogStore) {
|
2014-09-15 18:42:25 +04:00
|
|
|
// Should be no first index
|
|
|
|
idx, err := l.FirstID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
if idx != 0 {
|
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Should be no last index
|
|
|
|
idx, err = l.LastID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
if idx != 0 {
|
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Try a filed fetch
|
|
|
|
var out Log
|
|
|
|
if err := l.GetLog(10, &out); err.Error() != "log not found" {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Write out a log
|
|
|
|
log := Log{
|
|
|
|
ID: 1,
|
|
|
|
Data: []byte("first"),
|
|
|
|
}
|
|
|
|
for i := 1; i <= 10; i++ {
|
|
|
|
log.ID = uint64(i)
|
|
|
|
if err := l.StoreLog(&log); err != nil {
|
|
|
|
t.Fatalf("err: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Attempt to write multiple logs
|
|
|
|
var logs []*Log
|
|
|
|
for i := 11; i <= 20; i++ {
|
|
|
|
nl := &Log{
|
|
|
|
ID: uint64(i),
|
|
|
|
Data: []byte("first"),
|
|
|
|
}
|
|
|
|
logs = append(logs, nl)
|
|
|
|
}
|
|
|
|
if err := l.StoreLogs(logs); err != nil {
|
|
|
|
t.Fatalf("err: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Try to fetch
|
|
|
|
if err := l.GetLog(10, &out); err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Try to fetch
|
|
|
|
if err := l.GetLog(20, &out); err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check the lowest index
|
|
|
|
idx, err = l.FirstID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
if idx != 1 {
|
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check the highest index
|
|
|
|
idx, err = l.LastID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
if idx != 20 {
|
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Delete a suffix
|
2014-09-17 13:54:04 +04:00
|
|
|
if err := l.Purge(5); err != nil {
|
2014-09-15 18:42:25 +04:00
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Verify they are all deleted
|
2014-09-17 13:54:04 +04:00
|
|
|
for i := 1; i <= 5; i++ {
|
2014-09-15 18:42:25 +04:00
|
|
|
if err := l.GetLog(uint64(i), &out); err != ErrLogNotFound {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Index should be one
|
|
|
|
idx, err = l.FirstID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
2014-09-17 13:54:04 +04:00
|
|
|
if idx != 6 {
|
2014-09-15 18:42:25 +04:00
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
|
|
|
idx, err = l.LastID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
2014-09-17 13:54:04 +04:00
|
|
|
if idx != 20 {
|
2014-09-15 18:42:25 +04:00
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Should not be able to fetch
|
|
|
|
if err := l.GetLog(5, &out); err != ErrLogNotFound {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
2014-09-16 04:41:38 +04:00
|
|
|
|
|
|
|
if err := l.Clear(); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
idx, err = l.FirstID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
if idx != 0 {
|
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
|
|
|
|
|
|
|
idx, err = l.LastID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
if idx != 0 {
|
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
2014-09-17 13:54:04 +04:00
|
|
|
|
|
|
|
now := uint32(time.Now().Unix())
|
|
|
|
logs = []*Log{}
|
|
|
|
for i := 1; i <= 20; i++ {
|
|
|
|
nl := &Log{
|
|
|
|
ID: uint64(i),
|
|
|
|
CreateTime: now - 20,
|
|
|
|
Data: []byte("first"),
|
|
|
|
}
|
|
|
|
logs = append(logs, nl)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := l.PurgeExpired(1); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
idx, err = l.FirstID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
if idx != 0 {
|
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
|
|
|
|
|
|
|
idx, err = l.LastID()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %v ", err)
|
|
|
|
}
|
|
|
|
if idx != 0 {
|
|
|
|
t.Fatalf("bad idx: %d", idx)
|
|
|
|
}
|
2014-09-15 18:42:25 +04:00
|
|
|
}
|