github.com/kimor79/packer@v0.8.7-0.20151221212622-d507b18eb4cf/builder/vmware/iso/builder_test.go (about) 1 package iso 2 3 import ( 4 "io/ioutil" 5 "os" 6 "reflect" 7 "testing" 8 9 "github.com/mitchellh/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.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_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.DiskName != "disk" { 44 t.Errorf("bad disk name: %s", b.config.DiskName) 45 } 46 47 if b.config.OutputDir != "output-foo" { 48 t.Errorf("bad output dir: %s", b.config.OutputDir) 49 } 50 51 if b.config.Version != "9" { 52 t.Errorf("bad Version: %s", b.config.Version) 53 } 54 55 if b.config.VMName != "packer-foo" { 56 t.Errorf("bad vm name: %s", b.config.VMName) 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 config["floppy_files"] = []string{"foo", "bar"} 110 b = Builder{} 111 warns, err = b.Prepare(config) 112 if len(warns) > 0 { 113 t.Fatalf("bad: %#v", warns) 114 } 115 if err != nil { 116 t.Fatalf("should not have error: %s", err) 117 } 118 119 expected := []string{"foo", "bar"} 120 if !reflect.DeepEqual(b.config.FloppyFiles, expected) { 121 t.Fatalf("bad: %#v", b.config.FloppyFiles) 122 } 123 } 124 125 func TestBuilderPrepare_Format(t *testing.T) { 126 var b Builder 127 config := testConfig() 128 129 // Bad 130 config["format"] = "foobar" 131 warns, err := b.Prepare(config) 132 if len(warns) > 0 { 133 t.Fatalf("bad: %#v", warns) 134 } 135 if err == nil { 136 t.Fatal("should have error") 137 } 138 139 goodFormats := []string{"ova", "ovf", "vmx"} 140 141 for _, format := range goodFormats { 142 // Good 143 config["format"] = format 144 b = Builder{} 145 warns, err = b.Prepare(config) 146 if len(warns) > 0 { 147 t.Fatalf("bad: %#v", warns) 148 } 149 if err != nil { 150 t.Fatalf("should not have error: %s", err) 151 } 152 } 153 } 154 155 func TestBuilderPrepare_HTTPPort(t *testing.T) { 156 var b Builder 157 config := testConfig() 158 159 // Bad 160 config["http_port_min"] = 1000 161 config["http_port_max"] = 500 162 warns, err := b.Prepare(config) 163 if len(warns) > 0 { 164 t.Fatalf("bad: %#v", warns) 165 } 166 if err == nil { 167 t.Fatal("should have error") 168 } 169 170 // Bad 171 config["http_port_min"] = -500 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 have error") 179 } 180 181 // Good 182 config["http_port_min"] = 500 183 config["http_port_max"] = 1000 184 b = Builder{} 185 warns, err = b.Prepare(config) 186 if len(warns) > 0 { 187 t.Fatalf("bad: %#v", warns) 188 } 189 if err != nil { 190 t.Fatalf("should not have error: %s", err) 191 } 192 } 193 194 func TestBuilderPrepare_InvalidKey(t *testing.T) { 195 var b Builder 196 config := testConfig() 197 198 // Add a random key 199 config["i_should_not_be_valid"] = true 200 warns, err := b.Prepare(config) 201 if len(warns) > 0 { 202 t.Fatalf("bad: %#v", warns) 203 } 204 if err == nil { 205 t.Fatal("should have error") 206 } 207 } 208 209 func TestBuilderPrepare_OutputDir(t *testing.T) { 210 var b Builder 211 config := testConfig() 212 213 // Test with existing dir 214 dir, err := ioutil.TempDir("", "packer") 215 if err != nil { 216 t.Fatalf("err: %s", err) 217 } 218 defer os.RemoveAll(dir) 219 220 config["output_directory"] = dir 221 b = Builder{} 222 warns, err := b.Prepare(config) 223 if len(warns) > 0 { 224 t.Fatalf("bad: %#v", warns) 225 } 226 if err != nil { 227 t.Fatalf("err: %s", err) 228 } 229 230 // Test with a good one 231 config["output_directory"] = "i-hope-i-dont-exist" 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 242 func TestBuilderPrepare_ToolsUploadPath(t *testing.T) { 243 var b Builder 244 config := testConfig() 245 246 // Test a default 247 delete(config, "tools_upload_path") 248 warns, err := b.Prepare(config) 249 if len(warns) > 0 { 250 t.Fatalf("bad: %#v", warns) 251 } 252 if err != nil { 253 t.Fatalf("err: %s", err) 254 } 255 256 if b.config.ToolsUploadPath == "" { 257 t.Fatalf("bad value: %s", b.config.ToolsUploadPath) 258 } 259 260 // Test with a bad value 261 config["tools_upload_path"] = "{{{nope}" 262 b = Builder{} 263 warns, err = b.Prepare(config) 264 if len(warns) > 0 { 265 t.Fatalf("bad: %#v", warns) 266 } 267 if err == nil { 268 t.Fatal("should have error") 269 } 270 271 // Test with a good one 272 config["tools_upload_path"] = "hey" 273 b = Builder{} 274 warns, err = b.Prepare(config) 275 if len(warns) > 0 { 276 t.Fatalf("bad: %#v", warns) 277 } 278 if err != nil { 279 t.Fatalf("should not have error: %s", err) 280 } 281 } 282 283 func TestBuilderPrepare_VMXTemplatePath(t *testing.T) { 284 var b Builder 285 config := testConfig() 286 287 // Test bad 288 config["vmx_template_path"] = "/i/dont/exist/forreal" 289 warns, err := b.Prepare(config) 290 if len(warns) > 0 { 291 t.Fatalf("bad: %#v", warns) 292 } 293 if err == nil { 294 t.Fatal("should have error") 295 } 296 297 // Test good 298 tf, err := ioutil.TempFile("", "packer") 299 if err != nil { 300 t.Fatalf("err: %s", err) 301 } 302 defer os.Remove(tf.Name()) 303 defer tf.Close() 304 305 if _, err := tf.Write([]byte("HELLO!")); err != nil { 306 t.Fatalf("err: %s", err) 307 } 308 309 config["vmx_template_path"] = tf.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.Fatalf("should not have error: %s", err) 317 } 318 319 // Bad template 320 tf2, err := ioutil.TempFile("", "packer") 321 if err != nil { 322 t.Fatalf("err: %s", err) 323 } 324 defer os.Remove(tf2.Name()) 325 defer tf2.Close() 326 327 if _, err := tf2.Write([]byte("{{foo}")); err != nil { 328 t.Fatalf("err: %s", err) 329 } 330 331 config["vmx_template_path"] = tf2.Name() 332 b = Builder{} 333 warns, err = b.Prepare(config) 334 if len(warns) > 0 { 335 t.Fatalf("bad: %#v", warns) 336 } 337 if err == nil { 338 t.Fatal("should have error") 339 } 340 } 341 342 func TestBuilderPrepare_VNCPort(t *testing.T) { 343 var b Builder 344 config := testConfig() 345 346 // Bad 347 config["vnc_port_min"] = 1000 348 config["vnc_port_max"] = 500 349 warns, err := b.Prepare(config) 350 if len(warns) > 0 { 351 t.Fatalf("bad: %#v", warns) 352 } 353 if err == nil { 354 t.Fatal("should have error") 355 } 356 357 // Bad 358 config["vnc_port_min"] = -500 359 b = Builder{} 360 warns, err = b.Prepare(config) 361 if len(warns) > 0 { 362 t.Fatalf("bad: %#v", warns) 363 } 364 if err == nil { 365 t.Fatal("should have error") 366 } 367 368 // Good 369 config["vnc_port_min"] = 500 370 config["vnc_port_max"] = 1000 371 b = Builder{} 372 warns, err = b.Prepare(config) 373 if len(warns) > 0 { 374 t.Fatalf("bad: %#v", warns) 375 } 376 if err != nil { 377 t.Fatalf("should not have error: %s", err) 378 } 379 }