You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

177 lines
5.4 KiB

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