github.com/rahart/packer@v0.12.2-0.20161229105310-282bb6ad370f/builder/vmware/iso/builder_test.go (about) 1 package iso 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "reflect" 8 "testing" 9 10 "github.com/mitchellh/packer/packer" 11 ) 12 13 func testConfig() map[string]interface{} { 14 return map[string]interface{}{ 15 "iso_checksum": "foo", 16 "iso_checksum_type": "md5", 17 "iso_url": "http://www.packer.io", 18 "shutdown_command": "foo", 19 "ssh_username": "foo", 20 21 packer.BuildNameConfigKey: "foo", 22 } 23 } 24 25 func TestBuilder_ImplementsBuilder(t *testing.T) { 26 var raw interface{} 27 raw = &Builder{} 28 if _, ok := raw.(packer.Builder); !ok { 29 t.Error("Builder must implement builder.") 30 } 31 } 32 33 func TestBuilderPrepare_Defaults(t *testing.T) { 34 var b Builder 35 config := testConfig() 36 warns, err := b.Prepare(config) 37 if len(warns) > 0 { 38 t.Fatalf("bad: %#v", warns) 39 } 40 if err != nil { 41 t.Fatalf("should not have error: %s", err) 42 } 43 44 if b.config.DiskName != "disk" { 45 t.Errorf("bad disk name: %s", b.config.DiskName) 46 } 47 48 if b.config.OutputDir != "output-foo" { 49 t.Errorf("bad output dir: %s", b.config.OutputDir) 50 } 51 52 if b.config.Version != "9" { 53 t.Errorf("bad Version: %s", b.config.Version) 54 } 55 56 if b.config.VMName != "packer-foo" { 57 t.Errorf("bad vm name: %s", b.config.VMName) 58 } 59 } 60 61 func TestBuilderPrepare_DiskSize(t *testing.T) { 62 var b Builder 63 config := testConfig() 64 65 delete(config, "disk_size") 66 warns, err := b.Prepare(config) 67 if len(warns) > 0 { 68 t.Fatalf("bad: %#v", warns) 69 } 70 if err != nil { 71 t.Fatalf("bad err: %s", err) 72 } 73 74 if b.config.DiskSize != 40000 { 75 t.Fatalf("bad size: %d", b.config.DiskSize) 76 } 77 78 config["disk_size"] = 60000 79 b = Builder{} 80 warns, err = b.Prepare(config) 81 if len(warns) > 0 { 82 t.Fatalf("bad: %#v", warns) 83 } 84 if err != nil { 85 t.Fatalf("should not have error: %s", err) 86 } 87 88 if b.config.DiskSize != 60000 { 89 t.Fatalf("bad size: %d", b.config.DiskSize) 90 } 91 } 92 93 func TestBuilderPrepare_FloppyFiles(t *testing.T) { 94 var b Builder 95 config := testConfig() 96 97 delete(config, "floppy_files") 98 warns, err := b.Prepare(config) 99 if len(warns) > 0 { 100 t.Fatalf("bad: %#v", warns) 101 } 102 if err != nil { 103 t.Fatalf("bad err: %s", err) 104 } 105 106 if len(b.config.FloppyFiles) != 0 { 107 t.Fatalf("bad: %#v", b.config.FloppyFiles) 108 } 109 110 floppies_path := "../../../common/test-fixtures/floppies" 111 config["floppy_files"] = []string{fmt.Sprintf("%s/bar.bat", floppies_path), fmt.Sprintf("%s/foo.ps1", floppies_path)} 112 b = Builder{} 113 warns, err = b.Prepare(config) 114 if len(warns) > 0 { 115 t.Fatalf("bad: %#v", warns) 116 } 117 if err != nil { 118 t.Fatalf("should not have error: %s", err) 119 } 120 121 expected := []string{fmt.Sprintf("%s/bar.bat", floppies_path), fmt.Sprintf("%s/foo.ps1", floppies_path)} 122 if !reflect.DeepEqual(b.config.FloppyFiles, expected) { 123 t.Fatalf("bad: %#v", b.config.FloppyFiles) 124 } 125 } 126 127 func TestBuilderPrepare_InvalidFloppies(t *testing.T) { 128 var b Builder 129 config := testConfig() 130 config["floppy_files"] = []string{"nonexistant.bat", "nonexistant.ps1"} 131 b = Builder{} 132 _, errs := b.Prepare(config) 133 if errs == nil { 134 t.Fatalf("Non existant floppies should trigger multierror") 135 } 136 137 if len(errs.(*packer.MultiError).Errors) != 2 { 138 t.Fatalf("Multierror should work and report 2 errors") 139 } 140 } 141 142 func TestBuilderPrepare_Format(t *testing.T) { 143 var b Builder 144 config := testConfig() 145 146 // Bad 147 config["format"] = "foobar" 148 warns, err := b.Prepare(config) 149 if len(warns) > 0 { 150 t.Fatalf("bad: %#v", warns) 151 } 152 if err == nil { 153 t.Fatal("should have error") 154 } 155 156 goodFormats := []string{"ova", "ovf", "vmx"} 157 158 for _, format := range goodFormats { 159 // Good 160 config["format"] = format 161 b = Builder{} 162 warns, err = b.Prepare(config) 163 if len(warns) > 0 { 164 t.Fatalf("bad: %#v", warns) 165 } 166 if err != nil { 167 t.Fatalf("should not have error: %s", err) 168 } 169 } 170 } 171 172 func TestBuilderPrepare_InvalidKey(t *testing.T) { 173 var b Builder 174 config := testConfig() 175 176 // Add a random key 177 config["i_should_not_be_valid"] = true 178 warns, err := b.Prepare(config) 179 if len(warns) > 0 { 180 t.Fatalf("bad: %#v", warns) 181 } 182 if err == nil { 183 t.Fatal("should have error") 184 } 185 } 186 187 func TestBuilderPrepare_OutputDir(t *testing.T) { 188 var b Builder 189 config := testConfig() 190 191 // Test with existing dir 192 dir, err := ioutil.TempDir("", "packer") 193 if err != nil { 194 t.Fatalf("err: %s", err) 195 } 196 defer os.RemoveAll(dir) 197 198 config["output_directory"] = dir 199 b = Builder{} 200 warns, err := b.Prepare(config) 201 if len(warns) > 0 { 202 t.Fatalf("bad: %#v", warns) 203 } 204 if err != nil { 205 t.Fatalf("err: %s", err) 206 } 207 208 // Test with a good one 209 config["output_directory"] = "i-hope-i-dont-exist" 210 b = Builder{} 211 warns, err = b.Prepare(config) 212 if len(warns) > 0 { 213 t.Fatalf("bad: %#v", warns) 214 } 215 if err != nil { 216 t.Fatalf("should not have error: %s", err) 217 } 218 } 219 220 func TestBuilderPrepare_ToolsUploadPath(t *testing.T) { 221 var b Builder 222 config := testConfig() 223 224 // Test a default 225 delete(config, "tools_upload_path") 226 warns, err := b.Prepare(config) 227 if len(warns) > 0 { 228 t.Fatalf("bad: %#v", warns) 229 } 230 if err != nil { 231 t.Fatalf("err: %s", err) 232 } 233 234 if b.config.ToolsUploadPath == "" { 235 t.Fatalf("bad value: %s", b.config.ToolsUploadPath) 236 } 237 238 // Test with a bad value 239 config["tools_upload_path"] = "{{{nope}" 240 b = Builder{} 241 warns, err = b.Prepare(config) 242 if len(warns) > 0 { 243 t.Fatalf("bad: %#v", warns) 244 } 245 if err == nil { 246 t.Fatal("should have error") 247 } 248 249 // Test with a good one 250 config["tools_upload_path"] = "hey" 251 b = Builder{} 252 warns, err = b.Prepare(config) 253 if len(warns) > 0 { 254 t.Fatalf("bad: %#v", warns) 255 } 256 if err != nil { 257 t.Fatalf("should not have error: %s", err) 258 } 259 } 260 261 func TestBuilderPrepare_VMXTemplatePath(t *testing.T) { 262 var b Builder 263 config := testConfig() 264 265 // Test bad 266 config["vmx_template_path"] = "/i/dont/exist/forreal" 267 warns, err := b.Prepare(config) 268 if len(warns) > 0 { 269 t.Fatalf("bad: %#v", warns) 270 } 271 if err == nil { 272 t.Fatal("should have error") 273 } 274 275 // Test good 276 tf, err := ioutil.TempFile("", "packer") 277 if err != nil { 278 t.Fatalf("err: %s", err) 279 } 280 defer os.Remove(tf.Name()) 281 defer tf.Close() 282 283 if _, err := tf.Write([]byte("HELLO!")); err != nil { 284 t.Fatalf("err: %s", err) 285 } 286 287 config["vmx_template_path"] = tf.Name() 288 b = Builder{} 289 warns, err = b.Prepare(config) 290 if len(warns) > 0 { 291 t.Fatalf("bad: %#v", warns) 292 } 293 if err != nil { 294 t.Fatalf("should not have error: %s", err) 295 } 296 297 // Bad template 298 tf2, err := ioutil.TempFile("", "packer") 299 if err != nil { 300 t.Fatalf("err: %s", err) 301 } 302 defer os.Remove(tf2.Name()) 303 defer tf2.Close() 304 305 if _, err := tf2.Write([]byte("{{foo}")); err != nil { 306 t.Fatalf("err: %s", err) 307 } 308 309 config["vmx_template_path"] = tf2.Name() 310 b = Builder{} 311 warns, err = b.Prepare(config) 312 if len(warns) > 0 { 313 t.Fatalf("bad: %#v", warns) 314 } 315 if err == nil { 316 t.Fatal("should have error") 317 } 318 } 319 320 func TestBuilderPrepare_VNCPort(t *testing.T) { 321 var b Builder 322 config := testConfig() 323 324 // Bad 325 config["vnc_port_min"] = 1000 326 config["vnc_port_max"] = 500 327 warns, err := b.Prepare(config) 328 if len(warns) > 0 { 329 t.Fatalf("bad: %#v", warns) 330 } 331 if err == nil { 332 t.Fatal("should have error") 333 } 334 335 // Bad 336 config["vnc_port_min"] = -500 337 b = Builder{} 338 warns, err = b.Prepare(config) 339 if len(warns) > 0 { 340 t.Fatalf("bad: %#v", warns) 341 } 342 if err == nil { 343 t.Fatal("should have error") 344 } 345 346 // Good 347 config["vnc_port_min"] = 500 348 config["vnc_port_max"] = 1000 349 b = Builder{} 350 warns, err = b.Prepare(config) 351 if len(warns) > 0 { 352 t.Fatalf("bad: %#v", warns) 353 } 354 if err != nil { 355 t.Fatalf("should not have error: %s", err) 356 } 357 } 358 359 func TestBuilderPrepare_CommConfig(t *testing.T) { 360 // Test Winrm 361 { 362 config := testConfig() 363 config["communicator"] = "winrm" 364 config["winrm_username"] = "username" 365 config["winrm_password"] = "password" 366 config["winrm_host"] = "1.2.3.4" 367 368 var b Builder 369 warns, err := b.Prepare(config) 370 if len(warns) > 0 { 371 t.Fatalf("bad: %#v", warns) 372 } 373 if err != nil { 374 t.Fatalf("should not have error: %s", err) 375 } 376 377 if b.config.CommConfig.WinRMUser != "username" { 378 t.Errorf("bad winrm_username: %s", b.config.CommConfig.WinRMUser) 379 } 380 if b.config.CommConfig.WinRMPassword != "password" { 381 t.Errorf("bad winrm_password: %s", b.config.CommConfig.WinRMPassword) 382 } 383 if host := b.config.CommConfig.Host(); host != "1.2.3.4" { 384 t.Errorf("bad host: %s", host) 385 } 386 } 387 388 // Test SSH 389 { 390 config := testConfig() 391 config["communicator"] = "ssh" 392 config["ssh_username"] = "username" 393 config["ssh_password"] = "password" 394 config["ssh_host"] = "1.2.3.4" 395 396 var b Builder 397 warns, err := b.Prepare(config) 398 if len(warns) > 0 { 399 t.Fatalf("bad: %#v", warns) 400 } 401 if err != nil { 402 t.Fatalf("should not have error: %s", err) 403 } 404 405 if b.config.CommConfig.SSHUsername != "username" { 406 t.Errorf("bad ssh_username: %s", b.config.CommConfig.SSHUsername) 407 } 408 if b.config.CommConfig.SSHPassword != "password" { 409 t.Errorf("bad ssh_password: %s", b.config.CommConfig.SSHPassword) 410 } 411 if host := b.config.CommConfig.Host(); host != "1.2.3.4" { 412 t.Errorf("bad host: %s", host) 413 } 414 } 415 }