tendermint/db/backend_test.go

152 lines
3.5 KiB
Go
Raw Normal View History

package db
import (
"fmt"
2017-12-12 15:42:47 -08:00
"os"
2017-12-13 17:11:11 -08:00
"path/filepath"
"testing"
2017-12-12 15:42:47 -08:00
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
cmn "github.com/tendermint/tmlibs/common"
)
2017-12-12 16:28:52 -08:00
func cleanupDBDir(dir, name string) {
2017-12-13 17:11:11 -08:00
os.RemoveAll(filepath.Join(dir, name) + ".db")
2017-12-12 16:28:52 -08:00
}
2018-02-02 19:31:17 -08:00
func testBackendGetSetDelete(t *testing.T, backend DBBackendType) {
// Default
dir, dirname := cmn.Tempdir(fmt.Sprintf("test_backend_%s_", backend))
defer dir.Close()
db := NewDB("testdb", backend, dirname)
2017-12-12 16:28:52 -08:00
// A nonexistent key should return nil, even if the key is empty
require.Nil(t, db.Get([]byte("")))
// A nonexistent key should return nil, even if the key is nil
require.Nil(t, db.Get(nil))
// A nonexistent key should return nil.
2017-12-12 16:22:08 -08:00
key := []byte("abc")
require.Nil(t, db.Get(key))
// Set empty value.
2017-12-12 16:22:08 -08:00
db.Set(key, []byte(""))
require.NotNil(t, db.Get(key))
require.Empty(t, db.Get(key))
// Set nil value.
2017-12-12 16:22:08 -08:00
db.Set(key, nil)
require.NotNil(t, db.Get(key))
require.Empty(t, db.Get(key))
// Delete.
2017-12-12 16:22:08 -08:00
db.Delete(key)
require.Nil(t, db.Get(key))
}
2017-12-12 15:42:47 -08:00
func TestBackendsGetSetDelete(t *testing.T) {
for dbType, _ := range backends {
testBackendGetSetDelete(t, dbType)
}
}
func withDB(t *testing.T, creator dbCreator, fn func(DB)) {
name := cmn.Fmt("test_%x", cmn.RandStr(12))
db, err := creator(name, "")
defer cleanupDBDir("", name)
assert.Nil(t, err)
fn(db)
db.Close()
}
2017-12-12 15:42:47 -08:00
func TestBackendsNilKeys(t *testing.T) {
// Test all backends.
2017-12-12 15:42:47 -08:00
for dbType, creator := range backends {
withDB(t, creator, func(db DB) {
t.Run(fmt.Sprintf("Testing %s", dbType), func(t *testing.T) {
// Nil keys are treated as the empty key for most operations.
expect := func(key, value []byte) {
if len(key) == 0 { // nil or empty
assert.Equal(t, db.Get(nil), db.Get([]byte("")))
assert.Equal(t, db.Has(nil), db.Has([]byte("")))
}
assert.Equal(t, db.Get(key), value)
assert.Equal(t, db.Has(key), value != nil)
}
// Not set
expect(nil, nil)
// Set nil value
db.Set(nil, nil)
expect(nil, []byte(""))
// Set empty value
db.Set(nil, []byte(""))
expect(nil, []byte(""))
// Set nil, Delete nil
db.Set(nil, []byte("abc"))
expect(nil, []byte("abc"))
db.Delete(nil)
expect(nil, nil)
// Set nil, Delete empty
db.Set(nil, []byte("abc"))
expect(nil, []byte("abc"))
db.Delete([]byte(""))
expect(nil, nil)
// Set empty, Delete nil
db.Set([]byte(""), []byte("abc"))
expect(nil, []byte("abc"))
db.Delete(nil)
expect(nil, nil)
// Set empty, Delete empty
db.Set([]byte(""), []byte("abc"))
expect(nil, []byte("abc"))
db.Delete([]byte(""))
expect(nil, nil)
// SetSync nil, DeleteSync nil
db.SetSync(nil, []byte("abc"))
expect(nil, []byte("abc"))
db.DeleteSync(nil)
expect(nil, nil)
// SetSync nil, DeleteSync empty
db.SetSync(nil, []byte("abc"))
expect(nil, []byte("abc"))
db.DeleteSync([]byte(""))
expect(nil, nil)
// SetSync empty, DeleteSync nil
db.SetSync([]byte(""), []byte("abc"))
expect(nil, []byte("abc"))
db.DeleteSync(nil)
expect(nil, nil)
// SetSync empty, DeleteSync empty
db.SetSync([]byte(""), []byte("abc"))
expect(nil, []byte("abc"))
db.DeleteSync([]byte(""))
expect(nil, nil)
})
})
2017-12-12 15:42:47 -08:00
}
}
2018-01-24 15:55:31 -08:00
func TestGoLevelDBBackend(t *testing.T) {
2017-12-15 12:58:23 -08:00
name := cmn.Fmt("test_%x", cmn.RandStr(12))
2018-01-24 15:55:31 -08:00
db := NewDB(name, GoLevelDBBackend, "")
2017-12-15 12:58:23 -08:00
defer cleanupDBDir("", name)
_, ok := db.(*GoLevelDB)
assert.True(t, ok)
}