liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
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
80
81
82
83
// Copyright 2017 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
 
// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
 
package exec_test
 
import (
   "os/user"
   "strconv"
   "syscall"
   "testing"
   "time"
)
 
func TestCredentialNoSetGroups(t *testing.T) {
   u, err := user.Current()
   if err != nil {
       t.Fatalf("error getting current user: %v", err)
   }
 
   uid, err := strconv.Atoi(u.Uid)
   if err != nil {
       t.Fatalf("error converting Uid=%s to integer: %v", u.Uid, err)
   }
 
   gid, err := strconv.Atoi(u.Gid)
   if err != nil {
       t.Fatalf("error converting Gid=%s to integer: %v", u.Gid, err)
   }
 
   // If NoSetGroups is true, setgroups isn't called and cmd.Run should succeed
   cmd := helperCommand(t, "echo", "foo")
   cmd.SysProcAttr = &syscall.SysProcAttr{
       Credential: &syscall.Credential{
           Uid:         uint32(uid),
           Gid:         uint32(gid),
           NoSetGroups: true,
       },
   }
 
   if err = cmd.Run(); err != nil {
       t.Errorf("Failed to run command: %v", err)
   }
}
 
// For issue #19314: make sure that SIGSTOP does not cause the process
// to appear done.
func TestWaitid(t *testing.T) {
   t.Parallel()
 
   cmd := helperCommand(t, "sleep")
   if err := cmd.Start(); err != nil {
       t.Fatal(err)
   }
 
   // The sleeps here are unnecessary in the sense that the test
   // should still pass, but they are useful to make it more
   // likely that we are testing the expected state of the child.
   time.Sleep(100 * time.Millisecond)
 
   if err := cmd.Process.Signal(syscall.SIGSTOP); err != nil {
       cmd.Process.Kill()
       t.Fatal(err)
   }
 
   ch := make(chan error)
   go func() {
       ch <- cmd.Wait()
   }()
 
   time.Sleep(100 * time.Millisecond)
 
   if err := cmd.Process.Signal(syscall.SIGCONT); err != nil {
       t.Error(err)
       syscall.Kill(cmd.Process.Pid, syscall.SIGCONT)
   }
 
   cmd.Process.Kill()
 
   <-ch
}