github.com/armen/terraform@v0.5.2-0.20150529052519-caa8117a08f1/command/command_test.go (about)

     1  package command
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/hashicorp/terraform/config/module"
    11  	"github.com/hashicorp/terraform/terraform"
    12  )
    13  
    14  // This is the directory where our test fixtures are.
    15  var fixtureDir = "./test-fixtures"
    16  
    17  func init() {
    18  	test = true
    19  
    20  	// Expand the fixture dir on init because we change the working
    21  	// directory in some tests.
    22  	var err error
    23  	fixtureDir, err = filepath.Abs(fixtureDir)
    24  	if err != nil {
    25  		panic(err)
    26  	}
    27  }
    28  
    29  func tempDir(t *testing.T) string {
    30  	dir, err := ioutil.TempDir("", "tf")
    31  	if err != nil {
    32  		t.Fatalf("err: %s", err)
    33  	}
    34  	if err := os.RemoveAll(dir); err != nil {
    35  		t.Fatalf("err: %s", err)
    36  	}
    37  
    38  	return dir
    39  }
    40  
    41  func testFixturePath(name string) string {
    42  	return filepath.Join(fixtureDir, name)
    43  }
    44  
    45  func testCtxConfig(p terraform.ResourceProvider) *terraform.ContextOpts {
    46  	return &terraform.ContextOpts{
    47  		Providers: map[string]terraform.ResourceProviderFactory{
    48  			"test": func() (terraform.ResourceProvider, error) {
    49  				return p, nil
    50  			},
    51  		},
    52  	}
    53  }
    54  
    55  func testModule(t *testing.T, name string) *module.Tree {
    56  	mod, err := module.NewTreeModule("", filepath.Join(fixtureDir, name))
    57  	if err != nil {
    58  		t.Fatalf("err: %s", err)
    59  	}
    60  
    61  	s := &module.FolderStorage{StorageDir: tempDir(t)}
    62  	if err := mod.Load(s, module.GetModeGet); err != nil {
    63  		t.Fatalf("err: %s", err)
    64  	}
    65  
    66  	return mod
    67  }
    68  
    69  func testPlanFile(t *testing.T, plan *terraform.Plan) string {
    70  	path := testTempFile(t)
    71  
    72  	f, err := os.Create(path)
    73  	if err != nil {
    74  		t.Fatalf("err: %s", err)
    75  	}
    76  	defer f.Close()
    77  
    78  	if err := terraform.WritePlan(plan, f); err != nil {
    79  		t.Fatalf("err: %s", err)
    80  	}
    81  
    82  	return path
    83  }
    84  
    85  func testReadPlan(t *testing.T, path string) *terraform.Plan {
    86  	f, err := os.Open(path)
    87  	if err != nil {
    88  		t.Fatalf("err: %s", err)
    89  	}
    90  	defer f.Close()
    91  
    92  	p, err := terraform.ReadPlan(f)
    93  	if err != nil {
    94  		t.Fatalf("err: %s", err)
    95  	}
    96  
    97  	return p
    98  }
    99  
   100  // testState returns a test State structure that we use for a lot of tests.
   101  func testState() *terraform.State {
   102  	return &terraform.State{
   103  		Modules: []*terraform.ModuleState{
   104  			&terraform.ModuleState{
   105  				Path: []string{"root"},
   106  				Resources: map[string]*terraform.ResourceState{
   107  					"test_instance.foo": &terraform.ResourceState{
   108  						Type: "test_instance",
   109  						Primary: &terraform.InstanceState{
   110  							ID: "bar",
   111  						},
   112  					},
   113  				},
   114  			},
   115  		},
   116  	}
   117  }
   118  
   119  func testStateFile(t *testing.T, s *terraform.State) string {
   120  	path := testTempFile(t)
   121  
   122  	f, err := os.Create(path)
   123  	if err != nil {
   124  		t.Fatalf("err: %s", err)
   125  	}
   126  	defer f.Close()
   127  
   128  	if err := terraform.WriteState(s, f); err != nil {
   129  		t.Fatalf("err: %s", err)
   130  	}
   131  
   132  	return path
   133  }
   134  
   135  // testStateFileDefault writes the state out to the default statefile
   136  // in the cwd. Use `testCwd` to change into a temp cwd.
   137  func testStateFileDefault(t *testing.T, s *terraform.State) string {
   138  	f, err := os.Create(DefaultStateFilename)
   139  	if err != nil {
   140  		t.Fatalf("err: %s", err)
   141  	}
   142  	defer f.Close()
   143  
   144  	if err := terraform.WriteState(s, f); err != nil {
   145  		t.Fatalf("err: %s", err)
   146  	}
   147  
   148  	return DefaultStateFilename
   149  }
   150  
   151  // testStateFileRemote writes the state out to the remote statefile
   152  // in the cwd. Use `testCwd` to change into a temp cwd.
   153  func testStateFileRemote(t *testing.T, s *terraform.State) string {
   154  	path := filepath.Join(DefaultDataDir, DefaultStateFilename)
   155  	if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
   156  		t.Fatalf("err: %s", err)
   157  	}
   158  
   159  	f, err := os.Create(path)
   160  	if err != nil {
   161  		t.Fatalf("err: %s", err)
   162  	}
   163  	defer f.Close()
   164  
   165  	if err := terraform.WriteState(s, f); err != nil {
   166  		t.Fatalf("err: %s", err)
   167  	}
   168  
   169  	return path
   170  }
   171  
   172  // testStateOutput tests that the state at the given path contains
   173  // the expected state string.
   174  func testStateOutput(t *testing.T, path string, expected string) {
   175  	f, err := os.Open(path)
   176  	if err != nil {
   177  		t.Fatalf("err: %s", err)
   178  	}
   179  
   180  	newState, err := terraform.ReadState(f)
   181  	f.Close()
   182  	if err != nil {
   183  		t.Fatalf("err: %s", err)
   184  	}
   185  
   186  	actual := strings.TrimSpace(newState.String())
   187  	expected = strings.TrimSpace(expected)
   188  	if actual != expected {
   189  		t.Fatalf("bad:\n\n%s", actual)
   190  	}
   191  }
   192  
   193  func testProvider() *terraform.MockResourceProvider {
   194  	p := new(terraform.MockResourceProvider)
   195  	p.DiffReturn = &terraform.InstanceDiff{}
   196  	p.RefreshFn = func(
   197  		info *terraform.InstanceInfo,
   198  		s *terraform.InstanceState) (*terraform.InstanceState, error) {
   199  		return s, nil
   200  	}
   201  	p.ResourcesReturn = []terraform.ResourceType{
   202  		terraform.ResourceType{
   203  			Name: "test_instance",
   204  		},
   205  	}
   206  
   207  	return p
   208  }
   209  
   210  func testTempFile(t *testing.T) string {
   211  	tf, err := ioutil.TempFile("", "tf")
   212  	if err != nil {
   213  		t.Fatalf("err: %s", err)
   214  	}
   215  
   216  	result := tf.Name()
   217  
   218  	if err := tf.Close(); err != nil {
   219  		t.Fatalf("err: %s", err)
   220  	}
   221  	if err := os.Remove(result); err != nil {
   222  		t.Fatalf("err: %s", err)
   223  	}
   224  
   225  	return result
   226  }
   227  
   228  func testTempDir(t *testing.T) string {
   229  	d, err := ioutil.TempDir("", "tf")
   230  	if err != nil {
   231  		t.Fatalf("err: %s", err)
   232  	}
   233  
   234  	return d
   235  }
   236  
   237  // testCwd is used to change the current working directory
   238  // into a test directory that should be remoted after
   239  func testCwd(t *testing.T) (string, string) {
   240  	tmp, err := ioutil.TempDir("", "tf")
   241  	if err != nil {
   242  		t.Fatalf("err: %v", err)
   243  	}
   244  
   245  	cwd, err := os.Getwd()
   246  	if err != nil {
   247  		t.Fatalf("err: %v", err)
   248  	}
   249  
   250  	if err := os.Chdir(tmp); err != nil {
   251  		t.Fatalf("err: %v", err)
   252  	}
   253  
   254  	return tmp, cwd
   255  }
   256  
   257  // testFixCwd is used to as a defer to testDir
   258  func testFixCwd(t *testing.T, tmp, cwd string) {
   259  	if err := os.Chdir(cwd); err != nil {
   260  		t.Fatalf("err: %v", err)
   261  	}
   262  
   263  	if err := os.RemoveAll(tmp); err != nil {
   264  		t.Fatalf("err: %v", err)
   265  	}
   266  }