mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2024-12-27 05:57:28 +00:00
adf52465e3
Useful for minimizing merge conflicts when rebasing new geth
264 lines
5.0 KiB
Go
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)
|
|
}
|
|
|
|
}
|
|
}
|