github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/consensus/istanbul/ibft/engine/engine_test.go (about)

     1  package ibftengine
     2  
     3  import (
     4  	"bytes"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/kisexp/xdchain/common"
     9  	"github.com/kisexp/xdchain/common/hexutil"
    10  	"github.com/kisexp/xdchain/consensus/istanbul"
    11  	istanbulcommon "github.com/kisexp/xdchain/consensus/istanbul/common"
    12  	"github.com/kisexp/xdchain/core/types"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestEngine(t *testing.T) {
    18  	engine := NewEngine(nil, common.Address{}, nil)
    19  	require.NotNil(t, engine, "Constructor")
    20  	assert.Implements(t, new(istanbul.Engine), engine)
    21  }
    22  
    23  func TestPrepareExtra(t *testing.T) {
    24  	validators := make([]common.Address, 4)
    25  	validators[0] = common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a"))
    26  	validators[1] = common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212"))
    27  	validators[2] = common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6"))
    28  	validators[3] = common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440"))
    29  
    30  	vanity := make([]byte, types.IstanbulExtraVanity)
    31  	expectedResult := append(vanity, hexutil.MustDecode("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0")...)
    32  
    33  	h := &types.Header{
    34  		Extra: vanity,
    35  	}
    36  
    37  	payload, err := prepareExtra(h, validators)
    38  	if err != nil {
    39  		t.Errorf("error mismatch: have %v, want: nil", err)
    40  	}
    41  	if !reflect.DeepEqual(payload, expectedResult) {
    42  		t.Errorf("payload mismatch: have %v, want %v", payload, expectedResult)
    43  	}
    44  
    45  	// append useless information to extra-data
    46  	h.Extra = append(vanity, make([]byte, 15)...)
    47  
    48  	payload, _ = prepareExtra(h, validators)
    49  	if !reflect.DeepEqual(payload, expectedResult) {
    50  		t.Errorf("payload mismatch: have %v, want %v", payload, expectedResult)
    51  	}
    52  }
    53  
    54  func TestWriteSeal(t *testing.T) {
    55  	vanity := bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity)
    56  	istRawData := hexutil.MustDecode("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0")
    57  	expectedSeal := append([]byte{1, 2, 3}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-3)...)
    58  	expectedIstExtra := &types.IstanbulExtra{
    59  		Validators: []common.Address{
    60  			common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")),
    61  			common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")),
    62  			common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")),
    63  			common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")),
    64  		},
    65  		Seal:          expectedSeal,
    66  		CommittedSeal: [][]byte{},
    67  	}
    68  	var expectedErr error
    69  
    70  	h := &types.Header{
    71  		Extra: append(vanity, istRawData...),
    72  	}
    73  
    74  	// normal case
    75  	err := writeSeal(h, expectedSeal)
    76  	if err != expectedErr {
    77  		t.Errorf("error mismatch: have %v, want %v", err, expectedErr)
    78  	}
    79  
    80  	// verify istanbul extra-data
    81  	istExtra, err := types.ExtractIstanbulExtra(h)
    82  	if err != nil {
    83  		t.Errorf("error mismatch: have %v, want nil", err)
    84  	}
    85  	if !reflect.DeepEqual(istExtra, expectedIstExtra) {
    86  		t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra)
    87  	}
    88  
    89  	// invalid seal
    90  	unexpectedSeal := append(expectedSeal, make([]byte, 1)...)
    91  	err = writeSeal(h, unexpectedSeal)
    92  	if err != istanbulcommon.ErrInvalidSignature {
    93  		t.Errorf("error mismatch: have %v, want %v", err, istanbulcommon.ErrInvalidSignature)
    94  	}
    95  }
    96  
    97  func TestWriteCommittedSeals(t *testing.T) {
    98  	vanity := bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity)
    99  	istRawData := hexutil.MustDecode("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0")
   100  	expectedCommittedSeal := append([]byte{1, 2, 3}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-3)...)
   101  	expectedIstExtra := &types.IstanbulExtra{
   102  		Validators: []common.Address{
   103  			common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")),
   104  			common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")),
   105  			common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")),
   106  			common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")),
   107  		},
   108  		Seal:          []byte{},
   109  		CommittedSeal: [][]byte{expectedCommittedSeal},
   110  	}
   111  	var expectedErr error
   112  
   113  	h := &types.Header{
   114  		Extra: append(vanity, istRawData...),
   115  	}
   116  
   117  	// normal case
   118  	err := writeCommittedSeals(h, [][]byte{expectedCommittedSeal})
   119  	if err != expectedErr {
   120  		t.Errorf("error mismatch: have %v, want %v", err, expectedErr)
   121  	}
   122  
   123  	// verify istanbul extra-data
   124  	istExtra, err := types.ExtractIstanbulExtra(h)
   125  	if err != nil {
   126  		t.Errorf("error mismatch: have %v, want nil", err)
   127  	}
   128  	if !reflect.DeepEqual(istExtra, expectedIstExtra) {
   129  		t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra)
   130  	}
   131  
   132  	// invalid seal
   133  	unexpectedCommittedSeal := append(expectedCommittedSeal, make([]byte, 1)...)
   134  	err = writeCommittedSeals(h, [][]byte{unexpectedCommittedSeal})
   135  	if err != istanbulcommon.ErrInvalidCommittedSeals {
   136  		t.Errorf("error mismatch: have %v, want %v", err, istanbulcommon.ErrInvalidCommittedSeals)
   137  	}
   138  }