//go:build !windows package debugger import ( "bytes" "fmt" "os" "os/exec" "path/filepath" "runtime" "strings" "testing" "github.com/creack/pty" "github.com/go-delve/delve/pkg/gobuild" protest "github.com/go-delve/delve/pkg/proc/test" "github.com/go-delve/delve/service/api" ) func TestDebugger_LaunchNoExecutablePerm(t *testing.T) { fixturesDir := protest.FindFixturesDir() buildtestdir := filepath.Join(fixturesDir, "buildtest") debugname := "debug" switchOS := map[string]string{ "darwin": "linux", "windows": "linux", "freebsd": "windows", "linux": "windows", } if runtime.GOARCH == "arm64" && runtime.GOOS == "linux" { t.Setenv("GOARCH", "amd64") } if runtime.GOARCH == "ppc64le" && runtime.GOOS == "linux" { t.Setenv("GOARCH", "amd64") } if runtime.GOARCH == "riscv64" && runtime.GOOS == "linux" { t.Setenv("GOARCH", "amd64") } t.Setenv("GOOS", switchOS[runtime.GOOS]) exepath := filepath.Join(buildtestdir, debugname) defer os.Remove(exepath) if err := gobuild.GoBuild(debugname, []string{buildtestdir}, fmt.Sprintf("-o %s", exepath)); err != nil { t.Fatalf("go build error %v", err) } if err := os.Chmod(exepath, 0644); err != nil { t.Fatal(err) } d := new(Debugger) _, err := d.Launch([]string{exepath}, ".") if err == nil { t.Fatalf("expected error but none was generated") } if err != api.ErrNotExecutable { t.Fatalf("expected error %q got \"%v\"", api.ErrNotExecutable, err) } } func TestDebugger_LaunchWithTTY(t *testing.T) { if os.Getenv("CI") == "true" { if _, err := exec.LookPath("lsof"); err != nil { t.Skip("skipping test in CI, system does not contain lsof") } } // Ensure no env meddling is leftover from previous tests. t.Setenv("GOOS", runtime.GOOS) t.Setenv("GOARCH", runtime.GOARCH) p, tty, err := pty.Open() if err != nil { t.Fatal(err) } defer p.Close() defer tty.Close() fixturesDir := protest.FindFixturesDir() buildtestdir := filepath.Join(fixturesDir, "buildtest") debugname := "debugtty" exepath := filepath.Join(buildtestdir, debugname) if err := gobuild.GoBuild(debugname, []string{buildtestdir}, fmt.Sprintf("-o %s", exepath)); err != nil { t.Fatalf("go build error %v", err) } defer os.Remove(exepath) var backend string protest.DefaultTestBackend(&backend) conf := &Config{TTY: tty.Name(), Backend: backend} pArgs := []string{exepath} d, err := New(conf, pArgs) if err != nil { t.Fatal(err) } openFileCmd, wantTTYName := "lsof", tty.Name() if runtime.GOOS == "freebsd" { openFileCmd = "fstat" wantTTYName = strings.TrimPrefix(wantTTYName, "/dev/") } cmd := exec.Command(openFileCmd, "-p", fmt.Sprintf("%d", d.ProcessPid())) result, err := cmd.CombinedOutput() if err != nil { t.Fatal(err) } if !bytes.Contains(result, []byte(wantTTYName)) { t.Fatalf("process open file list does not contain expected tty %q", wantTTYName) } }