go_study/fabric-main/gossip/comm/metrics_test.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))
}