github.com/jrasell/terraform@v0.6.17-0.20160523115548-2652f5232949/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.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  // 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.Value {
    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  }