github.com/mitchellh/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  }