aboutsummaryrefslogtreecommitdiff
path: root/src/syscall/exec_windows_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/syscall/exec_windows_test.go')
-rw-r--r--src/syscall/exec_windows_test.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/syscall/exec_windows_test.go b/src/syscall/exec_windows_test.go
index eda1d36877..fb2c767c35 100644
--- a/src/syscall/exec_windows_test.go
+++ b/src/syscall/exec_windows_test.go
@@ -5,8 +5,14 @@
package syscall_test
import (
+ "fmt"
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
"syscall"
"testing"
+ "time"
)
func TestEscapeArg(t *testing.T) {
@@ -41,3 +47,70 @@ func TestEscapeArg(t *testing.T) {
}
}
}
+
+func TestChangingProcessParent(t *testing.T) {
+ if os.Getenv("GO_WANT_HELPER_PROCESS") == "parent" {
+ // in parent process
+
+ // Parent does nothign. It is just used as a parent of a child process.
+ time.Sleep(time.Minute)
+ os.Exit(0)
+ }
+
+ if os.Getenv("GO_WANT_HELPER_PROCESS") == "child" {
+ // in child process
+ dumpPath := os.Getenv("GO_WANT_HELPER_PROCESS_FILE")
+ if dumpPath == "" {
+ fmt.Fprintf(os.Stderr, "Dump file path cannot be blank.")
+ os.Exit(1)
+ }
+ err := os.WriteFile(dumpPath, []byte(fmt.Sprintf("%d", os.Getppid())), 0644)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Error writing dump file: %v", err)
+ os.Exit(2)
+ }
+ os.Exit(0)
+ }
+
+ // run parent process
+
+ parent := exec.Command(os.Args[0], "-test.run=TestChangingProcessParent")
+ parent.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=parent")
+ err := parent.Start()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer func() {
+ parent.Process.Kill()
+ parent.Wait()
+ }()
+
+ // run child process
+
+ const _PROCESS_CREATE_PROCESS = 0x0080
+ const _PROCESS_DUP_HANDLE = 0x0040
+ childDumpPath := filepath.Join(t.TempDir(), "ppid.txt")
+ ph, err := syscall.OpenProcess(_PROCESS_CREATE_PROCESS|_PROCESS_DUP_HANDLE|syscall.PROCESS_QUERY_INFORMATION,
+ false, uint32(parent.Process.Pid))
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer syscall.CloseHandle(ph)
+
+ child := exec.Command(os.Args[0], "-test.run=TestChangingProcessParent")
+ child.Env = append(os.Environ(),
+ "GO_WANT_HELPER_PROCESS=child",
+ "GO_WANT_HELPER_PROCESS_FILE="+childDumpPath)
+ child.SysProcAttr = &syscall.SysProcAttr{ParentProcess: ph}
+ childOutput, err := child.CombinedOutput()
+ if err != nil {
+ t.Errorf("child failed: %v: %v", err, string(childOutput))
+ }
+ childOutput, err = ioutil.ReadFile(childDumpPath)
+ if err != nil {
+ t.Fatalf("reading child output failed: %v", err)
+ }
+ if got, want := string(childOutput), fmt.Sprintf("%d", parent.Process.Pid); got != want {
+ t.Fatalf("child output: want %q, got %q", want, got)
+ }
+}