github.com/mapuri/terraform@v0.7.6-0.20161012203214-7e0408293f97/config/module/tree_test.go (about) 1 package module 2 3 import ( 4 "os" 5 "reflect" 6 "strings" 7 "testing" 8 9 "github.com/hashicorp/go-getter" 10 "github.com/hashicorp/terraform/config" 11 "github.com/hashicorp/terraform/helper/copy" 12 ) 13 14 func TestTreeChild(t *testing.T) { 15 storage := testStorage(t) 16 tree := NewTree("", testConfig(t, "child")) 17 if err := tree.Load(storage, GetModeGet); err != nil { 18 t.Fatalf("err: %s", err) 19 } 20 21 // Should be able to get the root child 22 if c := tree.Child([]string{}); c == nil { 23 t.Fatal("should not be nil") 24 } else if c.Name() != "root" { 25 t.Fatalf("bad: %#v", c.Name()) 26 } else if !reflect.DeepEqual(c.Path(), []string(nil)) { 27 t.Fatalf("bad: %#v", c.Path()) 28 } 29 30 // Should be able to get the root child 31 if c := tree.Child(nil); c == nil { 32 t.Fatal("should not be nil") 33 } else if c.Name() != "root" { 34 t.Fatalf("bad: %#v", c.Name()) 35 } else if !reflect.DeepEqual(c.Path(), []string(nil)) { 36 t.Fatalf("bad: %#v", c.Path()) 37 } 38 39 // Should be able to get the foo child 40 if c := tree.Child([]string{"foo"}); c == nil { 41 t.Fatal("should not be nil") 42 } else if c.Name() != "foo" { 43 t.Fatalf("bad: %#v", c.Name()) 44 } else if !reflect.DeepEqual(c.Path(), []string{"foo"}) { 45 t.Fatalf("bad: %#v", c.Path()) 46 } 47 48 // Should be able to get the nested child 49 if c := tree.Child([]string{"foo", "bar"}); c == nil { 50 t.Fatal("should not be nil") 51 } else if c.Name() != "bar" { 52 t.Fatalf("bad: %#v", c.Name()) 53 } else if !reflect.DeepEqual(c.Path(), []string{"foo", "bar"}) { 54 t.Fatalf("bad: %#v", c.Path()) 55 } 56 } 57 58 func TestTreeLoad(t *testing.T) { 59 storage := testStorage(t) 60 tree := NewTree("", testConfig(t, "basic")) 61 62 if tree.Loaded() { 63 t.Fatal("should not be loaded") 64 } 65 66 // This should error because we haven't gotten things yet 67 if err := tree.Load(storage, GetModeNone); err == nil { 68 t.Fatal("should error") 69 } 70 71 if tree.Loaded() { 72 t.Fatal("should not be loaded") 73 } 74 75 // This should get things 76 if err := tree.Load(storage, GetModeGet); err != nil { 77 t.Fatalf("err: %s", err) 78 } 79 80 if !tree.Loaded() { 81 t.Fatal("should be loaded") 82 } 83 84 // This should no longer error 85 if err := tree.Load(storage, GetModeNone); err != nil { 86 t.Fatalf("err: %s", err) 87 } 88 89 actual := strings.TrimSpace(tree.String()) 90 expected := strings.TrimSpace(treeLoadStr) 91 if actual != expected { 92 t.Fatalf("bad: \n\n%s", actual) 93 } 94 } 95 96 func TestTreeLoad_duplicate(t *testing.T) { 97 storage := testStorage(t) 98 tree := NewTree("", testConfig(t, "dup")) 99 100 if tree.Loaded() { 101 t.Fatal("should not be loaded") 102 } 103 104 // This should get things 105 if err := tree.Load(storage, GetModeGet); err == nil { 106 t.Fatalf("should error") 107 } 108 } 109 110 func TestTreeLoad_copyable(t *testing.T) { 111 dir := tempDir(t) 112 storage := &getter.FolderStorage{StorageDir: dir} 113 cfg := testConfig(t, "basic") 114 tree := NewTree("", cfg) 115 116 // This should get things 117 if err := tree.Load(storage, GetModeGet); err != nil { 118 t.Fatalf("err: %s", err) 119 } 120 121 if !tree.Loaded() { 122 t.Fatal("should be loaded") 123 } 124 125 // This should no longer error 126 if err := tree.Load(storage, GetModeNone); err != nil { 127 t.Fatalf("err: %s", err) 128 } 129 130 // Now we copy the directory, this COPIES symlink values, and 131 // doesn't create symlinks themselves. That is important. 132 dir2 := tempDir(t) 133 os.RemoveAll(dir2) 134 defer os.RemoveAll(dir2) 135 if err := copy.CopyDir(dir, dir2); err != nil { 136 t.Fatalf("err: %s", err) 137 } 138 139 // Now copy the configuration 140 cfgDir := tempDir(t) 141 os.RemoveAll(cfgDir) 142 defer os.RemoveAll(cfgDir) 143 if err := copy.CopyDir(cfg.Dir, cfgDir); err != nil { 144 t.Fatalf("err: %s", err) 145 } 146 147 { 148 cfg, err := config.LoadDir(cfgDir) 149 if err != nil { 150 t.Fatalf("err: %s", err) 151 } 152 153 tree := NewTree("", cfg) 154 storage := &getter.FolderStorage{StorageDir: dir2} 155 156 // This should not error since we already got it! 157 if err := tree.Load(storage, GetModeNone); err != nil { 158 t.Fatalf("err: %s", err) 159 } 160 161 if !tree.Loaded() { 162 t.Fatal("should be loaded") 163 } 164 } 165 } 166 167 func TestTreeLoad_parentRef(t *testing.T) { 168 storage := testStorage(t) 169 tree := NewTree("", testConfig(t, "basic-parent")) 170 171 if tree.Loaded() { 172 t.Fatal("should not be loaded") 173 } 174 175 // This should error because we haven't gotten things yet 176 if err := tree.Load(storage, GetModeNone); err == nil { 177 t.Fatal("should error") 178 } 179 180 if tree.Loaded() { 181 t.Fatal("should not be loaded") 182 } 183 184 // This should get things 185 if err := tree.Load(storage, GetModeGet); err != nil { 186 t.Fatalf("err: %s", err) 187 } 188 189 if !tree.Loaded() { 190 t.Fatal("should be loaded") 191 } 192 193 // This should no longer error 194 if err := tree.Load(storage, GetModeNone); err != nil { 195 t.Fatalf("err: %s", err) 196 } 197 198 actual := strings.TrimSpace(tree.String()) 199 expected := strings.TrimSpace(treeLoadParentStr) 200 if actual != expected { 201 t.Fatalf("bad: \n\n%s", actual) 202 } 203 } 204 205 func TestTreeLoad_subdir(t *testing.T) { 206 storage := testStorage(t) 207 tree := NewTree("", testConfig(t, "basic-subdir")) 208 209 if tree.Loaded() { 210 t.Fatal("should not be loaded") 211 } 212 213 // This should error because we haven't gotten things yet 214 if err := tree.Load(storage, GetModeNone); err == nil { 215 t.Fatal("should error") 216 } 217 218 if tree.Loaded() { 219 t.Fatal("should not be loaded") 220 } 221 222 // This should get things 223 if err := tree.Load(storage, GetModeGet); err != nil { 224 t.Fatalf("err: %s", err) 225 } 226 227 if !tree.Loaded() { 228 t.Fatal("should be loaded") 229 } 230 231 // This should no longer error 232 if err := tree.Load(storage, GetModeNone); err != nil { 233 t.Fatalf("err: %s", err) 234 } 235 236 actual := strings.TrimSpace(tree.String()) 237 expected := strings.TrimSpace(treeLoadSubdirStr) 238 if actual != expected { 239 t.Fatalf("bad: \n\n%s", actual) 240 } 241 } 242 243 func TestTreeModules(t *testing.T) { 244 tree := NewTree("", testConfig(t, "basic")) 245 actual := tree.Modules() 246 247 expected := []*Module{ 248 &Module{Name: "foo", Source: "./foo"}, 249 } 250 251 if !reflect.DeepEqual(actual, expected) { 252 t.Fatalf("bad: %#v", actual) 253 } 254 } 255 256 func TestTreeName(t *testing.T) { 257 tree := NewTree("", testConfig(t, "basic")) 258 actual := tree.Name() 259 260 if actual != RootName { 261 t.Fatalf("bad: %#v", actual) 262 } 263 } 264 265 func TestTreeValidate_badChild(t *testing.T) { 266 tree := NewTree("", testConfig(t, "validate-child-bad")) 267 268 if err := tree.Load(testStorage(t), GetModeGet); err != nil { 269 t.Fatalf("err: %s", err) 270 } 271 272 if err := tree.Validate(); err == nil { 273 t.Fatal("should error") 274 } 275 } 276 277 func TestTreeValidate_badChildOutput(t *testing.T) { 278 tree := NewTree("", testConfig(t, "validate-bad-output")) 279 280 if err := tree.Load(testStorage(t), GetModeGet); err != nil { 281 t.Fatalf("err: %s", err) 282 } 283 284 if err := tree.Validate(); err == nil { 285 t.Fatal("should error") 286 } 287 } 288 289 func TestTreeValidate_badChildOutputToModule(t *testing.T) { 290 tree := NewTree("", testConfig(t, "validate-bad-output-to-module")) 291 292 if err := tree.Load(testStorage(t), GetModeGet); err != nil { 293 t.Fatalf("err: %s", err) 294 } 295 296 if err := tree.Validate(); err == nil { 297 t.Fatal("should error") 298 } 299 } 300 301 func TestTreeValidate_badChildVar(t *testing.T) { 302 tree := NewTree("", testConfig(t, "validate-bad-var")) 303 304 if err := tree.Load(testStorage(t), GetModeGet); err != nil { 305 t.Fatalf("err: %s", err) 306 } 307 308 if err := tree.Validate(); err == nil { 309 t.Fatal("should error") 310 } 311 } 312 313 func TestTreeValidate_badRoot(t *testing.T) { 314 tree := NewTree("", testConfig(t, "validate-root-bad")) 315 316 if err := tree.Load(testStorage(t), GetModeGet); err != nil { 317 t.Fatalf("err: %s", err) 318 } 319 320 if err := tree.Validate(); err == nil { 321 t.Fatal("should error") 322 } 323 } 324 325 func TestTreeValidate_good(t *testing.T) { 326 tree := NewTree("", testConfig(t, "validate-child-good")) 327 328 if err := tree.Load(testStorage(t), GetModeGet); err != nil { 329 t.Fatalf("err: %s", err) 330 } 331 332 if err := tree.Validate(); err != nil { 333 t.Fatalf("err: %s", err) 334 } 335 } 336 337 func TestTreeValidate_notLoaded(t *testing.T) { 338 tree := NewTree("", testConfig(t, "basic")) 339 340 if err := tree.Validate(); err == nil { 341 t.Fatal("should error") 342 } 343 } 344 345 func TestTreeValidate_requiredChildVar(t *testing.T) { 346 tree := NewTree("", testConfig(t, "validate-required-var")) 347 348 if err := tree.Load(testStorage(t), GetModeGet); err != nil { 349 t.Fatalf("err: %s", err) 350 } 351 352 if err := tree.Validate(); err == nil { 353 t.Fatal("should error") 354 } 355 } 356 357 const treeLoadStr = ` 358 root 359 foo (path: foo) 360 ` 361 362 const treeLoadParentStr = ` 363 root 364 a (path: a) 365 b (path: a, b) 366 ` 367 const treeLoadSubdirStr = ` 368 root 369 foo (path: foo) 370 bar (path: foo, bar) 371 `