cosmos-sdk/db/prefix/prefix_test.go
Robert Zaremba 284affb594
feat: use cosmos/rocksdb rather than replace trick (#10927)
## Description

A follow up to https://github.com/cosmos/gorocksdb/pull/4 (see description there).
Also:
* remove import aliasing in rocksdb package.

Closes: #10915

TODO:
- [x] merge https://github.com/cosmos/gorocksdb/pull/4
- [x] tag new release in https://github.com/cosmos/gorocksdb
- [x] Update this PR to include new release
- [ ] tag `db/v1.0.0` (or `db/v0.1.0)` 

---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
2022-01-11 22:29:53 +00:00

158 lines
5.1 KiB
Go

package prefix_test
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/cosmos/cosmos-sdk/db"
"github.com/cosmos/cosmos-sdk/db/dbtest"
"github.com/cosmos/cosmos-sdk/db/memdb"
pfx "github.com/cosmos/cosmos-sdk/db/prefix"
)
func fillDBWithStuff(t *testing.T, dbw db.DBWriter) {
// Under "key" prefix
require.NoError(t, dbw.Set([]byte("key"), []byte("value")))
require.NoError(t, dbw.Set([]byte("key1"), []byte("value1")))
require.NoError(t, dbw.Set([]byte("key2"), []byte("value2")))
require.NoError(t, dbw.Set([]byte("key3"), []byte("value3")))
require.NoError(t, dbw.Set([]byte("something"), []byte("else")))
require.NoError(t, dbw.Set([]byte("k"), []byte("val")))
require.NoError(t, dbw.Set([]byte("ke"), []byte("valu")))
require.NoError(t, dbw.Set([]byte("kee"), []byte("valuu")))
require.NoError(t, dbw.Commit())
}
func mockDBWithStuff(t *testing.T) db.DBConnection {
dbm := memdb.NewDB()
fillDBWithStuff(t, dbm.Writer())
return dbm
}
func makePrefixReader(t *testing.T, dbc db.DBConnection, pre []byte) db.DBReader {
view := dbc.Reader()
require.NotNil(t, view)
return pfx.NewPrefixReader(view, pre)
}
func TestPrefixDBSimple(t *testing.T) {
pdb := makePrefixReader(t, mockDBWithStuff(t), []byte("key"))
dbtest.AssertValue(t, pdb, []byte("key"), nil)
dbtest.AssertValue(t, pdb, []byte("key1"), nil)
dbtest.AssertValue(t, pdb, []byte("1"), []byte("value1"))
dbtest.AssertValue(t, pdb, []byte("key2"), nil)
dbtest.AssertValue(t, pdb, []byte("2"), []byte("value2"))
dbtest.AssertValue(t, pdb, []byte("key3"), nil)
dbtest.AssertValue(t, pdb, []byte("3"), []byte("value3"))
dbtest.AssertValue(t, pdb, []byte("something"), nil)
dbtest.AssertValue(t, pdb, []byte("k"), nil)
dbtest.AssertValue(t, pdb, []byte("ke"), nil)
dbtest.AssertValue(t, pdb, []byte("kee"), nil)
}
func TestPrefixDBIterator1(t *testing.T) {
pdb := makePrefixReader(t, mockDBWithStuff(t), []byte("key"))
itr, err := pdb.Iterator(nil, nil)
require.NoError(t, err)
dbtest.AssertDomain(t, itr, nil, nil)
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("1"), []byte("value1"))
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("2"), []byte("value2"))
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("3"), []byte("value3"))
dbtest.AssertNext(t, itr, false)
dbtest.AssertInvalid(t, itr)
itr.Close()
}
func TestPrefixDBReverseIterator1(t *testing.T) {
pdb := makePrefixReader(t, mockDBWithStuff(t), []byte("key"))
itr, err := pdb.ReverseIterator(nil, nil)
require.NoError(t, err)
dbtest.AssertDomain(t, itr, nil, nil)
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("3"), []byte("value3"))
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("2"), []byte("value2"))
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("1"), []byte("value1"))
dbtest.AssertNext(t, itr, false)
dbtest.AssertInvalid(t, itr)
itr.Close()
}
func TestPrefixDBReverseIterator5(t *testing.T) {
pdb := makePrefixReader(t, mockDBWithStuff(t), []byte("key"))
itr, err := pdb.ReverseIterator([]byte("1"), nil)
require.NoError(t, err)
dbtest.AssertDomain(t, itr, []byte("1"), nil)
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("3"), []byte("value3"))
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("2"), []byte("value2"))
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("1"), []byte("value1"))
dbtest.AssertNext(t, itr, false)
dbtest.AssertInvalid(t, itr)
itr.Close()
}
func TestPrefixDBReverseIterator6(t *testing.T) {
pdb := makePrefixReader(t, mockDBWithStuff(t), []byte("key"))
itr, err := pdb.ReverseIterator([]byte("2"), nil)
require.NoError(t, err)
dbtest.AssertDomain(t, itr, []byte("2"), nil)
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("3"), []byte("value3"))
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("2"), []byte("value2"))
dbtest.AssertNext(t, itr, false)
dbtest.AssertInvalid(t, itr)
itr.Close()
}
func TestPrefixDBReverseIterator7(t *testing.T) {
pdb := makePrefixReader(t, mockDBWithStuff(t), []byte("key"))
itr, err := pdb.ReverseIterator(nil, []byte("2"))
require.NoError(t, err)
dbtest.AssertDomain(t, itr, nil, []byte("2"))
dbtest.AssertNext(t, itr, true)
dbtest.AssertItem(t, itr, []byte("1"), []byte("value1"))
dbtest.AssertNext(t, itr, false)
dbtest.AssertInvalid(t, itr)
itr.Close()
}
func TestPrefixDBViewVersion(t *testing.T) {
prefix := []byte("key")
dbm := memdb.NewDB()
fillDBWithStuff(t, dbm.Writer())
id, err := dbm.SaveNextVersion()
require.NoError(t, err)
pdb := pfx.NewPrefixReadWriter(dbm.ReadWriter(), prefix)
pdb.Set([]byte("1"), []byte("newvalue1"))
pdb.Delete([]byte("2"))
pdb.Set([]byte("4"), []byte("newvalue4"))
pdb.Discard()
dbview, err := dbm.ReaderAt(id)
require.NotNil(t, dbview)
require.NoError(t, err)
view := pfx.NewPrefixReader(dbview, prefix)
require.NotNil(t, view)
defer view.Discard()
dbtest.AssertValue(t, view, []byte("1"), []byte("value1"))
dbtest.AssertValue(t, view, []byte("2"), []byte("value2"))
dbtest.AssertValue(t, view, []byte("4"), nil)
}