github.phpd.cn/hashicorp/packer@v1.3.2/builder/virtualbox/iso/builder_test.go (about) 1 package iso 2 3 import ( 4 "fmt" 5 "reflect" 6 "testing" 7 8 "github.com/hashicorp/packer/builder/virtualbox/common" 9 "github.com/hashicorp/packer/packer" 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.google.com/", 17 "shutdown_command": "yes", 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_Defaults(t *testing.T) { 33 var b Builder 34 config := testConfig() 35 warns, err := b.Prepare(config) 36 if len(warns) > 0 { 37 t.Fatalf("bad: %#v", warns) 38 } 39 if err != nil { 40 t.Fatalf("should not have error: %s", err) 41 } 42 43 if b.config.GuestAdditionsMode != common.GuestAdditionsModeUpload { 44 t.Errorf("bad guest additions mode: %s", b.config.GuestAdditionsMode) 45 } 46 47 if b.config.GuestOSType != "Other" { 48 t.Errorf("bad guest OS type: %s", b.config.GuestOSType) 49 } 50 51 if b.config.VMName == "" { 52 t.Errorf("bad vm name: %s", b.config.VMName) 53 } 54 55 if b.config.Format != "ovf" { 56 t.Errorf("bad format: %s", b.config.Format) 57 } 58 } 59 60 func TestBuilderPrepare_DiskSize(t *testing.T) { 61 var b Builder 62 config := testConfig() 63 64 delete(config, "disk_size") 65 warns, err := b.Prepare(config) 66 if len(warns) > 0 { 67 t.Fatalf("bad: %#v", warns) 68 } 69 if err != nil { 70 t.Fatalf("bad err: %s", err) 71 } 72 73 if b.config.DiskSize != 40000 { 74 t.Fatalf("bad size: %d", b.config.DiskSize) 75 } 76 77 config["disk_size"] = 60000 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.DiskSize != 60000 { 88 t.Fatalf("bad size: %d", b.config.DiskSize) 89 } 90 } 91 92 func TestBuilderPrepare_FloppyFiles(t *testing.T) { 93 var b Builder 94 config := testConfig() 95 96 delete(config, "floppy_files") 97 warns, err := b.Prepare(config) 98 if len(warns) > 0 { 99 t.Fatalf("bad: %#v", warns) 100 } 101 if err != nil { 102 t.Fatalf("bad err: %s", err) 103 } 104 105 if len(b.config.FloppyFiles) != 0 { 106 t.Fatalf("bad: %#v", b.config.FloppyFiles) 107 } 108 109 floppies_path := "../../../common/test-fixtures/floppies" 110 config["floppy_files"] = []string{fmt.Sprintf("%s/bar.bat", floppies_path), fmt.Sprintf("%s/foo.ps1", floppies_path)} 111 b = Builder{} 112 warns, err = b.Prepare(config) 113 if len(warns) > 0 { 114 t.Fatalf("bad: %#v", warns) 115 } 116 if err != nil { 117 t.Fatalf("should not have error: %s", err) 118 } 119 120 expected := []string{fmt.Sprintf("%s/bar.bat", floppies_path), fmt.Sprintf("%s/foo.ps1", floppies_path)} 121 if !reflect.DeepEqual(b.config.FloppyFiles, expected) { 122 t.Fatalf("bad: %#v", b.config.FloppyFiles) 123 } 124 } 125 126 func TestBuilderPrepare_InvalidFloppies(t *testing.T) { 127 var b Builder 128 config := testConfig() 129 config["floppy_files"] = []string{"nonexistent.bat", "nonexistent.ps1"} 130 b = Builder{} 131 _, errs := b.Prepare(config) 132 if errs == nil { 133 t.Fatalf("Nonexistent floppies should trigger multierror") 134 } 135 136 if len(errs.(*packer.MultiError).Errors) != 2 { 137 t.Fatalf("Multierror should work and report 2 errors") 138 } 139 } 140 141 func TestBuilderPrepare_GuestAdditionsMode(t *testing.T) { 142 var b Builder 143 config := testConfig() 144 145 // test default mode 146 delete(config, "guest_additions_mode") 147 warns, err := b.Prepare(config) 148 if len(warns) > 0 { 149 t.Fatalf("bad: %#v", warns) 150 } 151 if err != nil { 152 t.Fatalf("bad err: %s", err) 153 } 154 155 // Test another mode 156 config["guest_additions_mode"] = "attach" 157 b = Builder{} 158 warns, err = b.Prepare(config) 159 if len(warns) > 0 { 160 t.Fatalf("bad: %#v", warns) 161 } 162 if err != nil { 163 t.Fatalf("should not have error: %s", err) 164 } 165 166 if b.config.GuestAdditionsMode != common.GuestAdditionsModeAttach { 167 t.Fatalf("bad: %s", b.config.GuestAdditionsMode) 168 } 169 170 // Test bad mode 171 config["guest_additions_mode"] = "teleport" 172 b = Builder{} 173 warns, err = b.Prepare(config) 174 if len(warns) > 0 { 175 t.Fatalf("bad: %#v", warns) 176 } 177 if err == nil { 178 t.Fatal("should error") 179 } 180 } 181 182 func TestBuilderPrepare_GuestAdditionsPath(t *testing.T) { 183 var b Builder 184 config := testConfig() 185 186 delete(config, "guest_additions_path") 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 b.config.GuestAdditionsPath != "VBoxGuestAdditions.iso" { 196 t.Fatalf("bad: %s", b.config.GuestAdditionsPath) 197 } 198 199 config["guest_additions_path"] = "foo" 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 if b.config.GuestAdditionsPath != "foo" { 210 t.Fatalf("bad size: %s", b.config.GuestAdditionsPath) 211 } 212 } 213 214 func TestBuilderPrepare_GuestAdditionsSHA256(t *testing.T) { 215 var b Builder 216 config := testConfig() 217 218 delete(config, "guest_additions_sha256") 219 warns, err := b.Prepare(config) 220 if len(warns) > 0 { 221 t.Fatalf("bad: %#v", warns) 222 } 223 if err != nil { 224 t.Fatalf("bad err: %s", err) 225 } 226 227 if b.config.GuestAdditionsSHA256 != "" { 228 t.Fatalf("bad: %s", b.config.GuestAdditionsSHA256) 229 } 230 231 config["guest_additions_sha256"] = "FOO" 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.Fatalf("should not have error: %s", err) 239 } 240 241 if b.config.GuestAdditionsSHA256 != "foo" { 242 t.Fatalf("bad size: %s", b.config.GuestAdditionsSHA256) 243 } 244 } 245 246 func TestBuilderPrepare_GuestAdditionsURL(t *testing.T) { 247 var b Builder 248 config := testConfig() 249 250 config["guest_additions_url"] = "" 251 warns, err := b.Prepare(config) 252 if len(warns) > 0 { 253 t.Fatalf("bad: %#v", warns) 254 } 255 if err != nil { 256 t.Fatalf("err: %s", err) 257 } 258 259 if b.config.GuestAdditionsURL != "" { 260 t.Fatalf("should be empty: %s", b.config.GuestAdditionsURL) 261 } 262 263 config["guest_additions_url"] = "http://www.packer.io" 264 b = Builder{} 265 warns, err = b.Prepare(config) 266 if len(warns) > 0 { 267 t.Fatalf("bad: %#v", warns) 268 } 269 if err != nil { 270 t.Errorf("should not have error: %s", err) 271 } 272 } 273 274 func TestBuilderPrepare_HardDriveInterface(t *testing.T) { 275 var b Builder 276 config := testConfig() 277 278 // Test a default boot_wait 279 delete(config, "hard_drive_interface") 280 warns, err := b.Prepare(config) 281 if len(warns) > 0 { 282 t.Fatalf("bad: %#v", warns) 283 } 284 if err != nil { 285 t.Fatalf("err: %s", err) 286 } 287 288 if b.config.HardDriveInterface != "ide" { 289 t.Fatalf("bad: %s", b.config.HardDriveInterface) 290 } 291 292 // Test with a bad 293 config["hard_drive_interface"] = "fake" 294 b = Builder{} 295 warns, err = b.Prepare(config) 296 if len(warns) > 0 { 297 t.Fatalf("bad: %#v", warns) 298 } 299 if err == nil { 300 t.Fatal("should have error") 301 } 302 303 // Test with a good 304 config["hard_drive_interface"] = "sata" 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.Fatalf("should not have error: %s", err) 312 } 313 } 314 315 func TestBuilderPrepare_InvalidKey(t *testing.T) { 316 var b Builder 317 config := testConfig() 318 319 // Add a random key 320 config["i_should_not_be_valid"] = true 321 warns, err := b.Prepare(config) 322 if len(warns) > 0 { 323 t.Fatalf("bad: %#v", warns) 324 } 325 if err == nil { 326 t.Fatal("should have error") 327 } 328 } 329 330 func TestBuilderPrepare_ISOInterface(t *testing.T) { 331 var b Builder 332 config := testConfig() 333 334 // Test a default boot_wait 335 delete(config, "iso_interface") 336 warns, err := b.Prepare(config) 337 if len(warns) > 0 { 338 t.Fatalf("bad: %#v", warns) 339 } 340 if err != nil { 341 t.Fatalf("err: %s", err) 342 } 343 344 if b.config.ISOInterface != "ide" { 345 t.Fatalf("bad: %s", b.config.ISOInterface) 346 } 347 348 // Test with a bad 349 config["iso_interface"] = "fake" 350 b = Builder{} 351 warns, err = b.Prepare(config) 352 if len(warns) > 0 { 353 t.Fatalf("bad: %#v", warns) 354 } 355 if err == nil { 356 t.Fatal("should have error") 357 } 358 359 // Test with a good 360 config["iso_interface"] = "sata" 361 b = Builder{} 362 warns, err = b.Prepare(config) 363 if len(warns) > 0 { 364 t.Fatalf("bad: %#v", warns) 365 } 366 if err != nil { 367 t.Fatalf("should not have error: %s", err) 368 } 369 }