github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/types/genesis_test.go (about) 1 package types 2 3 import ( 4 "encoding/json" 5 "os" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 11 "github.com/ari-anchor/sei-tendermint/crypto/ed25519" 12 tmtime "github.com/ari-anchor/sei-tendermint/libs/time" 13 ) 14 15 func TestGenesisBad(t *testing.T) { 16 // test some bad ones from raw json 17 testCases := [][]byte{ 18 {}, // empty 19 {1, 1, 1, 1, 1}, // junk 20 []byte(`{}`), // empty 21 []byte(`{"chain_id":"mychain","validators":[{}]}`), // invalid validator 22 []byte(`{"chain_id":"chain","initial_height":"-1"}`), // negative initial height 23 // missing pub_key type 24 []byte( 25 `{"validators":[{"pub_key":{"value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="},"power":"10","name":""}]}`, 26 ), 27 // missing chain_id 28 []byte( 29 `{"validators":[` + 30 `{"pub_key":{` + 31 `"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="` + 32 `},"power":"10","name":""}` + 33 `]}`, 34 ), 35 // too big chain_id 36 []byte( 37 `{"chain_id": "Lorem ipsum dolor sit amet, consectetuer adipiscing", "validators": [` + 38 `{"pub_key":{` + 39 `"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="` + 40 `},"power":"10","name":""}` + 41 `]}`, 42 ), 43 // wrong address 44 []byte( 45 `{"chain_id":"mychain", "validators":[` + 46 `{"address": "A", "pub_key":{` + 47 `"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="` + 48 `},"power":"10","name":""}` + 49 `]}`, 50 ), 51 } 52 53 for _, testCase := range testCases { 54 _, err := GenesisDocFromJSON(testCase) 55 assert.Error(t, err, "expected error for empty genDoc json") 56 } 57 } 58 59 func TestBasicGenesisDoc(t *testing.T) { 60 // test a good one by raw json 61 genDocBytes := []byte( 62 `{ 63 "genesis_time": "0001-01-01T00:00:00Z", 64 "chain_id": "test-chain-QDKdJr", 65 "initial_height": "1000", 66 "validators": [{ 67 "pub_key":{"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="}, 68 "power":"10", 69 "name":"" 70 }], 71 "app_hash":"", 72 "app_state":{"account_owner": "Bob"}, 73 "consensus_params": { 74 "synchrony": {"precision": "1", "message_delay": "10"}, 75 "timeout": { 76 "propose": "30000000000", 77 "propose_delta": "50000000", 78 "vote": "30000000000", 79 "vote_delta": "50000000", 80 "commit": "10000000000", 81 "bypass_commit_timeout": false 82 }, 83 "validator": {"pub_key_types":["ed25519"]}, 84 "block": {"max_bytes": "100"}, 85 "evidence": {"max_age_num_blocks": "100", "max_age_duration": "10"} 86 } 87 }`, 88 ) 89 _, err := GenesisDocFromJSON(genDocBytes) 90 assert.NoError(t, err, "expected no error for good genDoc json") 91 92 pubkey := ed25519.GenPrivKey().PubKey() 93 // create a base gendoc from struct 94 baseGenDoc := &GenesisDoc{ 95 ChainID: "abc", 96 Validators: []GenesisValidator{{pubkey.Address(), pubkey, 10, "myval"}}, 97 } 98 genDocBytes, err = json.Marshal(baseGenDoc) 99 assert.NoError(t, err, "error marshaling genDoc") 100 101 // test base gendoc and check consensus params were filled 102 genDoc, err := GenesisDocFromJSON(genDocBytes) 103 assert.NoError(t, err, "expected no error for valid genDoc json") 104 assert.NotNil(t, genDoc.ConsensusParams, "expected consensus params to be filled in") 105 106 // check validator's address is filled 107 assert.NotNil(t, genDoc.Validators[0].Address, "expected validator's address to be filled in") 108 109 // create json with consensus params filled 110 genDocBytes, err = json.Marshal(genDoc) 111 assert.NoError(t, err, "error marshaling genDoc") 112 genDoc, err = GenesisDocFromJSON(genDocBytes) 113 require.NoError(t, err, "expected no error for valid genDoc json") 114 115 // test with invalid consensus params 116 genDoc.ConsensusParams.Block.MaxBytes = 0 117 genDocBytes, err = json.Marshal(genDoc) 118 assert.NoError(t, err, "error marshaling genDoc") 119 _, err = GenesisDocFromJSON(genDocBytes) 120 assert.Error(t, err, "expected error for genDoc json with block size of 0") 121 122 // Genesis doc from raw json 123 missingValidatorsTestCases := [][]byte{ 124 []byte(`{"chain_id":"mychain"}`), // missing validators 125 []byte(`{"chain_id":"mychain","validators":[]}`), // missing validators 126 []byte(`{"chain_id":"mychain","validators":null}`), // nil validator 127 []byte(`{"chain_id":"mychain"}`), // missing validators 128 } 129 130 for _, tc := range missingValidatorsTestCases { 131 _, err := GenesisDocFromJSON(tc) 132 assert.NoError(t, err) 133 } 134 } 135 136 func TestGenesisSaveAs(t *testing.T) { 137 tmpfile, err := os.CreateTemp(t.TempDir(), "genesis") 138 require.NoError(t, err) 139 defer os.Remove(tmpfile.Name()) 140 141 genDoc := randomGenesisDoc() 142 143 // save 144 err = genDoc.SaveAs(tmpfile.Name()) 145 require.NoError(t, err) 146 stat, err := tmpfile.Stat() 147 require.NoError(t, err) 148 if err != nil && stat.Size() <= 0 { 149 t.Fatalf("SaveAs failed to write any bytes to %v", tmpfile.Name()) 150 } 151 152 err = tmpfile.Close() 153 require.NoError(t, err) 154 155 // load 156 genDoc2, err := GenesisDocFromFile(tmpfile.Name()) 157 require.NoError(t, err) 158 assert.EqualValues(t, genDoc2, genDoc) 159 assert.Equal(t, genDoc2.Validators, genDoc.Validators) 160 } 161 162 func TestGenesisValidatorHash(t *testing.T) { 163 genDoc := randomGenesisDoc() 164 assert.NotEmpty(t, genDoc.ValidatorHash()) 165 } 166 167 func randomGenesisDoc() *GenesisDoc { 168 pubkey := ed25519.GenPrivKey().PubKey() 169 return &GenesisDoc{ 170 GenesisTime: tmtime.Now(), 171 ChainID: "abc", 172 InitialHeight: 1000, 173 Validators: []GenesisValidator{{pubkey.Address(), pubkey, 10, "myval"}}, 174 ConsensusParams: DefaultConsensusParams(), 175 AppHash: []byte{1, 2, 3}, 176 } 177 }