github.com/evdatsion/aphelion-dpos-bft@v0.32.1/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/evdatsion/aphelion-dpos-bft/crypto/ed25519" 12 tmtime "github.com/evdatsion/aphelion-dpos-bft/types/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 // missing pub_key type 23 []byte(`{"validators":[{"pub_key":{"value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="},"power":"10","name":""}]}`), 24 // missing chain_id 25 []byte(`{"validators":[{"pub_key":{"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="},"power":"10","name":""}]}`), 26 // too big chain_id 27 []byte(`{"chain_id": "Lorem ipsum dolor sit amet, consectetuer adipiscing", "validators": [{"pub_key":{"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="},"power":"10","name":""}]}`), 28 // wrong address 29 []byte(`{"chain_id":"mychain", "validators":[{"address": "A", "pub_key":{"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="},"power":"10","name":""}]}`), 30 } 31 32 for _, testCase := range testCases { 33 _, err := GenesisDocFromJSON(testCase) 34 assert.Error(t, err, "expected error for empty genDoc json") 35 } 36 } 37 38 func TestGenesisGood(t *testing.T) { 39 // test a good one by raw json 40 genDocBytes := []byte(`{"genesis_time":"0001-01-01T00:00:00Z","chain_id":"test-chain-QDKdJr","consensus_params":null,"validators":[{"pub_key":{"type":"tendermint/PubKeyEd25519","value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="},"power":"10","name":""}],"app_hash":"","app_state":{"account_owner": "Bob"}}`) 41 _, err := GenesisDocFromJSON(genDocBytes) 42 assert.NoError(t, err, "expected no error for good genDoc json") 43 44 pubkey := ed25519.GenPrivKey().PubKey() 45 // create a base gendoc from struct 46 baseGenDoc := &GenesisDoc{ 47 ChainID: "abc", 48 Validators: []GenesisValidator{{pubkey.Address(), pubkey, 10, "myval"}}, 49 } 50 genDocBytes, err = cdc.MarshalJSON(baseGenDoc) 51 assert.NoError(t, err, "error marshalling genDoc") 52 53 // test base gendoc and check consensus params were filled 54 genDoc, err := GenesisDocFromJSON(genDocBytes) 55 assert.NoError(t, err, "expected no error for valid genDoc json") 56 assert.NotNil(t, genDoc.ConsensusParams, "expected consensus params to be filled in") 57 58 // check validator's address is filled 59 assert.NotNil(t, genDoc.Validators[0].Address, "expected validator's address to be filled in") 60 61 // create json with consensus params filled 62 genDocBytes, err = cdc.MarshalJSON(genDoc) 63 assert.NoError(t, err, "error marshalling genDoc") 64 genDoc, err = GenesisDocFromJSON(genDocBytes) 65 assert.NoError(t, err, "expected no error for valid genDoc json") 66 67 // test with invalid consensus params 68 genDoc.ConsensusParams.Block.MaxBytes = 0 69 genDocBytes, err = cdc.MarshalJSON(genDoc) 70 assert.NoError(t, err, "error marshalling genDoc") 71 genDoc, err = GenesisDocFromJSON(genDocBytes) 72 assert.Error(t, err, "expected error for genDoc json with block size of 0") 73 74 // Genesis doc from raw json 75 missingValidatorsTestCases := [][]byte{ 76 []byte(`{"chain_id":"mychain"}`), // missing validators 77 []byte(`{"chain_id":"mychain","validators":[]}`), // missing validators 78 []byte(`{"chain_id":"mychain","validators":null}`), // nil validator 79 []byte(`{"chain_id":"mychain"}`), // missing validators 80 } 81 82 for _, tc := range missingValidatorsTestCases { 83 _, err := GenesisDocFromJSON(tc) 84 assert.NoError(t, err) 85 } 86 } 87 88 func TestGenesisSaveAs(t *testing.T) { 89 tmpfile, err := ioutil.TempFile("", "genesis") 90 require.NoError(t, err) 91 defer os.Remove(tmpfile.Name()) 92 93 genDoc := randomGenesisDoc() 94 95 // save 96 genDoc.SaveAs(tmpfile.Name()) 97 stat, err := tmpfile.Stat() 98 require.NoError(t, err) 99 if err != nil && stat.Size() <= 0 { 100 t.Fatalf("SaveAs failed to write any bytes to %v", tmpfile.Name()) 101 } 102 103 err = tmpfile.Close() 104 require.NoError(t, err) 105 106 // load 107 genDoc2, err := GenesisDocFromFile(tmpfile.Name()) 108 require.NoError(t, err) 109 110 // fails to unknown reason 111 // assert.EqualValues(t, genDoc2, genDoc) 112 assert.Equal(t, genDoc2.Validators, genDoc.Validators) 113 } 114 115 func TestGenesisValidatorHash(t *testing.T) { 116 genDoc := randomGenesisDoc() 117 assert.NotEmpty(t, genDoc.ValidatorHash()) 118 } 119 120 func randomGenesisDoc() *GenesisDoc { 121 pubkey := ed25519.GenPrivKey().PubKey() 122 return &GenesisDoc{ 123 GenesisTime: tmtime.Now(), 124 ChainID: "abc", 125 Validators: []GenesisValidator{{pubkey.Address(), pubkey, 10, "myval"}}, 126 ConsensusParams: DefaultConsensusParams(), 127 } 128 }