Repository navigation
Expand file tree
/
Copy pathsource_descriptor_close_test.go
More file actions
79 lines (62 loc) · 2.45 KB
/
Copy pathsource_descriptor_close_test.go
File metadata and controls
79 lines (62 loc) · 2.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//go:build !windows
package starter_test
import (
"net"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
starter "github.com/lestrrat-go/server-starter/v2"
)
func TestListenerConversionClosesSourceFile(t *testing.T) {
t.Run("TCP", func(t *testing.T) {
source, err := net.ListenTCP("tcp", &net.TCPAddr{IP: net.ParseIP("127.0.0.1")})
require.NoError(t, err)
file, err := source.File()
require.NoError(t, err)
t.Cleanup(func() { _ = file.Close() })
address := source.Addr().(*net.TCPAddr)
require.NoError(t, source.Close())
listener, err := starter.NewTCPListener(address.IP.String(), address.Port, file.Fd()).Listen()
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, listener.Close()) })
require.Error(t, file.Close())
})
t.Run("UDP", func(t *testing.T) {
source, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("127.0.0.1")})
require.NoError(t, err)
file, err := source.File()
require.NoError(t, err)
t.Cleanup(func() { _ = file.Close() })
address := source.LocalAddr().(*net.UDPAddr)
require.NoError(t, source.Close())
packetConn, err := starter.NewUDPListener(address.IP.String(), address.Port, file.Fd()).ListenPacket()
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, packetConn.Close()) })
require.Error(t, file.Close())
})
t.Run("unix", func(t *testing.T) {
path := filepath.Join(t.TempDir(), "listener.sock")
source, err := net.ListenUnix("unix", &net.UnixAddr{Name: path, Net: "unix"})
require.NoError(t, err)
file, err := source.File()
require.NoError(t, err)
t.Cleanup(func() { _ = file.Close() })
require.NoError(t, source.Close())
listener, err := starter.NewUnixListener(path, file.Fd()).Listen()
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, listener.Close()) })
require.Error(t, file.Close())
})
}
func TestListenerConversionRejectsInvalidFileDescriptor(t *testing.T) {
invalidFD := ^uintptr(0)
listener, err := starter.NewTCPListener("127.0.0.1", 8080, invalidFD).Listen()
require.Nil(t, listener)
require.ErrorContains(t, err, "invalid TCP listener file descriptor")
packetConn, err := starter.NewUDPListener("127.0.0.1", 8080, invalidFD).ListenPacket()
require.Nil(t, packetConn)
require.ErrorContains(t, err, "invalid UDP listener file descriptor")
listener, err = starter.NewUnixListener("listener.sock", invalidFD).Listen()
require.Nil(t, listener)
require.ErrorContains(t, err, "invalid unix listener file descriptor")
}