poll.InitWSA()
}
-// checkFileIsNotPartOfNetpoll verifies that f is not managed by netpoll.
-func checkFileIsNotPartOfNetpoll(t *testing.T, f *os.File) {
- t.Helper()
- sc, err := f.SyscallConn()
- if err != nil {
- t.Fatal(err)
- }
- if err := sc.Control(func(fd uintptr) {
- // Only try to associate the file with an IOCP if the handle is opened for overlapped I/O,
- // else the association will always fail.
- overlapped, err := windows.IsNonblock(syscall.Handle(fd))
- if err != nil {
- t.Fatalf("%v fd=%v: %v", f.Name(), fd, err)
- }
- if overlapped {
- // If the file is part of netpoll, then associating it with another IOCP should fail.
- if _, err := windows.CreateIoCompletionPort(syscall.Handle(fd), 0, 0, 1); err != nil {
- t.Fatalf("%v fd=%v: is part of netpoll, but should not be: %v", f.Name(), fd, err)
- }
- }
- }); err != nil {
- t.Fatalf("%v fd=%v: is not initialized", f.Name(), f.Fd())
- }
-}
-
-func TestFileFdsAreInitialised(t *testing.T) {
- t.Parallel()
- exe, err := os.Executable()
- if err != nil {
- t.Fatal(err)
- }
- f, err := os.Open(exe)
- if err != nil {
- t.Fatal(err)
- }
- defer f.Close()
-
- checkFileIsNotPartOfNetpoll(t, f)
-}
-
-func TestSerialFdsAreInitialised(t *testing.T) {
- t.Parallel()
- for _, name := range []string{"COM1", "COM2", "COM3", "COM4"} {
- t.Run(name, func(t *testing.T) {
- t.Parallel()
- h, err := syscall.CreateFile(syscall.StringToUTF16Ptr(name),
- syscall.GENERIC_READ|syscall.GENERIC_WRITE,
- 0,
- nil,
- syscall.OPEN_EXISTING,
- syscall.FILE_ATTRIBUTE_NORMAL|syscall.FILE_FLAG_OVERLAPPED,
- 0)
- if err != nil {
- if errno, ok := err.(syscall.Errno); ok {
- switch errno {
- case syscall.ERROR_FILE_NOT_FOUND,
- syscall.ERROR_ACCESS_DENIED:
- t.Log("Skipping: ", err)
- return
- }
- }
- t.Fatal(err)
- }
- f := os.NewFile(uintptr(h), name)
- defer f.Close()
-
- checkFileIsNotPartOfNetpoll(t, f)
- })
- }
-}
-
func TestWSASocketConflict(t *testing.T) {
t.Parallel()
s, err := windows.WSASocket(syscall.AF_INET, syscall.SOCK_STREAM, syscall.IPPROTO_TCP, nil, 0, windows.WSA_FLAG_OVERLAPPED)