--- /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.
+
+// +build !plan9
+
+package main
+
+import (
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+)
+
+func TestAppendPath(t *testing.T) {
+ tmpd, err := ioutil.TempDir("", "go")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(tmpd)
+
+ if err := os.Setenv("HOME", tmpd); err != nil {
+ t.Fatal(err)
+ }
+
+ GOPATH := os.Getenv("GOPATH")
+ if err := appendToPATH(filepath.Join(GOPATH, "bin")); err != nil {
+ t.Fatal(err)
+ }
+
+ shellConfig, err := shellConfigFile()
+ if err != nil {
+ t.Fatal(err)
+ }
+ b, err := ioutil.ReadFile(shellConfig)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ expected := "export PATH=" + pathVar + envSeparator + filepath.Join(GOPATH, "bin")
+ if strings.TrimSpace(string(b)) != expected {
+ t.Fatalf("expected: %q, got %q", expected, strings.TrimSpace(string(b)))
+ }
+
+ // Check that appendToPATH is idempotent.
+ if err := appendToPATH(filepath.Join(GOPATH, "bin")); err != nil {
+ t.Fatal(err)
+ }
+ b, err = ioutil.ReadFile(shellConfig)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if strings.TrimSpace(string(b)) != expected {
+ t.Fatalf("expected: %q, got %q", expected, strings.TrimSpace(string(b)))
+ }
+}