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 }