Skip to content

Commit eb38e0e

Browse files
authored
Merge branch 'main' into sai/fix_12931
2 parents c6654a8 + 07c549b commit eb38e0e

File tree

3 files changed

+524
-0
lines changed

3 files changed

+524
-0
lines changed

scripts/mockgen.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ $mockgen_cmd -source=x/bank/types/expected_keepers.go -package testutil -destina
2222
$mockgen_cmd -source=x/group/testutil/expected_keepers.go -package testutil -destination x/group/testutil/expected_keepers_mocks.go
2323
$mockgen_cmd -source=x/evidence/types/expected_keepers.go -package testutil -destination x/evidence/testutil/expected_keepers_mocks.go
2424
$mockgen_cmd -source=x/slashing/types/expected_keepers.go -package testutil -destination x/slashing/testutil/expected_keepers_mocks.go
25+
$mockgen_cmd -source=x/genutil/types/expected_keepers.go -package testutil -destination x/genutil/testutil/expected_keepers_mocks.go

x/genutil/gentx_test.go

Lines changed: 337 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,337 @@
1+
package genutil_test
2+
3+
import (
4+
"cosmossdk.io/math"
5+
"encoding/json"
6+
"fmt"
7+
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
8+
"github.com/cosmos/cosmos-sdk/testutil"
9+
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
10+
sdk "github.com/cosmos/cosmos-sdk/types"
11+
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
12+
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
13+
14+
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
15+
"github.com/cosmos/cosmos-sdk/x/genutil"
16+
genutiltestutil "github.com/cosmos/cosmos-sdk/x/genutil/testutil"
17+
"github.com/cosmos/cosmos-sdk/x/genutil/types"
18+
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
19+
"github.com/golang/mock/gomock"
20+
"github.com/stretchr/testify/suite"
21+
abci "github.com/tendermint/tendermint/abci/types"
22+
"math/rand"
23+
"testing"
24+
"time"
25+
)
26+
27+
var (
28+
priv1 = secp256k1.GenPrivKey()
29+
priv2 = secp256k1.GenPrivKey()
30+
pk1 = priv1.PubKey()
31+
pk2 = priv2.PubKey()
32+
addr1 = sdk.AccAddress(pk1.Address())
33+
addr2 = sdk.AccAddress(pk2.Address())
34+
desc = stakingtypes.NewDescription("testname", "", "", "", "")
35+
comm = stakingtypes.CommissionRates{}
36+
)
37+
38+
// GenTxTestSuite is a test suite to be used with gentx tests.
39+
type GenTxTestSuite struct {
40+
suite.Suite
41+
42+
ctx sdk.Context
43+
44+
stakingKeeper *genutiltestutil.MockStakingKeeper
45+
encodingConfig moduletestutil.TestEncodingConfig
46+
msg1, msg2 *stakingtypes.MsgCreateValidator
47+
}
48+
49+
func (suite *GenTxTestSuite) SetupTest() {
50+
suite.encodingConfig = moduletestutil.MakeTestEncodingConfig(genutil.AppModuleBasic{})
51+
key := sdk.NewKVStoreKey("a_Store_Key")
52+
tkey := sdk.NewTransientStoreKey("a_transient_store")
53+
suite.ctx = testutil.DefaultContext(key, tkey)
54+
55+
ctrl := gomock.NewController(suite.T())
56+
suite.stakingKeeper = genutiltestutil.NewMockStakingKeeper(ctrl)
57+
58+
stakingtypes.RegisterInterfaces(suite.encodingConfig.InterfaceRegistry)
59+
banktypes.RegisterInterfaces(suite.encodingConfig.InterfaceRegistry)
60+
61+
var err error
62+
amount := sdk.NewInt64Coin(sdk.DefaultBondDenom, 50)
63+
one := math.OneInt()
64+
suite.msg1, err = stakingtypes.NewMsgCreateValidator(
65+
sdk.ValAddress(pk1.Address()), pk1, amount, desc, comm, one)
66+
suite.NoError(err)
67+
suite.msg2, err = stakingtypes.NewMsgCreateValidator(
68+
sdk.ValAddress(pk2.Address()), pk1, amount, desc, comm, one)
69+
suite.NoError(err)
70+
}
71+
72+
func (suite *GenTxTestSuite) setAccountBalance(balances []banktypes.Balance) json.RawMessage {
73+
bankGenesisState := banktypes.GenesisState{
74+
Params: banktypes.Params{DefaultSendEnabled: true},
75+
Balances: []banktypes.Balance{
76+
{
77+
Address: "cosmos1fl48vsnmsdzcv85q5d2q4z5ajdha8yu34mf0eh",
78+
Coins: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 1000000)},
79+
},
80+
{
81+
Address: "cosmos1jv65s3grqf6v6jl3dp4t6c9t9rk99cd88lyufl",
82+
Coins: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 2059726)},
83+
},
84+
{
85+
Address: "cosmos1k5lndq46x9xpejdxq52q3ql3ycrphg4qxlfqn7",
86+
Coins: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 100000000000000)},
87+
},
88+
},
89+
Supply: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)},
90+
}
91+
for _, balance := range balances {
92+
bankGenesisState.Balances = append(bankGenesisState.Balances, balance)
93+
94+
}
95+
for _, balance := range bankGenesisState.Balances {
96+
bankGenesisState.Supply.Add(balance.Coins...)
97+
}
98+
bankGenesis, err := suite.encodingConfig.Amino.MarshalJSON(bankGenesisState) // TODO switch this to use Marshaler
99+
suite.Require().NoError(err)
100+
101+
return bankGenesis
102+
}
103+
104+
func (suite *GenTxTestSuite) TestSetGenTxsInAppGenesisState() {
105+
var (
106+
txBuilder = suite.encodingConfig.TxConfig.NewTxBuilder()
107+
genTxs []sdk.Tx
108+
)
109+
110+
testCases := []struct {
111+
msg string
112+
malleate func()
113+
expPass bool
114+
}{
115+
{
116+
"one genesis transaction",
117+
func() {
118+
err := txBuilder.SetMsgs(suite.msg1)
119+
suite.Require().NoError(err)
120+
tx := txBuilder.GetTx()
121+
genTxs = []sdk.Tx{tx}
122+
},
123+
true,
124+
},
125+
{
126+
"two genesis transactions",
127+
func() {
128+
err := txBuilder.SetMsgs(suite.msg1, suite.msg2)
129+
suite.Require().NoError(err)
130+
tx := txBuilder.GetTx()
131+
genTxs = []sdk.Tx{tx}
132+
},
133+
true,
134+
},
135+
}
136+
137+
for _, tc := range testCases {
138+
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
139+
suite.SetupTest()
140+
cdc := suite.encodingConfig.Codec
141+
txJSONEncoder := suite.encodingConfig.TxConfig.TxJSONEncoder()
142+
143+
tc.malleate()
144+
appGenesisState, err := genutil.SetGenTxsInAppGenesisState(cdc, txJSONEncoder, make(map[string]json.RawMessage), genTxs)
145+
146+
if tc.expPass {
147+
suite.Require().NoError(err)
148+
suite.Require().NotNil(appGenesisState[types.ModuleName])
149+
150+
var genesisState types.GenesisState
151+
err := cdc.UnmarshalJSON(appGenesisState[types.ModuleName], &genesisState)
152+
suite.Require().NoError(err)
153+
suite.Require().NotNil(genesisState.GenTxs)
154+
} else {
155+
suite.Require().Error(err)
156+
}
157+
})
158+
}
159+
}
160+
161+
func (suite *GenTxTestSuite) TestValidateAccountInGenesis() {
162+
var (
163+
appGenesisState = make(map[string]json.RawMessage)
164+
coins sdk.Coins
165+
)
166+
167+
testCases := []struct {
168+
msg string
169+
malleate func()
170+
expPass bool
171+
}{
172+
{
173+
"no accounts",
174+
func() {
175+
coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}
176+
},
177+
false,
178+
},
179+
{
180+
"account without balance in the genesis state",
181+
func() {
182+
coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)}
183+
balances := banktypes.Balance{
184+
Address: addr2.String(),
185+
Coins: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 50)},
186+
}
187+
appGenesisState[banktypes.ModuleName] = suite.setAccountBalance([]banktypes.Balance{balances})
188+
},
189+
false,
190+
},
191+
{
192+
"account without enough funds of default bond denom",
193+
func() {
194+
coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 50)}
195+
balances := banktypes.Balance{
196+
Address: addr1.String(),
197+
Coins: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 25)},
198+
}
199+
appGenesisState[banktypes.ModuleName] = suite.setAccountBalance([]banktypes.Balance{balances})
200+
},
201+
false,
202+
},
203+
{
204+
"account with enough funds of default bond denom",
205+
func() {
206+
coins = sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 10)}
207+
balances := banktypes.Balance{
208+
Address: addr1.String(),
209+
Coins: sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 25)},
210+
}
211+
appGenesisState[banktypes.ModuleName] = suite.setAccountBalance([]banktypes.Balance{balances})
212+
},
213+
true,
214+
},
215+
}
216+
for _, tc := range testCases {
217+
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
218+
suite.SetupTest()
219+
cdc := suite.encodingConfig.Codec
220+
221+
stakingGenesis, err := cdc.MarshalJSON(&stakingtypes.GenesisState{Params: stakingtypes.DefaultParams()}) // TODO switch this to use Marshaler
222+
suite.Require().NoError(err)
223+
appGenesisState[stakingtypes.ModuleName] = stakingGenesis
224+
225+
tc.malleate()
226+
err = genutil.ValidateAccountInGenesis(
227+
appGenesisState, banktypes.GenesisBalancesIterator{},
228+
addr1, coins, cdc,
229+
)
230+
231+
if tc.expPass {
232+
suite.Require().NoError(err)
233+
} else {
234+
suite.Require().Error(err)
235+
}
236+
})
237+
}
238+
}
239+
240+
func (suite *GenTxTestSuite) TestDeliverGenTxs() {
241+
var (
242+
genTxs []json.RawMessage
243+
txBuilder = suite.encodingConfig.TxConfig.NewTxBuilder()
244+
)
245+
246+
testCases := []struct {
247+
msg string
248+
malleate func()
249+
deliverTxFn func(abci.RequestDeliverTx) abci.ResponseDeliverTx
250+
expPass bool
251+
}{
252+
{
253+
"no signature supplied",
254+
func() {
255+
err := txBuilder.SetMsgs(suite.msg1)
256+
suite.Require().NoError(err)
257+
258+
genTxs = make([]json.RawMessage, 1)
259+
tx, err := suite.encodingConfig.TxConfig.TxJSONEncoder()(txBuilder.GetTx())
260+
suite.Require().NoError(err)
261+
genTxs[0] = tx
262+
},
263+
func(_ abci.RequestDeliverTx) abci.ResponseDeliverTx {
264+
265+
return abci.ResponseDeliverTx{
266+
Code: sdkerrors.ErrNoSignatures.ABCICode(),
267+
GasWanted: int64(10000000),
268+
GasUsed: int64(41913),
269+
Log: "no signatures supplied",
270+
}
271+
},
272+
false,
273+
},
274+
{
275+
"success",
276+
func() {
277+
r := rand.New(rand.NewSource(time.Now().UnixNano()))
278+
msg := banktypes.NewMsgSend(addr1, addr2, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 1)})
279+
tx, err := simtestutil.GenSignedMockTx(
280+
r,
281+
suite.encodingConfig.TxConfig,
282+
[]sdk.Msg{msg},
283+
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 10)},
284+
simtestutil.DefaultGenTxGas,
285+
suite.ctx.ChainID(),
286+
[]uint64{7},
287+
[]uint64{0},
288+
priv1,
289+
)
290+
suite.Require().NoError(err)
291+
292+
genTxs = make([]json.RawMessage, 1)
293+
genTx, err := suite.encodingConfig.TxConfig.TxJSONEncoder()(tx)
294+
suite.Require().NoError(err)
295+
genTxs[0] = genTx
296+
},
297+
func(tx abci.RequestDeliverTx) abci.ResponseDeliverTx {
298+
return abci.ResponseDeliverTx{
299+
Code: sdkerrors.ErrUnauthorized.ABCICode(),
300+
GasWanted: int64(10000000),
301+
GasUsed: int64(41353),
302+
Log: "signature verification failed; please verify account number (4) and chain-id (): unauthorized",
303+
Codespace: "sdk",
304+
}
305+
},
306+
true,
307+
},
308+
}
309+
310+
for _, tc := range testCases {
311+
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
312+
suite.SetupTest()
313+
314+
tc.malleate()
315+
316+
if tc.expPass {
317+
suite.Require().NotPanics(func() {
318+
genutil.DeliverGenTxs(
319+
suite.ctx, genTxs, suite.stakingKeeper, tc.deliverTxFn,
320+
suite.encodingConfig.TxConfig,
321+
)
322+
})
323+
} else {
324+
_, err := genutil.DeliverGenTxs(
325+
suite.ctx, genTxs, suite.stakingKeeper, tc.deliverTxFn,
326+
suite.encodingConfig.TxConfig,
327+
)
328+
329+
suite.Require().Error(err)
330+
}
331+
})
332+
}
333+
}
334+
335+
func TestGenTxTestSuite(t *testing.T) {
336+
suite.Run(t, new(GenTxTestSuite))
337+
}

0 commit comments

Comments
 (0)