github.com/wangzhucn/terraform@v0.6.7-0.20151109233120-4eea011b56b3/config/config_test.go (about) 1 package config 2 3 import ( 4 "path/filepath" 5 "reflect" 6 "strings" 7 "testing" 8 ) 9 10 // This is the directory where our test fixtures are. 11 const fixtureDir = "./test-fixtures" 12 13 func TestConfigCount(t *testing.T) { 14 c := testConfig(t, "count-int") 15 actual, err := c.Resources[0].Count() 16 if err != nil { 17 t.Fatalf("err: %s", err) 18 } 19 if actual != 5 { 20 t.Fatalf("bad: %#v", actual) 21 } 22 } 23 24 func TestConfigCount_string(t *testing.T) { 25 c := testConfig(t, "count-string") 26 actual, err := c.Resources[0].Count() 27 if err != nil { 28 t.Fatalf("err: %s", err) 29 } 30 if actual != 5 { 31 t.Fatalf("bad: %#v", actual) 32 } 33 } 34 35 func TestConfigCount_var(t *testing.T) { 36 c := testConfig(t, "count-var") 37 _, err := c.Resources[0].Count() 38 if err == nil { 39 t.Fatalf("should error") 40 } 41 } 42 43 func TestConfigValidate(t *testing.T) { 44 c := testConfig(t, "validate-good") 45 if err := c.Validate(); err != nil { 46 t.Fatalf("err: %s", err) 47 } 48 } 49 50 func TestConfigValidate_badDependsOn(t *testing.T) { 51 c := testConfig(t, "validate-bad-depends-on") 52 if err := c.Validate(); err == nil { 53 t.Fatal("should not be valid") 54 } 55 } 56 57 func TestConfigValidate_countInt(t *testing.T) { 58 c := testConfig(t, "validate-count-int") 59 if err := c.Validate(); err != nil { 60 t.Fatalf("err: %s", err) 61 } 62 } 63 64 func TestConfigValidate_countBadContext(t *testing.T) { 65 c := testConfig(t, "validate-count-bad-context") 66 67 err := c.Validate() 68 69 expected := []string{ 70 "no_count_in_output: count variables are only valid within resources", 71 "no_count_in_module: count variables are only valid within resources", 72 } 73 for _, exp := range expected { 74 if !strings.Contains(err.Error(), exp) { 75 t.Fatalf("expected: %q,\nto contain: %q", err, exp) 76 } 77 } 78 } 79 80 func TestConfigValidate_countCountVar(t *testing.T) { 81 c := testConfig(t, "validate-count-count-var") 82 if err := c.Validate(); err == nil { 83 t.Fatal("should not be valid") 84 } 85 } 86 87 func TestConfigValidate_countModuleVar(t *testing.T) { 88 c := testConfig(t, "validate-count-module-var") 89 if err := c.Validate(); err == nil { 90 t.Fatal("should not be valid") 91 } 92 } 93 94 func TestConfigValidate_countNotInt(t *testing.T) { 95 c := testConfig(t, "validate-count-not-int") 96 if err := c.Validate(); err == nil { 97 t.Fatal("should not be valid") 98 } 99 } 100 101 func TestConfigValidate_countResourceVar(t *testing.T) { 102 c := testConfig(t, "validate-count-resource-var") 103 if err := c.Validate(); err == nil { 104 t.Fatal("should not be valid") 105 } 106 } 107 108 func TestConfigValidate_countUserVar(t *testing.T) { 109 c := testConfig(t, "validate-count-user-var") 110 if err := c.Validate(); err != nil { 111 t.Fatalf("err: %s", err) 112 } 113 } 114 115 func TestConfigValidate_countVar(t *testing.T) { 116 c := testConfig(t, "validate-count-var") 117 if err := c.Validate(); err != nil { 118 t.Fatalf("err: %s", err) 119 } 120 } 121 122 func TestConfigValidate_countVarInvalid(t *testing.T) { 123 c := testConfig(t, "validate-count-var-invalid") 124 if err := c.Validate(); err == nil { 125 t.Fatal("should not be valid") 126 } 127 } 128 129 func TestConfigValidate_dependsOnVar(t *testing.T) { 130 c := testConfig(t, "validate-depends-on-var") 131 if err := c.Validate(); err == nil { 132 t.Fatal("should not be valid") 133 } 134 } 135 136 func TestConfigValidate_dupModule(t *testing.T) { 137 c := testConfig(t, "validate-dup-module") 138 if err := c.Validate(); err == nil { 139 t.Fatal("should not be valid") 140 } 141 } 142 143 func TestConfigValidate_dupResource(t *testing.T) { 144 c := testConfig(t, "validate-dup-resource") 145 if err := c.Validate(); err == nil { 146 t.Fatal("should not be valid") 147 } 148 } 149 150 func TestConfigValidate_moduleNameBad(t *testing.T) { 151 c := testConfig(t, "validate-module-name-bad") 152 if err := c.Validate(); err == nil { 153 t.Fatal("should not be valid") 154 } 155 } 156 157 func TestConfigValidate_moduleSourceVar(t *testing.T) { 158 c := testConfig(t, "validate-module-source-var") 159 if err := c.Validate(); err == nil { 160 t.Fatal("should not be valid") 161 } 162 } 163 164 func TestConfigValidate_moduleVarInt(t *testing.T) { 165 c := testConfig(t, "validate-module-var-int") 166 if err := c.Validate(); err != nil { 167 t.Fatalf("should be valid: %s", err) 168 } 169 } 170 171 func TestConfigValidate_moduleVarMap(t *testing.T) { 172 c := testConfig(t, "validate-module-var-map") 173 if err := c.Validate(); err == nil { 174 t.Fatal("should be invalid") 175 } 176 } 177 178 func TestConfigValidate_moduleVarSelf(t *testing.T) { 179 c := testConfig(t, "validate-module-var-self") 180 if err := c.Validate(); err == nil { 181 t.Fatal("should be invalid") 182 } 183 } 184 185 func TestConfigValidate_nil(t *testing.T) { 186 var c Config 187 if err := c.Validate(); err != nil { 188 t.Fatalf("err: %s", err) 189 } 190 } 191 192 func TestConfigValidate_outputBadField(t *testing.T) { 193 c := testConfig(t, "validate-output-bad-field") 194 if err := c.Validate(); err == nil { 195 t.Fatal("should not be valid") 196 } 197 } 198 199 func TestConfigValidate_pathVar(t *testing.T) { 200 c := testConfig(t, "validate-path-var") 201 if err := c.Validate(); err != nil { 202 t.Fatalf("err: %s", err) 203 } 204 } 205 206 func TestConfigValidate_pathVarInvalid(t *testing.T) { 207 c := testConfig(t, "validate-path-var-invalid") 208 if err := c.Validate(); err == nil { 209 t.Fatal("should not be valid") 210 } 211 } 212 213 func TestConfigValidate_providerMulti(t *testing.T) { 214 c := testConfig(t, "validate-provider-multi") 215 if err := c.Validate(); err == nil { 216 t.Fatal("should not be valid") 217 } 218 } 219 220 func TestConfigValidate_providerMultiGood(t *testing.T) { 221 c := testConfig(t, "validate-provider-multi-good") 222 if err := c.Validate(); err != nil { 223 t.Fatalf("should be valid: %s", err) 224 } 225 } 226 227 func TestConfigValidate_providerMultiRefGood(t *testing.T) { 228 c := testConfig(t, "validate-provider-multi-ref-good") 229 if err := c.Validate(); err != nil { 230 t.Fatalf("should be valid: %s", err) 231 } 232 } 233 234 func TestConfigValidate_providerMultiRefBad(t *testing.T) { 235 c := testConfig(t, "validate-provider-multi-ref-bad") 236 if err := c.Validate(); err == nil { 237 t.Fatal("should not be valid") 238 } 239 } 240 241 func TestConfigValidate_provConnSplatOther(t *testing.T) { 242 c := testConfig(t, "validate-prov-conn-splat-other") 243 if err := c.Validate(); err != nil { 244 t.Fatalf("should be valid: %s", err) 245 } 246 } 247 248 func TestConfigValidate_provConnSplatSelf(t *testing.T) { 249 c := testConfig(t, "validate-prov-conn-splat-self") 250 if err := c.Validate(); err == nil { 251 t.Fatal("should not be valid") 252 } 253 } 254 255 func TestConfigValidate_provSplatOther(t *testing.T) { 256 c := testConfig(t, "validate-prov-splat-other") 257 if err := c.Validate(); err != nil { 258 t.Fatalf("should be valid: %s", err) 259 } 260 } 261 262 func TestConfigValidate_provSplatSelf(t *testing.T) { 263 c := testConfig(t, "validate-prov-splat-self") 264 if err := c.Validate(); err == nil { 265 t.Fatal("should not be valid") 266 } 267 } 268 269 func TestConfigValidate_resourceProvVarSelf(t *testing.T) { 270 c := testConfig(t, "validate-resource-prov-self") 271 if err := c.Validate(); err != nil { 272 t.Fatalf("should be valid: %s", err) 273 } 274 } 275 276 func TestConfigValidate_resourceVarSelf(t *testing.T) { 277 c := testConfig(t, "validate-resource-self") 278 if err := c.Validate(); err == nil { 279 t.Fatal("should not be valid") 280 } 281 } 282 283 func TestConfigValidate_unknownThing(t *testing.T) { 284 c := testConfig(t, "validate-unknownthing") 285 if err := c.Validate(); err == nil { 286 t.Fatal("should not be valid") 287 } 288 } 289 290 func TestConfigValidate_unknownResourceVar(t *testing.T) { 291 c := testConfig(t, "validate-unknown-resource-var") 292 if err := c.Validate(); err == nil { 293 t.Fatal("should not be valid") 294 } 295 } 296 297 func TestConfigValidate_unknownResourceVar_output(t *testing.T) { 298 c := testConfig(t, "validate-unknown-resource-var-output") 299 if err := c.Validate(); err == nil { 300 t.Fatal("should not be valid") 301 } 302 } 303 304 func TestConfigValidate_unknownVar(t *testing.T) { 305 c := testConfig(t, "validate-unknownvar") 306 if err := c.Validate(); err == nil { 307 t.Fatal("should not be valid") 308 } 309 } 310 311 func TestConfigValidate_unknownVarCount(t *testing.T) { 312 c := testConfig(t, "validate-unknownvar-count") 313 if err := c.Validate(); err == nil { 314 t.Fatal("should not be valid") 315 } 316 } 317 318 func TestConfigValidate_varDefault(t *testing.T) { 319 c := testConfig(t, "validate-var-default") 320 if err := c.Validate(); err != nil { 321 t.Fatalf("should be valid: %s", err) 322 } 323 } 324 325 func TestConfigValidate_varDefaultBadType(t *testing.T) { 326 c := testConfig(t, "validate-var-default-bad-type") 327 if err := c.Validate(); err == nil { 328 t.Fatal("should not be valid") 329 } 330 } 331 332 func TestConfigValidate_varDefaultInterpolate(t *testing.T) { 333 c := testConfig(t, "validate-var-default-interpolate") 334 if err := c.Validate(); err == nil { 335 t.Fatal("should not be valid") 336 } 337 } 338 339 func TestConfigValidate_varMultiExactNonSlice(t *testing.T) { 340 c := testConfig(t, "validate-var-multi-exact-non-slice") 341 if err := c.Validate(); err != nil { 342 t.Fatalf("should be valid: %s", err) 343 } 344 } 345 346 func TestConfigValidate_varMultiNonSlice(t *testing.T) { 347 c := testConfig(t, "validate-var-multi-non-slice") 348 if err := c.Validate(); err == nil { 349 t.Fatal("should not be valid") 350 } 351 } 352 353 func TestConfigValidate_varMultiNonSliceProvisioner(t *testing.T) { 354 c := testConfig(t, "validate-var-multi-non-slice-provisioner") 355 if err := c.Validate(); err == nil { 356 t.Fatal("should not be valid") 357 } 358 } 359 360 func TestConfigValidate_varMultiFunctionCall(t *testing.T) { 361 c := testConfig(t, "validate-var-multi-func") 362 if err := c.Validate(); err != nil { 363 t.Fatalf("should be valid: %s", err) 364 } 365 } 366 367 func TestConfigValidate_varModule(t *testing.T) { 368 c := testConfig(t, "validate-var-module") 369 if err := c.Validate(); err != nil { 370 t.Fatalf("err: %s", err) 371 } 372 } 373 374 func TestConfigValidate_varModuleInvalid(t *testing.T) { 375 c := testConfig(t, "validate-var-module-invalid") 376 if err := c.Validate(); err == nil { 377 t.Fatal("should not be valid") 378 } 379 } 380 381 func TestNameRegexp(t *testing.T) { 382 cases := []struct { 383 Input string 384 Match bool 385 }{ 386 {"hello", true}, 387 {"foo-bar", true}, 388 {"foo_bar", true}, 389 {"_hello", true}, 390 {"foo bar", false}, 391 {"foo.bar", false}, 392 } 393 394 for _, tc := range cases { 395 if NameRegexp.Match([]byte(tc.Input)) != tc.Match { 396 t.Fatalf("Input: %s\n\nExpected: %#v", tc.Input, tc.Match) 397 } 398 } 399 } 400 401 func TestProviderConfigName(t *testing.T) { 402 pcs := []*ProviderConfig{ 403 &ProviderConfig{Name: "aw"}, 404 &ProviderConfig{Name: "aws"}, 405 &ProviderConfig{Name: "a"}, 406 &ProviderConfig{Name: "gce_"}, 407 } 408 409 n := ProviderConfigName("aws_instance", pcs) 410 if n != "aws" { 411 t.Fatalf("bad: %s", n) 412 } 413 } 414 415 func TestVariableDefaultsMap(t *testing.T) { 416 cases := []struct { 417 Default interface{} 418 Output map[string]string 419 }{ 420 { 421 nil, 422 nil, 423 }, 424 425 { 426 "foo", 427 map[string]string{"var.foo": "foo"}, 428 }, 429 430 { 431 map[interface{}]interface{}{ 432 "foo": "bar", 433 "bar": "baz", 434 }, 435 map[string]string{ 436 "var.foo": "foo", 437 "var.foo.foo": "bar", 438 "var.foo.bar": "baz", 439 }, 440 }, 441 } 442 443 for i, tc := range cases { 444 v := &Variable{Name: "foo", Default: tc.Default} 445 actual := v.DefaultsMap() 446 if !reflect.DeepEqual(actual, tc.Output) { 447 t.Fatalf("%d: bad: %#v", i, actual) 448 } 449 } 450 } 451 452 func testConfig(t *testing.T, name string) *Config { 453 c, err := LoadFile(filepath.Join(fixtureDir, name, "main.tf")) 454 if err != nil { 455 t.Fatalf("file: %s\n\nerr: %s", name, err) 456 } 457 458 return c 459 }