github.com/cnboonhan/delve@v0.0.0-20230908061759-363f2388c2fb/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/go-delve/delve/pkg/gobuild" 18 protest "github.com/go-delve/delve/pkg/proc/test" 19 "github.com/go-delve/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 if runtime.GOARCH == "ppc64le" && runtime.GOOS == "linux" { 40 os.Setenv("GOARCH", "amd64") 41 } 42 os.Setenv("GOOS", switchOS[runtime.GOOS]) 43 exepath := filepath.Join(buildtestdir, debugname) 44 defer os.Remove(exepath) 45 if err := gobuild.GoBuild(debugname, []string{buildtestdir}, fmt.Sprintf("-o %s", exepath)); err != nil { 46 t.Fatalf("go build error %v", err) 47 } 48 if err := os.Chmod(exepath, 0644); err != nil { 49 t.Fatal(err) 50 } 51 d := new(Debugger) 52 _, err := d.Launch([]string{exepath}, ".") 53 if err == nil { 54 t.Fatalf("expected error but none was generated") 55 } 56 if err != api.ErrNotExecutable { 57 t.Fatalf("expected error %q got \"%v\"", api.ErrNotExecutable, err) 58 } 59 } 60 61 func TestDebugger_LaunchWithTTY(t *testing.T) { 62 if os.Getenv("CI") == "true" { 63 if _, err := exec.LookPath("lsof"); err != nil { 64 t.Skip("skipping test in CI, system does not contain lsof") 65 } 66 } 67 // Ensure no env meddling is leftover from previous tests. 68 os.Setenv("GOOS", runtime.GOOS) 69 os.Setenv("GOARCH", runtime.GOARCH) 70 71 p, tty, err := pty.Open() 72 if err != nil { 73 t.Fatal(err) 74 } 75 defer p.Close() 76 defer tty.Close() 77 78 fixturesDir := protest.FindFixturesDir() 79 buildtestdir := filepath.Join(fixturesDir, "buildtest") 80 debugname := "debugtty" 81 exepath := filepath.Join(buildtestdir, debugname) 82 if err := gobuild.GoBuild(debugname, []string{buildtestdir}, fmt.Sprintf("-o %s", exepath)); err != nil { 83 t.Fatalf("go build error %v", err) 84 } 85 defer os.Remove(exepath) 86 var backend string 87 protest.DefaultTestBackend(&backend) 88 conf := &Config{TTY: tty.Name(), Backend: backend} 89 pArgs := []string{exepath} 90 d, err := New(conf, pArgs) 91 if err != nil { 92 t.Fatal(err) 93 } 94 openFileCmd, wantTTYName := "lsof", tty.Name() 95 if runtime.GOOS == "freebsd" { 96 openFileCmd = "fstat" 97 wantTTYName = strings.TrimPrefix(wantTTYName, "/dev/") 98 } 99 cmd := exec.Command(openFileCmd, "-p", fmt.Sprintf("%d", d.ProcessPid())) 100 result, err := cmd.CombinedOutput() 101 if err != nil { 102 t.Fatal(err) 103 } 104 if !bytes.Contains(result, []byte(wantTTYName)) { 105 t.Fatalf("process open file list does not contain expected tty %q", wantTTYName) 106 } 107 }