github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/gossip/emitter/parent_test.go (about) 1 package emitter 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/golang/mock/gomock" 8 "github.com/stretchr/testify/require" 9 10 "github.com/unicornultrafoundation/go-helios/emitter/ancestor" 11 "github.com/unicornultrafoundation/go-helios/hash" 12 "github.com/unicornultrafoundation/go-helios/native/idx" 13 "github.com/unicornultrafoundation/go-helios/native/pos" 14 "github.com/unicornultrafoundation/go-helios/u2udb/memorydb" 15 16 "github.com/unicornultrafoundation/go-u2u/gossip/emitter/mock" 17 "github.com/unicornultrafoundation/go-u2u/integration/makefakegenesis" 18 "github.com/unicornultrafoundation/go-u2u/native" 19 "github.com/unicornultrafoundation/go-u2u/u2u" 20 "github.com/unicornultrafoundation/go-u2u/vecmt" 21 ) 22 23 func TestParents(t *testing.T) { 24 cfg := DefaultConfig() 25 gValidators := makefakegenesis.GetFakeValidators(3) 26 vv := pos.NewBuilder() 27 for _, v := range gValidators { 28 vv.Set(v.ID, pos.Weight(1)) 29 } 30 validators := vv.Build() 31 cfg.Validator.ID = gValidators[0].ID 32 33 ctrl := gomock.NewController(t) 34 external := mock.NewMockExternal(ctrl) 35 txPool := mock.NewMockTxPool(ctrl) 36 signer := mock.NewMockSigner(ctrl) 37 txSigner := mock.NewMockTxSigner(ctrl) 38 39 external.EXPECT().Lock(). 40 AnyTimes() 41 external.EXPECT().Unlock(). 42 AnyTimes() 43 external.EXPECT().DagIndex(). 44 Return(func() *vecmt.Index { 45 vi := vecmt.NewIndex(func(err error) { panic(err) }, vecmt.LiteConfig()) 46 vi.Reset(validators, memorydb.New(), nil) 47 return vi 48 }()). 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().GetLastEvent(idx.Epoch(2), cfg.Validator.ID). 81 Return(new(hash.Event)). 82 AnyTimes() 83 84 external.EXPECT().GetLastEvent(idx.Epoch(2), gValidators[1].ID). 85 Return((*hash.Event)(nil)). 86 AnyTimes() 87 88 external.EXPECT().GetHeads(idx.Epoch(1)). 89 Return(hash.Events{}). 90 AnyTimes() 91 92 external.EXPECT().GetHeads(idx.Epoch(2)). 93 Return(hash.Events{}). 94 AnyTimes() 95 96 external.EXPECT().GetGenesisTime(). 97 Return(native.Timestamp(uint64(time.Now().UnixNano()))). 98 AnyTimes() 99 100 em.init() 101 }) 102 103 t.Run("build strategies 0 events", func(t *testing.T) { 104 strategies := em.buildSearchStrategies(idx.Event(0)) 105 require.Equal(t, 0, len(strategies)) 106 }) 107 108 t.Run("build strategies 1 event", func(t *testing.T) { 109 strategies := em.buildSearchStrategies(idx.Event(1)) 110 require.Equal(t, 1, len(strategies)) 111 }) 112 113 t.Run("build strategies 4 event", func(t *testing.T) { 114 strategies := em.buildSearchStrategies(idx.Event(4)) 115 require.Equal(t, 4, len(strategies)) 116 }) 117 118 t.Run("build strategies with fcIndexer", func(t *testing.T) { 119 gValidator := makefakegenesis.GetFakeValidators(1) 120 vvNew := pos.NewBuilder() 121 vvNew.Set(gValidator[0].ID, pos.Weight(1)) 122 newValidators := vvNew.Build() 123 124 em.quorumIndexer = nil 125 em.fcIndexer = ancestor.NewFCIndexer(newValidators, em.world.DagIndex(), em.config.Validator.ID) 126 127 strategies := em.buildSearchStrategies(idx.Event(4)) 128 require.Equal(t, 4, len(strategies)) 129 }) 130 131 t.Run("choose parent not selfParent", func(t *testing.T) { 132 event, events, ok := em.chooseParents(idx.Epoch(1), em.config.Validator.ID) 133 require.Equal(t, true, ok) 134 var eventExp *hash.Event 135 require.Equal(t, eventExp, event) 136 require.Equal(t, hash.Events{}, events) 137 }) 138 139 t.Run("choose parent selfParent", func(t *testing.T) { 140 event, events, ok := em.chooseParents(idx.Epoch(2), em.config.Validator.ID) 141 require.Equal(t, true, ok) 142 eventExp := new(hash.Event) 143 require.Equal(t, eventExp, event) 144 require.Equal(t, hash.Events{hash.Event{}}, events) 145 }) 146 }