mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-26 00:41:27 -06:00
73dda868cc
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.
130 lines
2.7 KiB
Go
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())
|
|
}
|
|
}
|