Fix "PR c++/92804 ICE trying to use concept as a nested-name-specifier"
[official-gcc.git] / libgo / go / syscall / exec_unix_test.go
blob3bd95bd07e4ca2743cf9ebfd2765f5fc4526a7a3
1 // Copyright 2015 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.
5 // +build aix darwin dragonfly freebsd hurd linux netbsd openbsd solaris
7 package syscall_test
9 import (
10 "internal/testenv"
11 "io"
12 "os"
13 "os/exec"
14 "os/signal"
15 "runtime"
16 "syscall"
17 "testing"
18 "unsafe"
21 type command struct {
22 pipe io.WriteCloser
23 proc *exec.Cmd
24 test *testing.T
27 func (c *command) Info() (pid, pgrp int) {
28 pid = c.proc.Process.Pid
30 pgrp, err := syscall.Getpgid(pid)
31 if err != nil {
32 c.test.Fatal(err)
35 return
38 func (c *command) Start() {
39 if err := c.proc.Start(); err != nil {
40 c.test.Fatal(err)
44 func (c *command) Stop() {
45 c.pipe.Close()
46 if err := c.proc.Wait(); err != nil {
47 c.test.Fatal(err)
51 func create(t *testing.T) *command {
52 testenv.MustHaveExec(t)
54 proc := exec.Command("cat")
55 stdin, err := proc.StdinPipe()
56 if err != nil {
57 t.Fatal(err)
60 return &command{stdin, proc, t}
63 func parent() (pid, pgrp int) {
64 return syscall.Getpid(), syscall.Getpgrp()
67 func TestZeroSysProcAttr(t *testing.T) {
68 ppid, ppgrp := parent()
70 cmd := create(t)
72 cmd.Start()
73 defer cmd.Stop()
75 cpid, cpgrp := cmd.Info()
77 if cpid == ppid {
78 t.Fatalf("Parent and child have the same process ID")
81 if cpgrp != ppgrp {
82 t.Fatalf("Child is not in parent's process group")
86 func TestSetpgid(t *testing.T) {
87 ppid, ppgrp := parent()
89 cmd := create(t)
91 cmd.proc.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
92 cmd.Start()
93 defer cmd.Stop()
95 cpid, cpgrp := cmd.Info()
97 if cpid == ppid {
98 t.Fatalf("Parent and child have the same process ID")
101 if cpgrp == ppgrp {
102 t.Fatalf("Parent and child are in the same process group")
105 if cpid != cpgrp {
106 t.Fatalf("Child's process group is not the child's process ID")
110 func TestPgid(t *testing.T) {
111 ppid, ppgrp := parent()
113 cmd1 := create(t)
115 cmd1.proc.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
116 cmd1.Start()
117 defer cmd1.Stop()
119 cpid1, cpgrp1 := cmd1.Info()
121 if cpid1 == ppid {
122 t.Fatalf("Parent and child 1 have the same process ID")
125 if cpgrp1 == ppgrp {
126 t.Fatalf("Parent and child 1 are in the same process group")
129 if cpid1 != cpgrp1 {
130 t.Fatalf("Child 1's process group is not its process ID")
133 cmd2 := create(t)
135 cmd2.proc.SysProcAttr = &syscall.SysProcAttr{
136 Setpgid: true,
137 Pgid: cpgrp1,
139 cmd2.Start()
140 defer cmd2.Stop()
142 cpid2, cpgrp2 := cmd2.Info()
144 if cpid2 == ppid {
145 t.Fatalf("Parent and child 2 have the same process ID")
148 if cpgrp2 == ppgrp {
149 t.Fatalf("Parent and child 2 are in the same process group")
152 if cpid2 == cpgrp2 {
153 t.Fatalf("Child 2's process group is its process ID")
156 if cpid1 == cpid2 {
157 t.Fatalf("Child 1 and 2 have the same process ID")
160 if cpgrp1 != cpgrp2 {
161 t.Fatalf("Child 1 and 2 are not in the same process group")
165 func TestForeground(t *testing.T) {
166 if runtime.GOOS == "hurd" {
167 t.Skip("skipping; TestForeground: fails on GNU/Hurd")
169 signal.Ignore(syscall.SIGTTIN, syscall.SIGTTOU)
171 tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)
172 if err != nil {
173 t.Skipf("Can't test Foreground. Couldn't open /dev/tty: %s", err)
176 fpgrp := syscall.Pid_t(0)
178 errno := syscall.Ioctl(tty.Fd(), syscall.TIOCGPGRP, uintptr(unsafe.Pointer(&fpgrp)))
179 if errno != 0 {
180 t.Fatalf("TIOCGPGRP failed with error code: %s", errno)
183 if fpgrp == 0 {
184 t.Fatalf("Foreground process group is zero")
187 ppid, ppgrp := parent()
189 cmd := create(t)
191 cmd.proc.SysProcAttr = &syscall.SysProcAttr{
192 Ctty: int(tty.Fd()),
193 Foreground: true,
195 cmd.Start()
197 cpid, cpgrp := cmd.Info()
199 if cpid == ppid {
200 t.Fatalf("Parent and child have the same process ID")
203 if cpgrp == ppgrp {
204 t.Fatalf("Parent and child are in the same process group")
207 if cpid != cpgrp {
208 t.Fatalf("Child's process group is not the child's process ID")
211 cmd.Stop()
213 errno = syscall.Ioctl(tty.Fd(), syscall.TIOCSPGRP, uintptr(unsafe.Pointer(&fpgrp)))
214 if errno != 0 {
215 t.Fatalf("TIOCSPGRP failed with error code: %s", errno)
218 signal.Reset()