1
2
3
4
5 package execabs
6
7 import (
8 "context"
9 "fmt"
10 "internal/testenv"
11 "os"
12 "os/exec"
13 "path/filepath"
14 "runtime"
15 "testing"
16 )
17
18 func TestFixCmd(t *testing.T) {
19 cmd := &exec.Cmd{Path: "hello"}
20 fixCmd("hello", cmd)
21 if cmd.Path != "" {
22 t.Error("fixCmd didn't clear cmd.Path")
23 }
24 expectedErr := fmt.Sprintf("hello resolves to executable relative to current directory (.%chello)", filepath.Separator)
25 if err := cmd.Run(); err == nil {
26 t.Fatal("Command.Run didn't fail")
27 } else if err.Error() != expectedErr {
28 t.Fatalf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error())
29 }
30 }
31
32 func TestCommand(t *testing.T) {
33 testenv.MustHaveExec(t)
34
35 for _, cmd := range []func(string) *Cmd{
36 func(s string) *Cmd { return Command(s) },
37 func(s string) *Cmd { return CommandContext(context.Background(), s) },
38 } {
39 tmpDir := t.TempDir()
40 executable := "execabs-test"
41 if runtime.GOOS == "windows" {
42 executable += ".exe"
43 }
44 if err := os.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil {
45 t.Fatalf("os.WriteFile failed: %s", err)
46 }
47 cwd, err := os.Getwd()
48 if err != nil {
49 t.Fatalf("os.Getwd failed: %s", err)
50 }
51 defer os.Chdir(cwd)
52 if err = os.Chdir(tmpDir); err != nil {
53 t.Fatalf("os.Chdir failed: %s", err)
54 }
55 if runtime.GOOS != "windows" {
56
57
58 origPath := os.Getenv("PATH")
59 defer os.Setenv("PATH", origPath)
60 os.Setenv("PATH", fmt.Sprintf(".:%s", origPath))
61 }
62 expectedErr := fmt.Sprintf("execabs-test resolves to executable relative to current directory (.%c%s)", filepath.Separator, executable)
63 if err = cmd("execabs-test").Run(); err == nil {
64 t.Fatalf("Command.Run didn't fail when exec.LookPath returned a relative path")
65 } else if err.Error() != expectedErr {
66 t.Errorf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error())
67 }
68 }
69 }
70
71 func TestLookPath(t *testing.T) {
72 testenv.MustHaveExec(t)
73
74 tmpDir := t.TempDir()
75 executable := "execabs-test"
76 if runtime.GOOS == "windows" {
77 executable += ".exe"
78 }
79 if err := os.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil {
80 t.Fatalf("os.WriteFile failed: %s", err)
81 }
82 cwd, err := os.Getwd()
83 if err != nil {
84 t.Fatalf("os.Getwd failed: %s", err)
85 }
86 defer os.Chdir(cwd)
87 if err = os.Chdir(tmpDir); err != nil {
88 t.Fatalf("os.Chdir failed: %s", err)
89 }
90 if runtime.GOOS != "windows" {
91
92
93 origPath := os.Getenv("PATH")
94 defer os.Setenv("PATH", origPath)
95 os.Setenv("PATH", fmt.Sprintf(".:%s", origPath))
96 }
97 expectedErr := fmt.Sprintf("execabs-test resolves to executable relative to current directory (.%c%s)", filepath.Separator, executable)
98 if _, err := LookPath("execabs-test"); err == nil {
99 t.Fatalf("LookPath didn't fail when finding a non-relative path")
100 } else if err.Error() != expectedErr {
101 t.Errorf("LookPath returned unexpected error: want %q, got %q", expectedErr, err.Error())
102 }
103 }
104
View as plain text