github.com/keshavdv/terraform@v0.7.0-rc2.0.20160711232630-d69256dcb425/builtin/providers/template/datasource_template_file_test.go (about)

     1  package template
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"strings"
     8  	"sync"
     9  	"testing"
    10  
    11  	r "github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  var testProviders = map[string]terraform.ResourceProvider{
    16  	"template": Provider(),
    17  }
    18  
    19  func TestTemplateRendering(t *testing.T) {
    20  	var cases = []struct {
    21  		vars     string
    22  		template string
    23  		want     string
    24  	}{
    25  		{`{}`, `ABC`, `ABC`},
    26  		{`{a="foo"}`, `$${a}`, `foo`},
    27  		{`{a="hello"}`, `$${replace(a, "ello", "i")}`, `hi`},
    28  		{`{}`, `${1+2+3}`, `6`},
    29  	}
    30  
    31  	for _, tt := range cases {
    32  		r.UnitTest(t, r.TestCase{
    33  			Providers: testProviders,
    34  			Steps: []r.TestStep{
    35  				r.TestStep{
    36  					Config: testTemplateConfig(tt.template, tt.vars),
    37  					Check: func(s *terraform.State) error {
    38  						got := s.RootModule().Outputs["rendered"]
    39  						if tt.want != got.Value {
    40  							return fmt.Errorf("template:\n%s\nvars:\n%s\ngot:\n%s\nwant:\n%s\n", tt.template, tt.vars, got, tt.want)
    41  						}
    42  						return nil
    43  					},
    44  				},
    45  			},
    46  		})
    47  	}
    48  }
    49  
    50  func TestValidateTemplateAttribute(t *testing.T) {
    51  	file, err := ioutil.TempFile("", "testtemplate")
    52  	if err != nil {
    53  		t.Fatal(err)
    54  	}
    55  	file.WriteString("Hello world.")
    56  	file.Close()
    57  	defer os.Remove(file.Name())
    58  
    59  	ws, es := validateTemplateAttribute(file.Name(), "test")
    60  
    61  	if len(es) != 0 {
    62  		t.Fatalf("Unexpected errors: %#v", es)
    63  	}
    64  
    65  	if len(ws) != 1 {
    66  		t.Fatalf("Expected 1 warning, got %d", len(ws))
    67  	}
    68  
    69  	if !strings.Contains(ws[0], "Specifying a path directly is deprecated") {
    70  		t.Fatalf("Expected warning about path, got: %s", ws[0])
    71  	}
    72  }
    73  
    74  // This test covers a panic due to config.Func formerly being a
    75  // shared map, causing multiple template_file resources to try and
    76  // accessing it parallel during their lang.Eval() runs.
    77  //
    78  // Before fix, test fails under `go test -race`
    79  func TestTemplateSharedMemoryRace(t *testing.T) {
    80  	var wg sync.WaitGroup
    81  	for i := 0; i < 100; i++ {
    82  		go func(wg sync.WaitGroup, t *testing.T, i int) {
    83  			wg.Add(1)
    84  			out, err := execute("don't panic!", map[string]interface{}{})
    85  			if err != nil {
    86  				t.Fatalf("err: %s", err)
    87  			}
    88  			if out != "don't panic!" {
    89  				t.Fatalf("bad output: %s", out)
    90  			}
    91  			wg.Done()
    92  		}(wg, t, i)
    93  	}
    94  	wg.Wait()
    95  }
    96  
    97  func testTemplateConfig(template, vars string) string {
    98  	return fmt.Sprintf(`
    99  		data "template_file" "t0" {
   100  			template = "%s"
   101  			vars = %s
   102  		}
   103  		output "rendered" {
   104  				value = "${data.template_file.t0.rendered}"
   105  		}`, template, vars)
   106  }