github.com/rothwerx/packer@v0.9.0/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_InvalidKey(t *testing.T) { 156 var b Builder 157 config := testConfig() 158 159 // Add a random key 160 config["i_should_not_be_valid"] = true 161 warns, err := b.Prepare(config) 162 if len(warns) > 0 { 163 t.Fatalf("bad: %#v", warns) 164 } 165 if err == nil { 166 t.Fatal("should have error") 167 } 168 } 169 170 func TestBuilderPrepare_OutputDir(t *testing.T) { 171 var b Builder 172 config := testConfig() 173 174 // Test with existing dir 175 dir, err := ioutil.TempDir("", "packer") 176 if err != nil { 177 t.Fatalf("err: %s", err) 178 } 179 defer os.RemoveAll(dir) 180 181 config["output_directory"] = dir 182 b = Builder{} 183 warns, err := b.Prepare(config) 184 if len(warns) > 0 { 185 t.Fatalf("bad: %#v", warns) 186 } 187 if err != nil { 188 t.Fatalf("err: %s", err) 189 } 190 191 // Test with a good one 192 config["output_directory"] = "i-hope-i-dont-exist" 193 b = Builder{} 194 warns, err = b.Prepare(config) 195 if len(warns) > 0 { 196 t.Fatalf("bad: %#v", warns) 197 } 198 if err != nil { 199 t.Fatalf("should not have error: %s", err) 200 } 201 } 202 203 func TestBuilderPrepare_ToolsUploadPath(t *testing.T) { 204 var b Builder 205 config := testConfig() 206 207 // Test a default 208 delete(config, "tools_upload_path") 209 warns, err := b.Prepare(config) 210 if len(warns) > 0 { 211 t.Fatalf("bad: %#v", warns) 212 } 213 if err != nil { 214 t.Fatalf("err: %s", err) 215 } 216 217 if b.config.ToolsUploadPath == "" { 218 t.Fatalf("bad value: %s", b.config.ToolsUploadPath) 219 } 220 221 // Test with a bad value 222 config["tools_upload_path"] = "{{{nope}" 223 b = Builder{} 224 warns, err = b.Prepare(config) 225 if len(warns) > 0 { 226 t.Fatalf("bad: %#v", warns) 227 } 228 if err == nil { 229 t.Fatal("should have error") 230 } 231 232 // Test with a good one 233 config["tools_upload_path"] = "hey" 234 b = Builder{} 235 warns, err = b.Prepare(config) 236 if len(warns) > 0 { 237 t.Fatalf("bad: %#v", warns) 238 } 239 if err != nil { 240 t.Fatalf("should not have error: %s", err) 241 } 242 } 243 244 func TestBuilderPrepare_VMXTemplatePath(t *testing.T) { 245 var b Builder 246 config := testConfig() 247 248 // Test bad 249 config["vmx_template_path"] = "/i/dont/exist/forreal" 250 warns, err := b.Prepare(config) 251 if len(warns) > 0 { 252 t.Fatalf("bad: %#v", warns) 253 } 254 if err == nil { 255 t.Fatal("should have error") 256 } 257 258 // Test good 259 tf, err := ioutil.TempFile("", "packer") 260 if err != nil { 261 t.Fatalf("err: %s", err) 262 } 263 defer os.Remove(tf.Name()) 264 defer tf.Close() 265 266 if _, err := tf.Write([]byte("HELLO!")); err != nil { 267 t.Fatalf("err: %s", err) 268 } 269 270 config["vmx_template_path"] = tf.Name() 271 b = Builder{} 272 warns, err = b.Prepare(config) 273 if len(warns) > 0 { 274 t.Fatalf("bad: %#v", warns) 275 } 276 if err != nil { 277 t.Fatalf("should not have error: %s", err) 278 } 279 280 // Bad template 281 tf2, err := ioutil.TempFile("", "packer") 282 if err != nil { 283 t.Fatalf("err: %s", err) 284 } 285 defer os.Remove(tf2.Name()) 286 defer tf2.Close() 287 288 if _, err := tf2.Write([]byte("{{foo}")); err != nil { 289 t.Fatalf("err: %s", err) 290 } 291 292 config["vmx_template_path"] = tf2.Name() 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.Fatal("should have error") 300 } 301 } 302 303 func TestBuilderPrepare_VNCPort(t *testing.T) { 304 var b Builder 305 config := testConfig() 306 307 // Bad 308 config["vnc_port_min"] = 1000 309 config["vnc_port_max"] = 500 310 warns, err := b.Prepare(config) 311 if len(warns) > 0 { 312 t.Fatalf("bad: %#v", warns) 313 } 314 if err == nil { 315 t.Fatal("should have error") 316 } 317 318 // Bad 319 config["vnc_port_min"] = -500 320 b = Builder{} 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 // Good 330 config["vnc_port_min"] = 500 331 config["vnc_port_max"] = 1000 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.Fatalf("should not have error: %s", err) 339 } 340 }