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  }