bitxhub/internal/ledger/state_accessor_test.go

129 lines
3.4 KiB
Go

package ledger
import (
"io/ioutil"
"testing"
"github.com/meshplus/bitxhub-kit/bytesutil"
"github.com/meshplus/bitxhub-kit/log"
"github.com/meshplus/bitxhub-kit/types"
"github.com/meshplus/bitxhub/pkg/storage/leveldb"
"github.com/stretchr/testify/assert"
)
func TestChainLedger_QueryByPrefix(t *testing.T) {
repoRoot, err := ioutil.TempDir("", "ledger_commit")
assert.Nil(t, err)
blockStorage, err := leveldb.New(repoRoot)
assert.Nil(t, err)
ledger, err := New(repoRoot, blockStorage, log.NewWithModule("executor"))
assert.Nil(t, err)
addr := types.Bytes2Address(bytesutil.LeftPadBytes([]byte{1}, 20))
key0 := []byte{100, 100}
key1 := []byte{100, 101}
key2 := []byte{100, 102}
ledger.SetState(addr, key0, []byte("0"))
ledger.SetState(addr, key1, []byte("1"))
ledger.SetState(addr, key2, []byte("2"))
_, err = ledger.Commit(1)
assert.Nil(t, err)
ok, vals := ledger.QueryByPrefix(addr, string([]byte{100}))
assert.True(t, ok)
assert.Equal(t, 3, len(vals))
assert.Equal(t, []byte("0"), vals[0])
assert.Equal(t, []byte("1"), vals[1])
assert.Equal(t, []byte("2"), vals[2])
}
func TestChainLedger_GetAccount(t *testing.T) {
repoRoot, err := ioutil.TempDir("", "ledger_commit")
assert.Nil(t, err)
blockStorage, err := leveldb.New(repoRoot)
assert.Nil(t, err)
ledger, err := New(repoRoot, blockStorage, log.NewWithModule("executor"))
assert.Nil(t, err)
addr := types.Bytes2Address(bytesutil.LeftPadBytes([]byte{1}, 20))
code := bytesutil.LeftPadBytes([]byte{1}, 120)
key0 := []byte{100, 100}
key1 := []byte{100, 101}
account := ledger.GetOrCreateAccount(addr)
account.SetBalance(1)
account.SetNonce(2)
account.SetCodeAndHash(code)
account.SetState(key0, key1)
account.SetState(key1, key0)
_, err = ledger.Commit(1)
assert.Nil(t, err)
account1 := ledger.GetAccount(addr)
assert.Equal(t, account.GetBalance(), ledger.GetBalance(addr))
assert.Equal(t, account.GetBalance(), account1.GetBalance())
assert.Equal(t, account.GetNonce(), account1.GetNonce())
assert.Equal(t, account.CodeHash(), account1.CodeHash())
assert.Equal(t, account.Code(), account1.Code())
ok0, val0 := account.GetState(key0)
ok1, val1 := account.GetState(key1)
assert.Equal(t, ok0, ok1)
assert.Equal(t, val0, key1)
assert.Equal(t, val1, key0)
key2 := []byte{100, 102}
val2 := []byte{111}
ledger.SetState(addr, key0, val0)
ledger.SetState(addr, key2, val2)
ledger.SetState(addr, key0, val1)
_, err = ledger.Commit(2)
assert.Nil(t, err)
ledger.SetState(addr, key0, val0)
ledger.SetState(addr, key0, val1)
_, err = ledger.Commit(3)
assert.Nil(t, err)
ok, val := ledger.GetState(addr, key0)
assert.True(t, ok)
assert.Equal(t, val1, val)
}
func TestChainLedger_GetCode(t *testing.T) {
repoRoot, err := ioutil.TempDir("", "ledger_commit")
assert.Nil(t, err)
blockStorage, err := leveldb.New(repoRoot)
assert.Nil(t, err)
ledger, err := New(repoRoot, blockStorage, log.NewWithModule("executor"))
assert.Nil(t, err)
addr := types.Bytes2Address(bytesutil.LeftPadBytes([]byte{1}, 20))
key0 := []byte{100, 100}
key1 := []byte{100, 101}
key2 := []byte{100, 102}
ledger.SetState(addr, key0, []byte("0"))
ledger.SetState(addr, key1, []byte("1"))
ledger.SetState(addr, key2, []byte("2"))
code := bytesutil.LeftPadBytes([]byte{10}, 120)
ledger.SetCode(addr, code)
_, err = ledger.Commit(1)
assert.Nil(t, err)
vals := ledger.GetCode(addr)
assert.Equal(t, code, vals)
_, err = ledger.Commit(2)
assert.Nil(t, err)
vals = ledger.GetCode(addr)
assert.Equal(t, code, vals)
}