laconicd/x/evm/types/genesis_test.go
Federico Kunze 6f7470c2e0
build
2021-04-18 19:23:26 +02:00

263 lines
5.0 KiB
Go

package types
import (
"testing"
"github.com/stretchr/testify/suite"
ethcmn "github.com/ethereum/go-ethereum/common"
"github.com/cosmos/ethermint/crypto/ethsecp256k1"
)
type GenesisTestSuite struct {
suite.Suite
address string
hash ethcmn.Hash
code string
}
func (suite *GenesisTestSuite) SetupTest() {
priv, err := ethsecp256k1.GenerateKey()
suite.Require().NoError(err)
suite.address = ethcmn.BytesToAddress(priv.PubKey().Address().Bytes()).String()
suite.hash = ethcmn.BytesToHash([]byte("hash"))
suite.code = ethcmn.Bytes2Hex([]byte{1, 2, 3})
}
func TestGenesisTestSuite(t *testing.T) {
suite.Run(t, new(GenesisTestSuite))
}
func (suite *GenesisTestSuite) TestValidateGenesisAccount() {
testCases := []struct {
name string
genesisAccount GenesisAccount
expPass bool
}{
{
"valid genesis account",
GenesisAccount{
Address: suite.address,
Code: suite.code,
Storage: Storage{
NewState(suite.hash, suite.hash),
},
},
true,
},
{
"empty account address bytes",
GenesisAccount{
Address: ethcmn.Address{}.String(),
},
false,
},
{
"empty code bytes",
GenesisAccount{
Address: suite.address,
Code: "",
},
false,
},
}
for _, tc := range testCases {
tc := tc
err := tc.genesisAccount.Validate()
if tc.expPass {
suite.Require().NoError(err, tc.name)
} else {
suite.Require().Error(err, tc.name)
}
}
}
func (suite *GenesisTestSuite) TestValidateGenesis() {
testCases := []struct {
name string
genState *GenesisState
expPass bool
}{
{
name: "default",
genState: DefaultGenesisState(),
expPass: true,
},
{
name: "valid genesis",
genState: &GenesisState{
Accounts: []GenesisAccount{
{
Address: suite.address,
Code: suite.code,
Storage: Storage{
{Key: suite.hash.String()},
},
},
},
TxsLogs: []TransactionLogs{
{
Hash: suite.hash.String(),
Logs: []*Log{
{
Address: suite.address,
Topics: []string{suite.hash.String()},
Data: []byte("data"),
BlockNumber: 1,
TxHash: suite.hash.String(),
TxIndex: 1,
BlockHash: suite.hash.String(),
Index: 1,
Removed: false,
},
},
},
},
ChainConfig: DefaultChainConfig(),
Params: DefaultParams(),
},
expPass: true,
},
{
name: "empty genesis",
genState: &GenesisState{},
expPass: false,
},
{
name: "invalid genesis",
genState: &GenesisState{
Accounts: []GenesisAccount{
{
Address: ethcmn.Address{}.String(),
},
},
},
expPass: false,
},
{
name: "duplicated genesis account",
genState: &GenesisState{
Accounts: []GenesisAccount{
{
Address: suite.address,
Code: suite.code,
Storage: Storage{
NewState(suite.hash, suite.hash),
},
},
{
Address: suite.address,
Code: suite.code,
Storage: Storage{
NewState(suite.hash, suite.hash),
},
},
},
},
expPass: false,
},
{
name: "duplicated tx log",
genState: &GenesisState{
Accounts: []GenesisAccount{
{
Address: suite.address,
Code: suite.code,
Storage: Storage{
{Key: suite.hash.String()},
},
},
},
TxsLogs: []TransactionLogs{
{
Hash: suite.hash.String(),
Logs: []*Log{
{
Address: suite.address,
Topics: []string{suite.hash.String()},
Data: []byte("data"),
BlockNumber: 1,
TxHash: suite.hash.String(),
TxIndex: 1,
BlockHash: suite.hash.String(),
Index: 1,
Removed: false,
},
},
},
{
Hash: suite.hash.String(),
Logs: []*Log{
{
Address: suite.address,
Topics: []string{suite.hash.String()},
Data: []byte("data"),
BlockNumber: 1,
TxHash: suite.hash.String(),
TxIndex: 1,
BlockHash: suite.hash.String(),
Index: 1,
Removed: false,
},
},
},
},
},
expPass: false,
},
{
name: "invalid tx log",
genState: &GenesisState{
Accounts: []GenesisAccount{
{
Address: suite.address,
Code: suite.code,
Storage: Storage{
{Key: suite.hash.String()},
},
},
},
TxsLogs: []TransactionLogs{NewTransactionLogs(ethcmn.Hash{}, nil)},
},
expPass: false,
},
{
name: "invalid params",
genState: &GenesisState{
ChainConfig: DefaultChainConfig(),
Params: Params{},
},
expPass: false,
},
{
name: "invalid chain config",
genState: &GenesisState{
ChainConfig: ChainConfig{},
Params: DefaultParams(),
},
expPass: false,
},
}
for _, tc := range testCases {
tc := tc
err := tc.genState.Validate()
if tc.expPass {
suite.Require().NoError(err, tc.name)
} else {
suite.Require().Error(err, tc.name)
}
}
}