Skip to content

Commit

Permalink
Add some tests to server/v2 (#19791)
Browse files Browse the repository at this point in the history
  • Loading branch information
hieuvubk authored Mar 26, 2024
1 parent 632a89a commit bcb1931
Show file tree
Hide file tree
Showing 22 changed files with 679 additions and 39 deletions.
165 changes: 165 additions & 0 deletions server/v2/appmanager/appmanager_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
package appmanager

import (
"context"
"testing"

appmodulev2 "cosmossdk.io/core/appmodule/v2"
corestore "cosmossdk.io/core/store"
"cosmossdk.io/core/transaction"
ammstore "cosmossdk.io/server/v2/appmanager/store"
"cosmossdk.io/server/v2/core/appmanager"
"cosmossdk.io/server/v2/stf"
"cosmossdk.io/server/v2/stf/branch"
"cosmossdk.io/server/v2/stf/mock"
"cosmossdk.io/store/v2/storage/pebbledb"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/types/known/wrapperspb"
)

func TestAppManager(t *testing.T) {
mockTx := mock.Tx{
Sender: []byte("sender"),
Msg: wrapperspb.Bool(true), // msg does not matter at all because our handler does nothing.
GasLimit: 100_000,
}

s := stf.NewSTF(
func(ctx context.Context, msg transaction.Type) (msgResp transaction.Type, err error) {
err = kvSet(t, ctx, "exec")
return nil, err
},
func(ctx context.Context, msg transaction.Type) (msgResp transaction.Type, err error) {
err = kvSet(t, ctx, "query")
return nil, err
},
func(ctx context.Context, txs []mock.Tx) error { return nil },
func(ctx context.Context) error {
return kvSet(t, ctx, "begin-block")
},
func(ctx context.Context) error {
return kvSet(t, ctx, "end-block")
},
func(ctx context.Context, tx mock.Tx) error {
return kvSet(t, ctx, "validate")
},
func(ctx context.Context) ([]appmodulev2.ValidatorUpdate, error) { return nil, nil },
func(ctx context.Context, tx mock.Tx, success bool) error {
return kvSet(t, ctx, "post-tx-exec")
},
branch.DefaultNewWriterMap,
)

storageDB, err := pebbledb.New(t.TempDir())
require.NoError(t, err)

store, err := ammstore.New(storageDB)
require.NoError(t, err)

b := Builder[mock.Tx]{
STF: s,
DB: store,
ValidateTxGasLimit: 100_000,
QueryGasLimit: 100_000,
SimulationGasLimit: 100_000,
}

am, err := b.Build()
require.NoError(t, err)

t.Run("Invalid block height", func(t *testing.T) {
_, _, err := am.DeliverBlock(context.Background(), &appmanager.BlockRequest[mock.Tx]{Height: 0})
require.Error(t, err)
})

t.Run("begin and end block", func(t *testing.T) {
_, newState, err := am.DeliverBlock(context.Background(), &appmanager.BlockRequest[mock.Tx]{Height: 1})
require.NoError(t, err)
stateHas(t, newState, "begin-block")
stateHas(t, newState, "end-block")
})

t.Run("basic tx", func(t *testing.T) {
result, newState, err := am.DeliverBlock(context.Background(), &appmanager.BlockRequest[mock.Tx]{
Height: 1,
Txs: []mock.Tx{mockTx},
})
require.NoError(t, err)
stateHas(t, newState, "validate")
stateHas(t, newState, "exec")
stateHas(t, newState, "post-tx-exec")

require.Len(t, result.TxResults, 1)
txResult := result.TxResults[0]
require.NotZero(t, txResult.GasUsed)
require.Equal(t, mockTx.GasLimit, txResult.GasWanted)
})

t.Run("validate tx", func(t *testing.T) {
_, err := am.ValidateTx(context.Background(), mockTx)
require.NoError(t, err)
})

t.Run("validate tx out of gas", func(t *testing.T) {
am.config.ValidateTxGasLimit = 0
result, _ := am.ValidateTx(context.Background(), mockTx)
require.Error(t, result.Error, "out of gas")
})

t.Run("simulate tx", func(t *testing.T) {
_, newState, err := am.Simulate(context.Background(), mockTx)
require.NoError(t, err)
stateHas(t, newState, "validate")
stateHas(t, newState, "exec")
})

// SimulationGasLimit is unusing in STF
t.Run("simulate tx out of gas", func(t *testing.T) {
am.config.SimulationGasLimit = 0
_, newState, err := am.Simulate(context.Background(), mockTx)
require.NoError(t, err)
stateHas(t, newState, "validate") // should not has
stateHas(t, newState, "exec") // should not has
})

t.Run("query basic", func(t *testing.T) {
_, err = am.Query(context.Background(), 1, nil)
require.NoError(t, err)
})

t.Run("query basic, out of gas", func(t *testing.T) {
am.config.QueryGasLimit = 0
_, err := am.Query(context.Background(), 1, nil)
require.Error(t, err)
})

}

var actorName = []byte("cookies")

func kvSet(t *testing.T, ctx context.Context, v string) error {
t.Helper()
executionCtx := stf.GetExecutionContext(ctx)
require.NotNil(t, executionCtx)
state, err := executionCtx.State.GetWriter(actorName)
require.NoError(t, err)
return state.Set([]byte(v), []byte(v))
}

func stateHas(t *testing.T, accountState corestore.ReaderMap, key string) {
t.Helper()
state, err := accountState.GetReader(actorName)
require.NoError(t, err)
has, err := state.Has([]byte(key))
require.NoError(t, err)
require.Truef(t, has, "state did not have key: %s", key)
}

func stateNotHas(t *testing.T, accountState corestore.ReaderMap, key string) {
t.Helper()
state, err := accountState.GetReader(actorName)
require.NoError(t, err)
has, err := state.Has([]byte(key))
require.NoError(t, err)
require.Falsef(t, has, "state was not supposed to have key: %s", key)
}
49 changes: 46 additions & 3 deletions server/v2/appmanager/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,66 @@ replace (
cosmossdk.io/core => ../../../core
cosmossdk.io/server/v2/core => ../core
cosmossdk.io/server/v2/stf => ../stf
cosmossdk.io/store/v2 => ../../../store
)

require (
cosmossdk.io/core v0.12.0
cosmossdk.io/server/v2/core v0.0.0-00010101000000-000000000000
cosmossdk.io/server/v2/stf v0.0.0-00010101000000-000000000000
cosmossdk.io/store/v2 v2.0.0-00010101000000-000000000000
github.com/stretchr/testify v1.9.0
google.golang.org/protobuf v1.33.0
)

require (
cosmossdk.io/errors v1.0.1 // indirect
cosmossdk.io/log v1.3.1 // indirect
github.com/DataDog/zstd v1.5.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cockroachdb/errors v1.11.1 // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
github.com/cockroachdb/pebble v1.1.0 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/cometbft/cometbft v0.38.6 // indirect
github.com/cosmos/gogoproto v1.4.11 // indirect
github.com/cosmos/ics23/go v0.10.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/hashicorp/go-immutable-radix v1.0.0 // indirect
github.com/hashicorp/go-metrics v0.5.3 // indirect
github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/klauspost/compress v1.17.7 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/oasisprotocol/curve25519-voi v0.0.0-20220708102147-0a8a51822cae // indirect
github.com/petermattis/goid v0.0.0-20221215004737-a150e88a970d // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.19.0 // indirect
github.com/prometheus/client_model v0.6.0 // indirect
github.com/prometheus/common v0.50.0 // indirect
github.com/prometheus/procfs v0.13.0 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/rs/zerolog v1.32.0 // indirect
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect
golang.org/x/sys v0.17.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
github.com/sasha-s/go-deadlock v0.3.1 // indirect
github.com/tidwall/btree v1.7.0 // indirect
golang.org/x/crypto v0.21.0 // indirect
golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f // indirect
golang.org/x/net v0.22.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c // indirect
google.golang.org/grpc v1.62.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Loading

0 comments on commit bcb1931

Please sign in to comment.