--- /dev/null
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build !plan9
+// +build !plan9
+
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "runtime"
+ "testing"
+)
+
+const (
+ testbin = "testgetgo"
+)
+
+var (
+ exeSuffix string // ".exe" on Windows
+)
+
+func init() {
+ if runtime.GOOS == "windows" {
+ exeSuffix = ".exe"
+ }
+}
+
+// TestMain creates a getgo command for testing purposes and
+// deletes it after the tests have been run.
+func TestMain(m *testing.M) {
+ if os.Getenv("GOGET_INTEGRATION") == "" {
+ fmt.Fprintln(os.Stderr, "main_test: Skipping integration tests with GOGET_INTEGRATION unset")
+ return
+ }
+
+ args := []string{"build", "-tags", testbin, "-o", testbin + exeSuffix}
+ out, err := exec.Command("go", args...).CombinedOutput()
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "building %s failed: %v\n%s", testbin, err, out)
+ os.Exit(2)
+ }
+
+ // Don't let these environment variables confuse the test.
+ os.Unsetenv("GOBIN")
+ os.Unsetenv("GOPATH")
+ os.Unsetenv("GIT_ALLOW_PROTOCOL")
+ os.Unsetenv("PATH")
+
+ r := m.Run()
+
+ os.Remove(testbin + exeSuffix)
+
+ os.Exit(r)
+}
+
+func createTmpHome(t *testing.T) string {
+ tmpd, err := ioutil.TempDir("", "testgetgo")
+ if err != nil {
+ t.Fatalf("creating test tempdir failed: %v", err)
+ }
+
+ os.Setenv("HOME", tmpd)
+ return tmpd
+}
+
+// doRun runs the test getgo command, recording stdout and stderr and
+// returning exit status.
+func doRun(t *testing.T, args ...string) error {
+ var stdout, stderr bytes.Buffer
+ t.Logf("running %s %v", testbin, args)
+ cmd := exec.Command("./"+testbin+exeSuffix, args...)
+ cmd.Stdout = &stdout
+ cmd.Stderr = &stderr
+ cmd.Env = os.Environ()
+ status := cmd.Run()
+ if stdout.Len() > 0 {
+ t.Log("standard output:")
+ t.Log(stdout.String())
+ }
+ if stderr.Len() > 0 {
+ t.Log("standard error:")
+ t.Log(stderr.String())
+ }
+ return status
+}
+
+func TestCommandVerbose(t *testing.T) {
+ tmpd := createTmpHome(t)
+ defer os.RemoveAll(tmpd)
+
+ err := doRun(t, "-v")
+ if err != nil {
+ t.Fatal(err)
+ }
+ // make sure things are in path
+ shellConfig, err := shellConfigFile()
+ if err != nil {
+ t.Fatal(err)
+ }
+ b, err := ioutil.ReadFile(shellConfig)
+ if err != nil {
+ t.Fatal(err)
+ }
+ home, err := getHomeDir()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ expected := fmt.Sprintf(`
+export PATH=$PATH:%s/.go/bin
+
+export GOPATH=%s/go
+
+export PATH=$PATH:%s/go/bin
+`, home, home, home)
+
+ if string(b) != expected {
+ t.Fatalf("%s expected %q, got %q", shellConfig, expected, string(b))
+ }
+}
+
+func TestCommandPathExists(t *testing.T) {
+ tmpd := createTmpHome(t)
+ defer os.RemoveAll(tmpd)
+
+ // run once
+ err := doRun(t, "-skip-dl")
+ if err != nil {
+ t.Fatal(err)
+ }
+ // make sure things are in path
+ shellConfig, err := shellConfigFile()
+ if err != nil {
+ t.Fatal(err)
+ }
+ b, err := ioutil.ReadFile(shellConfig)
+ if err != nil {
+ t.Fatal(err)
+ }
+ home, err := getHomeDir()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ expected := fmt.Sprintf(`
+export GOPATH=%s/go
+
+export PATH=$PATH:%s/go/bin
+`, home, home)
+
+ if string(b) != expected {
+ t.Fatalf("%s expected %q, got %q", shellConfig, expected, string(b))
+ }
+
+ // run twice
+ if err := doRun(t, "-skip-dl"); err != nil {
+ t.Fatal(err)
+ }
+
+ b, err = ioutil.ReadFile(shellConfig)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ if string(b) != expected {
+ t.Fatalf("%s expected %q, got %q", shellConfig, expected, string(b))
+ }
+}