master
go 62 lines 1.63 KB
Raw
1 package libp2p
2
3 import (
4 "testing"
5 "testing/synctest"
6 "time"
7
8 "github.com/libp2p/go-libp2p/core/network"
9 rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager"
10 ma "github.com/multiformats/go-multiaddr"
11 "github.com/stretchr/testify/require"
12 "go.uber.org/zap"
13 "go.uber.org/zap/zaptest/observer"
14 )
15
16 func TestLoggingResourceManager(t *testing.T) {
17 synctest.Test(t, func(t *testing.T) {
18 orig := rcmgr.DefaultLimits.AutoScale()
19 limits := orig.ToPartialLimitConfig()
20 limits.System.Conns = 1
21 limits.System.ConnsInbound = 1
22 limits.System.ConnsOutbound = 1
23 limiter := rcmgr.NewFixedLimiter(limits.Build(orig))
24 rm, err := rcmgr.NewResourceManager(limiter)
25 if err != nil {
26 t.Fatal(err)
27 }
28 defer rm.Close()
29
30 oCore, oLogs := observer.New(zap.WarnLevel)
31 oLogger := zap.New(oCore)
32 lrm := &loggingResourceManager{
33 logger: oLogger.Sugar(),
34 delegate: rm,
35 logInterval: 1 * time.Second,
36 }
37
38 // 2 of these should result in resource limit exceeded errors and subsequent log messages
39 for range 3 {
40 _, _ = lrm.OpenConnection(network.DirInbound, false, ma.StringCast("/ip4/127.0.0.1/tcp/1234"))
41 }
42
43 // run the logger which will write an entry for those errors
44 ctx := t.Context()
45 lrm.start(ctx)
46 time.Sleep(3 * time.Second)
47
48 timer := time.NewTimer(1 * time.Second)
49 for {
50 select {
51 case <-timer.C:
52 t.Fatalf("expected logs never arrived")
53 default:
54 if oLogs.Len() == 0 {
55 continue
56 }
57 require.Equal(t, "Protected from exceeding resource limits 2 times. libp2p message: \"system: cannot reserve inbound connection: resource limit exceeded\".", oLogs.All()[0].Message)
58 return
59 }
60 }
61 })
62 }