@@ -16,97 +16,117 @@ func TestLookPath(t *testing.T) {
16
16
t .Fatal (wderr )
17
17
}
18
18
19
- paths := []string {
20
- filepath .Join (root , "_fixtures" , "nonexist" ),
21
- filepath .Join (root , "_fixtures" , "system" ),
22
- }
23
- os .Setenv ("PATH" , strings .Join (paths , string (filepath .ListSeparator )))
24
-
25
19
if err := os .Chdir (filepath .Join (root , "_fixtures" , "cwd" )); err != nil {
26
20
t .Fatal (err )
27
21
}
28
22
29
23
testCases := []struct {
30
24
desc string
25
+ path []string
31
26
pathext string
32
27
arg string
33
28
wants string
34
29
wantErr bool
35
30
}{
36
31
{
37
- desc : "no extension" ,
32
+ desc : "no extension" ,
33
+ path : []string {
34
+ filepath .Join (root , "_fixtures" , "nonexist" ),
35
+ filepath .Join (root , "_fixtures" , "system" ),
36
+ },
38
37
pathext : "" ,
39
38
arg : "ls" ,
40
39
wants : filepath .Join (root , "_fixtures" , "system" , "ls" + winonly (".exe" )),
41
40
wantErr : false ,
42
41
},
43
42
{
44
43
desc : "with extension" ,
44
+ path : []string {filepath .Join (root , "_fixtures" , "system" )},
45
45
pathext : "" ,
46
46
arg : "ls.exe" ,
47
47
wants : filepath .Join (root , "_fixtures" , "system" , "ls.exe" ),
48
48
wantErr : false ,
49
49
},
50
50
{
51
51
desc : "with path" ,
52
+ path : []string {filepath .Join (root , "_fixtures" , "system" )},
52
53
pathext : "" ,
53
54
arg : filepath .Join (".." , "system" , "ls" ),
54
55
wants : filepath .Join (".." , "system" , "ls" + winonly (".exe" )),
55
56
wantErr : false ,
56
57
},
57
58
{
58
59
desc : "with path+extension" ,
60
+ path : []string {filepath .Join (root , "_fixtures" , "system" )},
59
61
pathext : "" ,
60
62
arg : filepath .Join (".." , "system" , "ls.bat" ),
61
63
wants : filepath .Join (".." , "system" , "ls.bat" ),
62
64
wantErr : false ,
63
65
},
64
66
{
65
67
desc : "no extension, PATHEXT" ,
68
+ path : []string {filepath .Join (root , "_fixtures" , "system" )},
66
69
pathext : ".com;.bat" ,
67
70
arg : "ls" ,
68
71
wants : filepath .Join (root , "_fixtures" , "system" , "ls" + winonly (".bat" )),
69
72
wantErr : false ,
70
73
},
71
74
{
72
75
desc : "with extension, PATHEXT" ,
76
+ path : []string {filepath .Join (root , "_fixtures" , "system" )},
73
77
pathext : ".com;.bat" ,
74
78
arg : "ls.exe" ,
75
79
wants : filepath .Join (root , "_fixtures" , "system" , "ls.exe" ),
76
80
wantErr : false ,
77
81
},
78
82
{
79
- desc : "no extension, not found" ,
83
+ desc : "no extension, not found" ,
84
+ path : []string {
85
+ filepath .Join (root , "_fixtures" , "nonexist" ),
86
+ filepath .Join (root , "_fixtures" , "system" ),
87
+ },
80
88
pathext : "" ,
81
89
arg : "cat" ,
82
90
wants : "" ,
83
91
wantErr : true ,
84
92
},
85
93
{
86
94
desc : "with extension, not found" ,
95
+ path : []string {filepath .Join (root , "_fixtures" , "system" )},
87
96
pathext : "" ,
88
97
arg : "cat.exe" ,
89
98
wants : "" ,
90
99
wantErr : true ,
91
100
},
92
101
{
93
102
desc : "no extension, PATHEXT, not found" ,
103
+ path : []string {filepath .Join (root , "_fixtures" , "system" )},
94
104
pathext : ".com;.bat" ,
95
105
arg : "cat" ,
96
106
wants : "" ,
97
107
wantErr : true ,
98
108
},
99
109
{
100
110
desc : "with extension, PATHEXT, not found" ,
111
+ path : []string {filepath .Join (root , "_fixtures" , "system" )},
101
112
pathext : ".com;.bat" ,
102
113
arg : "cat.exe" ,
103
114
wants : "" ,
104
115
wantErr : true ,
105
116
},
117
+ {
118
+ desc : "relative path" ,
119
+ path : []string {filepath .Join (".." , "system" )},
120
+ pathext : "" ,
121
+ arg : "ls" ,
122
+ wants : filepath .Join (".." , "system" , "ls" + winonly (".exe" )),
123
+ wantErr : false ,
124
+ },
106
125
}
107
126
for _ , tC := range testCases {
108
127
t .Run (tC .desc , func (t * testing.T ) {
109
- os .Setenv ("PATHEXT" , tC .pathext )
128
+ setenv (t , "PATH" , strings .Join (tC .path , string (filepath .ListSeparator )))
129
+ setenv (t , "PATHEXT" , tC .pathext )
110
130
got , err := LookPath (tC .arg )
111
131
112
132
if tC .wantErr != (err != nil ) {
@@ -122,6 +142,20 @@ func TestLookPath(t *testing.T) {
122
142
}
123
143
}
124
144
145
+ func setenv (t * testing.T , name , newValue string ) {
146
+ oldValue , hasOldValue := os .LookupEnv (name )
147
+ if err := os .Setenv (name , newValue ); err != nil {
148
+ t .Errorf ("error setting environment variable %s: %v" , name , err )
149
+ }
150
+ t .Cleanup (func () {
151
+ if hasOldValue {
152
+ _ = os .Setenv (name , oldValue )
153
+ } else {
154
+ _ = os .Unsetenv (name )
155
+ }
156
+ })
157
+ }
158
+
125
159
func winonly (s string ) string {
126
160
if runtime .GOOS == "windows" {
127
161
return s
0 commit comments