github.com/undoio/delve@v1.9.0/service/debugger/debugger_unix_test.go (about) 1 //go:build !windows 2 // +build !windows 3 4 package debugger 5 6 import ( 7 "bytes" 8 "fmt" 9 "os" 10 "os/exec" 11 "path/filepath" 12 "runtime" 13 "strings" 14 "testing" 15 16 "github.com/creack/pty" 17 "github.com/undoio/delve/pkg/gobuild" 18 protest "github.com/undoio/delve/pkg/proc/test" 19 "github.com/undoio/delve/service/api" 20 ) 21 22 func TestDebugger_LaunchNoExecutablePerm(t *testing.T) { 23 defer func() { 24 os.Setenv("GOOS", runtime.GOOS) 25 os.Setenv("GOARCH", runtime.GOARCH) 26 }() 27 fixturesDir := protest.FindFixturesDir() 28 buildtestdir := filepath.Join(fixturesDir, "buildtest") 29 debugname := "debug" 30 switchOS := map[string]string{ 31 "darwin": "linux", 32 "windows": "linux", 33 "freebsd": "windows", 34 "linux": "windows", 35 } 36 if runtime.GOARCH == "arm64" && runtime.GOOS == "linux" { 37 os.Setenv("GOARCH", "amd64") 38 } 39 os.Setenv("GOOS", switchOS[runtime.GOOS]) 40 exepath := filepath.Join(buildtestdir, debugname) 41 defer os.Remove(exepath) 42 if err := gobuild.GoBuild(debugname, []string{buildtestdir}, fmt.Sprintf("-o %s", exepath)); err != nil { 43 t.Fatalf("go build error %v", err) 44 } 45 if err := os.Chmod(exepath, 0644); err != nil { 46 t.Fatal(err) 47 } 48 d := new(Debugger) 49 _, err := d.Launch([]string{exepath}, ".") 50 if err == nil { 51 t.Fatalf("expected error but none was generated") 52 } 53 if err != api.ErrNotExecutable { 54 t.Fatalf("expected error \"%s\" got \"%v\"", api.ErrNotExecutable, err) 55 } 56 } 57 58 func TestDebugger_LaunchWithTTY(t *testing.T) { 59 if os.Getenv("CI") == "true" { 60 if _, err := exec.LookPath("lsof"); err != nil { 61 t.Skip("skipping test in CI, system does not contain lsof") 62 } 63 } 64 // Ensure no env meddling is leftover from previous tests. 65 os.Setenv("GOOS", runtime.GOOS) 66 os.Setenv("GOARCH", runtime.GOARCH) 67 68 p, tty, err := pty.Open() 69 if err != nil { 70 t.Fatal(err) 71 } 72 defer p.Close() 73 defer tty.Close() 74 75 fixturesDir := protest.FindFixturesDir() 76 buildtestdir := filepath.Join(fixturesDir, "buildtest") 77 debugname := "debugtty" 78 exepath := filepath.Join(buildtestdir, debugname) 79 if err := gobuild.GoBuild(debugname, []string{buildtestdir}, fmt.Sprintf("-o %s", exepath)); err != nil { 80 t.Fatalf("go build error %v", err) 81 } 82 defer os.Remove(exepath) 83 var backend string 84 protest.DefaultTestBackend(&backend) 85 conf := &Config{TTY: tty.Name(), Backend: backend} 86 pArgs := []string{exepath} 87 d, err := New(conf, pArgs) 88 if err != nil { 89 t.Fatal(err) 90 } 91 openFileCmd, wantTTYName := "lsof", tty.Name() 92 if runtime.GOOS == "freebsd" { 93 openFileCmd = "fstat" 94 wantTTYName = strings.TrimPrefix(wantTTYName, "/dev/") 95 } 96 cmd := exec.Command(openFileCmd, "-p", fmt.Sprintf("%d", d.ProcessPid())) 97 result, err := cmd.CombinedOutput() 98 if err != nil { 99 t.Fatal(err) 100 } 101 if !bytes.Contains(result, []byte(wantTTYName)) { 102 t.Fatalf("process open file list does not contain expected tty %q", wantTTYName) 103 } 104 }