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