github.com/anacrolix/torrent@v1.61.0/network_test.go (about) 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 if isUnsupportedNetworkError(err) { 20 return 21 } 22 require.NoError(t, err) 23 defer l.Close() 24 assert.EqualValues(t, expectedNet, l.Addr().Network()) 25 ip := missinggo.AddrIP(l.Addr()) 26 assert.Equal(t, validIp4, ip.To4() != nil, ip) 27 } 28 29 func listenUtpListener(net, addr string) (l net.Listener, err error) { 30 l, err = NewUtpSocket(net, addr, nil, log.Default) 31 return 32 } 33 34 func testAcceptedConnAddr( 35 t *testing.T, 36 network string, valid4 bool, 37 dial func(addr string) (net.Conn, error), 38 listen func() (net.Listener, error), 39 ) { 40 l, err := listen() 41 require.NoError(t, err) 42 defer l.Close() 43 done := make(chan struct{}) 44 defer close(done) 45 go func() { 46 c, err := dial(l.Addr().String()) 47 require.NoError(t, err) 48 <-done 49 c.Close() 50 }() 51 c, err := l.Accept() 52 require.NoError(t, err) 53 defer c.Close() 54 assert.EqualValues(t, network, c.RemoteAddr().Network()) 55 assert.Equal(t, valid4, missinggo.AddrIP(c.RemoteAddr()).To4() == nil) 56 } 57 58 func listenClosure( 59 rawListenFunc func(string, string) (net.Listener, error), 60 network, addr string, 61 ) func() (net.Listener, error) { 62 return func() (net.Listener, error) { 63 return rawListenFunc(network, addr) 64 } 65 } 66 67 func dialClosure(f func(net, addr string) (net.Conn, error), network string) func(addr string) (net.Conn, error) { 68 return func(addr string) (net.Conn, error) { 69 return f(network, addr) 70 } 71 } 72 73 func TestListenLocalhostNetwork(t *testing.T) { 74 testListenerNetwork(t, net.Listen, "tcp", "tcp", "0.0.0.0:0", false) 75 testListenerNetwork(t, net.Listen, "tcp", "tcp", "[::1]:0", false) 76 testListenerNetwork(t, listenUtpListener, "udp", "udp6", "[::1]:0", false) 77 testListenerNetwork(t, listenUtpListener, "udp", "udp6", "[::]:0", false) 78 testListenerNetwork(t, listenUtpListener, "udp", "udp4", "localhost:0", true) 79 80 testAcceptedConnAddr( 81 t, 82 "tcp", 83 false, 84 dialClosure(net.Dial, "tcp"), 85 listenClosure(net.Listen, "tcp4", "localhost:0"), 86 ) 87 }