mirror of
				https://github.com/go-delve/delve.git
				synced 2025-11-04 14:36:47 +08:00 
			
		
		
		
	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)
 | 
						|
	}
 | 
						|
}
 |