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  }