github.com/kubernetes-incubator/kube-aws@v0.16.4/pkg/api/userdata_test.go (about) 1 package api 2 3 import ( 4 "github.com/stretchr/testify/assert" 5 6 "fmt" 7 "io/ioutil" 8 "os" 9 "testing" 10 ) 11 12 const ( 13 s3Body = `#cloud-config 14 --- 15 coreos: {} 16 ` 17 ) 18 19 func mkTmpl(t, b string) string { 20 return fmt.Sprintf(`{{define "%s"}}%s{{end}}`, t, b) 21 } 22 23 var ( 24 mkInstance = func(b string) string { return mkTmpl(USERDATA_INSTANCE, b) } 25 mkInstanceScript = func(b string) string { return mkTmpl(USERDATA_INSTANCE_SCRIPT, b) } 26 mkS3 = func(b string) string { return mkTmpl(USERDATA_S3, b) } 27 tS3 = mkS3(s3Body) 28 tInstance = mkInstance("INSTANCE BODY") 29 tInstanceScript = mkInstanceScript("INSTANCE SCRIPT BODY") 30 instanceOnlyOpt = []UserDataOption{UserDataPartsOpt(PartDesc{USERDATA_INSTANCE, validateNone})} 31 ) 32 33 type Expectation func(assert *assert.Assertions, ud UserData, err error) 34 35 func TestUserDataNew(t *testing.T) { 36 tests := []struct { 37 name string 38 template string 39 opts []UserDataOption 40 exp Expectation 41 }{ 42 {"simple", tS3 + tInstance + tInstanceScript, nil, 43 func(a *assert.Assertions, ud UserData, err error) { 44 a.NoError(err) 45 a.NotEmpty(ud) 46 47 a.Len(ud.Parts, 3) 48 if a.Contains(ud.Parts, USERDATA_S3) { 49 udata, _ := ud.Parts[USERDATA_S3] 50 content, err := udata.Template() 51 a.NoError(err) 52 a.Equal(content, s3Body) 53 } 54 55 if a.Contains(ud.Parts, USERDATA_INSTANCE) { 56 udata, _ := ud.Parts[USERDATA_INSTANCE] 57 content, err := udata.Template() 58 a.NoError(err) 59 a.Equal(content, "INSTANCE BODY") 60 } 61 62 if a.Contains(ud.Parts, USERDATA_INSTANCE_SCRIPT) { 63 udata, _ := ud.Parts[USERDATA_INSTANCE_SCRIPT] 64 content, err := udata.Template() 65 a.NoError(err) 66 a.Equal(content, "INSTANCE SCRIPT BODY") 67 } 68 }, 69 }, 70 {"missing S3", tInstance, nil, 71 func(a *assert.Assertions, ud UserData, err error) { 72 if a.Error(err) { 73 a.Contains(err.Error(), "Can't find requested template") 74 } 75 }, 76 }, 77 {"extra", mkInstance("{{extra.Body}}"), instanceOnlyOpt, 78 func(a *assert.Assertions, ud UserData, err error) { 79 a.NoError(err, "Userdata creation failed") 80 81 p, ok := ud.Parts[USERDATA_INSTANCE] 82 if a.True(ok) { 83 content, err := p.Template(map[string]interface{}{"Body": "EXTRA BODY"}) 84 a.NoError(err, "Can't find 'extra' function") 85 a.Equal("EXTRA BODY", content) 86 } 87 }, 88 }, 89 {"self", mkInstance("{{if self.Parts}}GOOD{{else}}BAD{{end}}"), instanceOnlyOpt, 90 func(a *assert.Assertions, ud UserData, err error) { 91 if !a.NoError(err, "Userdata creation failed") { 92 return 93 } 94 95 p, ok := ud.Parts[USERDATA_INSTANCE] 96 if a.True(ok, "Can't find Instance template") { 97 content, err := p.Template() 98 a.NoError(err, "Can't find 'self' function") 99 a.Equal("GOOD", content, "self function doesn't return our own UserData") 100 } 101 }, 102 }, 103 } 104 105 for _, test := range tests { 106 tmpfile, _ := ioutil.TempFile("", "ud") 107 tmpfile.WriteString(test.template) 108 tmpfile.Close() 109 defer os.Remove(tmpfile.Name()) 110 t.Run(test.name, func(t *testing.T) { 111 ud, err := NewUserDataFromTemplateFile(tmpfile.Name(), nil, test.opts...) 112 test.exp(assert.New(t), ud, err) 113 }) 114 } 115 }