github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/template/resource_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.Test(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 { 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 // https://github.com/hashicorp/terraform/issues/2344 51 func TestTemplateVariableChange(t *testing.T) { 52 steps := []struct { 53 vars string 54 template string 55 want string 56 }{ 57 {`{a="foo"}`, `${a}`, `foo`}, 58 {`{b="bar"}`, `${b}`, `bar`}, 59 } 60 61 var testSteps []r.TestStep 62 for i, step := range steps { 63 testSteps = append(testSteps, r.TestStep{ 64 Config: testTemplateConfig(step.template, step.vars), 65 Check: func(i int, want string) r.TestCheckFunc { 66 return func(s *terraform.State) error { 67 got := s.RootModule().Outputs["rendered"] 68 if want != got { 69 return fmt.Errorf("[%d] got:\n%q\nwant:\n%q\n", i, got, want) 70 } 71 return nil 72 } 73 }(i, step.want), 74 }) 75 } 76 77 r.Test(t, r.TestCase{ 78 Providers: testProviders, 79 Steps: testSteps, 80 }) 81 } 82 83 func TestValidateTemplateAttribute(t *testing.T) { 84 file, err := ioutil.TempFile("", "testtemplate") 85 if err != nil { 86 t.Fatal(err) 87 } 88 file.WriteString("Hello world.") 89 file.Close() 90 defer os.Remove(file.Name()) 91 92 ws, es := validateTemplateAttribute(file.Name(), "test") 93 94 if len(es) != 0 { 95 t.Fatalf("Unexpected errors: %#v", es) 96 } 97 98 if len(ws) != 1 { 99 t.Fatalf("Expected 1 warning, got %d", len(ws)) 100 } 101 102 if !strings.Contains(ws[0], "Specifying a path directly is deprecated") { 103 t.Fatalf("Expected warning about path, got: %s", ws[0]) 104 } 105 } 106 107 // This test covers a panic due to config.Func formerly being a 108 // shared map, causing multiple template_file resources to try and 109 // accessing it parallel during their lang.Eval() runs. 110 // 111 // Before fix, test fails under `go test -race` 112 func TestTemplateSharedMemoryRace(t *testing.T) { 113 var wg sync.WaitGroup 114 for i := 0; i < 100; i++ { 115 go func(wg sync.WaitGroup, t *testing.T, i int) { 116 wg.Add(1) 117 out, err := execute("don't panic!", map[string]interface{}{}) 118 if err != nil { 119 t.Fatalf("err: %s", err) 120 } 121 if out != "don't panic!" { 122 t.Fatalf("bad output: %s", out) 123 } 124 wg.Done() 125 }(wg, t, i) 126 } 127 wg.Wait() 128 } 129 130 func testTemplateConfig(template, vars string) string { 131 return fmt.Sprintf(` 132 resource "template_file" "t0" { 133 template = "%s" 134 vars = %s 135 } 136 output "rendered" { 137 value = "${template_file.t0.rendered}" 138 }`, template, vars) 139 }