github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/backend/backend_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package backend 5 6 import ( 7 "io" 8 "io/ioutil" 9 "os" 10 "os/user" 11 "strings" 12 "testing" 13 14 "github.com/mitchellh/go-homedir" 15 ) 16 17 func TestReadPathOrContents_Path(t *testing.T) { 18 f, cleanup := testTempFile(t) 19 defer cleanup() 20 21 if _, err := io.WriteString(f, "foobar"); err != nil { 22 t.Fatalf("err: %s", err) 23 } 24 f.Close() 25 26 contents, err := ReadPathOrContents(f.Name()) 27 28 if err != nil { 29 t.Fatalf("err: %s", err) 30 } 31 if contents != "foobar" { 32 t.Fatalf("expected contents %s, got %s", "foobar", contents) 33 } 34 } 35 36 func TestReadPathOrContents_TildePath(t *testing.T) { 37 home, err := homedir.Dir() 38 if err != nil { 39 t.Fatalf("err: %s", err) 40 } 41 f, cleanup := testTempFile(t, home) 42 defer cleanup() 43 44 if _, err := io.WriteString(f, "foobar"); err != nil { 45 t.Fatalf("err: %s", err) 46 } 47 f.Close() 48 49 r := strings.NewReplacer(home, "~") 50 homePath := r.Replace(f.Name()) 51 contents, err := ReadPathOrContents(homePath) 52 53 if err != nil { 54 t.Fatalf("err: %s", err) 55 } 56 if contents != "foobar" { 57 t.Fatalf("expected contents %s, got %s", "foobar", contents) 58 } 59 } 60 61 func TestRead_PathNoPermission(t *testing.T) { 62 // This skip condition is intended to get this test out of the way of users 63 // who are building and testing Terraform from within a Linux-based Docker 64 // container, where it is common for processes to be running as effectively 65 // root within the container. 66 if u, err := user.Current(); err == nil && u.Uid == "0" { 67 t.Skip("This test is invalid when running as root, since root can read every file") 68 } 69 70 f, cleanup := testTempFile(t) 71 defer cleanup() 72 73 if _, err := io.WriteString(f, "foobar"); err != nil { 74 t.Fatalf("err: %s", err) 75 } 76 f.Close() 77 78 if err := os.Chmod(f.Name(), 0); err != nil { 79 t.Fatalf("err: %s", err) 80 } 81 82 contents, err := ReadPathOrContents(f.Name()) 83 84 if err == nil { 85 t.Fatal("Expected error, got none!") 86 } 87 if contents != "" { 88 t.Fatalf("expected contents %s, got %s", "", contents) 89 } 90 } 91 92 func TestReadPathOrContents_Contents(t *testing.T) { 93 input := "hello" 94 95 contents, err := ReadPathOrContents(input) 96 97 if err != nil { 98 t.Fatalf("err: %s", err) 99 } 100 if contents != input { 101 t.Fatalf("expected contents %s, got %s", input, contents) 102 } 103 } 104 105 func TestReadPathOrContents_TildeContents(t *testing.T) { 106 input := "~/hello/notafile" 107 108 contents, err := ReadPathOrContents(input) 109 110 if err != nil { 111 t.Fatalf("err: %s", err) 112 } 113 if contents != input { 114 t.Fatalf("expected contents %s, got %s", input, contents) 115 } 116 } 117 118 // Returns an open tempfile based at baseDir and a function to clean it up. 119 func testTempFile(t *testing.T, baseDir ...string) (*os.File, func()) { 120 base := "" 121 if len(baseDir) == 1 { 122 base = baseDir[0] 123 } 124 f, err := ioutil.TempFile(base, "tf") 125 if err != nil { 126 t.Fatalf("err: %s", err) 127 } 128 129 return f, func() { 130 os.Remove(f.Name()) 131 } 132 }