github.com/rmenn/terraform@v0.3.8-0.20150225065417-fc84b3a78802/command/command_test.go (about)

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