github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/os/exec/exec_posix_test.go (about) 1 // Copyright 2017 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 aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris 6 // +build aix darwin dragonfly freebsd linux netbsd openbsd solaris 7 8 package exec_test 9 10 import ( 11 "os/user" 12 "runtime" 13 "strconv" 14 "syscall" 15 "testing" 16 "time" 17 ) 18 19 func TestCredentialNoSetGroups(t *testing.T) { 20 if runtime.GOOS == "android" { 21 t.Skip("unsupported on Android") 22 } 23 24 u, err := user.Current() 25 if err != nil { 26 t.Fatalf("error getting current user: %v", err) 27 } 28 29 uid, err := strconv.Atoi(u.Uid) 30 if err != nil { 31 t.Fatalf("error converting Uid=%s to integer: %v", u.Uid, err) 32 } 33 34 gid, err := strconv.Atoi(u.Gid) 35 if err != nil { 36 t.Fatalf("error converting Gid=%s to integer: %v", u.Gid, err) 37 } 38 39 // If NoSetGroups is true, setgroups isn't called and cmd.Run should succeed 40 cmd := helperCommand(t, "echo", "foo") 41 cmd.SysProcAttr = &syscall.SysProcAttr{ 42 Credential: &syscall.Credential{ 43 Uid: uint32(uid), 44 Gid: uint32(gid), 45 NoSetGroups: true, 46 }, 47 } 48 49 if err = cmd.Run(); err != nil { 50 t.Errorf("Failed to run command: %v", err) 51 } 52 } 53 54 // For issue #19314: make sure that SIGSTOP does not cause the process 55 // to appear done. 56 func TestWaitid(t *testing.T) { 57 t.Parallel() 58 59 cmd := helperCommand(t, "sleep") 60 if err := cmd.Start(); err != nil { 61 t.Fatal(err) 62 } 63 64 // The sleeps here are unnecessary in the sense that the test 65 // should still pass, but they are useful to make it more 66 // likely that we are testing the expected state of the child. 67 time.Sleep(100 * time.Millisecond) 68 69 if err := cmd.Process.Signal(syscall.SIGSTOP); err != nil { 70 cmd.Process.Kill() 71 t.Fatal(err) 72 } 73 74 ch := make(chan error) 75 go func() { 76 ch <- cmd.Wait() 77 }() 78 79 time.Sleep(100 * time.Millisecond) 80 81 if err := cmd.Process.Signal(syscall.SIGCONT); err != nil { 82 t.Error(err) 83 syscall.Kill(cmd.Process.Pid, syscall.SIGCONT) 84 } 85 86 cmd.Process.Kill() 87 88 <-ch 89 }