]> Sergey Matveev's repositories - btrtrc.git/blobdiff - reuse_test.go
Drop support for go 1.20
[btrtrc.git] / reuse_test.go
index 3adf002f6fbeb07d1edd4c2504ca2c9f8f870e4b..5da4ab8096b922ab6c8a2e1735ee7a87ab2d7a79 100644 (file)
@@ -2,14 +2,12 @@ package torrent
 
 import (
        "context"
-       "errors"
        "net"
        "sync/atomic"
        "syscall"
        "testing"
 
        "github.com/anacrolix/log"
-
        qt "github.com/frankban/quicktest"
 )
 
@@ -20,17 +18,25 @@ func TestTcpPortReuseIsABadIdea(t *testing.T) {
        c.Assert(err, qt.IsNil)
        defer remote.Close()
        dialer := net.Dialer{}
+       // Show that we can't duplicate an existing connection even with various socket options.
        dialer.Control = func(network, address string, c syscall.RawConn) (err error) {
                return c.Control(func(fd uintptr) {
                        err = setReusePortSockOpts(fd)
                })
        }
+       // Tie up a local port to the remote.
        first, err := dialer.Dial("tcp", remote.Addr().String())
        c.Assert(err, qt.IsNil)
        defer first.Close()
+       // Show that dialling the remote with the same local port fails.
        dialer.LocalAddr = first.LocalAddr()
        _, err = dialer.Dial("tcp", remote.Addr().String())
-       c.Assert(errors.Is(err, syscall.EADDRINUSE), qt.IsTrue)
+       c.Assert(err, qt.IsNotNil)
+       // Show that not fixing the local port again allows connections to succeed.
+       dialer.LocalAddr = nil
+       second, err := dialer.Dial("tcp", remote.Addr().String())
+       c.Assert(err, qt.IsNil)
+       second.Close()
 }
 
 // Show that multiple connections from the same local utp socket to the same remote port will
@@ -42,7 +48,9 @@ func TestUtpLocalPortIsReusable(t *testing.T) {
        c.Assert(err, qt.IsNil)
        defer remote.Close()
        var remoteAccepts int32
+       doneAccepting := make(chan struct{})
        go func() {
+               defer close(doneAccepting)
                for {
                        c, err := remote.Accept()
                        if err != nil {
@@ -66,5 +74,6 @@ func TestUtpLocalPortIsReusable(t *testing.T) {
        c.Assert(err, qt.IsNil)
        defer second.Close()
        remote.Close()
+       <-doneAccepting
        c.Assert(atomic.LoadInt32(&remoteAccepts), qt.Equals, int32(2))
 }