github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/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  // testStateOutput tests that the state at the given path contains
   152  // the expected state string.
   153  func testStateOutput(t *testing.T, path string, expected string) {
   154  	f, err := os.Open(path)
   155  	if err != nil {
   156  		t.Fatalf("err: %s", err)
   157  	}
   158  
   159  	newState, err := terraform.ReadState(f)
   160  	f.Close()
   161  	if err != nil {
   162  		t.Fatalf("err: %s", err)
   163  	}
   164  
   165  	actual := strings.TrimSpace(newState.String())
   166  	expected = strings.TrimSpace(expected)
   167  	if actual != expected {
   168  		t.Fatalf("bad:\n\n%s", actual)
   169  	}
   170  }
   171  
   172  func testProvider() *terraform.MockResourceProvider {
   173  	p := new(terraform.MockResourceProvider)
   174  	p.DiffReturn = &terraform.InstanceDiff{}
   175  	p.RefreshFn = func(
   176  		info *terraform.InstanceInfo,
   177  		s *terraform.InstanceState) (*terraform.InstanceState, error) {
   178  		return s, nil
   179  	}
   180  	p.ResourcesReturn = []terraform.ResourceType{
   181  		terraform.ResourceType{
   182  			Name: "test_instance",
   183  		},
   184  	}
   185  
   186  	return p
   187  }
   188  
   189  func testTempFile(t *testing.T) string {
   190  	tf, err := ioutil.TempFile("", "tf")
   191  	if err != nil {
   192  		t.Fatalf("err: %s", err)
   193  	}
   194  
   195  	result := tf.Name()
   196  
   197  	if err := tf.Close(); err != nil {
   198  		t.Fatalf("err: %s", err)
   199  	}
   200  	if err := os.Remove(result); err != nil {
   201  		t.Fatalf("err: %s", err)
   202  	}
   203  
   204  	return result
   205  }
   206  
   207  func testTempDir(t *testing.T) string {
   208  	d, err := ioutil.TempDir("", "tf")
   209  	if err != nil {
   210  		t.Fatalf("err: %s", err)
   211  	}
   212  
   213  	return d
   214  }
   215  
   216  // testCwd is used to change the current working directory
   217  // into a test directory that should be remoted after
   218  func testCwd(t *testing.T) (string, string) {
   219  	tmp, err := ioutil.TempDir("", "tf")
   220  	if err != nil {
   221  		t.Fatalf("err: %v", err)
   222  	}
   223  
   224  	cwd, err := os.Getwd()
   225  	if err != nil {
   226  		t.Fatalf("err: %v", err)
   227  	}
   228  
   229  	if err := os.Chdir(tmp); err != nil {
   230  		t.Fatalf("err: %v", err)
   231  	}
   232  
   233  	return tmp, cwd
   234  }
   235  
   236  // testFixCwd is used to as a defer to testDir
   237  func testFixCwd(t *testing.T, tmp, cwd string) {
   238  	if err := os.Chdir(cwd); err != nil {
   239  		t.Fatalf("err: %v", err)
   240  	}
   241  
   242  	if err := os.RemoveAll(tmp); err != nil {
   243  		t.Fatalf("err: %v", err)
   244  	}
   245  }