Source file src/os/exec_test.go

     1  // Copyright 2024 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.
     4  
     5  package os_test
     6  
     7  import (
     8  	"internal/testenv"
     9  	"os"
    10  	"os/signal"
    11  	"runtime"
    12  	"syscall"
    13  	"testing"
    14  	"time"
    15  )
    16  
    17  func TestProcessLiteral(t *testing.T) {
    18  	if runtime.GOOS == "windows" {
    19  		t.Skip("Process literals do not work on Windows. FindProcess/etc must initialize the process handle")
    20  	}
    21  	if runtime.GOARCH == "wasm" {
    22  		t.Skip("Signals send + notify not fully supported om wasm port")
    23  	}
    24  
    25  	c := make(chan os.Signal, 1)
    26  	signal.Notify(c, os.Interrupt)
    27  	defer signal.Stop(c)
    28  
    29  	p := &os.Process{Pid: os.Getpid()}
    30  	if err := p.Signal(os.Interrupt); err != nil {
    31  		t.Fatalf("Signal got err %v, want nil", err)
    32  	}
    33  
    34  	// Verify we actually received the signal.
    35  	select {
    36  	case <-time.After(1 * time.Second):
    37  		t.Error("timeout waiting for signal")
    38  	case <-c:
    39  		// Good
    40  	}
    41  }
    42  
    43  func TestProcessReleaseTwice(t *testing.T) {
    44  	testenv.MustHaveGoBuild(t)
    45  	t.Parallel()
    46  
    47  	r, w, err := os.Pipe()
    48  	if err != nil {
    49  		t.Fatalf("Pipe() got err %v, want nil", err)
    50  	}
    51  	defer r.Close()
    52  	defer w.Close()
    53  
    54  	p, err := os.StartProcess(testenv.GoToolPath(t), []string{"go"}, &os.ProcAttr{
    55  		// N.B. On Windows, StartProcess requires exactly 3 Files. Pass
    56  		// in a dummy pipe to avoid irrelevant output on the test stdout.
    57  		Files: []*os.File{r, w, w},
    58  	})
    59  	if err != nil {
    60  		t.Fatalf("starting test process: %v", err)
    61  	}
    62  	if err := p.Release(); err != nil {
    63  		t.Fatalf("first Release: got err %v, want nil", err)
    64  	}
    65  
    66  	err = p.Release()
    67  
    68  	// We want EINVAL from a second Release call only on Windows.
    69  	var want error
    70  	if runtime.GOOS == "windows" {
    71  		want = syscall.EINVAL
    72  	}
    73  
    74  	if err != want {
    75  		t.Fatalf("second Release: got err %v, want %v", err, want)
    76  	}
    77  }
    78  

View as plain text