|
package types
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/tendermint/tendermint/crypto/ed25519"
|
|
tmtime "github.com/tendermint/tendermint/libs/time"
|
|
)
|
|
|
|
func TestGenesisBad(t *testing.T) {
|
|
// test some bad ones from raw json
|
|
testCases := [][]byte{
|
|
{}, // empty
|
|
{1, 1, 1, 1, 1}, // junk
|
|
[]byte(`{}`), // empty
|
|
[]byte(`{"chain_id":"mychain","validators":[{}]}`), // invalid validator
|
|
[]byte(`{"chain_id":"chain","initial_height":"-1"}`), // negative initial height
|
|
// missing pub_key type
|
|
[]byte(
|
|
`{"validators":[{"pub_key":{"value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="},"power":"10","name":""}]}`,
|
|
),
|
|
// missing chain_id
|
|
[]byte(
|
|
`{"validators":[` +
|
|
`{"pub_key":{` +
|
|
`"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="` +
|
|
`},"power":"10","name":""}` +
|
|
`]}`,
|
|
),
|
|
// too big chain_id
|
|
[]byte(
|
|
`{"chain_id": "Lorem ipsum dolor sit amet, consectetuer adipiscing", "validators": [` +
|
|
`{"pub_key":{` +
|
|
`"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="` +
|
|
`},"power":"10","name":""}` +
|
|
`]}`,
|
|
),
|
|
// wrong address
|
|
[]byte(
|
|
`{"chain_id":"mychain", "validators":[` +
|
|
`{"address": "A", "pub_key":{` +
|
|
`"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="` +
|
|
`},"power":"10","name":""}` +
|
|
`]}`,
|
|
),
|
|
}
|
|
|
|
for _, testCase := range testCases {
|
|
_, err := GenesisDocFromJSON(testCase)
|
|
assert.Error(t, err, "expected error for empty genDoc json")
|
|
}
|
|
}
|
|
|
|
func TestBasicGenesisDoc(t *testing.T) {
|
|
// test a good one by raw json
|
|
genDocBytes := []byte(
|
|
`{
|
|
"genesis_time": "0001-01-01T00:00:00Z",
|
|
"chain_id": "test-chain-QDKdJr",
|
|
"initial_height": "1000",
|
|
"validators": [{
|
|
"pub_key":{"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="},
|
|
"power":"10",
|
|
"name":""
|
|
}],
|
|
"app_hash":"",
|
|
"app_state":{"account_owner": "Bob"},
|
|
"consensus_params": {
|
|
"synchrony": {"precision": "1", "message_delay": "10"},
|
|
"validator": {"pub_key_types":["ed25519"]},
|
|
"block": {"max_bytes": "100"},
|
|
"evidence": {"max_age_num_blocks": "100", "max_age_duration": "10"}
|
|
}
|
|
}`,
|
|
)
|
|
_, err := GenesisDocFromJSON(genDocBytes)
|
|
assert.NoError(t, err, "expected no error for good genDoc json")
|
|
|
|
pubkey := ed25519.GenPrivKey().PubKey()
|
|
// create a base gendoc from struct
|
|
baseGenDoc := &GenesisDoc{
|
|
ChainID: "abc",
|
|
Validators: []GenesisValidator{{pubkey.Address(), pubkey, 10, "myval"}},
|
|
}
|
|
genDocBytes, err = json.Marshal(baseGenDoc)
|
|
assert.NoError(t, err, "error marshaling genDoc")
|
|
|
|
// test base gendoc and check consensus params were filled
|
|
genDoc, err := GenesisDocFromJSON(genDocBytes)
|
|
assert.NoError(t, err, "expected no error for valid genDoc json")
|
|
assert.NotNil(t, genDoc.ConsensusParams, "expected consensus params to be filled in")
|
|
|
|
// check validator's address is filled
|
|
assert.NotNil(t, genDoc.Validators[0].Address, "expected validator's address to be filled in")
|
|
|
|
// create json with consensus params filled
|
|
genDocBytes, err = json.Marshal(genDoc)
|
|
assert.NoError(t, err, "error marshaling genDoc")
|
|
genDoc, err = GenesisDocFromJSON(genDocBytes)
|
|
require.NoError(t, err, "expected no error for valid genDoc json")
|
|
|
|
// test with invalid consensus params
|
|
genDoc.ConsensusParams.Block.MaxBytes = 0
|
|
genDocBytes, err = json.Marshal(genDoc)
|
|
assert.NoError(t, err, "error marshaling genDoc")
|
|
_, err = GenesisDocFromJSON(genDocBytes)
|
|
assert.Error(t, err, "expected error for genDoc json with block size of 0")
|
|
|
|
// Genesis doc from raw json
|
|
missingValidatorsTestCases := [][]byte{
|
|
[]byte(`{"chain_id":"mychain"}`), // missing validators
|
|
[]byte(`{"chain_id":"mychain","validators":[]}`), // missing validators
|
|
[]byte(`{"chain_id":"mychain","validators":null}`), // nil validator
|
|
[]byte(`{"chain_id":"mychain"}`), // missing validators
|
|
}
|
|
|
|
for _, tc := range missingValidatorsTestCases {
|
|
_, err := GenesisDocFromJSON(tc)
|
|
assert.NoError(t, err)
|
|
}
|
|
}
|
|
|
|
func TestGenesisSaveAs(t *testing.T) {
|
|
tmpfile, err := os.CreateTemp("", "genesis")
|
|
require.NoError(t, err)
|
|
defer os.Remove(tmpfile.Name())
|
|
|
|
genDoc := randomGenesisDoc()
|
|
|
|
// save
|
|
err = genDoc.SaveAs(tmpfile.Name())
|
|
require.NoError(t, err)
|
|
stat, err := tmpfile.Stat()
|
|
require.NoError(t, err)
|
|
if err != nil && stat.Size() <= 0 {
|
|
t.Fatalf("SaveAs failed to write any bytes to %v", tmpfile.Name())
|
|
}
|
|
|
|
err = tmpfile.Close()
|
|
require.NoError(t, err)
|
|
|
|
// load
|
|
genDoc2, err := GenesisDocFromFile(tmpfile.Name())
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, genDoc2, genDoc)
|
|
assert.Equal(t, genDoc2.Validators, genDoc.Validators)
|
|
}
|
|
|
|
func TestGenesisValidatorHash(t *testing.T) {
|
|
genDoc := randomGenesisDoc()
|
|
assert.NotEmpty(t, genDoc.ValidatorHash())
|
|
}
|
|
|
|
func randomGenesisDoc() *GenesisDoc {
|
|
pubkey := ed25519.GenPrivKey().PubKey()
|
|
return &GenesisDoc{
|
|
GenesisTime: tmtime.Now(),
|
|
ChainID: "abc",
|
|
InitialHeight: 1000,
|
|
Validators: []GenesisValidator{{pubkey.Address(), pubkey, 10, "myval"}},
|
|
ConsensusParams: DefaultConsensusParams(),
|
|
AppHash: []byte{1, 2, 3},
|
|
}
|
|
}
|