| 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 | } |