| | |
| | |
| | |
| |
|
| | 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) |
| | } |
| |
|
| | |
| | select { |
| | case <-time.After(1 * time.Second): |
| | t.Error("timeout waiting for signal") |
| | case <-c: |
| | |
| | } |
| | } |
| |
|
| | 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{ |
| | |
| | |
| | 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() |
| |
|
| | |
| | var want error |
| | if runtime.GOOS == "windows" { |
| | want = syscall.EINVAL |
| | } |
| |
|
| | if err != want { |
| | t.Fatalf("second Release: got err %v, want %v", err, want) |
| | } |
| | } |
| |
|