github.com/adoriasoft/tendermint@v0.34.0-dev1.0.20200722151356-96d84601a75a/types/genesis_test.go (about) 1 package types 2 3 import ( 4 "io/ioutil" 5 "os" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 11 "github.com/tendermint/tendermint/crypto/ed25519" 12 tmjson "github.com/tendermint/tendermint/libs/json" 13 tmtime "github.com/tendermint/tendermint/types/time" 14 ) 15 16 func TestGenesisBad(t *testing.T) { 17 // test some bad ones from raw json 18 testCases := [][]byte{ 19 {}, // empty 20 {1, 1, 1, 1, 1}, // junk 21 []byte(`{}`), // empty 22 []byte(`{"chain_id":"mychain","validators":[{}]}`), // invalid validator 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 TestGenesisGood(t *testing.T) { 60 // test a good one by raw json 61 genDocBytes := []byte( 62 `{"genesis_time":"0001-01-01T00:00:00Z","chain_id":"test-chain-QDKdJr","consensus_params":null,"validators":[` + 63 `{"pub_key":{` + 64 `"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="` + 65 `},"power":"10","name":""}` + 66 `],"app_hash":"","app_state":{"account_owner": "Bob"}}`, 67 ) 68 _, err := GenesisDocFromJSON(genDocBytes) 69 assert.NoError(t, err, "expected no error for good genDoc json") 70 71 pubkey := ed25519.GenPrivKey().PubKey() 72 // create a base gendoc from struct 73 baseGenDoc := &GenesisDoc{ 74 ChainID: "abc", 75 Validators: []GenesisValidator{{pubkey.Address(), pubkey, 10, "myval"}}, 76 } 77 genDocBytes, err = tmjson.Marshal(baseGenDoc) 78 assert.NoError(t, err, "error marshalling genDoc") 79 80 // test base gendoc and check consensus params were filled 81 genDoc, err := GenesisDocFromJSON(genDocBytes) 82 assert.NoError(t, err, "expected no error for valid genDoc json") 83 assert.NotNil(t, genDoc.ConsensusParams, "expected consensus params to be filled in") 84 85 // check validator's address is filled 86 assert.NotNil(t, genDoc.Validators[0].Address, "expected validator's address to be filled in") 87 88 // create json with consensus params filled 89 genDocBytes, err = tmjson.Marshal(genDoc) 90 assert.NoError(t, err, "error marshalling genDoc") 91 genDoc, err = GenesisDocFromJSON(genDocBytes) 92 assert.NoError(t, err, "expected no error for valid genDoc json") 93 94 // test with invalid consensus params 95 genDoc.ConsensusParams.Block.MaxBytes = 0 96 genDocBytes, err = tmjson.Marshal(genDoc) 97 assert.NoError(t, err, "error marshalling genDoc") 98 _, err = GenesisDocFromJSON(genDocBytes) 99 assert.Error(t, err, "expected error for genDoc json with block size of 0") 100 101 // Genesis doc from raw json 102 missingValidatorsTestCases := [][]byte{ 103 []byte(`{"chain_id":"mychain"}`), // missing validators 104 []byte(`{"chain_id":"mychain","validators":[]}`), // missing validators 105 []byte(`{"chain_id":"mychain","validators":null}`), // nil validator 106 []byte(`{"chain_id":"mychain"}`), // missing validators 107 } 108 109 for _, tc := range missingValidatorsTestCases { 110 _, err := GenesisDocFromJSON(tc) 111 assert.NoError(t, err) 112 } 113 } 114 115 func TestGenesisSaveAs(t *testing.T) { 116 tmpfile, err := ioutil.TempFile("", "genesis") 117 require.NoError(t, err) 118 defer os.Remove(tmpfile.Name()) 119 120 genDoc := randomGenesisDoc() 121 122 // save 123 genDoc.SaveAs(tmpfile.Name()) 124 stat, err := tmpfile.Stat() 125 require.NoError(t, err) 126 if err != nil && stat.Size() <= 0 { 127 t.Fatalf("SaveAs failed to write any bytes to %v", tmpfile.Name()) 128 } 129 130 err = tmpfile.Close() 131 require.NoError(t, err) 132 133 // load 134 genDoc2, err := GenesisDocFromFile(tmpfile.Name()) 135 require.NoError(t, err) 136 137 // fails to unknown reason 138 // assert.EqualValues(t, genDoc2, genDoc) 139 assert.Equal(t, genDoc2.Validators, genDoc.Validators) 140 } 141 142 func TestGenesisValidatorHash(t *testing.T) { 143 genDoc := randomGenesisDoc() 144 assert.NotEmpty(t, genDoc.ValidatorHash()) 145 } 146 147 func randomGenesisDoc() *GenesisDoc { 148 pubkey := ed25519.GenPrivKey().PubKey() 149 return &GenesisDoc{ 150 GenesisTime: tmtime.Now(), 151 ChainID: "abc", 152 Validators: []GenesisValidator{{pubkey.Address(), pubkey, 10, "myval"}}, 153 ConsensusParams: DefaultConsensusParams(), 154 } 155 }