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

     1  package p2p
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"sync"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/golang/snappy"
    11  	pubsubpb "github.com/libp2p/go-libp2p-pubsub/pb"
    12  	mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing"
    13  	"github.com/prysmaticlabs/prysm/beacon-chain/p2p/encoder"
    14  	testp2p "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing"
    15  	"github.com/prysmaticlabs/prysm/shared/hashutil"
    16  	"github.com/prysmaticlabs/prysm/shared/params"
    17  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    18  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    19  )
    20  
    21  func TestService_PublishToTopicConcurrentMapWrite(t *testing.T) {
    22  	s, err := NewService(context.Background(), &Config{
    23  		StateNotifier: &mock.MockStateNotifier{},
    24  	})
    25  	require.NoError(t, err)
    26  	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
    27  	defer cancel()
    28  
    29  	go s.awaitStateInitialized()
    30  	fd := initializeStateWithForkDigest(ctx, t, s.stateNotifier.StateFeed())
    31  
    32  	if !s.isInitialized() {
    33  		t.Fatal("service was not initialized")
    34  	}
    35  
    36  	// Set up two connected test hosts.
    37  	p0 := testp2p.NewTestP2P(t)
    38  	p1 := testp2p.NewTestP2P(t)
    39  	p0.Connect(p1)
    40  	s.host = p0.BHost
    41  	s.pubsub = p0.PubSub()
    42  
    43  	topic := fmt.Sprintf(BlockSubnetTopicFormat, fd) + "/" + encoder.ProtocolSuffixSSZSnappy
    44  
    45  	// Establish the remote peer to be subscribed to the outgoing topic.
    46  	_, err = p1.SubscribeToTopic(topic)
    47  	require.NoError(t, err)
    48  
    49  	wg := sync.WaitGroup{}
    50  	wg.Add(10)
    51  	for i := 0; i < 10; i++ {
    52  		go func(i int) {
    53  			assert.NoError(t, s.PublishToTopic(ctx, topic, []byte{}))
    54  			wg.Done()
    55  		}(i)
    56  	}
    57  	wg.Wait()
    58  }
    59  
    60  func TestMessageIDFunction_HashesCorrectly(t *testing.T) {
    61  	invalidSnappy := [32]byte{'J', 'U', 'N', 'K'}
    62  	pMsg := &pubsubpb.Message{Data: invalidSnappy[:]}
    63  	hashedData := hashutil.Hash(append(params.BeaconNetworkConfig().MessageDomainInvalidSnappy[:], pMsg.Data...))
    64  	msgID := string(hashedData[:20])
    65  	assert.Equal(t, msgID, msgIDFunction(pMsg), "Got incorrect msg id")
    66  
    67  	validObj := [32]byte{'v', 'a', 'l', 'i', 'd'}
    68  	enc := snappy.Encode(nil, validObj[:])
    69  	nMsg := &pubsubpb.Message{Data: enc}
    70  	hashedData = hashutil.Hash(append(params.BeaconNetworkConfig().MessageDomainValidSnappy[:], validObj[:]...))
    71  	msgID = string(hashedData[:20])
    72  	assert.Equal(t, msgID, msgIDFunction(nMsg), "Got incorrect msg id")
    73  }