github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/engine/account_test.go (about)

     1  package engine
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hyperledger/burrow/acm"
     7  	"github.com/hyperledger/burrow/acm/acmstate"
     8  	"github.com/hyperledger/burrow/crypto"
     9  	"github.com/hyperledger/burrow/execution/errors"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestState_CreateAccount(t *testing.T) {
    15  	st := acmstate.NewMemoryState()
    16  	address := AddressFromName("frogs")
    17  	err := CreateAccount(st, address)
    18  	require.NoError(t, err)
    19  	err = CreateAccount(st, address)
    20  	require.Error(t, err)
    21  	require.Equal(t, errors.Codes.DuplicateAddress, errors.GetCode(err))
    22  
    23  	st = acmstate.NewMemoryState()
    24  	err = CreateAccount(st, address)
    25  	require.NoError(t, err)
    26  	err = InitEVMCode(st, address, []byte{1, 2, 3})
    27  	require.NoError(t, err)
    28  }
    29  
    30  func TestState_Sync(t *testing.T) {
    31  	backend := acmstate.NewCache(acmstate.NewMemoryState())
    32  	st := NewCallFrame(backend)
    33  	address := AddressFromName("frogs")
    34  
    35  	err := CreateAccount(st, address)
    36  	require.NoError(t, err)
    37  	amt := uint64(1232)
    38  	addToBalance(t, st, address, amt)
    39  	err = st.Sync()
    40  	require.NoError(t, err)
    41  
    42  	acc, err := backend.GetAccount(address)
    43  	require.NoError(t, err)
    44  	assert.Equal(t, acc.Balance, amt)
    45  }
    46  
    47  func TestState_NewCache(t *testing.T) {
    48  	st := NewCallFrame(acmstate.NewMemoryState())
    49  	address := AddressFromName("frogs")
    50  
    51  	cache, err := st.NewFrame()
    52  	require.NoError(t, err)
    53  	err = CreateAccount(cache, address)
    54  	require.NoError(t, err)
    55  	amt := uint64(1232)
    56  	addToBalance(t, cache, address, amt)
    57  
    58  	acc, err := st.GetAccount(address)
    59  	require.NoError(t, err)
    60  	require.Nil(t, acc)
    61  
    62  	// Sync through to cache
    63  	err = cache.Sync()
    64  	require.NoError(t, err)
    65  
    66  	acc, err = MustAccount(cache, address)
    67  	require.NoError(t, err)
    68  	assert.Equal(t, amt, acc.Balance)
    69  
    70  	cache, err = cache.NewFrame(acmstate.ReadOnly)
    71  	require.NoError(t, err)
    72  	cache, err = cache.NewFrame()
    73  	require.NoError(t, err)
    74  	err = UpdateAccount(cache, address, func(account *acm.Account) error {
    75  		return account.AddToBalance(amt)
    76  	})
    77  	require.Error(t, err)
    78  	require.Equal(t, errors.Codes.IllegalWrite, errors.GetCode(err))
    79  }
    80  
    81  func addToBalance(t testing.TB, st acmstate.ReaderWriter, address crypto.Address, amt uint64) {
    82  	err := UpdateAccount(st, address, func(account *acm.Account) error {
    83  		return account.AddToBalance(amt)
    84  	})
    85  	require.NoError(t, err)
    86  }