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 }