github.com/giovannyortegon/go@v0.0.0-20220115155912-8890063f5bdd/src/pkg/mod/golang.org/x/sys@v0.0.0-20210927094055-39ccf1dd6fa6/unix/pipe2_test.go (about) 1 // Copyright 2021 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 //go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris 6 // +build dragonfly freebsd linux netbsd openbsd solaris 7 8 package unix_test 9 10 import ( 11 "testing" 12 13 "golang.org/x/sys/unix" 14 ) 15 16 func TestPipe2(t *testing.T) { 17 const s = "hello" 18 var pipes [2]int 19 err := unix.Pipe2(pipes[:], 0) 20 if err != nil { 21 t.Fatalf("pipe2: %v", err) 22 } 23 r := pipes[0] 24 w := pipes[1] 25 go func() { 26 n, err := unix.Write(w, []byte(s)) 27 if err != nil { 28 t.Errorf("bad write: %v", err) 29 return 30 } 31 if n != len(s) { 32 t.Errorf("bad write count: %d", n) 33 return 34 } 35 err = unix.Close(w) 36 if err != nil { 37 t.Errorf("bad close: %v", err) 38 return 39 } 40 }() 41 var buf [10 + len(s)]byte 42 n, err := unix.Read(r, buf[:]) 43 if err != nil { 44 t.Fatalf("bad read: %v", err) 45 } 46 if n != len(s) { 47 t.Fatalf("bad read count: %d", n) 48 } 49 if string(buf[:n]) != s { 50 t.Fatalf("bad contents: %s", string(buf[:n])) 51 } 52 err = unix.Close(r) 53 if err != nil { 54 t.Fatalf("bad close: %v", err) 55 } 56 } 57 58 func checkNonblocking(t *testing.T, fd int, name string) { 59 t.Helper() 60 flags, err := unix.FcntlInt(uintptr(fd), unix.F_GETFL, 0) 61 if err != nil { 62 t.Errorf("fcntl(%s, F_GETFL) failed: %v", name, err) 63 } else if flags&unix.O_NONBLOCK == 0 { 64 t.Errorf("O_NONBLOCK not set in %s flags %#x", name, flags) 65 } 66 } 67 68 func checkCloseonexec(t *testing.T, fd int, name string) { 69 t.Helper() 70 flags, err := unix.FcntlInt(uintptr(fd), unix.F_GETFD, 0) 71 if err != nil { 72 t.Errorf("fcntl(%s, F_GETFD) failed: %v", name, err) 73 } else if flags&unix.FD_CLOEXEC == 0 { 74 t.Errorf("FD_CLOEXEC not set in %s flags %#x", name, flags) 75 } 76 } 77 78 func TestNonblockingPipe2(t *testing.T) { 79 var pipes [2]int 80 err := unix.Pipe2(pipes[:], unix.O_NONBLOCK|unix.O_CLOEXEC) 81 if err != nil { 82 t.Fatalf("pipe2: %v", err) 83 } 84 r := pipes[0] 85 w := pipes[1] 86 defer func() { 87 unix.Close(r) 88 unix.Close(w) 89 }() 90 91 checkNonblocking(t, r, "reader") 92 checkCloseonexec(t, r, "reader") 93 checkNonblocking(t, w, "writer") 94 checkCloseonexec(t, w, "writer") 95 }