github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/genesis/spec/genesis_spec_test.go (about)

     1  package spec
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hyperledger/burrow/acm/balance"
     7  	"github.com/hyperledger/burrow/crypto"
     8  	"github.com/hyperledger/burrow/keys"
     9  	"github.com/hyperledger/burrow/logging"
    10  	"github.com/hyperledger/burrow/permission"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestGenesisSpec_GenesisDoc(t *testing.T) {
    16  	keyClient := keys.NewLocalKeyClient(keys.NewMemoryKeyStore(), logging.NewNoopLogger())
    17  
    18  	// Try a spec with a single account/validator
    19  	amtBonded := uint64(100)
    20  	genesisSpec := GenesisSpec{
    21  		Accounts: []TemplateAccount{{
    22  			Amounts: balance.New().Power(amtBonded),
    23  		}},
    24  	}
    25  
    26  	genesisDoc, err := genesisSpec.GenesisDoc(keyClient, crypto.CurveTypeEd25519)
    27  	require.NoError(t, err)
    28  	require.Len(t, genesisDoc.Accounts, 1)
    29  	// Should create validator
    30  	require.Len(t, genesisDoc.Validators, 1)
    31  	assert.NotZero(t, genesisDoc.Accounts[0].Address)
    32  	assert.NotZero(t, genesisDoc.Accounts[0].PublicKey)
    33  	assert.Equal(t, genesisDoc.Accounts[0].Address, genesisDoc.Validators[0].Address)
    34  	assert.Equal(t, genesisDoc.Accounts[0].PublicKey, genesisDoc.Validators[0].PublicKey)
    35  	assert.Equal(t, amtBonded, genesisDoc.Validators[0].Amount)
    36  	assert.NotEmpty(t, genesisDoc.ChainName, "Chain name should not be empty")
    37  
    38  	address, err := keyClient.Generate("test-lookup-of-key", crypto.CurveTypeEd25519)
    39  	require.NoError(t, err)
    40  	pubKey, err := keyClient.PublicKey(address)
    41  	require.NoError(t, err)
    42  
    43  	// Try a spec with two accounts and no validators
    44  	amt := uint64(99299299)
    45  	genesisSpec = GenesisSpec{
    46  		Accounts: []TemplateAccount{
    47  			{
    48  				Address: &address,
    49  			},
    50  			{
    51  				Amounts:     balance.New().Native(amt),
    52  				Permissions: []string{permission.CreateAccountString, permission.CallString},
    53  			}},
    54  	}
    55  
    56  	genesisDoc, err = genesisSpec.GenesisDoc(keyClient, crypto.CurveTypeEd25519)
    57  	require.NoError(t, err)
    58  
    59  	require.Len(t, genesisDoc.Accounts, 2)
    60  	// Nothing bonded so no validators
    61  	require.Len(t, genesisDoc.Validators, 0)
    62  	assert.Equal(t, pubKey, genesisDoc.Accounts[0].PublicKey)
    63  	assert.Equal(t, amt, genesisDoc.Accounts[1].Amount)
    64  	permFlag := permission.CreateAccount | permission.Call
    65  	assert.Equal(t, permFlag, genesisDoc.Accounts[1].Permissions.Base.Perms)
    66  	assert.Equal(t, permFlag, genesisDoc.Accounts[1].Permissions.Base.SetBit)
    67  
    68  	// Try an empty spec
    69  	genesisSpec = GenesisSpec{}
    70  
    71  	genesisDoc, err = genesisSpec.GenesisDoc(keyClient, crypto.CurveTypeEd25519)
    72  	require.NoError(t, err)
    73  
    74  	// Similar assersions to first case - should generate our default single identity chain
    75  	require.Len(t, genesisDoc.Accounts, 1)
    76  	// Should create validator
    77  	require.Len(t, genesisDoc.Validators, 1)
    78  	assert.NotZero(t, genesisDoc.Accounts[0].Address)
    79  	assert.NotZero(t, genesisDoc.Accounts[0].PublicKey)
    80  	assert.Equal(t, genesisDoc.Accounts[0].Address, genesisDoc.Validators[0].Address)
    81  	assert.Equal(t, genesisDoc.Accounts[0].PublicKey, genesisDoc.Validators[0].PublicKey)
    82  }
    83  
    84  func TestTemplateAccount_AccountPermissions(t *testing.T) {
    85  }