package xva import ( "github.com/mitchellh/packer/packer" "reflect" "testing" ) func testConfig() map[string]interface{} { return map[string]interface{}{ "host_ip": "localhost", "username": "admin", "password": "admin", "vm_name": "foo", "iso_checksum": "foo", "iso_checksum_type": "md5", "iso_url": "http://www.google.com/", "shutdown_command": "yes", "ssh_username": "foo", packer.BuildNameConfigKey: "foo", } } func TestBuilder_ImplementsBuilder(t *testing.T) { var raw interface{} raw = &Builder{} if _, ok := raw.(packer.Builder); !ok { t.Error("Builder must implement builder.") } } func TestBuilderPrepare_Defaults(t *testing.T) { var b Builder config := testConfig() warns, err := b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Fatalf("should not have error: %s", err) } if b.config.ToolsIsoName != "xs-tools.iso" { t.Errorf("bad tools ISO name: %s", b.config.ToolsIsoName) } if b.config.CloneTemplate != "Other install media" { t.Errorf("bad clone template: %s", b.config.CloneTemplate) } if b.config.VMName == "" { t.Errorf("bad vm name: %s", b.config.VMName) } if b.config.ExportFormat != "xva" { t.Errorf("bad format: %s", b.config.ExportFormat) } if b.config.KeepInstance != "never" { t.Errorf("bad keep instance: %s", b.config.KeepInstance) } } func TestBuilderPrepare_DiskSize(t *testing.T) { var b Builder config := testConfig() delete(config, "disk_size") warns, err := b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Fatalf("bad err: %s", err) } if b.config.DiskSize != 40000 { t.Fatalf("bad size: %d", b.config.DiskSize) } config["disk_size"] = 60000 b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Fatalf("should not have error: %s", err) } if b.config.DiskSize != 60000 { t.Fatalf("bad size: %s", b.config.DiskSize) } } func TestBuilderPrepare_Format(t *testing.T) { var b Builder config := testConfig() // Bad config["export_format"] = "foo" warns, err := b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } // Good config["export_format"] = "vdi_raw" b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Fatalf("should not have error: %s", err) } } func TestBuilderPrepare_HTTPPort(t *testing.T) { var b Builder config := testConfig() // Bad config["http_port_min"] = 1000 config["http_port_max"] = 500 warns, err := b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } // Bad config["http_port_min"] = -500 b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } // Good config["http_port_min"] = 500 config["http_port_max"] = 1000 b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Fatalf("should not have error: %s", err) } } func TestBuilderPrepare_InvalidKey(t *testing.T) { var b Builder config := testConfig() // Add a random key config["i_should_not_be_valid"] = true warns, err := b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } } func TestBuilderPrepare_ISOChecksum(t *testing.T) { var b Builder config := testConfig() // Test bad config["iso_checksum"] = "" warns, err := b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } // Test good config["iso_checksum"] = "FOo" b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Fatalf("should not have error: %s", err) } if b.config.ISOChecksum != "foo" { t.Fatalf("should've lowercased: %s", b.config.ISOChecksum) } } func TestBuilderPrepare_ISOChecksumType(t *testing.T) { var b Builder config := testConfig() // Test bad config["iso_checksum_type"] = "" warns, err := b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } // Test good config["iso_checksum_type"] = "mD5" b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Fatalf("should not have error: %s", err) } if b.config.ISOChecksumType != "md5" { t.Fatalf("should've lowercased: %s", b.config.ISOChecksumType) } // Test unknown config["iso_checksum_type"] = "fake" b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } // Test none config["iso_checksum_type"] = "none" b = Builder{} warns, err = b.Prepare(config) // @todo: give warning in this case? /* if len(warns) == 0 { t.Fatalf("bad: %#v", warns) } */ if err != nil { t.Fatalf("should not have error: %s", err) } if b.config.ISOChecksumType != "none" { t.Fatalf("should've lowercased: %s", b.config.ISOChecksumType) } } func TestBuilderPrepare_ISOUrl(t *testing.T) { var b Builder config := testConfig() delete(config, "iso_url") delete(config, "iso_urls") // Test both epty config["iso_url"] = "" b = Builder{} warns, err := b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } // Test iso_url set config["iso_url"] = "http://www.packer.io" b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Errorf("should not have error: %s", err) } expected := []string{"http://www.packer.io"} if !reflect.DeepEqual(b.config.ISOUrls, expected) { t.Fatalf("bad: %#v", b.config.ISOUrls) } // Test both set config["iso_url"] = "http://www.packer.io" config["iso_urls"] = []string{"http://www.packer.io"} b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } // Test just iso_urls set delete(config, "iso_url") config["iso_urls"] = []string{ "http://www.packer.io", "http://www.hashicorp.com", } b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Errorf("should not have error: %s", err) } expected = []string{ "http://www.packer.io", "http://www.hashicorp.com", } if !reflect.DeepEqual(b.config.ISOUrls, expected) { t.Fatalf("bad: %#v", b.config.ISOUrls) } } func TestBuilderPrepare_KeepInstance(t *testing.T) { var b Builder config := testConfig() // Bad config["keep_instance"] = "foo" warns, err := b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err == nil { t.Fatal("should have error") } // Good config["keep_instance"] = "always" b = Builder{} warns, err = b.Prepare(config) if len(warns) > 0 { t.Fatalf("bad: %#v", warns) } if err != nil { t.Fatalf("should not have error: %s", err) } }