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  }