refactor!: Remove sdk.Router and refactor baseapp tests (#13005)
* test * progress-ish * progress * progress * make mocks * progress * test * progress * progress * progress * progress * progress * progress * fix mock tests * progress * pretty much done, might need some tidying up * lint * re-enable blockgas test * remove router * gofumpt * remove more references of Router * fix * remove unused code * remove unused code Co-authored-by: Marko <marbar3778@yahoo.com>
This commit is contained in:
parent
2c527d0650
commit
797bd12af5
@ -1,10 +1,13 @@
|
||||
package baseapp
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
abci "github.com/tendermint/tendermint/abci/types"
|
||||
"github.com/tendermint/tendermint/libs/log"
|
||||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
||||
dbm "github.com/tendermint/tm-db"
|
||||
|
||||
@ -12,8 +15,13 @@ import (
|
||||
"github.com/cosmos/cosmos-sdk/snapshots"
|
||||
snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types"
|
||||
"github.com/cosmos/cosmos-sdk/testutil"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
func defaultLogger() log.Logger {
|
||||
return log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app")
|
||||
}
|
||||
|
||||
func TestGetBlockRentionHeight(t *testing.T) {
|
||||
logger := defaultLogger()
|
||||
db := dbm.NewMemDB()
|
||||
@ -164,3 +172,40 @@ func TestBaseAppCreateQueryContext(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
type paramStore struct {
|
||||
db *dbm.MemDB
|
||||
}
|
||||
|
||||
func (ps *paramStore) Set(_ sdk.Context, key []byte, value interface{}) {
|
||||
bz, err := json.Marshal(value)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
ps.db.Set(key, bz)
|
||||
}
|
||||
|
||||
func (ps *paramStore) Has(_ sdk.Context, key []byte) bool {
|
||||
ok, err := ps.db.Has(key)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return ok
|
||||
}
|
||||
|
||||
func (ps *paramStore) Get(_ sdk.Context, key []byte, ptr interface{}) {
|
||||
bz, err := ps.db.Get(key)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if len(bz) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(bz, ptr); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,7 +18,6 @@ import (
|
||||
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
"github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -49,7 +48,6 @@ type BaseApp struct { //nolint: maligned
|
||||
db dbm.DB // common DB backend
|
||||
cms sdk.CommitMultiStore // Main (uncached) state
|
||||
storeLoader StoreLoader // function to handle store loading, may be overridden with SetStoreLoader()
|
||||
router sdk.Router // handle any kind of legacy message
|
||||
queryRouter sdk.QueryRouter // router for redirecting query calls
|
||||
grpcQueryRouter *GRPCQueryRouter // router for redirecting gRPC query calls
|
||||
msgServiceRouter *MsgServiceRouter // router for redirecting Msg service messages
|
||||
@ -149,7 +147,6 @@ func NewBaseApp(
|
||||
db: db,
|
||||
cms: store.NewCommitMultiStore(db),
|
||||
storeLoader: DefaultStoreLoader,
|
||||
router: NewRouter(),
|
||||
queryRouter: NewQueryRouter(),
|
||||
grpcQueryRouter: NewGRPCQueryRouter(),
|
||||
msgServiceRouter: NewMsgServiceRouter(),
|
||||
@ -367,17 +364,6 @@ func (app *BaseApp) setIndexEvents(ie []string) {
|
||||
}
|
||||
}
|
||||
|
||||
// Router returns the legacy router of the BaseApp.
|
||||
func (app *BaseApp) Router() sdk.Router {
|
||||
if app.sealed {
|
||||
// We cannot return a Router when the app is sealed because we can't have
|
||||
// any routes modified which would cause unexpected routing behavior.
|
||||
panic("Router() on sealed BaseApp")
|
||||
}
|
||||
|
||||
return app.router
|
||||
}
|
||||
|
||||
// QueryRouter returns the QueryRouter of a BaseApp.
|
||||
func (app *BaseApp) QueryRouter() sdk.QueryRouter { return app.queryRouter }
|
||||
|
||||
@ -749,20 +735,6 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s
|
||||
// ADR 031 request type routing
|
||||
msgResult, err = handler(ctx, msg)
|
||||
eventMsgName = sdk.MsgTypeURL(msg)
|
||||
} else if legacyMsg, ok := msg.(legacytx.LegacyMsg); ok {
|
||||
// legacy sdk.Msg routing
|
||||
// Assuming that the app developer has migrated all their Msgs to
|
||||
// proto messages and has registered all `Msg services`, then this
|
||||
// path should never be called, because all those Msgs should be
|
||||
// registered within the `msgServiceRouter` already.
|
||||
msgRoute := legacyMsg.Route()
|
||||
eventMsgName = legacyMsg.Type()
|
||||
handler := app.router.Route(ctx, msgRoute)
|
||||
if handler == nil {
|
||||
return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized message route: %s; message index: %d", msgRoute, i)
|
||||
}
|
||||
|
||||
msgResult, err = handler(ctx, msg)
|
||||
} else {
|
||||
return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "can't route message %+v", msg)
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
||||
package baseapp_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"context"
|
||||
"math"
|
||||
"testing"
|
||||
|
||||
@ -12,9 +12,8 @@ import (
|
||||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
||||
dbm "github.com/tendermint/tm-db"
|
||||
|
||||
bankmodulev1 "cosmossdk.io/api/cosmos/bank/module/v1"
|
||||
"cosmossdk.io/depinject"
|
||||
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||
baseapptestutil "github.com/cosmos/cosmos-sdk/baseapp/testutil"
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/client/tx"
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
@ -39,6 +38,22 @@ import (
|
||||
|
||||
var blockMaxGas = uint64(simtestutil.DefaultConsensusParams.Block.MaxGas)
|
||||
|
||||
type BlockGasImpl struct {
|
||||
panicTx bool
|
||||
gasToConsume uint64
|
||||
key store.StoreKey
|
||||
}
|
||||
|
||||
func (m BlockGasImpl) Set(ctx context.Context, msg *baseapptestutil.MsgKeyValue) (*baseapptestutil.MsgCreateKeyValueResponse, error) {
|
||||
sdkCtx := sdk.UnwrapSDKContext(ctx)
|
||||
sdkCtx.KVStore(m.key).Set(msg.Key, msg.Value)
|
||||
sdkCtx.GasMeter().ConsumeGas(m.gasToConsume, "TestMsg")
|
||||
if m.panicTx {
|
||||
panic("panic in tx execution")
|
||||
}
|
||||
return &baseapptestutil.MsgCreateKeyValueResponse{}, nil
|
||||
}
|
||||
|
||||
func TestBaseApp_BlockGas(t *testing.T) {
|
||||
testcases := []struct {
|
||||
name string
|
||||
@ -68,25 +83,7 @@ func TestBaseApp_BlockGas(t *testing.T) {
|
||||
err error
|
||||
)
|
||||
|
||||
appConfig := depinject.Configs(makeTestConfig(),
|
||||
depinject.ProvideInModule(banktypes.ModuleName,
|
||||
func(_ *bankmodulev1.Module, key *store.KVStoreKey) runtime.BaseAppOption {
|
||||
return func(app *baseapp.BaseApp) {
|
||||
route := (&testdata.TestMsg{}).Route()
|
||||
app.Router().AddRoute(sdk.NewRoute(route, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
||||
_, ok := msg.(*testdata.TestMsg)
|
||||
if !ok {
|
||||
return &sdk.Result{}, fmt.Errorf("Wrong Msg type, expected %T, got %T", (*testdata.TestMsg)(nil), msg)
|
||||
}
|
||||
ctx.KVStore(key).Set([]byte("ok"), []byte("ok"))
|
||||
ctx.GasMeter().ConsumeGas(tc.gasToConsume, "TestMsg")
|
||||
if tc.panicTx {
|
||||
panic("panic in tx execution")
|
||||
}
|
||||
return &sdk.Result{}, nil
|
||||
}))
|
||||
}
|
||||
}))
|
||||
appConfig := depinject.Configs(makeTestConfig())
|
||||
|
||||
err = depinject.Inject(appConfig,
|
||||
&bankKeeper,
|
||||
@ -105,9 +102,13 @@ func TestBaseApp_BlockGas(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
interfaceRegistry.RegisterImplementations((*sdk.Msg)(nil),
|
||||
&testdata.TestMsg{},
|
||||
)
|
||||
baseapptestutil.RegisterInterfaces(interfaceRegistry)
|
||||
baseapptestutil.RegisterKeyValueServer(bapp.MsgServiceRouter(), BlockGasImpl{
|
||||
panicTx: tc.panicTx,
|
||||
gasToConsume: tc.gasToConsume,
|
||||
key: bapp.UnsafeFindStoreKey(banktypes.ModuleName),
|
||||
})
|
||||
|
||||
genState := GenesisStateWithSingleValidator(t, cdc, appBuilder)
|
||||
stateBytes, err := tmjson.MarshalIndent(genState, "", " ")
|
||||
require.NoError(t, err)
|
||||
@ -134,7 +135,11 @@ func TestBaseApp_BlockGas(t *testing.T) {
|
||||
require.Equal(t, uint64(0), seq)
|
||||
|
||||
// msg and signatures
|
||||
msg := testdata.NewTestMsg(addr1)
|
||||
msg := &baseapptestutil.MsgKeyValue{
|
||||
Key: []byte("ok"),
|
||||
Value: []byte("ok"),
|
||||
Signer: addr1.String(),
|
||||
}
|
||||
|
||||
txBuilder := txConfig.NewTxBuilder()
|
||||
|
||||
@ -166,7 +171,7 @@ func TestBaseApp_BlockGas(t *testing.T) {
|
||||
require.Equal(t, []byte("ok"), okValue)
|
||||
}
|
||||
// check block gas is always consumed
|
||||
baseGas := uint64(52744) // baseGas is the gas consumed before tx msg
|
||||
baseGas := uint64(52864) // baseGas is the gas consumed before tx msg
|
||||
expGasConsumed := addUint64Saturating(tc.gasToConsume, baseGas)
|
||||
if expGasConsumed > txtypes.MaxGasWanted {
|
||||
// capped by gasLimit
|
||||
|
||||
2186
baseapp/deliver_tx_test.go
Normal file
2186
baseapp/deliver_tx_test.go
Normal file
File diff suppressed because it is too large
Load Diff
@ -200,14 +200,6 @@ func (app *BaseApp) SetStoreLoader(loader StoreLoader) {
|
||||
app.storeLoader = loader
|
||||
}
|
||||
|
||||
// SetRouter allows us to customize the router.
|
||||
func (app *BaseApp) SetRouter(router sdk.Router) {
|
||||
if app.sealed {
|
||||
panic("SetRouter() on sealed BaseApp")
|
||||
}
|
||||
app.router = router
|
||||
}
|
||||
|
||||
// SetSnapshot sets the snapshot store and options.
|
||||
func (app *BaseApp) SetSnapshot(snapshotStore *snapshots.Store, opts snapshottypes.SnapshotOptions) {
|
||||
if app.sealed {
|
||||
|
||||
@ -1,41 +0,0 @@
|
||||
package baseapp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
type Router struct {
|
||||
routes map[string]sdk.Handler
|
||||
}
|
||||
|
||||
var _ sdk.Router = NewRouter()
|
||||
|
||||
// NewRouter returns a reference to a new router.
|
||||
func NewRouter() *Router {
|
||||
return &Router{
|
||||
routes: make(map[string]sdk.Handler),
|
||||
}
|
||||
}
|
||||
|
||||
// AddRoute adds a route path to the router with a given handler. The route must
|
||||
// be alphanumeric.
|
||||
func (rtr *Router) AddRoute(route sdk.Route) sdk.Router {
|
||||
if !sdk.IsAlphaNumeric(route.Path()) {
|
||||
panic("route expressions can only contain alphanumeric characters")
|
||||
}
|
||||
if rtr.routes[route.Path()] != nil {
|
||||
panic(fmt.Sprintf("route %s has already been initialized", route.Path()))
|
||||
}
|
||||
|
||||
rtr.routes[route.Path()] = route.Handler()
|
||||
return rtr
|
||||
}
|
||||
|
||||
// Route returns a handler for a given route path.
|
||||
//
|
||||
// TODO: Handle expressive matches.
|
||||
func (rtr *Router) Route(_ sdk.Context, path string) sdk.Handler {
|
||||
return rtr.routes[path]
|
||||
}
|
||||
@ -1,31 +0,0 @@
|
||||
package baseapp
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
var testHandler = func(_ sdk.Context, _ sdk.Msg) (*sdk.Result, error) {
|
||||
return &sdk.Result{}, nil
|
||||
}
|
||||
|
||||
func TestRouter(t *testing.T) {
|
||||
rtr := NewRouter()
|
||||
|
||||
// require panic on invalid route
|
||||
require.Panics(t, func() {
|
||||
rtr.AddRoute(sdk.NewRoute("*", testHandler))
|
||||
})
|
||||
|
||||
rtr.AddRoute(sdk.NewRoute("testRoute", testHandler))
|
||||
h := rtr.Route(sdk.Context{}, "testRoute")
|
||||
require.NotNil(t, h)
|
||||
|
||||
// require panic on duplicate route
|
||||
require.Panics(t, func() {
|
||||
rtr.AddRoute(sdk.NewRoute("testRoute", testHandler))
|
||||
})
|
||||
}
|
||||
5
baseapp/testutil/buf.gen.yaml
Normal file
5
baseapp/testutil/buf.gen.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
version: v1
|
||||
plugins:
|
||||
- name: gocosmos
|
||||
out: ../..
|
||||
opt: plugins=grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types
|
||||
17
baseapp/testutil/buf.lock
Normal file
17
baseapp/testutil/buf.lock
Normal file
@ -0,0 +1,17 @@
|
||||
# Generated by buf. DO NOT EDIT.
|
||||
version: v1
|
||||
deps:
|
||||
- remote: buf.build
|
||||
owner: cosmos
|
||||
repository: cosmos-proto
|
||||
branch: main
|
||||
commit: 9e9a53f8db0d493f8b8c66d458c767c1
|
||||
digest: b1-6w7Hozd_Oo_yZ1Sku8Nhz9qou-4licLr6VmEyeI9jO4=
|
||||
create_time: 2021-12-02T20:41:47.795828Z
|
||||
- remote: buf.build
|
||||
owner: cosmos
|
||||
repository: gogo-proto
|
||||
branch: main
|
||||
commit: bee5511075b7499da6178d9e4aaa628b
|
||||
digest: b1-rrBIustouD-S80cVoZ_rM0qJsmei9AgbXy9GPQu6vxg=
|
||||
create_time: 2021-12-02T20:01:17.069307Z
|
||||
4
baseapp/testutil/buf.yaml
Normal file
4
baseapp/testutil/buf.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
version: v1
|
||||
deps:
|
||||
- buf.build/cosmos/gogo-proto
|
||||
- buf.build/cosmos/cosmos-proto
|
||||
56
baseapp/testutil/messages.go
Normal file
56
baseapp/testutil/messages.go
Normal file
@ -0,0 +1,56 @@
|
||||
package testutil
|
||||
|
||||
import (
|
||||
"github.com/cosmos/cosmos-sdk/codec/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
"github.com/cosmos/cosmos-sdk/types/msgservice"
|
||||
)
|
||||
|
||||
func RegisterInterfaces(registry types.InterfaceRegistry) {
|
||||
registry.RegisterImplementations(
|
||||
(*sdk.Msg)(nil),
|
||||
&MsgCounter{},
|
||||
&MsgCounter2{},
|
||||
&MsgKeyValue{},
|
||||
)
|
||||
msgservice.RegisterMsgServiceDesc(registry, &_Counter_serviceDesc)
|
||||
msgservice.RegisterMsgServiceDesc(registry, &_Counter2_serviceDesc)
|
||||
msgservice.RegisterMsgServiceDesc(registry, &_KeyValue_serviceDesc)
|
||||
}
|
||||
|
||||
var _ sdk.Msg = &MsgCounter{}
|
||||
|
||||
func (msg *MsgCounter) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{} }
|
||||
func (msg *MsgCounter) ValidateBasic() error {
|
||||
if msg.Counter >= 0 {
|
||||
return nil
|
||||
}
|
||||
return sdkerrors.Wrap(sdkerrors.ErrInvalidSequence, "counter should be a non-negative integer")
|
||||
}
|
||||
|
||||
var _ sdk.Msg = &MsgCounter2{}
|
||||
|
||||
func (msg *MsgCounter2) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{} }
|
||||
func (msg *MsgCounter2) ValidateBasic() error {
|
||||
if msg.Counter >= 0 {
|
||||
return nil
|
||||
}
|
||||
return sdkerrors.Wrap(sdkerrors.ErrInvalidSequence, "counter should be a non-negative integer")
|
||||
}
|
||||
|
||||
var _ sdk.Msg = &MsgKeyValue{}
|
||||
|
||||
func (msg *MsgKeyValue) GetSigners() []sdk.AccAddress {
|
||||
return []sdk.AccAddress{sdk.MustAccAddressFromBech32(msg.Signer)}
|
||||
}
|
||||
|
||||
func (msg *MsgKeyValue) ValidateBasic() error {
|
||||
if msg.Key == nil {
|
||||
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "key cannot be nil")
|
||||
}
|
||||
if msg.Value == nil {
|
||||
return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "value cannot be nil")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
1293
baseapp/testutil/messages.pb.go
Normal file
1293
baseapp/testutil/messages.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
39
baseapp/testutil/messages.proto
Normal file
39
baseapp/testutil/messages.proto
Normal file
@ -0,0 +1,39 @@
|
||||
syntax = "proto3";
|
||||
package testdata;
|
||||
|
||||
import "gogoproto/gogo.proto";
|
||||
import "google/protobuf/any.proto";
|
||||
|
||||
option go_package = "github.com/cosmos/cosmos-sdk/baseapp/testutil";
|
||||
|
||||
message MsgCounter {
|
||||
int64 counter = 1;
|
||||
bool fail_on_handler = 2;
|
||||
}
|
||||
|
||||
message MsgCounter2 {
|
||||
int64 counter = 1;
|
||||
bool fail_on_handler = 2;
|
||||
}
|
||||
|
||||
message MsgCreateCounterResponse {}
|
||||
|
||||
message MsgKeyValue {
|
||||
bytes key = 1;
|
||||
bytes value = 2;
|
||||
string signer = 3;
|
||||
}
|
||||
|
||||
message MsgCreateKeyValueResponse {}
|
||||
|
||||
service Counter {
|
||||
rpc IncrementCounter(MsgCounter) returns (MsgCreateCounterResponse);
|
||||
}
|
||||
|
||||
service Counter2 {
|
||||
rpc IncrementCounter(MsgCounter2) returns (MsgCreateCounterResponse);
|
||||
}
|
||||
|
||||
service KeyValue {
|
||||
rpc Set(MsgKeyValue) returns (MsgCreateKeyValueResponse);
|
||||
}
|
||||
@ -2,11 +2,11 @@
|
||||
package testpb
|
||||
|
||||
import (
|
||||
v1beta11 "cosmossdk.io/api/cosmos/base/query/v1beta1"
|
||||
v1beta1 "cosmossdk.io/api/cosmos/base/v1beta1"
|
||||
fmt "fmt"
|
||||
_ "github.com/cosmos/cosmos-proto"
|
||||
runtime "github.com/cosmos/cosmos-proto/runtime"
|
||||
v1beta11 "cosmossdk.io/api/cosmos/base/query/v1beta1"
|
||||
v1beta1 "cosmossdk.io/api/cosmos/base/v1beta1"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoiface "google.golang.org/protobuf/runtime/protoiface"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
|
||||
@ -35,6 +35,9 @@ cd ..
|
||||
# generate codec/testdata proto code
|
||||
(cd testutil/testdata; buf generate)
|
||||
|
||||
# generate baseapp test messages
|
||||
(cd baseapp/testutil; buf generate)
|
||||
|
||||
# move proto files to the right places
|
||||
cp -r github.com/cosmos/cosmos-sdk/* ./
|
||||
rm -rf github.com
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package mock
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
@ -8,12 +9,14 @@ import (
|
||||
|
||||
"github.com/tendermint/tendermint/types"
|
||||
db "github.com/tendermint/tm-db"
|
||||
"google.golang.org/grpc"
|
||||
|
||||
abci "github.com/tendermint/tendermint/abci/types"
|
||||
"github.com/tendermint/tendermint/libs/log"
|
||||
|
||||
bam "github.com/cosmos/cosmos-sdk/baseapp"
|
||||
"github.com/cosmos/cosmos-sdk/codec"
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
@ -38,8 +41,23 @@ func NewApp(rootDir string, logger log.Logger) (abci.Application, error) {
|
||||
|
||||
baseApp.SetInitChainer(InitChainer(capKeyMainStore))
|
||||
|
||||
// Set a Route.
|
||||
baseApp.Router().AddRoute(sdk.NewRoute("kvstore", KVStoreHandler(capKeyMainStore)))
|
||||
interfaceRegistry := codectypes.NewInterfaceRegistry()
|
||||
interfaceRegistry.RegisterImplementations((*sdk.Msg)(nil), &kvstoreTx{})
|
||||
router := bam.NewMsgServiceRouter()
|
||||
router.SetInterfaceRegistry(interfaceRegistry)
|
||||
|
||||
newDesc := &grpc.ServiceDesc{
|
||||
ServiceName: "test",
|
||||
Methods: []grpc.MethodDesc{
|
||||
{
|
||||
MethodName: "Test",
|
||||
Handler: _Msg_Test_Handler,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
router.RegisterService(newDesc, &MsgServerImpl{capKeyMainStore})
|
||||
baseApp.SetMsgServiceRouter(router)
|
||||
|
||||
// Load latest version.
|
||||
if err := baseApp.LoadLatestVersion(); err != nil {
|
||||
@ -53,7 +71,7 @@ func NewApp(rootDir string, logger log.Logger) (abci.Application, error) {
|
||||
// them to the db
|
||||
func KVStoreHandler(storeKey storetypes.StoreKey) sdk.Handler {
|
||||
return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
||||
dTx, ok := msg.(kvstoreTx)
|
||||
dTx, ok := msg.(*kvstoreTx)
|
||||
if !ok {
|
||||
return nil, errors.New("KVStoreHandler should only receive kvstoreTx")
|
||||
}
|
||||
@ -126,3 +144,34 @@ func AppGenStateEmpty(_ *codec.LegacyAmino, _ types.GenesisDoc, _ []json.RawMess
|
||||
appState = json.RawMessage(``)
|
||||
return
|
||||
}
|
||||
|
||||
// Manually write the handlers for this custom message
|
||||
type MsgServer interface {
|
||||
Test(ctx context.Context, msg *kvstoreTx) (*sdk.Result, error)
|
||||
}
|
||||
|
||||
type MsgServerImpl struct {
|
||||
capKeyMainStore *storetypes.KVStoreKey
|
||||
}
|
||||
|
||||
func _Msg_Test_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(kvstoreTx)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(MsgServer).Test(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/kvstoreTx",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(MsgServer).Test(ctx, req.(*kvstoreTx))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func (m MsgServerImpl) Test(ctx context.Context, msg *kvstoreTx) (*sdk.Result, error) {
|
||||
return KVStoreHandler(m.capKeyMainStore)(sdk.UnwrapSDKContext(ctx), msg)
|
||||
}
|
||||
|
||||
@ -16,50 +16,42 @@ type kvstoreTx struct {
|
||||
}
|
||||
|
||||
// dummy implementation of proto.Message
|
||||
func (msg kvstoreTx) Reset() {}
|
||||
func (msg kvstoreTx) String() string { return "TODO" }
|
||||
func (msg kvstoreTx) ProtoMessage() {}
|
||||
func (msg *kvstoreTx) Reset() {}
|
||||
func (msg *kvstoreTx) String() string { return "TODO" }
|
||||
func (msg *kvstoreTx) ProtoMessage() {}
|
||||
|
||||
var (
|
||||
_ sdk.Tx = kvstoreTx{}
|
||||
_ sdk.Msg = kvstoreTx{}
|
||||
_ sdk.Tx = &kvstoreTx{}
|
||||
_ sdk.Msg = &kvstoreTx{}
|
||||
)
|
||||
|
||||
func NewTx(key, value string) kvstoreTx {
|
||||
func NewTx(key, value string) *kvstoreTx {
|
||||
bytes := fmt.Sprintf("%s=%s", key, value)
|
||||
return kvstoreTx{
|
||||
return &kvstoreTx{
|
||||
key: []byte(key),
|
||||
value: []byte(value),
|
||||
bytes: []byte(bytes),
|
||||
}
|
||||
}
|
||||
|
||||
func (tx kvstoreTx) Route() string {
|
||||
return "kvstore"
|
||||
}
|
||||
|
||||
func (tx kvstoreTx) Type() string {
|
||||
func (tx *kvstoreTx) Type() string {
|
||||
return "kvstore_tx"
|
||||
}
|
||||
|
||||
func (tx kvstoreTx) GetMsgs() []sdk.Msg {
|
||||
func (tx *kvstoreTx) GetMsgs() []sdk.Msg {
|
||||
return []sdk.Msg{tx}
|
||||
}
|
||||
|
||||
func (tx kvstoreTx) GetMemo() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (tx kvstoreTx) GetSignBytes() []byte {
|
||||
func (tx *kvstoreTx) GetSignBytes() []byte {
|
||||
return tx.bytes
|
||||
}
|
||||
|
||||
// Should the app be calling this? Or only handlers?
|
||||
func (tx kvstoreTx) ValidateBasic() error {
|
||||
func (tx *kvstoreTx) ValidateBasic() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (tx kvstoreTx) GetSigners() []sdk.AccAddress {
|
||||
func (tx *kvstoreTx) GetSigners() []sdk.AccAddress {
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -71,10 +63,10 @@ func decodeTx(txBytes []byte) (sdk.Tx, error) {
|
||||
split := bytes.Split(txBytes, []byte("="))
|
||||
if len(split) == 1 { //nolint:gocritic
|
||||
k := split[0]
|
||||
tx = kvstoreTx{k, k, txBytes}
|
||||
tx = &kvstoreTx{k, k, txBytes}
|
||||
} else if len(split) == 2 {
|
||||
k, v := split[0], split[1]
|
||||
tx = kvstoreTx{k, v, txBytes}
|
||||
tx = &kvstoreTx{k, v, txBytes}
|
||||
} else {
|
||||
return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, "too many '='")
|
||||
}
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
package cachekv
|
||||
|
||||
import (
|
||||
db "github.com/tendermint/tm-db"
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
db "github.com/tendermint/tm-db"
|
||||
)
|
||||
|
||||
func BenchmarkLargeUnsortedMisses(b *testing.B) {
|
||||
|
||||
@ -59,7 +59,6 @@ type GenTxTestSuite struct {
|
||||
}
|
||||
|
||||
func (suite *GenTxTestSuite) SetupTest() {
|
||||
|
||||
encCfg := moduletestutil.TestEncodingConfig{}
|
||||
|
||||
app, err := simtestutil.SetupWithConfiguration(
|
||||
|
||||
@ -11,57 +11,6 @@ import (
|
||||
gomock "github.com/golang/mock/gomock"
|
||||
)
|
||||
|
||||
// MockRouter is a mock of Router interface.
|
||||
type MockRouter struct {
|
||||
ctrl *gomock.Controller
|
||||
recorder *MockRouterMockRecorder
|
||||
}
|
||||
|
||||
// MockRouterMockRecorder is the mock recorder for MockRouter.
|
||||
type MockRouterMockRecorder struct {
|
||||
mock *MockRouter
|
||||
}
|
||||
|
||||
// NewMockRouter creates a new mock instance.
|
||||
func NewMockRouter(ctrl *gomock.Controller) *MockRouter {
|
||||
mock := &MockRouter{ctrl: ctrl}
|
||||
mock.recorder = &MockRouterMockRecorder{mock}
|
||||
return mock
|
||||
}
|
||||
|
||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||
func (m *MockRouter) EXPECT() *MockRouterMockRecorder {
|
||||
return m.recorder
|
||||
}
|
||||
|
||||
// AddRoute mocks base method.
|
||||
func (m *MockRouter) AddRoute(r types.Route) types.Router {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "AddRoute", r)
|
||||
ret0, _ := ret[0].(types.Router)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// AddRoute indicates an expected call of AddRoute.
|
||||
func (mr *MockRouterMockRecorder) AddRoute(r interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRoute", reflect.TypeOf((*MockRouter)(nil).AddRoute), r)
|
||||
}
|
||||
|
||||
// Route mocks base method.
|
||||
func (m *MockRouter) Route(ctx types.Context, path string) types.Handler {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "Route", ctx, path)
|
||||
ret0, _ := ret[0].(types.Handler)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// Route indicates an expected call of Route.
|
||||
func (mr *MockRouterMockRecorder) Route(ctx, path interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Route", reflect.TypeOf((*MockRouter)(nil).Route), ctx, path)
|
||||
}
|
||||
|
||||
// MockQueryRouter is a mock of QueryRouter interface.
|
||||
type MockQueryRouter struct {
|
||||
ctrl *gomock.Controller
|
||||
|
||||
@ -189,9 +189,6 @@ func NewGenesisOnlyAppModule(amg AppModuleGenesis) AppModule {
|
||||
// RegisterInvariants is a placeholder function register no invariants
|
||||
func (GenesisOnlyAppModule) RegisterInvariants(_ sdk.InvariantRegistry) {}
|
||||
|
||||
// Route empty module message route
|
||||
func (GenesisOnlyAppModule) Route() sdk.Route { return sdk.Route{} }
|
||||
|
||||
// QuerierRoute returns an empty module querier route
|
||||
func (GenesisOnlyAppModule) QuerierRoute() string { return "" }
|
||||
|
||||
|
||||
@ -2,7 +2,6 @@ package types
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -27,37 +26,6 @@ var (
|
||||
IsNumeric = regexp.MustCompile(`^[0-9]+$`).MatchString
|
||||
)
|
||||
|
||||
// Router provides handlers for each transaction type.
|
||||
type Router interface {
|
||||
AddRoute(r Route) Router
|
||||
Route(ctx Context, path string) Handler
|
||||
}
|
||||
|
||||
type Route struct {
|
||||
path string
|
||||
handler Handler
|
||||
}
|
||||
|
||||
// NewRoute returns an instance of Route.
|
||||
func NewRoute(p string, h Handler) Route {
|
||||
return Route{path: strings.TrimSpace(p), handler: h}
|
||||
}
|
||||
|
||||
// Path returns the path the route has assigned.
|
||||
func (r Route) Path() string {
|
||||
return r.path
|
||||
}
|
||||
|
||||
// Handler returns the handler that handles the route.
|
||||
func (r Route) Handler() Handler {
|
||||
return r.handler
|
||||
}
|
||||
|
||||
// Empty returns true only if both handler and path are not empty.
|
||||
func (r Route) Empty() bool {
|
||||
return r.handler == nil || r.path == ""
|
||||
}
|
||||
|
||||
// QueryRouter provides queryables for each query path.
|
||||
type QueryRouter interface {
|
||||
AddRoute(r string, h Querier) QueryRouter
|
||||
|
||||
@ -1,58 +0,0 @@
|
||||
package types_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/suite"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
type routeTestSuite struct {
|
||||
suite.Suite
|
||||
}
|
||||
|
||||
func TestRouteTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(routeTestSuite))
|
||||
}
|
||||
|
||||
func (s *routeTestSuite) SetupSuite() {
|
||||
s.T().Parallel()
|
||||
}
|
||||
|
||||
func (s *routeTestSuite) TestNilRoute() {
|
||||
tests := []struct {
|
||||
name string
|
||||
route sdk.Route
|
||||
expected bool
|
||||
}{
|
||||
{
|
||||
name: "all empty",
|
||||
route: sdk.NewRoute("", nil),
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "only path",
|
||||
route: sdk.NewRoute("some", nil),
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "only handler",
|
||||
route: sdk.NewRoute("", func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
||||
return nil, nil
|
||||
}),
|
||||
expected: true,
|
||||
},
|
||||
{
|
||||
name: "correct route",
|
||||
route: sdk.NewRoute("some", func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
||||
return nil, nil
|
||||
}),
|
||||
expected: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
s.Require().Equal(tt.expected, tt.route.Empty())
|
||||
}
|
||||
}
|
||||
@ -30,7 +30,8 @@ func genSequenceOfTxs(txGen client.TxConfig,
|
||||
accNums []uint64,
|
||||
initSeqNums []uint64,
|
||||
numToGenerate int,
|
||||
priv ...cryptotypes.PrivKey) ([]sdk.Tx, error) {
|
||||
priv ...cryptotypes.PrivKey,
|
||||
) ([]sdk.Tx, error) {
|
||||
txs := make([]sdk.Tx, numToGenerate)
|
||||
var err error
|
||||
for i := 0; i < numToGenerate; i++ {
|
||||
@ -58,7 +59,7 @@ func genSequenceOfTxs(txGen client.TxConfig,
|
||||
}
|
||||
|
||||
func BenchmarkOneBankSendTxPerBlock(b *testing.B) {
|
||||
//b.Skip("Skipping benchmark with buggy code reported at https://github.com/cosmos/cosmos-sdk/issues/10023")
|
||||
// b.Skip("Skipping benchmark with buggy code reported at https://github.com/cosmos/cosmos-sdk/issues/10023")
|
||||
|
||||
b.ReportAllocs()
|
||||
// Add an account at genesis
|
||||
@ -103,7 +104,7 @@ func BenchmarkOneBankSendTxPerBlock(b *testing.B) {
|
||||
}
|
||||
|
||||
func BenchmarkOneBankMultiSendTxPerBlock(b *testing.B) {
|
||||
//b.Skip("Skipping benchmark with buggy code reported at https://github.com/cosmos/cosmos-sdk/issues/10023")
|
||||
// b.Skip("Skipping benchmark with buggy code reported at https://github.com/cosmos/cosmos-sdk/issues/10023")
|
||||
|
||||
b.ReportAllocs()
|
||||
// Add an account at genesis
|
||||
|
||||
@ -36,7 +36,6 @@ type SimTestSuite struct {
|
||||
}
|
||||
|
||||
func (suite *SimTestSuite) SetupTest() {
|
||||
|
||||
var (
|
||||
appBuilder *runtime.AppBuilder
|
||||
err error
|
||||
|
||||
@ -467,7 +467,6 @@ func TestWithdrawDelegationRewardsBasic(t *testing.T) {
|
||||
bankKeeper.EXPECT().SendCoinsFromModuleToAccount(ctx, disttypes.ModuleName, addr, expCommission)
|
||||
_, err = distrKeeper.WithdrawValidatorCommission(ctx, valAddr)
|
||||
require.Nil(t, err)
|
||||
|
||||
}
|
||||
|
||||
func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) {
|
||||
|
||||
@ -1,9 +1,14 @@
|
||||
package genutil_test
|
||||
|
||||
import (
|
||||
"cosmossdk.io/math"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"cosmossdk.io/math"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
|
||||
"github.com/cosmos/cosmos-sdk/testutil"
|
||||
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
|
||||
@ -19,9 +24,6 @@ import (
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/stretchr/testify/suite"
|
||||
abci "github.com/tendermint/tendermint/abci/types"
|
||||
"math/rand"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -90,7 +92,6 @@ func (suite *GenTxTestSuite) setAccountBalance(balances []banktypes.Balance) jso
|
||||
}
|
||||
for _, balance := range balances {
|
||||
bankGenesisState.Balances = append(bankGenesisState.Balances, balance)
|
||||
|
||||
}
|
||||
for _, balance := range bankGenesisState.Balances {
|
||||
bankGenesisState.Supply.Add(balance.Coins...)
|
||||
@ -261,7 +262,6 @@ func (suite *GenTxTestSuite) TestDeliverGenTxs() {
|
||||
genTxs[0] = tx
|
||||
},
|
||||
func(_ abci.RequestDeliverTx) abci.ResponseDeliverTx {
|
||||
|
||||
return abci.ResponseDeliverTx{
|
||||
Code: sdkerrors.ErrNoSignatures.ABCICode(),
|
||||
GasWanted: int64(10000000),
|
||||
|
||||
@ -10,7 +10,7 @@ import (
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
|
||||
"github.com/cosmos/cosmos-sdk/x/gov"
|
||||
v1gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1"
|
||||
v1gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1"
|
||||
v3gov "github.com/cosmos/cosmos-sdk/x/gov/migrations/v3"
|
||||
v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
|
||||
"github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user