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 }