// Copyright 2024 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. package os_test import ( "internal/testenv" "os" "os/signal" "runtime" "syscall" "testing" "time" ) func TestProcessLiteral(t *testing.T) { if runtime.GOOS == "windows" { t.Skip("Process literals do not work on Windows. FindProcess/etc must initialize the process handle") } if runtime.GOARCH == "wasm" { t.Skip("Signals send + notify not fully supported om wasm port") } c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) defer signal.Stop(c) p := &os.Process{Pid: os.Getpid()} if err := p.Signal(os.Interrupt); err != nil { t.Fatalf("Signal got err %v, want nil", err) } // Verify we actually received the signal. select { case <-time.After(1 * time.Second): t.Error("timeout waiting for signal") case <-c: // Good } } func TestProcessReleaseTwice(t *testing.T) { testenv.MustHaveGoBuild(t) t.Parallel() r, w, err := os.Pipe() if err != nil { t.Fatalf("Pipe() got err %v, want nil", err) } defer r.Close() defer w.Close() p, err := os.StartProcess(testenv.GoToolPath(t), []string{"go"}, &os.ProcAttr{ // N.B. On Windows, StartProcess requires exactly 3 Files. Pass // in a dummy pipe to avoid irrelevant output on the test stdout. Files: []*os.File{r, w, w}, }) if err != nil { t.Fatalf("starting test process: %v", err) } if err := p.Release(); err != nil { t.Fatalf("first Release: got err %v, want nil", err) } err = p.Release() // We want EINVAL from a second Release call only on Windows. var want error if runtime.GOOS == "windows" { want = syscall.EINVAL } if err != want { t.Fatalf("second Release: got err %v, want %v", err, want) } }