|  | package backend | 
|  |  | 
|  | import ( | 
|  | "io" | 
|  | "io/ioutil" | 
|  | "os" | 
|  | "os/user" | 
|  | "strings" | 
|  | "testing" | 
|  |  | 
|  | "github.com/mitchellh/go-homedir" | 
|  | ) | 
|  |  | 
|  | func TestReadPathOrContents_Path(t *testing.T) { | 
|  | f, cleanup := testTempFile(t) | 
|  | defer cleanup() | 
|  |  | 
|  | if _, err := io.WriteString(f, "foobar"); err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  | f.Close() | 
|  |  | 
|  | contents, err := ReadPathOrContents(f.Name()) | 
|  |  | 
|  | if err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  | if contents != "foobar" { | 
|  | t.Fatalf("expected contents %s, got %s", "foobar", contents) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestReadPathOrContents_TildePath(t *testing.T) { | 
|  | home, err := homedir.Dir() | 
|  | if err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  | f, cleanup := testTempFile(t, home) | 
|  | defer cleanup() | 
|  |  | 
|  | if _, err := io.WriteString(f, "foobar"); err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  | f.Close() | 
|  |  | 
|  | r := strings.NewReplacer(home, "~") | 
|  | homePath := r.Replace(f.Name()) | 
|  | contents, err := ReadPathOrContents(homePath) | 
|  |  | 
|  | if err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  | if contents != "foobar" { | 
|  | t.Fatalf("expected contents %s, got %s", "foobar", contents) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestRead_PathNoPermission(t *testing.T) { | 
|  | // This skip condition is intended to get this test out of the way of users | 
|  | // who are building and testing Terraform from within a Linux-based Docker | 
|  | // container, where it is common for processes to be running as effectively | 
|  | // root within the container. | 
|  | if u, err := user.Current(); err == nil && u.Uid == "0" { | 
|  | t.Skip("This test is invalid when running as root, since root can read every file") | 
|  | } | 
|  |  | 
|  | f, cleanup := testTempFile(t) | 
|  | defer cleanup() | 
|  |  | 
|  | if _, err := io.WriteString(f, "foobar"); err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  | f.Close() | 
|  |  | 
|  | if err := os.Chmod(f.Name(), 0); err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  |  | 
|  | contents, err := ReadPathOrContents(f.Name()) | 
|  |  | 
|  | if err == nil { | 
|  | t.Fatal("Expected error, got none!") | 
|  | } | 
|  | if contents != "" { | 
|  | t.Fatalf("expected contents %s, got %s", "", contents) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestReadPathOrContents_Contents(t *testing.T) { | 
|  | input := "hello" | 
|  |  | 
|  | contents, err := ReadPathOrContents(input) | 
|  |  | 
|  | if err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  | if contents != input { | 
|  | t.Fatalf("expected contents %s, got %s", input, contents) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestReadPathOrContents_TildeContents(t *testing.T) { | 
|  | input := "~/hello/notafile" | 
|  |  | 
|  | contents, err := ReadPathOrContents(input) | 
|  |  | 
|  | if err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  | if contents != input { | 
|  | t.Fatalf("expected contents %s, got %s", input, contents) | 
|  | } | 
|  | } | 
|  |  | 
|  | // Returns an open tempfile based at baseDir and a function to clean it up. | 
|  | func testTempFile(t *testing.T, baseDir ...string) (*os.File, func()) { | 
|  | base := "" | 
|  | if len(baseDir) == 1 { | 
|  | base = baseDir[0] | 
|  | } | 
|  | f, err := ioutil.TempFile(base, "tf") | 
|  | if err != nil { | 
|  | t.Fatalf("err: %s", err) | 
|  | } | 
|  |  | 
|  | return f, func() { | 
|  | os.Remove(f.Name()) | 
|  | } | 
|  | } |