- package db
-
- import (
- "fmt"
- "sync"
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- cmn "github.com/tendermint/tmlibs/common"
- )
-
- //----------------------------------------
- // Helper functions.
-
- func checkValue(t *testing.T, db DB, key []byte, valueWanted []byte) {
- valueGot := db.Get(key)
- assert.Equal(t, valueWanted, valueGot)
- }
-
- func checkValid(t *testing.T, itr Iterator, expected bool) {
- valid := itr.Valid()
- require.Equal(t, expected, valid)
- }
-
- func checkNext(t *testing.T, itr Iterator, expected bool) {
- itr.Next()
- valid := itr.Valid()
- require.Equal(t, expected, valid)
- }
-
- func checkNextPanics(t *testing.T, itr Iterator) {
- assert.Panics(t, func() { itr.Next() }, "checkNextPanics expected panic but didn't")
- }
-
- func checkItem(t *testing.T, itr Iterator, key []byte, value []byte) {
- k, v := itr.Key(), itr.Value()
- assert.Exactly(t, key, k)
- assert.Exactly(t, value, v)
- }
-
- func checkInvalid(t *testing.T, itr Iterator) {
- checkValid(t, itr, false)
- checkKeyPanics(t, itr)
- checkValuePanics(t, itr)
- checkNextPanics(t, itr)
- }
-
- func checkKeyPanics(t *testing.T, itr Iterator) {
- assert.Panics(t, func() { itr.Key() }, "checkKeyPanics expected panic but didn't")
- }
-
- func checkValuePanics(t *testing.T, itr Iterator) {
- assert.Panics(t, func() { itr.Key() }, "checkValuePanics expected panic but didn't")
- }
-
- func newTempDB(t *testing.T, backend DBBackendType) (db DB) {
- dir, dirname := cmn.Tempdir("db_common_test")
- db = NewDB("testdb", backend, dirname)
- dir.Close()
- return db
- }
-
- //----------------------------------------
- // mockDB
-
- // NOTE: not actually goroutine safe.
- // If you want something goroutine safe, maybe you just want a MemDB.
- type mockDB struct {
- mtx sync.Mutex
- calls map[string]int
- }
-
- func newMockDB() *mockDB {
- return &mockDB{
- calls: make(map[string]int),
- }
- }
-
- func (mdb *mockDB) Mutex() *sync.Mutex {
- return &(mdb.mtx)
- }
-
- func (mdb *mockDB) Get([]byte) []byte {
- mdb.calls["Get"] += 1
- return nil
- }
-
- func (mdb *mockDB) Has([]byte) bool {
- mdb.calls["Has"] += 1
- return false
- }
-
- func (mdb *mockDB) Set([]byte, []byte) {
- mdb.calls["Set"] += 1
- }
-
- func (mdb *mockDB) SetSync([]byte, []byte) {
- mdb.calls["SetSync"] += 1
- }
-
- func (mdb *mockDB) SetNoLock([]byte, []byte) {
- mdb.calls["SetNoLock"] += 1
- }
-
- func (mdb *mockDB) SetNoLockSync([]byte, []byte) {
- mdb.calls["SetNoLockSync"] += 1
- }
-
- func (mdb *mockDB) Delete([]byte) {
- mdb.calls["Delete"] += 1
- }
-
- func (mdb *mockDB) DeleteSync([]byte) {
- mdb.calls["DeleteSync"] += 1
- }
-
- func (mdb *mockDB) DeleteNoLock([]byte) {
- mdb.calls["DeleteNoLock"] += 1
- }
-
- func (mdb *mockDB) DeleteNoLockSync([]byte) {
- mdb.calls["DeleteNoLockSync"] += 1
- }
-
- func (mdb *mockDB) Iterator(start, end []byte) Iterator {
- mdb.calls["Iterator"] += 1
- return &mockIterator{}
- }
-
- func (mdb *mockDB) ReverseIterator(start, end []byte) Iterator {
- mdb.calls["ReverseIterator"] += 1
- return &mockIterator{}
- }
-
- func (mdb *mockDB) Close() {
- mdb.calls["Close"] += 1
- }
-
- func (mdb *mockDB) NewBatch() Batch {
- mdb.calls["NewBatch"] += 1
- return &memBatch{db: mdb}
- }
-
- func (mdb *mockDB) Print() {
- mdb.calls["Print"] += 1
- fmt.Printf("mockDB{%v}", mdb.Stats())
- }
-
- func (mdb *mockDB) Stats() map[string]string {
- mdb.calls["Stats"] += 1
-
- res := make(map[string]string)
- for key, count := range mdb.calls {
- res[key] = fmt.Sprintf("%d", count)
- }
- return res
- }
-
- //----------------------------------------
- // mockIterator
-
- type mockIterator struct{}
-
- func (_ mockIterator) Domain() (start []byte, end []byte) {
- return nil, nil
- }
-
- func (_ mockIterator) Valid() bool {
- return false
- }
-
- func (_ mockIterator) Next() {
- }
-
- func (_ mockIterator) Key() []byte {
- return nil
- }
-
- func (_ mockIterator) Value() []byte {
- return nil
- }
-
- func (_ mockIterator) Close() {
- }
|