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 }