|
5 | 5 | package main
|
6 | 6 |
|
7 | 7 | import (
|
8 |
| - "fmt" |
| 8 | + "os" |
9 | 9 | "runtime"
|
10 | 10 | "testing"
|
11 | 11 | )
|
12 | 12 |
|
13 |
| -func TestSetPathEnv(t *testing.T) { |
14 |
| - if runtime.GOOS == "windows" { |
15 |
| - t.Skip("TODO(adg): make this test work on windows") |
16 |
| - } |
17 |
| - |
18 |
| - const workDir = "/workdir" |
19 |
| - |
| 13 | +func TestPathEnv(t *testing.T) { |
20 | 14 | for _, c := range []struct {
|
| 15 | + goos string // default "linux" |
| 16 | + wd string // default "/workdir" |
21 | 17 | env []string
|
22 | 18 | path []string
|
23 |
| - want []string |
| 19 | + want string |
| 20 | + noOp bool |
24 | 21 | }{
|
25 | 22 | { // No change to PATH
|
26 |
| - []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
27 |
| - []string{}, |
28 |
| - []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
| 23 | + env: []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
| 24 | + path: []string{"$PATH"}, |
| 25 | + want: "PATH=/bin:/usr/bin", |
| 26 | + noOp: true, |
| 27 | + }, |
| 28 | + { // Test that $EMPTY rewrites the path to be empty |
| 29 | + env: []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
| 30 | + path: []string{"$EMPTY"}, |
| 31 | + want: "PATH=", |
29 | 32 | },
|
30 |
| - { // Test sentinel $EMPTY value to clear PATH |
31 |
| - []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
32 |
| - []string{"$EMPTY"}, |
33 |
| - []string{"A=1", "B=2"}, |
| 33 | + { // Test that clearing an already-unset PATH is a no-op |
| 34 | + env: []string{"A=1", "B=2"}, |
| 35 | + path: []string{"$EMPTY"}, |
| 36 | + want: "PATH=", |
| 37 | + noOp: true, |
34 | 38 | },
|
35 | 39 | { // Test $WORKDIR expansion
|
36 |
| - []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
37 |
| - []string{"/go/bin", "$WORKDIR/foo"}, |
38 |
| - []string{"A=1", "PATH=/go/bin:/workdir/foo", "B=2"}, |
| 40 | + env: []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
| 41 | + path: []string{"/go/bin", "$WORKDIR/foo"}, |
| 42 | + want: "PATH=/go/bin:/workdir/foo", |
39 | 43 | },
|
40 | 44 | { // Test $PATH expansion
|
41 |
| - []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
42 |
| - []string{"/go/bin", "$PATH", "$WORKDIR/foo"}, |
43 |
| - []string{"A=1", "PATH=/go/bin:/bin:/usr/bin:/workdir/foo", "B=2"}, |
| 45 | + env: []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
| 46 | + path: []string{"/go/bin", "$PATH", "$WORKDIR/foo"}, |
| 47 | + want: "PATH=/go/bin:/bin:/usr/bin:/workdir/foo", |
44 | 48 | },
|
45 | 49 | { // Test $PATH expansion (prepend only)
|
46 |
| - []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
47 |
| - []string{"/go/bin", "/a/b", "$PATH"}, |
48 |
| - []string{"A=1", "PATH=/go/bin:/a/b:/bin:/usr/bin", "B=2"}, |
| 50 | + env: []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
| 51 | + path: []string{"/go/bin", "/a/b", "$PATH"}, |
| 52 | + want: "PATH=/go/bin:/a/b:/bin:/usr/bin", |
49 | 53 | },
|
50 | 54 | { // Test $PATH expansion (append only)
|
51 |
| - []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
52 |
| - []string{"$PATH", "/go/bin", "/a/b"}, |
53 |
| - []string{"A=1", "PATH=/bin:/usr/bin:/go/bin:/a/b", "B=2"}, |
| 55 | + env: []string{"A=1", "PATH=/bin:/usr/bin", "B=2"}, |
| 56 | + path: []string{"$PATH", "/go/bin", "/a/b"}, |
| 57 | + want: "PATH=/bin:/usr/bin:/go/bin:/a/b", |
| 58 | + }, |
| 59 | + { // Test that empty $PATH expansion is a no-op |
| 60 | + env: []string{"A=1", "B=2"}, |
| 61 | + path: []string{"$PATH"}, |
| 62 | + want: "PATH=", |
| 63 | + noOp: true, |
| 64 | + }, |
| 65 | + { // Test that empty $PATH expansion does not add extraneous separators |
| 66 | + env: []string{"A=1", "B=2"}, |
| 67 | + path: []string{"$PATH", "$WORKDIR/foo"}, |
| 68 | + want: "PATH=/workdir/foo", |
| 69 | + }, |
| 70 | + { // Test that in case of multiple PATH entries we modify the last one, |
| 71 | + // not the first. |
| 72 | + env: []string{"PATH=/bin:/usr/bin", "PATH=/bin:/usr/bin:/usr/local/bin"}, |
| 73 | + path: []string{"$WORKDIR/foo", "$PATH"}, |
| 74 | + want: "PATH=/workdir/foo:/bin:/usr/bin:/usr/local/bin", |
| 75 | + }, |
| 76 | + { // Test that Windows reads the existing variable regardless of case |
| 77 | + goos: "windows", |
| 78 | + wd: `C:\workdir`, |
| 79 | + env: []string{"A=1", `PaTh=C:\Go\bin;C:\windows`, "B=2"}, |
| 80 | + path: []string{"$PATH", `$WORKDIR\foo`}, |
| 81 | + want: `PATH=C:\Go\bin;C:\windows;C:\workdir\foo`, |
| 82 | + }, |
| 83 | + { // Test that plan9 uses plan9 separators and "path" instead of "PATH" |
| 84 | + goos: "plan9", |
| 85 | + env: []string{"path=/bin\x00/usr/bin", "PATH=/bananas"}, |
| 86 | + path: []string{"$PATH", "$WORKDIR/foo"}, |
| 87 | + want: "path=/bin\x00/usr/bin\x00/workdir/foo", |
54 | 88 | },
|
55 | 89 | } {
|
56 |
| - got := setPathEnv(c.env, c.path, workDir) |
57 |
| - if g, w := fmt.Sprint(got), fmt.Sprint(c.want); g != w { |
58 |
| - t.Errorf("setPathEnv(%q, %q) = %q, want %q", c.env, c.path, g, w) |
| 90 | + goos := c.goos |
| 91 | + if goos == "" { |
| 92 | + goos = "linux" |
| 93 | + } |
| 94 | + wd := c.wd |
| 95 | + if wd == "" { |
| 96 | + wd = "/workdir" |
| 97 | + } |
| 98 | + got, gotOk := pathEnv(goos, c.env, c.path, wd) |
| 99 | + wantOk := !c.noOp |
| 100 | + if got != c.want || gotOk != wantOk { |
| 101 | + t.Errorf("pathEnv(%q, %q, %q, %q) =\n\t%q, %t\nwant:\n\t%q, %t", goos, c.env, c.path, wd, got, gotOk, c.want, wantOk) |
59 | 102 | }
|
60 | 103 | }
|
61 | 104 | }
|
| 105 | + |
| 106 | +func TestPathListSeparator(t *testing.T) { |
| 107 | + sep := pathListSeparator(runtime.GOOS) |
| 108 | + want := string(os.PathListSeparator) |
| 109 | + if sep != want { |
| 110 | + t.Errorf("pathListSeparator(%q) = %q; want %q", runtime.GOOS, sep, want) |
| 111 | + } |
| 112 | +} |
0 commit comments