github.com/Hashicorp/terraform@v0.11.12-beta1/helper/pathorcontents/read_test.go (about)

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