-
Notifications
You must be signed in to change notification settings - Fork 1
/
upgrades_test.go
145 lines (120 loc) · 3.93 KB
/
upgrades_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package v8_test
import (
"testing"
"time"
"github.com/stretchr/testify/suite"
upgradetypes "cosmossdk.io/x/upgrade/types"
"github.com/cosmos/cosmos-sdk/baseapp"
sdk "github.com/cosmos/cosmos-sdk/types"
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/evmos/ethermint/crypto/ethsecp256k1"
feemarkettypes "github.com/evmos/ethermint/x/feemarket/types"
abci "github.com/cometbft/cometbft/abci/types"
cmtproto "github.com/cometbft/cometbft/proto/tendermint/types"
chain "github.com/Canto-Network/Canto/v7/app"
v8 "github.com/Canto-Network/Canto/v7/app/upgrades/v8"
)
type UpgradeTestSuite struct {
suite.Suite
ctx sdk.Context
app *chain.Canto
consAddress sdk.ConsAddress
}
func (s *UpgradeTestSuite) SetupTest() {
// consensus key
priv, err := ethsecp256k1.GenerateKey()
s.Require().NoError(err)
s.consAddress = sdk.ConsAddress(priv.PubKey().Address())
s.app = chain.Setup(false, feemarkettypes.DefaultGenesisState())
s.ctx = s.app.BaseApp.NewContextLegacy(false, cmtproto.Header{
ChainID: "canto_9001-1",
Height: 1,
Time: time.Date(2023, 5, 9, 8, 0, 0, 0, time.UTC),
ProposerAddress: s.consAddress.Bytes(),
})
// In the upgrade to comsos-sdk v0.47.x, the migration from subspace
// to ParamsStore of the consensus module should be performed. Since
// the upgrade of binaries does not happen in unittest, it is necessary
// to set the required values into subspace to prevent panic.
bz := s.app.AppCodec().MustMarshalJSON(chain.DefaultConsensusParams.Block)
sp, ok := s.app.ParamsKeeper.GetSubspace(baseapp.Paramspace)
s.Require().True(ok)
err = sp.Update(s.ctx, baseapp.ParamStoreKeyBlockParams, bz)
s.Require().NoError(err)
// Set Validator
valAddr := sdk.ValAddress(s.consAddress.Bytes())
validator, err := stakingtypes.NewValidator(valAddr.String(), priv.PubKey(), stakingtypes.Description{})
s.Require().NoError(err)
validator = stakingkeeper.TestingUpdateValidator(s.app.StakingKeeper, s.ctx, validator, true)
valbz, err := s.app.StakingKeeper.ValidatorAddressCodec().StringToBytes(validator.GetOperator())
s.Require().NoError(err)
s.app.StakingKeeper.Hooks().AfterValidatorCreated(s.ctx, valbz)
err = s.app.StakingKeeper.SetValidatorByConsAddr(s.ctx, validator)
s.Require().NoError(err)
}
func TestKeeperTestSuite(t *testing.T) {
suite.Run(t, new(UpgradeTestSuite))
}
const testUpgradeHeight = 10
func (s *UpgradeTestSuite) TestUpgradeV8() {
testCases := []struct {
title string
before func()
after func()
expPass bool
}{
{
"v8 upgrade min_commission_rate",
func() {},
func() {
params, err := s.app.StakingKeeper.GetParams(s.ctx)
s.Require().NoError(err)
s.Require().Equal(v8.MinCommissionRate, params.MinCommissionRate)
},
true,
},
}
for _, tc := range testCases {
s.Run(tc.title, func() {
s.SetupTest()
tc.before()
// proceed with the block until the test upgrade height
for s.ctx.BlockHeight() < testUpgradeHeight {
err := s.Commit()
s.Require().NoError(err)
}
// simulate binary upgrade
plan := upgradetypes.Plan{Name: v8.UpgradeName, Height: testUpgradeHeight}
err := s.app.UpgradeKeeper.ScheduleUpgrade(s.ctx, plan)
s.Require().NoError(err)
_, err = s.app.UpgradeKeeper.GetUpgradePlan(s.ctx)
s.Require().NoError(err)
// execute upgrade handler
err = s.Commit()
s.Require().NoError(err)
tc.after()
})
}
}
func (s *UpgradeTestSuite) Commit() error {
header := s.ctx.BlockHeader()
if _, err := s.app.FinalizeBlock(&abci.RequestFinalizeBlock{
Height: header.Height,
}); err != nil {
return err
}
if _, err := s.app.Commit(); err != nil {
return err
}
header.Height += 1
if _, err := s.app.FinalizeBlock(&abci.RequestFinalizeBlock{
Height: header.Height,
Time: header.Time,
}); err != nil {
return err
}
// update ctx
s.ctx = s.app.BaseApp.NewContextLegacy(false, header)
return nil
}