github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/sync/utils_test.go (about)

     1  package sync
     2  
     3  import (
     4  	"math/rand"
     5  	"testing"
     6  
     7  	types "github.com/prysmaticlabs/eth2-types"
     8  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
     9  	"github.com/prysmaticlabs/prysm/proto/eth/v1alpha1/wrapper"
    10  	"github.com/prysmaticlabs/prysm/proto/interfaces"
    11  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
    12  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    13  )
    14  
    15  func TestSortedObj_SortBlocksRoots(t *testing.T) {
    16  	source := rand.NewSource(33)
    17  	randGen := rand.New(source)
    18  	var blks []interfaces.SignedBeaconBlock
    19  	var roots [][32]byte
    20  	randFunc := func() int64 {
    21  		return randGen.Int63n(50)
    22  	}
    23  
    24  	for i := 0; i < 10; i++ {
    25  		slot := types.Slot(randFunc())
    26  		newBlk := wrapper.WrappedPhase0SignedBeaconBlock(&ethpb.SignedBeaconBlock{Block: &ethpb.BeaconBlock{Slot: slot}})
    27  		blks = append(blks, newBlk)
    28  		root := bytesutil.ToBytes32(bytesutil.Bytes32(uint64(slot)))
    29  		roots = append(roots, root)
    30  	}
    31  
    32  	r := &Service{}
    33  
    34  	newBlks, newRoots := r.sortBlocksAndRoots(blks, roots)
    35  
    36  	previousSlot := types.Slot(0)
    37  	for i, b := range newBlks {
    38  		if b.Block().Slot() < previousSlot {
    39  			t.Errorf("Block list is not sorted as %d is smaller than previousSlot %d", b.Block().Slot(), previousSlot)
    40  		}
    41  		if bytesutil.FromBytes8(newRoots[i][:]) != uint64(b.Block().Slot()) {
    42  			t.Errorf("root doesn't match stored slot in block: wanted %d but got %d", b.Block().Slot(), bytesutil.FromBytes8(newRoots[i][:]))
    43  		}
    44  		previousSlot = b.Block().Slot()
    45  	}
    46  }
    47  
    48  func TestSortedObj_NoDuplicates(t *testing.T) {
    49  	source := rand.NewSource(33)
    50  	randGen := rand.New(source)
    51  	var blks []interfaces.SignedBeaconBlock
    52  	var roots [][32]byte
    53  	randFunc := func() int64 {
    54  		return randGen.Int63n(50)
    55  	}
    56  
    57  	for i := 0; i < 10; i++ {
    58  		slot := types.Slot(randFunc())
    59  		newBlk := &ethpb.SignedBeaconBlock{Block: &ethpb.BeaconBlock{Slot: slot}}
    60  		// append twice
    61  		blks = append(blks, wrapper.WrappedPhase0SignedBeaconBlock(newBlk), wrapper.WrappedPhase0SignedBeaconBlock(newBlk))
    62  
    63  		// append twice
    64  		root := bytesutil.ToBytes32(bytesutil.Bytes32(uint64(slot)))
    65  		roots = append(roots, root, root)
    66  	}
    67  
    68  	r := &Service{}
    69  
    70  	newBlks, newRoots, err := r.dedupBlocksAndRoots(blks, roots)
    71  	require.NoError(t, err)
    72  
    73  	rootMap := make(map[[32]byte]bool)
    74  	for i, b := range newBlks {
    75  		if rootMap[newRoots[i]] {
    76  			t.Errorf("Duplicated root exists %#x with block %v", newRoots[i], b)
    77  		}
    78  		rootMap[newRoots[i]] = true
    79  	}
    80  }