// 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. // +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)) } }