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 }