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  }