1 | // Copyright 2017 The Go Authors. All rights reserved. |
---|---|
2 | // Use of this source code is governed by a BSD-style |
3 | // license that can be found in the LICENSE file. |
4 | |
5 | //go:build !plan9 |
6 | // +build !plan9 |
7 | |
8 | package main |
9 | |
10 | import ( |
11 | "bytes" |
12 | "fmt" |
13 | "io/ioutil" |
14 | "os" |
15 | "os/exec" |
16 | "testing" |
17 | ) |
18 | |
19 | func TestMain(m *testing.M) { |
20 | if os.Getenv("GO_GETGO_TEST_IS_GETGO") != "" { |
21 | main() |
22 | os.Exit(0) |
23 | } |
24 | |
25 | if os.Getenv("GOGET_INTEGRATION") == "" { |
26 | fmt.Fprintln(os.Stderr, "main_test: Skipping integration tests with GOGET_INTEGRATION unset") |
27 | return |
28 | } |
29 | |
30 | // Don't let these environment variables confuse the test. |
31 | os.Unsetenv("GOBIN") |
32 | os.Unsetenv("GOPATH") |
33 | os.Unsetenv("GIT_ALLOW_PROTOCOL") |
34 | os.Unsetenv("PATH") |
35 | |
36 | os.Exit(m.Run()) |
37 | } |
38 | |
39 | func createTmpHome(t *testing.T) string { |
40 | tmpd, err := ioutil.TempDir("", "testgetgo") |
41 | if err != nil { |
42 | t.Fatalf("creating test tempdir failed: %v", err) |
43 | } |
44 | |
45 | os.Setenv("HOME", tmpd) |
46 | return tmpd |
47 | } |
48 | |
49 | // doRun runs the test getgo command, recording stdout and stderr and |
50 | // returning exit status. |
51 | func doRun(t *testing.T, args ...string) error { |
52 | exe, err := os.Executable() |
53 | if err != nil { |
54 | t.Fatal(err) |
55 | } |
56 | t.Helper() |
57 | |
58 | t.Logf("running getgo %v", args) |
59 | var stdout, stderr bytes.Buffer |
60 | cmd := exec.Command(exe, args...) |
61 | cmd.Stdout = &stdout |
62 | cmd.Stderr = &stderr |
63 | cmd.Env = append(os.Environ(), "GO_GETGO_TEST_IS_GETGO=1") |
64 | status := cmd.Run() |
65 | if stdout.Len() > 0 { |
66 | t.Log("standard output:") |
67 | t.Log(stdout.String()) |
68 | } |
69 | if stderr.Len() > 0 { |
70 | t.Log("standard error:") |
71 | t.Log(stderr.String()) |
72 | } |
73 | return status |
74 | } |
75 | |
76 | func TestCommandVerbose(t *testing.T) { |
77 | tmpd := createTmpHome(t) |
78 | defer os.RemoveAll(tmpd) |
79 | |
80 | err := doRun(t, "-v") |
81 | if err != nil { |
82 | t.Fatal(err) |
83 | } |
84 | // make sure things are in path |
85 | shellConfig, err := shellConfigFile() |
86 | if err != nil { |
87 | t.Fatal(err) |
88 | } |
89 | b, err := ioutil.ReadFile(shellConfig) |
90 | if err != nil { |
91 | t.Fatal(err) |
92 | } |
93 | home, err := getHomeDir() |
94 | if err != nil { |
95 | t.Fatal(err) |
96 | } |
97 | |
98 | expected := fmt.Sprintf(` |
99 | export PATH=$PATH:%s/.go/bin |
100 | |
101 | export GOPATH=%s/go |
102 | |
103 | export PATH=$PATH:%s/go/bin |
104 | `, home, home, home) |
105 | |
106 | if string(b) != expected { |
107 | t.Fatalf("%s expected %q, got %q", shellConfig, expected, string(b)) |
108 | } |
109 | } |
110 | |
111 | func TestCommandPathExists(t *testing.T) { |
112 | tmpd := createTmpHome(t) |
113 | defer os.RemoveAll(tmpd) |
114 | |
115 | // run once |
116 | err := doRun(t, "-skip-dl") |
117 | if err != nil { |
118 | t.Fatal(err) |
119 | } |
120 | // make sure things are in path |
121 | shellConfig, err := shellConfigFile() |
122 | if err != nil { |
123 | t.Fatal(err) |
124 | } |
125 | b, err := ioutil.ReadFile(shellConfig) |
126 | if err != nil { |
127 | t.Fatal(err) |
128 | } |
129 | home, err := getHomeDir() |
130 | if err != nil { |
131 | t.Fatal(err) |
132 | } |
133 | |
134 | expected := fmt.Sprintf(` |
135 | export GOPATH=%s/go |
136 | |
137 | export PATH=$PATH:%s/go/bin |
138 | `, home, home) |
139 | |
140 | if string(b) != expected { |
141 | t.Fatalf("%s expected %q, got %q", shellConfig, expected, string(b)) |
142 | } |
143 | |
144 | // run twice |
145 | if err := doRun(t, "-skip-dl"); err != nil { |
146 | t.Fatal(err) |
147 | } |
148 | |
149 | b, err = ioutil.ReadFile(shellConfig) |
150 | if err != nil { |
151 | t.Fatal(err) |
152 | } |
153 | |
154 | if string(b) != expected { |
155 | t.Fatalf("%s expected %q, got %q", shellConfig, expected, string(b)) |
156 | } |
157 | } |
158 |
Members