cosmos-sdk/state/store_test.go

148 lines
2.8 KiB
Go
Raw Normal View History

2017-07-26 11:39:04 -07:00
package state
import (
"io/ioutil"
2017-07-26 11:39:04 -07:00
"testing"
"github.com/stretchr/testify/assert"
2017-07-26 16:26:06 -07:00
"github.com/tendermint/merkleeyes/iavl"
dbm "github.com/tendermint/tmlibs/db"
2017-07-26 11:39:04 -07:00
)
func GetDBs() []SimpleDB {
// tree with persistence....
tmpDir, err := ioutil.TempDir("", "state-tests")
if err != nil {
panic(err)
}
db := dbm.NewDB("test-get-dbs", dbm.LevelDBBackendStr, tmpDir)
persist := iavl.NewIAVLTree(500, db)
2017-07-26 16:26:06 -07:00
2017-07-26 11:39:04 -07:00
return []SimpleDB{
2017-07-26 16:26:06 -07:00
NewMemKVStore(),
NewBonsai(iavl.NewIAVLTree(0, nil)),
NewBonsai(persist),
2017-07-26 11:39:04 -07:00
}
}
2017-07-26 13:23:28 -07:00
func b(k string) []byte {
if k == "" {
return nil
}
return []byte(k)
}
func m(k, v string) Model {
return Model{
Key: b(k),
Value: b(v),
}
}
2017-07-26 14:44:48 -07:00
type listQuery struct {
// this is the list query
start, end string
limit int
// expected result from List, first element also expected for First
expected []Model
// expected result from Last
last Model
}
2017-07-26 11:39:04 -07:00
// TestKVStore makes sure that get/set/remove operations work,
// as well as list
func TestKVStore(t *testing.T) {
assert := assert.New(t)
cases := []struct {
toSet []Model
toRemove []Model
toGet []Model
toList []listQuery
}{
// simple add
{
2017-07-26 13:23:28 -07:00
toSet: []Model{m("a", "b"), m("c", "d")},
toRemove: nil,
toGet: []Model{m("a", "b")},
toList: []listQuery{
2017-07-26 11:39:04 -07:00
{
2017-07-26 13:23:28 -07:00
"a", "d", 0,
[]Model{m("a", "b"), m("c", "d")},
m("c", "d"),
2017-07-26 11:39:04 -07:00
},
{
2017-07-26 13:23:28 -07:00
"a", "c", 10,
[]Model{m("a", "b")},
m("a", "b"),
2017-07-26 11:39:04 -07:00
},
},
},
// over-write data, remove
{
2017-07-26 13:23:28 -07:00
toSet: []Model{
m("a", "1"),
m("b", "2"),
m("c", "3"),
m("b", "4"),
2017-07-26 11:39:04 -07:00
},
2017-07-26 13:23:28 -07:00
toRemove: []Model{m("c", "3")},
toGet: []Model{
m("a", "1"),
m("b", "4"),
m("c", ""),
2017-07-26 11:39:04 -07:00
},
2017-07-26 13:23:28 -07:00
toList: []listQuery{
2017-07-26 11:39:04 -07:00
{
2017-07-26 13:23:28 -07:00
"0d", "h", 1,
[]Model{m("a", "1")},
m("b", "4"),
2017-07-26 11:39:04 -07:00
},
{
2017-07-26 13:23:28 -07:00
"ad", "ak", 10,
2017-07-26 11:39:04 -07:00
[]Model{},
Model{},
},
{
2017-07-26 13:23:28 -07:00
"ad", "k", 0,
[]Model{m("b", "4")},
m("b", "4"),
2017-07-26 11:39:04 -07:00
},
},
},
}
for i, tc := range cases {
for j, db := range GetDBs() {
for _, s := range tc.toSet {
db.Set(s.Key, s.Value)
}
for k, r := range tc.toRemove {
val := db.Remove(r.Key)
assert.EqualValues(r.Value, val, "%d/%d/%d", i, j, k)
}
for k, g := range tc.toGet {
val := db.Get(g.Key)
assert.EqualValues(g.Value, val, "%d/%d/%d", i, j, k)
has := db.Has(g.Key)
assert.Equal(len(g.Value) != 0, has, "%d/%d/%d", i, j, k)
}
for k, lq := range tc.toList {
2017-07-26 13:23:28 -07:00
start, end := []byte(lq.start), []byte(lq.end)
list := db.List(start, end, lq.limit)
2017-07-26 11:39:04 -07:00
if assert.EqualValues(lq.expected, list, "%d/%d/%d", i, j, k) {
var first Model
if len(lq.expected) > 0 {
first = lq.expected[0]
}
2017-07-26 13:23:28 -07:00
f := db.First(start, end)
2017-07-26 11:39:04 -07:00
assert.EqualValues(first, f, "%d/%d/%d", i, j, k)
2017-07-26 13:23:28 -07:00
l := db.Last(start, end)
2017-07-26 11:39:04 -07:00
assert.EqualValues(lq.last, l, "%d/%d/%d", i, j, k)
}
}
}
}
}