85 lines
2.0 KiB
Go
85 lines
2.0 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package comm
|
|
|
|
import (
|
|
"sync/atomic"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/hyperledger/fabric/gossip/metrics"
|
|
"github.com/hyperledger/fabric/gossip/metrics/mocks"
|
|
"github.com/hyperledger/fabric/gossip/util"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func newCommInstanceWithMetrics(t *testing.T, sec *naiveSecProvider, metrics *metrics.CommMetrics) (c Comm, port int) {
|
|
port, gRPCServer, certs, secureDialOpts, dialOpts := util.CreateGRPCLayer()
|
|
comm := newCommInstanceOnlyWithMetrics(t, metrics, sec, gRPCServer, certs, secureDialOpts, dialOpts...)
|
|
return comm, port
|
|
}
|
|
|
|
func TestMetrics(t *testing.T) {
|
|
testMetricProvider := mocks.TestUtilConstructMetricProvider()
|
|
|
|
var overflown uint32
|
|
testMetricProvider.FakeBufferOverflow.AddStub = func(delta float64) {
|
|
atomic.StoreUint32(&overflown, uint32(1))
|
|
}
|
|
|
|
fakeCommMetrics := metrics.NewGossipMetrics(testMetricProvider.FakeProvider).CommMetrics
|
|
|
|
comm1, _ := newCommInstanceWithMetrics(t, naiveSec, fakeCommMetrics)
|
|
comm2, port2 := newCommInstanceWithMetrics(t, naiveSec, fakeCommMetrics)
|
|
defer comm1.Stop()
|
|
defer comm2.Stop()
|
|
|
|
// Establish preliminary connection
|
|
fromComm1 := comm2.Accept(acceptAll)
|
|
comm1.Send(createGossipMsg(), remotePeer(port2))
|
|
<-fromComm1
|
|
|
|
// Drain messages slowly by comm2
|
|
drainMessages := func() {
|
|
for {
|
|
msg := <-fromComm1
|
|
time.Sleep(time.Millisecond)
|
|
if msg == nil {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
go drainMessages()
|
|
|
|
// Send messages until the buffer overflow event emission is detected
|
|
for {
|
|
comm1.Send(createGossipMsg(), remotePeer(port2))
|
|
if atomic.LoadUint32(&overflown) == uint32(1) {
|
|
t.Log("Buffer overflow detected")
|
|
break
|
|
}
|
|
}
|
|
|
|
require.EqualValues(t,
|
|
1,
|
|
testMetricProvider.FakeSentMessages.AddArgsForCall(0),
|
|
)
|
|
|
|
require.EqualValues(t,
|
|
1,
|
|
testMetricProvider.FakeReceivedMessages.AddArgsForCall(0),
|
|
)
|
|
|
|
require.EqualValues(t,
|
|
1,
|
|
testMetricProvider.FakeBufferOverflow.AddArgsForCall(0),
|
|
)
|
|
|
|
require.Equal(t, uint32(1), atomic.LoadUint32(&overflown))
|
|
}
|