github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/gossip/emitter/emitter_test.go (about) 1 package emitter 2 3 import ( 4 "math/big" 5 "testing" 6 "time" 7 8 "github.com/golang/mock/gomock" 9 "github.com/stretchr/testify/require" 10 11 "github.com/unicornultrafoundation/go-helios/hash" 12 "github.com/unicornultrafoundation/go-helios/native/idx" 13 "github.com/unicornultrafoundation/go-helios/native/pos" 14 15 "github.com/unicornultrafoundation/go-u2u/common" 16 "github.com/unicornultrafoundation/go-u2u/core/types" 17 "github.com/unicornultrafoundation/go-u2u/gossip/emitter/mock" 18 "github.com/unicornultrafoundation/go-u2u/integration/makefakegenesis" 19 "github.com/unicornultrafoundation/go-u2u/native" 20 "github.com/unicornultrafoundation/go-u2u/u2u" 21 "github.com/unicornultrafoundation/go-u2u/utils/txtime" 22 "github.com/unicornultrafoundation/go-u2u/vecmt" 23 ) 24 25 //go:generate go run github.com/golang/mock/mockgen -package=mock -destination=mock/world.go github.com/unicornultrafoundation/go-u2u/gossip/emitter External,TxPool,TxSigner,Signer 26 27 func TestEmitter(t *testing.T) { 28 cfg := DefaultConfig() 29 gValidators := makefakegenesis.GetFakeValidators(3) 30 vv := pos.NewBuilder() 31 for _, v := range gValidators { 32 vv.Set(v.ID, pos.Weight(1)) 33 } 34 validators := vv.Build() 35 cfg.Validator.ID = gValidators[0].ID 36 37 ctrl := gomock.NewController(t) 38 external := mock.NewMockExternal(ctrl) 39 txPool := mock.NewMockTxPool(ctrl) 40 signer := mock.NewMockSigner(ctrl) 41 txSigner := mock.NewMockTxSigner(ctrl) 42 43 external.EXPECT().Lock(). 44 AnyTimes() 45 external.EXPECT().Unlock(). 46 AnyTimes() 47 external.EXPECT().DagIndex(). 48 Return((*vecmt.Index)(nil)). 49 AnyTimes() 50 external.EXPECT().IsSynced(). 51 Return(true). 52 AnyTimes() 53 external.EXPECT().PeersNum(). 54 Return(int(3)). 55 AnyTimes() 56 external.EXPECT().StateDB(). 57 Return(nil). 58 AnyTimes() 59 60 em := NewEmitter(cfg, World{ 61 External: external, 62 TxPool: txPool, 63 Signer: signer, 64 TxSigner: txSigner, 65 }) 66 67 t.Run("init", func(t *testing.T) { 68 external.EXPECT().GetRules(). 69 Return(u2u.FakeNetRules()). 70 AnyTimes() 71 72 external.EXPECT().GetEpochValidators(). 73 Return(validators, idx.Epoch(1)). 74 AnyTimes() 75 76 external.EXPECT().GetLastEvent(idx.Epoch(1), cfg.Validator.ID). 77 Return((*hash.Event)(nil)). 78 AnyTimes() 79 80 external.EXPECT().GetGenesisTime(). 81 Return(native.Timestamp(uint64(time.Now().UnixNano()))). 82 AnyTimes() 83 84 em.init() 85 }) 86 87 t.Run("memorizeTxTimes", func(t *testing.T) { 88 txtime.Enabled = true 89 require := require.New(t) 90 tx1 := types.NewTransaction(1, common.Address{}, big.NewInt(1), 1, big.NewInt(1), nil) 91 tx2 := types.NewTransaction(2, common.Address{}, big.NewInt(2), 2, big.NewInt(2), nil) 92 93 txtime.Saw(tx1.Hash(), time.Unix(1, 0)) 94 95 require.Equal(time.Unix(1, 0), txtime.Of(tx1.Hash())) 96 txtime.Saw(tx1.Hash(), time.Unix(2, 0)) 97 require.Equal(time.Unix(1, 0), txtime.Of(tx1.Hash())) 98 txtime.Validated(tx1.Hash(), time.Unix(2, 0)) 99 require.Equal(time.Unix(1, 0), txtime.Of(tx1.Hash())) 100 101 // reversed order 102 txtime.Validated(tx2.Hash(), time.Unix(3, 0)) 103 txtime.Saw(tx2.Hash(), time.Unix(2, 0)) 104 105 require.Equal(time.Unix(3, 0), txtime.Of(tx2.Hash())) 106 txtime.Saw(tx2.Hash(), time.Unix(3, 0)) 107 require.Equal(time.Unix(3, 0), txtime.Of(tx2.Hash())) 108 txtime.Validated(tx2.Hash(), time.Unix(3, 0)) 109 require.Equal(time.Unix(3, 0), txtime.Of(tx2.Hash())) 110 }) 111 112 external.EXPECT().IsBusy().Return(true).Times(1) 113 t.Run("tick", func(t *testing.T) { 114 em.tick() 115 }) 116 117 t.Run("tick", func(t *testing.T) { 118 tx1 := types.NewTransaction(1, common.Address{}, big.NewInt(1), 1, big.NewInt(1), nil) 119 tx2 := types.NewTransaction(2, common.Address{}, big.NewInt(2), 2, big.NewInt(2), nil) 120 121 txPool.EXPECT().Count(). 122 Return(1). 123 AnyTimes() 124 txPool.EXPECT().Pending(true). 125 Return(map[common.Address]types.Transactions{ 126 common.Address{}: {tx1, tx2}, 127 }, nil).AnyTimes() 128 129 external.EXPECT().IsBusy(). 130 Return(false). 131 AnyTimes() 132 external.EXPECT().GetLatestBlockIndex(). 133 Return(idx.Block(0)). 134 AnyTimes() 135 136 txSigner.EXPECT().Sender(tx1). 137 Return(common.Address{}, nil). 138 AnyTimes() 139 txSigner.EXPECT().Sender(tx2). 140 Return(common.Address{}, nil). 141 AnyTimes() 142 em.tick() 143 }) 144 145 }