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