Skip to content

Commit cd78376

Browse files
alpepinosu
andauthored
Add system tests for chain upgrade (#1643)
* Start chain upgrade tests * Fix stakeunstake test * Make test pass * Better stop chain * Test chain upgrade * Set upgrade handler order * Fix app for chain upgrade * Minor cleanup * Check contract state * Updates * Gov constitution migration will be handled by the sdk * Deactivate upgrade test * Helper * Better upgrade structure an minor updates (cherry picked from commit 32a01da) * Updates * Gci formatting * Updates * Testnet commit timeout * Update * Store artifacts on system test failure * Better circleci setup * Artifact path * x * Fix upgrade * Generic upgrade handler * Fix imports * Update tests/system/cli.go Co-authored-by: pinosu <[email protected]> --------- Co-authored-by: Pino' Surace <[email protected]> Co-authored-by: pinosu <[email protected]>
1 parent 96867a3 commit cd78376

File tree

21 files changed

+632
-155
lines changed

21 files changed

+632
-155
lines changed

.circleci/config.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ jobs:
112112
- run:
113113
name: Build and run system tests
114114
command: make test-system
115+
- run:
116+
command: |
117+
mkdir -p /tmp/system-test-workspace
118+
mv /home/circleci/project/tests/system/testnet /tmp/system-test-workspace
119+
when: on_fail
120+
- store_artifacts:
121+
path: /tmp/system-test-workspace
115122

116123
benchmark:
117124
executor: golang

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ test-system: install
161161
format-tools:
162162
go install mvdan.cc/[email protected]
163163
go install github.com/client9/misspell/cmd/[email protected]
164-
go install golang.org/x/tools/cmd/goimports@latest
164+
go install github.com/daixiang0/[email protected]
165165

166166
lint: format-tools
167167
golangci-lint run --tests=false
@@ -170,7 +170,7 @@ lint: format-tools
170170
format: format-tools
171171
find . -name '*.go' -type f -not -path "./vendor*" -not -path "./tests/system/vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs gofumpt -w
172172
find . -name '*.go' -type f -not -path "./vendor*" -not -path "./tests/system/vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs misspell -w
173-
find . -name '*.go' -type f -not -path "./vendor*" -not -path "./tests/system/vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs goimports -w -local github.com/CosmWasm/wasmd
173+
find . -name '*.go' -type f -not -path "./vendor*" -not -path "./tests/system/vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs gci write --skip-generated -s standard -s default -s "prefix(cosmossdk.io)" -s "prefix(github.com/cosmos/cosmos-sdk)" -s "prefix(github.com/CosmWasm/wasmd)" --custom-order
174174

175175

176176
###############################################################################

app/app.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,7 @@ func NewWasmApp(
842842

843843
// initialize BaseApp
844844
app.SetInitChainer(app.InitChainer)
845+
app.SetPreBlocker(app.PreBlocker)
845846
app.SetBeginBlocker(app.BeginBlocker)
846847
app.SetEndBlocker(app.EndBlocker)
847848
app.setAnteHandler(txConfig, wasmConfig, keys[wasmtypes.StoreKey])
@@ -949,6 +950,11 @@ func (app *WasmApp) setPostHandler() {
949950
// Name returns the name of the App
950951
func (app *WasmApp) Name() string { return app.BaseApp.Name() }
951952

953+
// PreBlocker application updates every pre block
954+
func (app *WasmApp) PreBlocker(ctx sdk.Context, _ *abci.RequestFinalizeBlock) (*sdk.ResponsePreBlock, error) {
955+
return app.ModuleManager.PreBlock(ctx)
956+
}
957+
952958
// BeginBlocker application updates every begin block
953959
func (app *WasmApp) BeginBlocker(ctx sdk.Context) (sdk.BeginBlock, error) {
954960
return app.ModuleManager.BeginBlock(ctx)
@@ -1164,6 +1170,5 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino
11641170
paramsKeeper.Subspace(icahosttypes.SubModuleName)
11651171
paramsKeeper.Subspace(icacontrollertypes.SubModuleName)
11661172
paramsKeeper.Subspace(wasmtypes.ModuleName)
1167-
11681173
return paramsKeeper
11691174
}

app/upgrades.go

Lines changed: 72 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,90 @@
11
package app
22

33
import (
4-
"context"
4+
"fmt"
5+
6+
icacontrollertypes "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/controller/types"
7+
icahosttypes "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/host/types"
8+
ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types"
9+
ibcclienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" //nolint:staticcheck
10+
ibcconnectiontypes "github.com/cosmos/ibc-go/v8/modules/core/03-connection/types"
11+
ibcexported "github.com/cosmos/ibc-go/v8/modules/core/exported"
512

6-
storetypes "cosmossdk.io/store/types"
713
upgradetypes "cosmossdk.io/x/upgrade/types"
814

9-
"github.com/cosmos/cosmos-sdk/types/module"
15+
paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
16+
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
17+
18+
"github.com/CosmWasm/wasmd/app/upgrades"
19+
"github.com/CosmWasm/wasmd/app/upgrades/noop"
20+
v050 "github.com/CosmWasm/wasmd/app/upgrades/v050"
1021
)
1122

12-
// UpgradeName defines the on-chain upgrade name for the sample SimApp upgrade
13-
// from v047 to v050.
14-
//
15-
// NOTE: This upgrade defines a reference implementation of what an upgrade
16-
// could look like when an application is migrating from Cosmos SDK version
17-
// v0.47.x to v0.50.x.
18-
const UpgradeName = "v047-to-v050"
23+
// Upgrades list of chain upgrades
24+
var Upgrades = []upgrades.Upgrade{v050.Upgrade}
1925

26+
// RegisterUpgradeHandlers registers the chain upgrade handlers
2027
func (app WasmApp) RegisterUpgradeHandlers() {
21-
app.UpgradeKeeper.SetUpgradeHandler(
22-
UpgradeName,
23-
func(ctx context.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
24-
return app.ModuleManager.RunMigrations(ctx, app.Configurator(), fromVM)
25-
},
26-
)
28+
setupLegacyKeyTables(app.ParamsKeeper)
29+
if len(Upgrades) == 0 {
30+
// always have a unique upgrade registered for the current version to test in system tests
31+
Upgrades = append(Upgrades, noop.NewUpgrade(app.Version()))
32+
}
33+
34+
keepers := upgrades.AppKeepers{AccountKeeper: app.AccountKeeper}
35+
// register all upgrade handlers
36+
for _, upgrade := range Upgrades {
37+
app.UpgradeKeeper.SetUpgradeHandler(
38+
upgrade.UpgradeName,
39+
upgrade.CreateUpgradeHandler(
40+
app.ModuleManager,
41+
app.configurator,
42+
&keepers,
43+
),
44+
)
45+
}
2746

2847
upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk()
2948
if err != nil {
30-
panic(err)
49+
panic(fmt.Sprintf("failed to read upgrade info from disk %s", err))
3150
}
3251

33-
if upgradeInfo.Name == UpgradeName && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
34-
storeUpgrades := storetypes.StoreUpgrades{}
52+
if app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
53+
return
54+
}
55+
56+
// register store loader for current upgrade
57+
for _, upgrade := range Upgrades {
58+
if upgradeInfo.Name == upgrade.UpgradeName {
59+
app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &upgrade.StoreUpgrades)) // nolint:gosec
60+
break
61+
}
62+
}
63+
}
64+
65+
func setupLegacyKeyTables(k paramskeeper.Keeper) {
66+
// Set param key table for params module migration
67+
for _, subspace := range k.GetSubspaces() {
68+
subspace := subspace
69+
70+
var keyTable paramstypes.KeyTable
71+
switch subspace.Name() {
72+
// ibc types
73+
case ibcexported.ModuleName:
74+
keyTable = ibcclienttypes.ParamKeyTable()
75+
keyTable.RegisterParamSet(&ibcconnectiontypes.Params{})
76+
case ibctransfertypes.ModuleName:
77+
keyTable = ibctransfertypes.ParamKeyTable()
78+
case icahosttypes.SubModuleName:
79+
keyTable = icahosttypes.ParamKeyTable()
80+
case icacontrollertypes.SubModuleName:
81+
keyTable = icacontrollertypes.ParamKeyTable()
82+
default:
83+
continue
84+
}
3585

36-
// configure store loader that checks if version == upgradeHeight and applies store upgrades
37-
app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
86+
if !subspace.HasKeyTable() {
87+
subspace.WithKeyTable(keyTable)
88+
}
3889
}
3990
}

