From 4b784f05d49c684139562fd34f1bd151b7b6adb8 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 22 Mar 2023 12:47:26 +1100 Subject: [PATCH] tests: add a stream read deadline transport test --- p2p/test/transport/integration_test.go | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/p2p/test/transport/integration_test.go b/p2p/test/transport/integration_test.go index 7eb084a2e3..578c68d087 100644 --- a/p2p/test/transport/integration_test.go +++ b/p2p/test/transport/integration_test.go @@ -6,8 +6,10 @@ import ( "crypto/rand" "fmt" "io" + "net" "sync" "testing" + "time" "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p/config" @@ -326,3 +328,39 @@ func TestDialerStreamResets(t *testing.T) { }) } } + +func TestStreamReadDeadline(t *testing.T) { + for _, tc := range transportsToTest { + t.Run(tc.Name, func(t *testing.T) { + h1 := tc.HostGenerator(t, TransportTestCaseOpts{}) + h2 := tc.HostGenerator(t, TransportTestCaseOpts{NoListen: true}) + + require.NoError(t, h2.Connect(context.Background(), peer.AddrInfo{ + ID: h1.ID(), + Addrs: h1.Addrs(), + })) + + h1.SetStreamHandler("echo", func(s network.Stream) { + io.Copy(s, s) + }) + + s, err := h2.NewStream(context.Background(), h1.ID(), "echo") + require.NoError(t, err) + require.NoError(t, s.SetReadDeadline(time.Now().Add(100*time.Millisecond))) + _, err = s.Read([]byte{0}) + require.Error(t, err) + require.Contains(t, err.Error(), "deadline") + nerr, ok := err.(net.Error) + require.True(t, ok, "expected a net.Error") + require.True(t, nerr.Timeout(), "expected net.Error.Timeout() == true") + // now test that the stream is still usable + s.SetReadDeadline(time.Time{}) + _, err = s.Write([]byte("foobar")) + require.NoError(t, err) + b := make([]byte, 6) + _, err = s.Read(b) + require.Equal(t, "foobar", string(b)) + require.NoError(t, err) + }) + } +}