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