app/upgrades/noop/upgrades.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package noop
2+
3+
import (
4+
"context"
5+
6+
storetypes "cosmossdk.io/store/types"
7+
upgradetypes "cosmossdk.io/x/upgrade/types"
8+
9+
"github.com/cosmos/cosmos-sdk/types/module"
10+
11+
"github.com/CosmWasm/wasmd/app/upgrades"
12+
)
13+
14+
// NewUpgrade constructor
15+
func NewUpgrade(semver string) upgrades.Upgrade {
16+
return upgrades.Upgrade{
17+
UpgradeName: semver,
18+
CreateUpgradeHandler: CreateUpgradeHandler,
19+
StoreUpgrades: storetypes.StoreUpgrades{
20+
Added: []string{},
21+
Deleted: []string{},
22+
},
23+
}
24+
}
25+
26+
func CreateUpgradeHandler(
27+
mm *module.Manager,
28+
configurator module.Configurator,
29+
ak *upgrades.AppKeepers,
30+
) upgradetypes.UpgradeHandler {
31+
return func(ctx context.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
32+
return mm.RunMigrations(ctx, configurator, fromVM)
33+
}
34+
}

app/upgrades/types.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package upgrades
2+
3+
import (
4+
storetypes "cosmossdk.io/store/types"
5+
upgradetypes "cosmossdk.io/x/upgrade/types"
6+
7+
"github.com/cosmos/cosmos-sdk/types/module"
8+
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
9+
)
10+
11+
type AppKeepers struct {
12+
authkeeper.AccountKeeper
13+
}
14+
15+
// Upgrade defines a struct containing necessary fields that a SoftwareUpgradeProposal
16+
// must have written, in order for the state migration to go smoothly.
17+
// An upgrade must implement this struct, and then set it in the app.go.
18+
// The app.go will then define the handler.
19+
type Upgrade struct {
20+
// Upgrade version name, for the upgrade handler, e.g. `v7`
21+
UpgradeName string
22+
23+
// CreateUpgradeHandler defines the function that creates an upgrade handler
24+
CreateUpgradeHandler func(*module.Manager, module.Configurator, *AppKeepers) upgradetypes.UpgradeHandler
25+
StoreUpgrades storetypes.StoreUpgrades
26+
}

