]> Sergey Matveev's repositories - btrtrc.git/blob - network_test.go
Drop support for go 1.20
[btrtrc.git] / network_test.go
1 package torrent
2
3 import (
4         "net"
5         "testing"
6
7         "github.com/anacrolix/log"
8         "github.com/anacrolix/missinggo/v2"
9         "github.com/stretchr/testify/assert"
10         "github.com/stretchr/testify/require"
11 )
12
13 func testListenerNetwork(
14         t *testing.T,
15         listenFunc func(net, addr string) (net.Listener, error),
16         expectedNet, givenNet, addr string, validIp4 bool,
17 ) {
18         l, err := listenFunc(givenNet, addr)
19         require.NoError(t, err)
20         defer l.Close()
21         assert.EqualValues(t, expectedNet, l.Addr().Network())
22         ip := missinggo.AddrIP(l.Addr())
23         assert.Equal(t, validIp4, ip.To4() != nil, ip)
24 }
25
26 func listenUtpListener(net, addr string) (l net.Listener, err error) {
27         l, err = NewUtpSocket(net, addr, nil, log.Default)
28         return
29 }
30
31 func testAcceptedConnAddr(
32         t *testing.T,
33         network string, valid4 bool,
34         dial func(addr string) (net.Conn, error),
35         listen func() (net.Listener, error),
36 ) {
37         l, err := listen()
38         require.NoError(t, err)
39         defer l.Close()
40         done := make(chan struct{})
41         defer close(done)
42         go func() {
43                 c, err := dial(l.Addr().String())
44                 require.NoError(t, err)
45                 <-done
46                 c.Close()
47         }()
48         c, err := l.Accept()
49         require.NoError(t, err)
50         defer c.Close()
51         assert.EqualValues(t, network, c.RemoteAddr().Network())
52         assert.Equal(t, valid4, missinggo.AddrIP(c.RemoteAddr()).To4() != nil)
53 }
54
55 func listenClosure(rawListenFunc func(string, string) (net.Listener, error), network, addr string) func() (net.Listener, error) {
56         return func() (net.Listener, error) {
57                 return rawListenFunc(network, addr)
58         }
59 }
60
61 func dialClosure(f func(net, addr string) (net.Conn, error), network string) func(addr string) (net.Conn, error) {
62         return func(addr string) (net.Conn, error) {
63                 return f(network, addr)
64         }
65 }
66
67 func TestListenLocalhostNetwork(t *testing.T) {
68         testListenerNetwork(t, net.Listen, "tcp", "tcp", "0.0.0.0:0", false)
69         testListenerNetwork(t, net.Listen, "tcp", "tcp", "[::1]:0", false)
70         testListenerNetwork(t, listenUtpListener, "udp", "udp6", "[::1]:0", false)
71         testListenerNetwork(t, listenUtpListener, "udp", "udp6", "[::]:0", false)
72         testListenerNetwork(t, listenUtpListener, "udp", "udp4", "localhost:0", true)
73
74         testAcceptedConnAddr(
75                 t,
76                 "tcp",
77                 false,
78                 dialClosure(net.Dial, "tcp"),
79                 listenClosure(net.Listen, "tcp6", "localhost:0"),
80         )
81 }