package db
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestDBIteratorSingleKey(t *testing.T) {
|
|
for backend := range backends {
|
|
t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
|
|
db, dir := newTempDB(t, backend)
|
|
defer os.RemoveAll(dir)
|
|
|
|
db.SetSync(bz("1"), bz("value_1"))
|
|
itr := db.Iterator(nil, nil)
|
|
|
|
checkValid(t, itr, true)
|
|
checkNext(t, itr, false)
|
|
checkValid(t, itr, false)
|
|
checkNextPanics(t, itr)
|
|
|
|
// Once invalid...
|
|
checkInvalid(t, itr)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDBIteratorTwoKeys(t *testing.T) {
|
|
for backend := range backends {
|
|
t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
|
|
db, dir := newTempDB(t, backend)
|
|
defer os.RemoveAll(dir)
|
|
|
|
db.SetSync(bz("1"), bz("value_1"))
|
|
db.SetSync(bz("2"), bz("value_1"))
|
|
|
|
{ // Fail by calling Next too much
|
|
itr := db.Iterator(nil, nil)
|
|
checkValid(t, itr, true)
|
|
|
|
checkNext(t, itr, true)
|
|
checkValid(t, itr, true)
|
|
|
|
checkNext(t, itr, false)
|
|
checkValid(t, itr, false)
|
|
|
|
checkNextPanics(t, itr)
|
|
|
|
// Once invalid...
|
|
checkInvalid(t, itr)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDBIteratorMany(t *testing.T) {
|
|
for backend := range backends {
|
|
t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
|
|
db, dir := newTempDB(t, backend)
|
|
defer os.RemoveAll(dir)
|
|
|
|
keys := make([][]byte, 100)
|
|
for i := 0; i < 100; i++ {
|
|
keys[i] = []byte{byte(i)}
|
|
}
|
|
|
|
value := []byte{5}
|
|
for _, k := range keys {
|
|
db.Set(k, value)
|
|
}
|
|
|
|
itr := db.Iterator(nil, nil)
|
|
defer itr.Close()
|
|
for ; itr.Valid(); itr.Next() {
|
|
assert.Equal(t, db.Get(itr.Key()), itr.Value())
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDBIteratorEmpty(t *testing.T) {
|
|
for backend := range backends {
|
|
t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
|
|
db, dir := newTempDB(t, backend)
|
|
defer os.RemoveAll(dir)
|
|
|
|
itr := db.Iterator(nil, nil)
|
|
|
|
checkInvalid(t, itr)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDBIteratorEmptyBeginAfter(t *testing.T) {
|
|
for backend := range backends {
|
|
t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
|
|
db, dir := newTempDB(t, backend)
|
|
defer os.RemoveAll(dir)
|
|
|
|
itr := db.Iterator(bz("1"), nil)
|
|
|
|
checkInvalid(t, itr)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDBIteratorNonemptyBeginAfter(t *testing.T) {
|
|
for backend := range backends {
|
|
t.Run(fmt.Sprintf("Backend %s", backend), func(t *testing.T) {
|
|
db, dir := newTempDB(t, backend)
|
|
defer os.RemoveAll(dir)
|
|
|
|
db.SetSync(bz("1"), bz("value_1"))
|
|
itr := db.Iterator(bz("2"), nil)
|
|
|
|
checkInvalid(t, itr)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDBBatchWrite(t *testing.T) {
|
|
testCases := []struct {
|
|
modify func(batch Batch)
|
|
calls map[string]int
|
|
}{
|
|
0: {
|
|
func(batch Batch) {
|
|
batch.Set(bz("1"), bz("1"))
|
|
batch.Set(bz("2"), bz("2"))
|
|
batch.Delete(bz("3"))
|
|
batch.Set(bz("4"), bz("4"))
|
|
batch.Write()
|
|
},
|
|
map[string]int{
|
|
"Set": 0, "SetSync": 0, "SetNoLock": 3, "SetNoLockSync": 0,
|
|
"Delete": 0, "DeleteSync": 0, "DeleteNoLock": 1, "DeleteNoLockSync": 0,
|
|
},
|
|
},
|
|
1: {
|
|
func(batch Batch) {
|
|
batch.Set(bz("1"), bz("1"))
|
|
batch.Set(bz("2"), bz("2"))
|
|
batch.Set(bz("4"), bz("4"))
|
|
batch.Delete(bz("3"))
|
|
batch.Write()
|
|
},
|
|
map[string]int{
|
|
"Set": 0, "SetSync": 0, "SetNoLock": 3, "SetNoLockSync": 0,
|
|
"Delete": 0, "DeleteSync": 0, "DeleteNoLock": 1, "DeleteNoLockSync": 0,
|
|
},
|
|
},
|
|
2: {
|
|
func(batch Batch) {
|
|
batch.Set(bz("1"), bz("1"))
|
|
batch.Set(bz("2"), bz("2"))
|
|
batch.Delete(bz("3"))
|
|
batch.Set(bz("4"), bz("4"))
|
|
batch.WriteSync()
|
|
},
|
|
map[string]int{
|
|
"Set": 0, "SetSync": 0, "SetNoLock": 2, "SetNoLockSync": 1,
|
|
"Delete": 0, "DeleteSync": 0, "DeleteNoLock": 1, "DeleteNoLockSync": 0,
|
|
},
|
|
},
|
|
3: {
|
|
func(batch Batch) {
|
|
batch.Set(bz("1"), bz("1"))
|
|
batch.Set(bz("2"), bz("2"))
|
|
batch.Set(bz("4"), bz("4"))
|
|
batch.Delete(bz("3"))
|
|
batch.WriteSync()
|
|
},
|
|
map[string]int{
|
|
"Set": 0, "SetSync": 0, "SetNoLock": 3, "SetNoLockSync": 0,
|
|
"Delete": 0, "DeleteSync": 0, "DeleteNoLock": 0, "DeleteNoLockSync": 1,
|
|
},
|
|
},
|
|
}
|
|
|
|
for i, tc := range testCases {
|
|
mdb := newMockDB()
|
|
ddb := NewDebugDB(t.Name(), mdb)
|
|
batch := ddb.NewBatch()
|
|
|
|
tc.modify(batch)
|
|
|
|
for call, exp := range tc.calls {
|
|
got := mdb.calls[call]
|
|
assert.Equal(t, exp, got, "#%v - key: %s", i, call)
|
|
}
|
|
}
|
|
}
|