
FreeBSD does not have lsof, rather it has fstat. Additionally, the TTY name does not match up with the current code.
105 lines
2.8 KiB
Go
105 lines
2.8 KiB
Go
//go:build !windows
|
|
// +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) {
|
|
defer func() {
|
|
os.Setenv("GOOS", runtime.GOOS)
|
|
os.Setenv("GOARCH", runtime.GOARCH)
|
|
}()
|
|
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" {
|
|
os.Setenv("GOARCH", "amd64")
|
|
}
|
|
os.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 \"%s\" 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.
|
|
os.Setenv("GOOS", runtime.GOOS)
|
|
os.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)
|
|
}
|
|
}
|