erigon-pulse/turbo/trie/witness_operators_test.go
Igor Mandrigin adf52465e3
move ./trie to ./turbo/trie (#1114)
Useful for minimizing merge conflicts when rebasing new geth
2020-09-14 11:33:39 +01:00

264 lines
5.0 KiB
Go

package trie
import (
"bytes"
"math/big"
"testing"
"github.com/ugorji/go/codec"
)
func TestOperatoLoaderByteArray(t *testing.T) {
var cbor codec.CborHandle
var buffer bytes.Buffer
encoder := codec.NewEncoder(&buffer, &cbor)
bytes1 := []byte("test1")
bytes2 := []byte("abcd2")
if err := encoder.Encode(bytes1); err != nil {
t.Error(err)
}
if err := encoder.Encode(bytes2); err != nil {
t.Error(err)
}
loader1 := NewOperatorUnmarshaller(&buffer)
decoded1, err := loader1.ReadByteArray()
if err != nil {
t.Error(err)
}
if !bytes.Equal(decoded1, bytes1) {
t.Errorf("failed to decode bytes, expected %v got %v", bytes1, decoded1)
}
decoded2, err := loader1.ReadByteArray()
if err != nil {
t.Error(err)
}
if !bytes.Equal(decoded2, bytes2) {
t.Errorf("failed to decode bytes, expected %v got %v", bytes1, decoded1)
}
}
func TestAccountBigBalance(t *testing.T) {
key := []byte("l")
balance := big.NewInt(0)
var ok bool
balance, ok = balance.SetString("92233720368547758080", 10)
if !ok {
t.Error("fail to set balance to a large number")
}
acc := &OperatorLeafAccount{
key,
0,
balance,
false,
false,
0,
}
var buff bytes.Buffer
collector := NewOperatorMarshaller(&buff)
err := acc.WriteTo(collector)
if err != nil {
t.Error(err)
}
// discard the opcode
_, err = buff.ReadByte()
if err != nil {
t.Error(err)
}
acc2 := &OperatorLeafAccount{}
loader := NewOperatorUnmarshaller(&buff)
if err := acc2.LoadFrom(loader); err != nil {
t.Error(err)
}
if acc2.Balance.Cmp(acc.Balance) != 0 {
t.Errorf("wrong deserialization of balance (expected: %s got %s)", acc.Balance.String(), acc2.Balance.String())
}
}
func TestAccountCompactWriteTo(t *testing.T) {
key := []byte("l")
acc := &OperatorLeafAccount{
key,
0,
big.NewInt(0),
false,
false,
0,
}
var buff bytes.Buffer
collector := NewOperatorMarshaller(&buff)
err := acc.WriteTo(collector)
if err != nil {
t.Error(err)
}
b := buff.Bytes()
expectedLen := 1 /* opcode */ + 1 /* CBOR prefix for key */ + len(key) + 1 /* flags */
if len(b) != expectedLen {
t.Errorf("unexpected serialization len for default fields, expected %d (no fields seralized), got %d (raw: %v)", expectedLen, len(b), b)
}
}
func TestAccountFullWriteTo(t *testing.T) {
key := []byte("l")
acc := &OperatorLeafAccount{
key,
20,
big.NewInt(10),
true,
true,
0,
}
var buff bytes.Buffer
collector := NewOperatorMarshaller(&buff)
err := acc.WriteTo(collector)
if err != nil {
t.Error(err)
}
b := buff.Bytes()
compactLen := 1 /* opcode */ + 1 /* CBOR prefix for key */ + len(key) + 1 /* flags */
if len(b) <= compactLen {
t.Errorf("unexpected serialization expected to be bigger than %d (fields seralized), got %d (raw: %v)", compactLen, len(b), b)
}
flags := b[3]
expectedFlags := byte(0)
expectedFlags |= flagStorage
expectedFlags |= flagCode
expectedFlags |= flagNonce
expectedFlags |= flagBalance
if flags != expectedFlags {
t.Errorf("unexpected flags value (expected %b, got %b)", expectedFlags, flags)
}
}
func TestAccountPartialNoNonceWriteTo(t *testing.T) {
key := []byte("l")
acc := &OperatorLeafAccount{
key,
0,
big.NewInt(10),
true,
true,
0,
}
var buff bytes.Buffer
collector := NewOperatorMarshaller(&buff)
err := acc.WriteTo(collector)
if err != nil {
t.Error(err)
}
b := buff.Bytes()
compactLen := 1 /* opcode */ + 1 /* CBOR prefix for key */ + len(key) + 1 /* flags */
if len(b) <= compactLen {
t.Errorf("unexpected serialization expected to be bigger than %d (fields seralized), got %d (raw: %v)", compactLen, len(b), b)
}
flags := b[3]
expectedFlags := byte(0)
expectedFlags |= flagStorage
expectedFlags |= flagCode
expectedFlags |= flagBalance
if flags != expectedFlags {
t.Errorf("unexpected flags value (expected %b, got %b)", expectedFlags, flags)
}
}
func TestAccountPartialNoBalanceWriteTo(t *testing.T) {
key := []byte("l")
acc := &OperatorLeafAccount{
key,
22,
big.NewInt(0),
true,
true,
0,
}
var buff bytes.Buffer
collector := NewOperatorMarshaller(&buff)
err := acc.WriteTo(collector)
if err != nil {
t.Error(err)
}
b := buff.Bytes()
compactLen := 1 /* opcode */ + 1 /* CBOR prefix for key */ + len(key) + 1 /* flags */
if len(b) <= compactLen {
t.Errorf("unexpected serialization expected to be bigger than %d (fields seralized), got %d (raw: %v)", compactLen, len(b), b)
}
flags := b[3]
expectedFlags := byte(0)
expectedFlags |= flagStorage
expectedFlags |= flagCode
expectedFlags |= flagNonce
if flags != expectedFlags {
t.Errorf("unexpected flags value (expected %b, got %b)", expectedFlags, flags)
}
}
func TestKeySerialization(t *testing.T) {
for _, key := range [][]byte{
{1, 16},
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5, 6},
{},
{3, 9, 1},
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 15, 15, 15, 15},
{1},
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 15, 15, 15, 16},
} {
b := keyNibblesToBytes(key)
key2 := keyBytesToNibbles(b)
if !bytes.Equal(key, key2) {
t.Errorf("wrong deserialization, expected %x got %x", key, key2)
}
}
}