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  `