opentofu/internal/backend/backend_test.go
Martin Atkins 73dda868cc Move backend/ to internal/backend/
This is part of a general effort to move all of Terraform's non-library
package surface under internal in order to reinforce that these are for
internal use within Terraform only.

If you were previously importing packages under this prefix into an
external codebase, you could pin to an earlier release tag as an interim
solution until you've make a plan to achieve the same functionality some
other way.
2021-05-17 14:09:07 -07:00

130 lines
2.7 KiB
Go

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())
}
}