From c69ced35e1bf10d7df64a3f4affaa93b465c38b9 Mon Sep 17 00:00:00 2001 From: Silas Davis <silas@monax.io> Date: Mon, 2 Apr 2018 19:09:13 +0100 Subject: [PATCH] Added state cache test Signed-off-by: Silas Davis <silas@monax.io> --- account/state/state_cache_test.go | 93 +++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 16 deletions(-) diff --git a/account/state/state_cache_test.go b/account/state/state_cache_test.go index 5928a6ed..de9683b2 100644 --- a/account/state/state_cache_test.go +++ b/account/state/state_cache_test.go @@ -6,37 +6,75 @@ import ( acm "github.com/hyperledger/burrow/account" "github.com/hyperledger/burrow/binary" + "github.com/hyperledger/burrow/execution/evm/asm" "github.com/hyperledger/burrow/permission" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestStateCache_GetAccount(t *testing.T) { - acc := acm.NewConcreteAccountFromSecret("foo") - acc.Permissions.Base.Perms = permission.AddRole | permission.Send - acc.Permissions.Base.SetBit = acc.Permissions.Base.Perms - state := combine(account(acc.Account(), "I AM A KEY", "NO YOU ARE A KEY")) - cache := NewCache(state) + // Build backend states for read and write + readBackend := testAccounts() + writeBackend := NewCache(newTestState()) + cache := NewCache(readBackend) - accOut, err := cache.GetAccount(acc.Address) + acc := readBackend.Accounts[addressOf("acc1")] + accOut, err := cache.GetAccount(acc.Address()) require.NoError(t, err) cache.UpdateAccount(accOut) - accEnc, err := acc.Encode() - accEncOut, err := accOut.Encode() - assert.Equal(t, accEnc, accEncOut) - assert.Equal(t, acc.Permissions, accOut.Permissions()) + assert.Equal(t, acm.AsConcreteAccount(acc), acm.AsConcreteAccount(accOut)) - cacheBackend := NewCache(newTestState()) - err = cache.Sync(cacheBackend) + err = cache.Sync(writeBackend) require.NoError(t, err) - accOut, err = cacheBackend.GetAccount(acc.Address) + accOut, err = writeBackend.GetAccount(acc.Address()) require.NotNil(t, accOut) - accEncOut, err = accOut.Encode() assert.NoError(t, err) - assert.Equal(t, accEnc, accEncOut) + assert.Equal(t, acm.AsConcreteAccount(acc), acm.AsConcreteAccount(accOut)) } func TestStateCache_UpdateAccount(t *testing.T) { + // Build backend states for read and write + backend := NewCache(newTestState()) + cache := NewCache(backend) + // Create acccount + accNew := acm.NewConcreteAccountFromSecret("accNew") + balance := uint64(24) + accNew.Balance = balance + err := cache.UpdateAccount(accNew.Account()) + require.NoError(t, err) + + // Check cache + accNewOut, err := cache.GetAccount(accNew.Address) + require.NoError(t, err) + assert.Equal(t, balance, accNewOut.Balance()) + + // Check not stored in backend + accNewOut, err = backend.GetAccount(accNew.Address) + require.NoError(t, err) + assert.Nil(t, accNewOut) + + // Check syncs to backend + err = cache.Sync(backend) + require.NoError(t, err) + accNewOut, err = backend.GetAccount(accNew.Address) + require.NoError(t, err) + assert.Equal(t, balance, accNewOut.Balance()) + + // Alter in cache + newBalance := uint64(100029) + accNew.Balance = newBalance + err = cache.UpdateAccount(accNew.Account()) + require.NoError(t, err) + + // Check cache + accNewOut, err = cache.GetAccount(accNew.Address) + require.NoError(t, err) + assert.Equal(t, newBalance, accNewOut.Balance()) + + // Check backend unchanged + accNewOut, err = backend.GetAccount(accNew.Address) + require.NoError(t, err) + assert.Equal(t, balance, accNewOut.Balance()) } func TestStateCache_RemoveAccount(t *testing.T) { @@ -54,7 +92,30 @@ func TestStateCache_Sync(t *testing.T) { func TestStateCache_get(t *testing.T) { } -// TODO: write tests as part of feature branch +func testAccounts() *testState { + acc1 := acm.NewConcreteAccountFromSecret("acc1") + acc1.Permissions.Base.Perms = permission.AddRole | permission.Send + acc1.Permissions.Base.SetBit = acc1.Permissions.Base.Perms + + acc2 := acm.NewConcreteAccountFromSecret("acc2") + acc2.Permissions.Base.Perms = permission.AddRole | permission.Send + acc2.Permissions.Base.SetBit = acc1.Permissions.Base.Perms + acc2.Code, _ = acm.NewBytecode(asm.PUSH1, 0x20) + + cache := combine( + account(acc1.Account(), "I AM A KEY", "NO YOU ARE A KEY"), + account(acc2.Account(), "ducks", "have lucks", + "chickens", "just cluck"), + ) + return cache +} + +func addressOf(secret string) acm.Address { + return acm.NewConcreteAccountFromSecret(secret).Address +} + +// testState StateIterable + type testState struct { Accounts map[acm.Address]acm.Account Storage map[acm.Address]map[binary.Word256]binary.Word256 -- GitLab