Skip to content

Commit 0eb9540

Browse files
mergify[bot]hieuvubkjulienrbrt
authored
test(server/v2/cometbft): Add abci unit tests (backport #21020) (#21605)
Co-authored-by: Hieu Vu <[email protected]> Co-authored-by: Julien Robert <[email protected]>
1 parent ec08ea7 commit 0eb9540

File tree

8 files changed

+947
-4
lines changed

8 files changed

+947
-4
lines changed

server/v2/cometbft/abci_test.go

Lines changed: 714 additions & 0 deletions
Large diffs are not rendered by default.

server/v2/cometbft/go.mod

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ require (
2323
cosmossdk.io/log v1.4.1
2424
cosmossdk.io/server/v2 v2.0.0-20240829074658-81a225e6a29b // main
2525
cosmossdk.io/server/v2/appmanager v0.0.0-20240827095516-355f748add9e // main
26+
cosmossdk.io/server/v2/stf v0.0.0-20240909103429-ac53e337a9b5 // main
2627
cosmossdk.io/store/v2 v2.0.0-20240906090851-36d9b25e8981 // main
2728
cosmossdk.io/x/consensus v0.0.0-00010101000000-000000000000
2829
github.com/cometbft/cometbft v1.0.0-rc1.0.20240908111210-ab0be101882f
@@ -35,6 +36,7 @@ require (
3536
github.com/spf13/cobra v1.8.1
3637
github.com/spf13/pflag v1.0.5
3738
github.com/spf13/viper v1.19.0
39+
github.com/stretchr/testify v1.9.0
3840
google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117
3941
google.golang.org/grpc v1.66.0
4042
google.golang.org/protobuf v1.34.2
@@ -119,6 +121,7 @@ require (
119121
github.com/magiconair/properties v1.8.7 // indirect
120122
github.com/mattn/go-colorable v0.1.13 // indirect
121123
github.com/mattn/go-isatty v0.0.20 // indirect
124+
github.com/mattn/go-sqlite3 v1.14.22 // indirect
122125
github.com/minio/highwayhash v1.0.3 // indirect
123126
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
124127
github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -144,7 +147,6 @@ require (
144147
github.com/sourcegraph/conc v0.3.0 // indirect
145148
github.com/spf13/afero v1.11.0 // indirect
146149
github.com/spf13/cast v1.7.0 // indirect
147-
github.com/stretchr/testify v1.9.0 // indirect
148150
github.com/subosito/gotenv v1.6.0 // indirect
149151
github.com/supranational/blst v0.3.13 // indirect
150152
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
@@ -171,3 +173,5 @@ require (
171173
gotest.tools/v3 v3.5.1 // indirect
172174
pgregory.net/rapid v1.1.0 // indirect
173175
)
176+
177+
require cosmossdk.io/core/testing v0.0.0-20240903211221-70488a89a87a // indirect

server/v2/cometbft/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ cosmossdk.io/server/v2 v2.0.0-20240829074658-81a225e6a29b h1:FFixNVq2SbtRlYvr1fB
2828
cosmossdk.io/server/v2 v2.0.0-20240829074658-81a225e6a29b/go.mod h1:MgjYKtPEW4FPEYxh1h0idVBjgblFgdrAWkeqn7UOrVA=
2929
cosmossdk.io/server/v2/appmanager v0.0.0-20240827095516-355f748add9e h1:9eB2si1gT6c5ea8Jsh498Ei6E3Th1yMyuJgSLiT6D4Y=
3030
cosmossdk.io/server/v2/appmanager v0.0.0-20240827095516-355f748add9e/go.mod h1:fJDDnWJCBRxLLIyu2byqtf3KTRYIVS4OxKwdZozJi20=
31+
cosmossdk.io/server/v2/stf v0.0.0-20240909103429-ac53e337a9b5 h1:lrq7/YrEflKv3enDm5jMHHz1GsfmBzHM4FGgjSt1ZmQ=
32+
cosmossdk.io/server/v2/stf v0.0.0-20240909103429-ac53e337a9b5/go.mod h1:Y0cRRjdM5JcXqFsGYgZgWkiG7fA4eN8oNBP1vSEE8Gc=
3133
cosmossdk.io/store v1.0.0-rc.0.0.20240906090851-36d9b25e8981 h1:O510vQpVdyZgSlLm4NG2aQltDkKfoWcKrVCPPWQlNHs=
3234
cosmossdk.io/store v1.0.0-rc.0.0.20240906090851-36d9b25e8981/go.mod h1:5lnCUSlWPWQYrUcNjpqBLTnlykyz1NeGQpMmZq1DCOg=
3335
cosmossdk.io/store/v2 v2.0.0-20240906090851-36d9b25e8981 h1:Z6I2YbnF6b6mRD63hMQ5DA2efQ4Ip9Ujf1y/r31egWk=
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package mock
2+
3+
import (
4+
"context"
5+
6+
"cosmossdk.io/core/transaction"
7+
"cosmossdk.io/server/v2/cometbft/mempool"
8+
)
9+
10+
var _ mempool.Mempool[transaction.Tx] = (*MockMempool[transaction.Tx])(nil)
11+
12+
// MockMempool implements Mempool
13+
// Used for testing instead of NoOpMempool
14+
type MockMempool[T transaction.Tx] struct{}
15+
16+
func (MockMempool[T]) Insert(context.Context, T) error { return nil }
17+
func (MockMempool[T]) Select(context.Context, []T) mempool.Iterator[T] { return nil }
18+
func (MockMempool[T]) CountTx() int { return 0 }
19+
func (MockMempool[T]) Remove([]T) error { return nil }
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package mock
2+
3+
import (
4+
corestore "cosmossdk.io/core/store"
5+
)
6+
7+
// ReaderMap defines an adapter around a RootStore that only exposes read-only
8+
// operations. This is useful for exposing a read-only view of the RootStore at
9+
// a specific version in history, which could also be the latest state.
10+
type ReaderMap struct {
11+
store *MockStore
12+
version uint64
13+
}
14+
15+
func NewMockReaderMap(v uint64, rs *MockStore) *ReaderMap {
16+
return &ReaderMap{
17+
store: rs,
18+
version: v,
19+
}
20+
}
21+
22+
func (roa *ReaderMap) GetReader(actor []byte) (corestore.Reader, error) {
23+
return NewMockReader(roa.version, roa.store, actor), nil
24+
}
25+
26+
// Reader represents a read-only adapter for accessing data from the root store.
27+
type MockReader struct {
28+
version uint64 // The version of the data.
29+
store *MockStore // The root store to read data from.
30+
actor []byte // The actor associated with the data.
31+
}
32+
33+
func NewMockReader(v uint64, rs *MockStore, actor []byte) *MockReader {
34+
return &MockReader{
35+
version: v,
36+
store: rs,
37+
actor: actor,
38+
}
39+
}
40+
41+
func (roa *MockReader) Has(key []byte) (bool, error) {
42+
val, err := roa.store.GetStateStorage().Has(roa.actor, roa.version, key)
43+
if err != nil {
44+
return false, err
45+
}
46+
47+
return val, nil
48+
}
49+
50+
func (roa *MockReader) Get(key []byte) ([]byte, error) {
51+
result, err := roa.store.GetStateStorage().Get(roa.actor, roa.version, key)
52+
if err != nil {
53+
return nil, err
54+
}
55+
56+
return result, nil
57+
}
58+
59+
func (roa *MockReader) Iterator(start, end []byte) (corestore.Iterator, error) {
60+
return roa.store.GetStateStorage().Iterator(roa.actor, roa.version, start, end)
61+
}
62+
63+
func (roa *MockReader) ReverseIterator(start, end []byte) (corestore.Iterator, error) {
64+
return roa.store.GetStateStorage().ReverseIterator(roa.actor, roa.version, start, end)
65+
}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package mock
2+
3+
import (
4+
"crypto/sha256"
5+
"fmt"
6+
7+
"cosmossdk.io/core/log"
8+
corestore "cosmossdk.io/core/store"
9+
10+
storev2 "cosmossdk.io/store/v2"
11+
"cosmossdk.io/store/v2/commitment"
12+
"cosmossdk.io/store/v2/commitment/iavl"
13+
dbm "cosmossdk.io/store/v2/db"
14+
"cosmossdk.io/store/v2/proof"
15+
"cosmossdk.io/store/v2/storage"
16+
"cosmossdk.io/store/v2/storage/sqlite"
17+
)
18+
19+
type MockStore struct {
20+
Storage storev2.VersionedDatabase
21+
Commiter storev2.Committer
22+
}
23+
24+
func NewMockStorage(logger log.Logger, dir string) storev2.VersionedDatabase {
25+
storageDB, _ := sqlite.New(dir)
26+
ss := storage.NewStorageStore(storageDB, logger)
27+
return ss
28+
}
29+
30+
func NewMockCommiter(logger log.Logger, actors ...string) storev2.Committer {
31+
treeMap := make(map[string]commitment.Tree)
32+
for _, actor := range actors {
33+
tree := iavl.NewIavlTree(dbm.NewMemDB(), logger, iavl.DefaultConfig())
34+
treeMap[actor] = tree
35+
}
36+
sc, _ := commitment.NewCommitStore(treeMap, treeMap, dbm.NewMemDB(), logger)
37+
return sc
38+
}
39+
40+
func NewMockStore(ss storev2.VersionedDatabase, sc storev2.Committer) *MockStore {
41+
return &MockStore{Storage: ss, Commiter: sc}
42+
}
43+
44+
func (s *MockStore) GetLatestVersion() (uint64, error) {
45+
lastCommitID, err := s.LastCommitID()
46+
if err != nil {
47+
return 0, err
48+
}
49+
50+
return lastCommitID.Version, nil
51+
}
52+
53+
func (s *MockStore) StateLatest() (uint64, corestore.ReaderMap, error) {
54+
v, err := s.GetLatestVersion()
55+
if err != nil {
56+
return 0, nil, err
57+
}
58+
59+
return v, NewMockReaderMap(v, s), nil
60+
}
61+
62+
func (s *MockStore) Commit(changeset *corestore.Changeset) (corestore.Hash, error) {
63+
v, _, _ := s.StateLatest()
64+
err := s.Storage.ApplyChangeset(v, changeset)
65+
if err != nil {
66+
return []byte{}, err
67+
}
68+
69+
err = s.Commiter.WriteChangeset(changeset)
70+
if err != nil {
71+
return []byte{}, err
72+
}
73+
74+
commitInfo, err := s.Commiter.Commit(v + 1)
75+
fmt.Println("commitInfo", commitInfo, err)
76+
return []byte{}, err
77+
}
78+
79+
func (s *MockStore) StateAt(version uint64) (corestore.ReaderMap, error) {
80+
info, err := s.Commiter.GetCommitInfo(version)
81+
if err != nil || info == nil {
82+
return nil, fmt.Errorf("failed to get commit info for version %d: %w", version, err)
83+
}
84+
return NewMockReaderMap(version, s), nil
85+
}
86+
87+
func (s *MockStore) GetStateStorage() storev2.VersionedDatabase {
88+
return s.Storage
89+
}
90+
91+
func (s *MockStore) GetStateCommitment() storev2.Committer {
92+
return s.Commiter
93+
}
94+
95+
type Result struct {
96+
key []byte
97+
value []byte
98+
version uint64
99+
proofOps []proof.CommitmentOp
100+
}
101+
102+
func (s *MockStore) Query(storeKey []byte, version uint64, key []byte, prove bool) (storev2.QueryResult, error) {
103+
state, err := s.StateAt(version)
104+
reader, err := state.GetReader(storeKey)
105+
value, err := reader.Get(key)
106+
res := storev2.QueryResult{
107+
Key: key,
108+
Value: value,
109+
Version: version,
110+
}
111+
return res, err
112+
}
113+
114+
func (s *MockStore) LastCommitID() (proof.CommitID, error) {
115+
v, err := s.GetStateCommitment().GetLatestVersion()
116+
bz := sha256.Sum256([]byte{})
117+
return proof.CommitID{
118+
Version: v,
119+
Hash: bz[:],
120+
}, err
121+
}
122+
123+
func (s *MockStore) SetInitialVersion(v uint64) error {
124+
return s.Commiter.SetInitialVersion(v)
125+
}
126+
127+
func (s *MockStore) WorkingHash(changeset *corestore.Changeset) (corestore.Hash, error) {
128+
v, _, _ := s.StateLatest()
129+
err := s.Storage.ApplyChangeset(v, changeset)
130+
if err != nil {
131+
return []byte{}, err
132+
}
133+
134+
err = s.Commiter.WriteChangeset(changeset)
135+
if err != nil {
136+
return []byte{}, err
137+
}
138+
return []byte{}, nil
139+
}

simapp/v2/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ require (
5757
cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5 // indirect
5858
cosmossdk.io/schema v0.2.0 // indirect
5959
cosmossdk.io/server/v2/appmanager v0.0.0-20240827095516-355f748add9e // indirect; main
60-
cosmossdk.io/server/v2/stf v0.0.0-20240827095516-355f748add9e // indirect; main
60+
cosmossdk.io/server/v2/stf v0.0.0-20240909103429-ac53e337a9b5 // indirect; main
6161
cosmossdk.io/store v1.1.1-0.20240815194237-858ec2fcb897 // indirect; main
6262
cosmossdk.io/x/accounts/defaults/lockup v0.0.0-20240417181816-5e7aae0db1f5 // indirect
6363
cosmossdk.io/x/accounts/defaults/multisig v0.0.0-00010101000000-000000000000 // indirect

simapp/v2/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,8 @@ cosmossdk.io/server/v2 v2.0.0-20240829074658-81a225e6a29b h1:FFixNVq2SbtRlYvr1fB
218218
cosmossdk.io/server/v2 v2.0.0-20240829074658-81a225e6a29b/go.mod h1:MgjYKtPEW4FPEYxh1h0idVBjgblFgdrAWkeqn7UOrVA=
219219
cosmossdk.io/server/v2/appmanager v0.0.0-20240827095516-355f748add9e h1:9eB2si1gT6c5ea8Jsh498Ei6E3Th1yMyuJgSLiT6D4Y=
220220
cosmossdk.io/server/v2/appmanager v0.0.0-20240827095516-355f748add9e/go.mod h1:fJDDnWJCBRxLLIyu2byqtf3KTRYIVS4OxKwdZozJi20=
221-
cosmossdk.io/server/v2/stf v0.0.0-20240827095516-355f748add9e h1:A2JxCwJuoMRiBF8ZjpxRf+JO5cTSYw8Vc2iHImfHoKg=
222-
cosmossdk.io/server/v2/stf v0.0.0-20240827095516-355f748add9e/go.mod h1:Y0cRRjdM5JcXqFsGYgZgWkiG7fA4eN8oNBP1vSEE8Gc=
221+
cosmossdk.io/server/v2/stf v0.0.0-20240909103429-ac53e337a9b5 h1:lrq7/YrEflKv3enDm5jMHHz1GsfmBzHM4FGgjSt1ZmQ=
222+
cosmossdk.io/server/v2/stf v0.0.0-20240909103429-ac53e337a9b5/go.mod h1:Y0cRRjdM5JcXqFsGYgZgWkiG7fA4eN8oNBP1vSEE8Gc=
223223
cosmossdk.io/store v1.0.0-rc.0.0.20240906090851-36d9b25e8981 h1:O510vQpVdyZgSlLm4NG2aQltDkKfoWcKrVCPPWQlNHs=
224224
cosmossdk.io/store v1.0.0-rc.0.0.20240906090851-36d9b25e8981/go.mod h1:5lnCUSlWPWQYrUcNjpqBLTnlykyz1NeGQpMmZq1DCOg=
225225
cosmossdk.io/store/v2 v2.0.0-20240906090851-36d9b25e8981 h1:Z6I2YbnF6b6mRD63hMQ5DA2efQ4Ip9Ujf1y/r31egWk=

0 commit comments

Comments
 (0)