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