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  }