app/upgrades/v050/upgrades.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package v050
2+
3+
import (
4+
"context"
5+
6+
storetypes "cosmossdk.io/store/types"
7+
circuittypes "cosmossdk.io/x/circuit/types"
8+
upgradetypes "cosmossdk.io/x/upgrade/types"
9+
10+
"github.com/cosmos/cosmos-sdk/types/module"
11+
12+
"github.com/CosmWasm/wasmd/app/upgrades"
13+
)
14+
15+
// UpgradeName defines the on-chain upgrade name
16+
const UpgradeName = "v0.50"
17+
18+
var Upgrade = upgrades.Upgrade{
19+
UpgradeName: UpgradeName,
20+
CreateUpgradeHandler: CreateUpgradeHandler,
21+
StoreUpgrades: storetypes.StoreUpgrades{
22+
Added: []string{
23+
circuittypes.ModuleName,
24+
},
25+
Deleted: []string{},
26+
},
27+
}
28+
29+
func CreateUpgradeHandler(
30+
mm *module.Manager,
31+
configurator module.Configurator,
32+
ak *upgrades.AppKeepers,
33+
) upgradetypes.UpgradeHandler {
34+
return func(ctx context.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
35+
return mm.RunMigrations(ctx, configurator, fromVM)
36+
}
37+
}

cmd/wasmd/testnet.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ type startArgs struct {
8282
outputDir string
8383
printMnemonic bool
8484
rpcAddress string
85+
timeoutCommit time.Duration
8586
}
8687

8788
func addTestnetFlagsToCmd(cmd *cobra.Command) {
@@ -159,14 +160,13 @@ Example:
159160
if err != nil {
160161
return err
161162
}
162-
163163
return initTestnetFiles(clientCtx, cmd, config, mbm, genBalIterator, clientCtx.TxConfig.SigningContext().ValidatorAddressCodec(), args)
164164
},
165165
}
166166

167167
addTestnetFlagsToCmd(cmd)
168168
cmd.Flags().String(flagNodeDirPrefix, "node", "Prefix the directory name for each node with (node results in node0, node1, ...)")
169-
cmd.Flags().String(flagNodeDaemonHome, "wasmd", "Home directory of the node's daemon configuration")
169+
cmd.Flags().String(flagNodeDaemonHome, version.AppName, "Home directory of the node's daemon configuration")
170170
cmd.Flags().String(flagStartingIPAddress, "192.168.0.1", "Starting IP address (192.168.0.1 results in persistent peers list [email protected]:46656, [email protected]:46656, ...)")
171171
cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)")
172172
cmd.Flags().Duration(flagCommitTimeout, 5*time.Second, "Time to wait after a block commit before starting on the new height")
@@ -553,6 +553,7 @@ func startTestnet(cmd *cobra.Command, args startArgs) error {
553553
networkConfig.APIAddress = args.apiAddress
554554
networkConfig.GRPCAddress = args.grpcAddress
555555
networkConfig.PrintMnemonic = args.printMnemonic
556+
networkConfig.TimeoutCommit = args.timeoutCommit
556557
networkLogger := network.NewCLILogger(cmd)
557558

558559
baseDir := fmt.Sprintf("%s/%s", args.outputDir, networkConfig.ChainID)

tests/system/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
/testnet
2+
/binaries

tests/system/Makefile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ test:
1010
format:
1111
find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs gofumpt -w
1212
find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs misspell -w
13-
find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs goimports -w -local github.com/CosmWasm/wasmd
14-
13+
find . -name '*.go' -type f -not -path "./vendor*" -not -path "./tests/system/vendor*" -not -path "*.git*" -not -path "./client/lcd/statik/statik.go" | xargs gci write --skip-generated -s standard -s default -s "prefix(cosmossdk.io)" -s "prefix(github.com/cosmos/cosmos-sdk)" -s "prefix(github.com/CosmWasm/wasmd)" --custom-order
1514

1615
.PHONY: all test format

0 commit comments

Comments
 (0)