7 "github.com/anacrolix/log"
9 "github.com/anacrolix/missinggo/v2"
10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/require"
14 func testListenerNetwork(
16 listenFunc func(net, addr string) (net.Listener, error),
17 expectedNet, givenNet, addr string, validIp4 bool,
19 l, err := listenFunc(givenNet, addr)
20 require.NoError(t, err)
22 assert.EqualValues(t, expectedNet, l.Addr().Network())
23 ip := missinggo.AddrIP(l.Addr())
24 assert.Equal(t, validIp4, ip.To4() != nil, ip)
27 func listenUtpListener(net, addr string) (l net.Listener, err error) {
28 l, err = NewUtpSocket(net, addr, nil, log.Default)
32 func testAcceptedConnAddr(
34 network string, valid4 bool,
35 dial func(addr string) (net.Conn, error),
36 listen func() (net.Listener, error),
39 require.NoError(t, err)
41 done := make(chan struct{})
44 c, err := dial(l.Addr().String())
45 require.NoError(t, err)
50 require.NoError(t, err)
52 assert.EqualValues(t, network, c.RemoteAddr().Network())
53 assert.Equal(t, valid4, missinggo.AddrIP(c.RemoteAddr()).To4() != nil)
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)
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)
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)
75 testAcceptedConnAddr(t, "tcp", false, dialClosure(net.Dial, "tcp"), listenClosure(net.Listen, "tcp6", ":0"))