github.com/daniellockard/packer@v0.7.6-0.20141210173435-5a9390934716/builder/vmware/iso/builder_test.go (about) 1 package iso 2 3 import ( 4 "github.com/mitchellh/packer/packer" 5 "io/ioutil" 6 "os" 7 "reflect" 8 "testing" 9 "time" 10 ) 11 12 func testConfig() map[string]interface{} { 13 return map[string]interface{}{ 14 "iso_checksum": "foo", 15 "iso_checksum_type": "md5", 16 "iso_url": "http://www.packer.io", 17 "shutdown_command": "foo", 18 "ssh_username": "foo", 19 20 packer.BuildNameConfigKey: "foo", 21 } 22 } 23 24 func TestBuilder_ImplementsBuilder(t *testing.T) { 25 var raw interface{} 26 raw = &Builder{} 27 if _, ok := raw.(packer.Builder); !ok { 28 t.Error("Builder must implement builder.") 29 } 30 } 31 32 func TestBuilderPrepare_ISOChecksum(t *testing.T) { 33 var b Builder 34 config := testConfig() 35 36 // Test bad 37 config["iso_checksum"] = "" 38 warns, err := b.Prepare(config) 39 if len(warns) > 0 { 40 t.Fatalf("bad: %#v", warns) 41 } 42 if err == nil { 43 t.Fatal("should have error") 44 } 45 46 // Test good 47 config["iso_checksum"] = "FOo" 48 b = Builder{} 49 warns, err = b.Prepare(config) 50 if len(warns) > 0 { 51 t.Fatalf("bad: %#v", warns) 52 } 53 if err != nil { 54 t.Fatalf("should not have error: %s", err) 55 } 56 57 if b.config.ISOChecksum != "foo" { 58 t.Fatalf("should've lowercased: %s", b.config.ISOChecksum) 59 } 60 } 61 62 func TestBuilderPrepare_ISOChecksumType(t *testing.T) { 63 var b Builder 64 config := testConfig() 65 66 // Test bad 67 config["iso_checksum_type"] = "" 68 warns, err := b.Prepare(config) 69 if len(warns) > 0 { 70 t.Fatalf("bad: %#v", warns) 71 } 72 if err == nil { 73 t.Fatal("should have error") 74 } 75 76 // Test good 77 config["iso_checksum_type"] = "mD5" 78 b = Builder{} 79 warns, err = b.Prepare(config) 80 if len(warns) > 0 { 81 t.Fatalf("bad: %#v", warns) 82 } 83 if err != nil { 84 t.Fatalf("should not have error: %s", err) 85 } 86 87 if b.config.ISOChecksumType != "md5" { 88 t.Fatalf("should've lowercased: %s", b.config.ISOChecksumType) 89 } 90 91 // Test unknown 92 config["iso_checksum_type"] = "fake" 93 b = Builder{} 94 warns, err = b.Prepare(config) 95 if len(warns) > 0 { 96 t.Fatalf("bad: %#v", warns) 97 } 98 if err == nil { 99 t.Fatal("should have error") 100 } 101 102 // Test none 103 config["iso_checksum_type"] = "none" 104 b = Builder{} 105 warns, err = b.Prepare(config) 106 if len(warns) == 0 { 107 t.Fatalf("bad: %#v", warns) 108 } 109 if err != nil { 110 t.Fatalf("should not have error: %s", err) 111 } 112 113 if b.config.ISOChecksumType != "none" { 114 t.Fatalf("should've lowercased: %s", b.config.ISOChecksumType) 115 } 116 } 117 118 func TestBuilderPrepare_Defaults(t *testing.T) { 119 var b Builder 120 config := testConfig() 121 warns, err := b.Prepare(config) 122 if len(warns) > 0 { 123 t.Fatalf("bad: %#v", warns) 124 } 125 if err != nil { 126 t.Fatalf("should not have error: %s", err) 127 } 128 129 if b.config.DiskName != "disk" { 130 t.Errorf("bad disk name: %s", b.config.DiskName) 131 } 132 133 if b.config.OutputDir != "output-foo" { 134 t.Errorf("bad output dir: %s", b.config.OutputDir) 135 } 136 137 if b.config.Version != "9" { 138 t.Errorf("bad Version: %s", b.config.Version) 139 } 140 141 if b.config.SSHWaitTimeout != (20 * time.Minute) { 142 t.Errorf("bad wait timeout: %s", b.config.SSHWaitTimeout) 143 } 144 145 if b.config.VMName != "packer-foo" { 146 t.Errorf("bad vm name: %s", b.config.VMName) 147 } 148 } 149 150 func TestBuilderPrepare_DiskSize(t *testing.T) { 151 var b Builder 152 config := testConfig() 153 154 delete(config, "disk_size") 155 warns, err := b.Prepare(config) 156 if len(warns) > 0 { 157 t.Fatalf("bad: %#v", warns) 158 } 159 if err != nil { 160 t.Fatalf("bad err: %s", err) 161 } 162 163 if b.config.DiskSize != 40000 { 164 t.Fatalf("bad size: %d", b.config.DiskSize) 165 } 166 167 config["disk_size"] = 60000 168 b = Builder{} 169 warns, err = b.Prepare(config) 170 if len(warns) > 0 { 171 t.Fatalf("bad: %#v", warns) 172 } 173 if err != nil { 174 t.Fatalf("should not have error: %s", err) 175 } 176 177 if b.config.DiskSize != 60000 { 178 t.Fatalf("bad size: %s", b.config.DiskSize) 179 } 180 } 181 182 func TestBuilderPrepare_FloppyFiles(t *testing.T) { 183 var b Builder 184 config := testConfig() 185 186 delete(config, "floppy_files") 187 warns, err := b.Prepare(config) 188 if len(warns) > 0 { 189 t.Fatalf("bad: %#v", warns) 190 } 191 if err != nil { 192 t.Fatalf("bad err: %s", err) 193 } 194 195 if len(b.config.FloppyFiles) != 0 { 196 t.Fatalf("bad: %#v", b.config.FloppyFiles) 197 } 198 199 config["floppy_files"] = []string{"foo", "bar"} 200 b = Builder{} 201 warns, err = b.Prepare(config) 202 if len(warns) > 0 { 203 t.Fatalf("bad: %#v", warns) 204 } 205 if err != nil { 206 t.Fatalf("should not have error: %s", err) 207 } 208 209 expected := []string{"foo", "bar"} 210 if !reflect.DeepEqual(b.config.FloppyFiles, expected) { 211 t.Fatalf("bad: %#v", b.config.FloppyFiles) 212 } 213 } 214 215 func TestBuilderPrepare_HTTPPort(t *testing.T) { 216 var b Builder 217 config := testConfig() 218 219 // Bad 220 config["http_port_min"] = 1000 221 config["http_port_max"] = 500 222 warns, err := b.Prepare(config) 223 if len(warns) > 0 { 224 t.Fatalf("bad: %#v", warns) 225 } 226 if err == nil { 227 t.Fatal("should have error") 228 } 229 230 // Bad 231 config["http_port_min"] = -500 232 b = Builder{} 233 warns, err = b.Prepare(config) 234 if len(warns) > 0 { 235 t.Fatalf("bad: %#v", warns) 236 } 237 if err == nil { 238 t.Fatal("should have error") 239 } 240 241 // Good 242 config["http_port_min"] = 500 243 config["http_port_max"] = 1000 244 b = Builder{} 245 warns, err = b.Prepare(config) 246 if len(warns) > 0 { 247 t.Fatalf("bad: %#v", warns) 248 } 249 if err != nil { 250 t.Fatalf("should not have error: %s", err) 251 } 252 } 253 254 func TestBuilderPrepare_InvalidKey(t *testing.T) { 255 var b Builder 256 config := testConfig() 257 258 // Add a random key 259 config["i_should_not_be_valid"] = true 260 warns, err := b.Prepare(config) 261 if len(warns) > 0 { 262 t.Fatalf("bad: %#v", warns) 263 } 264 if err == nil { 265 t.Fatal("should have error") 266 } 267 } 268 269 func TestBuilderPrepare_ISOUrl(t *testing.T) { 270 var b Builder 271 config := testConfig() 272 delete(config, "iso_url") 273 delete(config, "iso_urls") 274 275 // Test both epty 276 config["iso_url"] = "" 277 b = Builder{} 278 warns, err := b.Prepare(config) 279 if len(warns) > 0 { 280 t.Fatalf("bad: %#v", warns) 281 } 282 if err == nil { 283 t.Fatal("should have error") 284 } 285 286 // Test iso_url set 287 config["iso_url"] = "http://www.packer.io" 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.Errorf("should not have error: %s", err) 295 } 296 297 expected := []string{"http://www.packer.io"} 298 if !reflect.DeepEqual(b.config.ISOUrls, expected) { 299 t.Fatalf("bad: %#v", b.config.ISOUrls) 300 } 301 302 // Test both set 303 config["iso_url"] = "http://www.packer.io" 304 config["iso_urls"] = []string{"http://www.packer.io"} 305 b = Builder{} 306 warns, err = b.Prepare(config) 307 if len(warns) > 0 { 308 t.Fatalf("bad: %#v", warns) 309 } 310 if err == nil { 311 t.Fatal("should have error") 312 } 313 314 // Test just iso_urls set 315 delete(config, "iso_url") 316 config["iso_urls"] = []string{ 317 "http://www.packer.io", 318 "http://www.hashicorp.com", 319 } 320 321 b = Builder{} 322 warns, err = b.Prepare(config) 323 if len(warns) > 0 { 324 t.Fatalf("bad: %#v", warns) 325 } 326 if err != nil { 327 t.Errorf("should not have error: %s", err) 328 } 329 330 expected = []string{ 331 "http://www.packer.io", 332 "http://www.hashicorp.com", 333 } 334 if !reflect.DeepEqual(b.config.ISOUrls, expected) { 335 t.Fatalf("bad: %#v", b.config.ISOUrls) 336 } 337 } 338 339 func TestBuilderPrepare_OutputDir(t *testing.T) { 340 var b Builder 341 config := testConfig() 342 343 // Test with existing dir 344 dir, err := ioutil.TempDir("", "packer") 345 if err != nil { 346 t.Fatalf("err: %s", err) 347 } 348 defer os.RemoveAll(dir) 349 350 config["output_directory"] = dir 351 b = Builder{} 352 warns, err := b.Prepare(config) 353 if len(warns) > 0 { 354 t.Fatalf("bad: %#v", warns) 355 } 356 if err == nil { 357 t.Fatal("should have error") 358 } 359 360 // Test with a good one 361 config["output_directory"] = "i-hope-i-dont-exist" 362 b = Builder{} 363 warns, err = b.Prepare(config) 364 if len(warns) > 0 { 365 t.Fatalf("bad: %#v", warns) 366 } 367 if err != nil { 368 t.Fatalf("should not have error: %s", err) 369 } 370 } 371 372 func TestBuilderPrepare_ToolsUploadPath(t *testing.T) { 373 var b Builder 374 config := testConfig() 375 376 // Test a default 377 delete(config, "tools_upload_path") 378 warns, err := b.Prepare(config) 379 if len(warns) > 0 { 380 t.Fatalf("bad: %#v", warns) 381 } 382 if err != nil { 383 t.Fatalf("err: %s", err) 384 } 385 386 if b.config.ToolsUploadPath == "" { 387 t.Fatalf("bad value: %s", b.config.ToolsUploadPath) 388 } 389 390 // Test with a bad value 391 config["tools_upload_path"] = "{{{nope}" 392 b = Builder{} 393 warns, err = b.Prepare(config) 394 if len(warns) > 0 { 395 t.Fatalf("bad: %#v", warns) 396 } 397 if err == nil { 398 t.Fatal("should have error") 399 } 400 401 // Test with a good one 402 config["tools_upload_path"] = "hey" 403 b = Builder{} 404 warns, err = b.Prepare(config) 405 if len(warns) > 0 { 406 t.Fatalf("bad: %#v", warns) 407 } 408 if err != nil { 409 t.Fatalf("should not have error: %s", err) 410 } 411 } 412 413 func TestBuilderPrepare_VMXTemplatePath(t *testing.T) { 414 var b Builder 415 config := testConfig() 416 417 // Test bad 418 config["vmx_template_path"] = "/i/dont/exist/forreal" 419 warns, err := b.Prepare(config) 420 if len(warns) > 0 { 421 t.Fatalf("bad: %#v", warns) 422 } 423 if err == nil { 424 t.Fatal("should have error") 425 } 426 427 // Test good 428 tf, err := ioutil.TempFile("", "packer") 429 if err != nil { 430 t.Fatalf("err: %s", err) 431 } 432 defer os.Remove(tf.Name()) 433 defer tf.Close() 434 435 if _, err := tf.Write([]byte("HELLO!")); err != nil { 436 t.Fatalf("err: %s", err) 437 } 438 439 config["vmx_template_path"] = tf.Name() 440 b = Builder{} 441 warns, err = b.Prepare(config) 442 if len(warns) > 0 { 443 t.Fatalf("bad: %#v", warns) 444 } 445 if err != nil { 446 t.Fatalf("should not have error: %s", err) 447 } 448 449 // Bad template 450 tf2, err := ioutil.TempFile("", "packer") 451 if err != nil { 452 t.Fatalf("err: %s", err) 453 } 454 defer os.Remove(tf2.Name()) 455 defer tf2.Close() 456 457 if _, err := tf2.Write([]byte("{{foo}")); err != nil { 458 t.Fatalf("err: %s", err) 459 } 460 461 config["vmx_template_path"] = tf2.Name() 462 b = Builder{} 463 warns, err = b.Prepare(config) 464 if len(warns) > 0 { 465 t.Fatalf("bad: %#v", warns) 466 } 467 if err == nil { 468 t.Fatal("should have error") 469 } 470 } 471 472 func TestBuilderPrepare_VNCPort(t *testing.T) { 473 var b Builder 474 config := testConfig() 475 476 // Bad 477 config["vnc_port_min"] = 1000 478 config["vnc_port_max"] = 500 479 warns, err := b.Prepare(config) 480 if len(warns) > 0 { 481 t.Fatalf("bad: %#v", warns) 482 } 483 if err == nil { 484 t.Fatal("should have error") 485 } 486 487 // Bad 488 config["vnc_port_min"] = -500 489 b = Builder{} 490 warns, err = b.Prepare(config) 491 if len(warns) > 0 { 492 t.Fatalf("bad: %#v", warns) 493 } 494 if err == nil { 495 t.Fatal("should have error") 496 } 497 498 // Good 499 config["vnc_port_min"] = 500 500 config["vnc_port_max"] = 1000 501 b = Builder{} 502 warns, err = b.Prepare(config) 503 if len(warns) > 0 { 504 t.Fatalf("bad: %#v", warns) 505 } 506 if err != nil { 507 t.Fatalf("should not have error: %s", err) 508 } 509 }