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  }