diff --git a/testsuite/devserver.go b/testsuite/devserver.go index ce90bd591..23054fb6a 100644 --- a/testsuite/devserver.go +++ b/testsuite/devserver.go @@ -109,8 +109,8 @@ func StartDevServer(ctx context.Context, options DevServerOptions) (*DevServer, } args := prepareCommand(&options, host, port, clientOptions.Namespace) - cmd := exec.Command(exePath, args...) - cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + + cmd := newCmd(exePath, args...) clientOptions.Logger.Info("Starting DevServer", "ExePath", exePath, "Args", args) if err := cmd.Start(); err != nil { return nil, fmt.Errorf("failed starting: %w", err) diff --git a/testsuite/interrupt_nonwindows.go b/testsuite/process_nonwindows.go similarity index 85% rename from testsuite/interrupt_nonwindows.go rename to testsuite/process_nonwindows.go index e910fade1..bc51a82a5 100644 --- a/testsuite/interrupt_nonwindows.go +++ b/testsuite/process_nonwindows.go @@ -26,9 +26,17 @@ package testsuite import ( "os" + "os/exec" "syscall" ) +// newCmd creates a new command with the given executable path and arguments. +func newCmd(exePath string, args ...string) *exec.Cmd { + cmd := exec.Command(exePath, args...) + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + return cmd +} + // sendInterrupt sends an interrupt signal to the given process for graceful shutdown. func sendInterrupt(process *os.Process) error { return process.Signal(syscall.SIGINT) diff --git a/testsuite/interrupt_windows.go b/testsuite/process_windows.go similarity index 73% rename from testsuite/interrupt_windows.go rename to testsuite/process_windows.go index 644d424c9..7e1b303db 100644 --- a/testsuite/interrupt_windows.go +++ b/testsuite/process_windows.go @@ -24,41 +24,35 @@ package testsuite import ( "os" + "os/exec" "syscall" "golang.org/x/sys/windows" ) +// newCmd creates a new command with the given executable path and arguments. +func newCmd(exePath string, args ...string) *exec.Cmd { + cmd := exec.Command(exePath, args...) + cmd.SysProcAttr = &syscall.SysProcAttr{ + // isolate the process and signals sent to it from the current console + CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, + } + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + return cmd +} + // sendInterrupt calls the break event on the given process for graceful shutdown. func sendInterrupt(process *os.Process) error { dll, err := windows.LoadDLL("kernel32.dll") if err != nil { return err } - defer dll.Release() - f, err := dll.FindProc("AttachConsole") - if err != nil { - return err - } - r1, _, err := f.Call(uintptr(process.Pid)) - if r1 == 0 && err != syscall.ERROR_ACCESS_DENIED { - return err - } - - f, err = dll.FindProc("SetConsoleCtrlHandler") - if err != nil { - return err - } - r1, _, err = f.Call(0, 1) - if r1 == 0 { - return err - } - f, err = dll.FindProc("GenerateConsoleCtrlEvent") + p, err := dll.FindProc("GenerateConsoleCtrlEvent") if err != nil { return err } - r1, _, err = f.Call(windows.CTRL_BREAK_EVENT, uintptr(process.Pid)) - if r1 == 0 { + r, _, err := p.Call(uintptr(windows.CTRL_BREAK_EVENT), uintptr(process.Pid)) + if r == 0 { return err } return nil