mirror of
				https://github.com/go-delve/delve.git
				synced 2025-11-04 06:32:16 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// +build !windows
 | 
						|
 | 
						|
package debugger
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"os/exec"
 | 
						|
	"path/filepath"
 | 
						|
	"runtime"
 | 
						|
	"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)
 | 
						|
	}
 | 
						|
	cmd := exec.Command("lsof", "-p", fmt.Sprintf("%d", d.ProcessPid()))
 | 
						|
	result, err := cmd.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	if !bytes.Contains(result, []byte(tty.Name())) {
 | 
						|
		t.Fatal("process open file list does not contain expected tty")
 | 
						|
	}
 | 
						|
}
 |