github.com/2matz/terraform@v0.6.1-0.20150714181608-a03cbdb5d5bd/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 }