github.com/MetalBlockchain/metalgo@v1.11.9/network/peer/message_queue_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package peer
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/MetalBlockchain/metalgo/ids"
    13  	"github.com/MetalBlockchain/metalgo/message"
    14  	"github.com/MetalBlockchain/metalgo/proto/pb/p2p"
    15  	"github.com/MetalBlockchain/metalgo/utils/logging"
    16  )
    17  
    18  func TestMessageQueue(t *testing.T) {
    19  	require := require.New(t)
    20  
    21  	expectFail := false
    22  	q := NewBlockingMessageQueue(
    23  		SendFailedFunc(func(message.OutboundMessage) {
    24  			require.True(expectFail)
    25  		}),
    26  		logging.NoLog{},
    27  		0,
    28  	)
    29  
    30  	mc := newMessageCreator(t)
    31  	msgs := []message.OutboundMessage{}
    32  	numToSend := 10
    33  
    34  	// Assert that the messages are popped in the same order they were pushed
    35  	for i := 0; i < numToSend; i++ {
    36  		testID := ids.GenerateTestID()
    37  		testID2 := ids.GenerateTestID()
    38  		m, err := mc.Ping(
    39  			uint32(i),
    40  			[]*p2p.SubnetUptime{
    41  				{SubnetId: testID[:], Uptime: uint32(i)},
    42  				{SubnetId: testID2[:], Uptime: uint32(i)},
    43  			})
    44  		require.NoError(err)
    45  		msgs = append(msgs, m)
    46  	}
    47  
    48  	go func() {
    49  		for i := 0; i < numToSend; i++ {
    50  			q.Push(context.Background(), msgs[i])
    51  		}
    52  	}()
    53  
    54  	for i := 0; i < numToSend; i++ {
    55  		msg, ok := q.Pop()
    56  		require.True(ok)
    57  		require.Equal(msgs[i], msg)
    58  	}
    59  
    60  	// Assert that PopNow returns false when the queue is empty
    61  	_, ok := q.PopNow()
    62  	require.False(ok)
    63  
    64  	// Assert that Push returns false when the context is canceled
    65  	ctx, cancel := context.WithCancel(context.Background())
    66  	cancel()
    67  	expectFail = true
    68  	done := make(chan struct{})
    69  	go func() {
    70  		ok := q.Push(ctx, msgs[0])
    71  		require.False(ok)
    72  		close(done)
    73  	}()
    74  	<-done
    75  
    76  	// Assert that Push returns false when the queue is closed
    77  	done = make(chan struct{})
    78  	go func() {
    79  		ok := q.Push(context.Background(), msgs[0])
    80  		require.False(ok)
    81  		close(done)
    82  	}()
    83  	q.Close()
    84  	<-done
    85  
    86  	// Assert Pop returns false when the queue is closed
    87  	_, ok = q.Pop()
    88  	require.False(ok)
    89  }