github.com/emate/packer@v0.8.1-0.20150625195101-fe0fde195dc6/builder/virtualbox/iso/builder_test.go (about)

     1  package iso
     2  
     3  import (
     4  	"github.com/mitchellh/packer/builder/virtualbox/common"
     5  	"github.com/mitchellh/packer/packer"
     6  	"reflect"
     7  	"testing"
     8  )
     9  
    10  func testConfig() map[string]interface{} {
    11  	return map[string]interface{}{
    12  		"iso_checksum":      "foo",
    13  		"iso_checksum_type": "md5",
    14  		"iso_url":           "http://www.google.com/",
    15  		"shutdown_command":  "yes",
    16  		"ssh_username":      "foo",
    17  
    18  		packer.BuildNameConfigKey: "foo",
    19  	}
    20  }
    21  
    22  func TestBuilder_ImplementsBuilder(t *testing.T) {
    23  	var raw interface{}
    24  	raw = &Builder{}
    25  	if _, ok := raw.(packer.Builder); !ok {
    26  		t.Error("Builder must implement builder.")
    27  	}
    28  }
    29  
    30  func TestBuilderPrepare_Defaults(t *testing.T) {
    31  	var b Builder
    32  	config := testConfig()
    33  	warns, err := b.Prepare(config)
    34  	if len(warns) > 0 {
    35  		t.Fatalf("bad: %#v", warns)
    36  	}
    37  	if err != nil {
    38  		t.Fatalf("should not have error: %s", err)
    39  	}
    40  
    41  	if b.config.GuestAdditionsMode != common.GuestAdditionsModeUpload {
    42  		t.Errorf("bad guest additions mode: %s", b.config.GuestAdditionsMode)
    43  	}
    44  
    45  	if b.config.GuestOSType != "Other" {
    46  		t.Errorf("bad guest OS type: %s", b.config.GuestOSType)
    47  	}
    48  
    49  	if b.config.VMName == "" {
    50  		t.Errorf("bad vm name: %s", b.config.VMName)
    51  	}
    52  
    53  	if b.config.Format != "ovf" {
    54  		t.Errorf("bad format: %s", b.config.Format)
    55  	}
    56  }
    57  
    58  func TestBuilderPrepare_DiskSize(t *testing.T) {
    59  	var b Builder
    60  	config := testConfig()
    61  
    62  	delete(config, "disk_size")
    63  	warns, err := b.Prepare(config)
    64  	if len(warns) > 0 {
    65  		t.Fatalf("bad: %#v", warns)
    66  	}
    67  	if err != nil {
    68  		t.Fatalf("bad err: %s", err)
    69  	}
    70  
    71  	if b.config.DiskSize != 40000 {
    72  		t.Fatalf("bad size: %d", b.config.DiskSize)
    73  	}
    74  
    75  	config["disk_size"] = 60000
    76  	b = Builder{}
    77  	warns, err = b.Prepare(config)
    78  	if len(warns) > 0 {
    79  		t.Fatalf("bad: %#v", warns)
    80  	}
    81  	if err != nil {
    82  		t.Fatalf("should not have error: %s", err)
    83  	}
    84  
    85  	if b.config.DiskSize != 60000 {
    86  		t.Fatalf("bad size: %d", b.config.DiskSize)
    87  	}
    88  }
    89  
    90  func TestBuilderPrepare_GuestAdditionsMode(t *testing.T) {
    91  	var b Builder
    92  	config := testConfig()
    93  
    94  	// test default mode
    95  	delete(config, "guest_additions_mode")
    96  	warns, err := b.Prepare(config)
    97  	if len(warns) > 0 {
    98  		t.Fatalf("bad: %#v", warns)
    99  	}
   100  	if err != nil {
   101  		t.Fatalf("bad err: %s", err)
   102  	}
   103  
   104  	// Test another mode
   105  	config["guest_additions_mode"] = "attach"
   106  	b = Builder{}
   107  	warns, err = b.Prepare(config)
   108  	if len(warns) > 0 {
   109  		t.Fatalf("bad: %#v", warns)
   110  	}
   111  	if err != nil {
   112  		t.Fatalf("should not have error: %s", err)
   113  	}
   114  
   115  	if b.config.GuestAdditionsMode != common.GuestAdditionsModeAttach {
   116  		t.Fatalf("bad: %s", b.config.GuestAdditionsMode)
   117  	}
   118  
   119  	// Test bad mode
   120  	config["guest_additions_mode"] = "teleport"
   121  	b = Builder{}
   122  	warns, err = b.Prepare(config)
   123  	if len(warns) > 0 {
   124  		t.Fatalf("bad: %#v", warns)
   125  	}
   126  	if err == nil {
   127  		t.Fatal("should error")
   128  	}
   129  }
   130  
   131  func TestBuilderPrepare_GuestAdditionsPath(t *testing.T) {
   132  	var b Builder
   133  	config := testConfig()
   134  
   135  	delete(config, "guest_additions_path")
   136  	warns, err := b.Prepare(config)
   137  	if len(warns) > 0 {
   138  		t.Fatalf("bad: %#v", warns)
   139  	}
   140  	if err != nil {
   141  		t.Fatalf("bad err: %s", err)
   142  	}
   143  
   144  	if b.config.GuestAdditionsPath != "VBoxGuestAdditions.iso" {
   145  		t.Fatalf("bad: %s", b.config.GuestAdditionsPath)
   146  	}
   147  
   148  	config["guest_additions_path"] = "foo"
   149  	b = Builder{}
   150  	warns, err = b.Prepare(config)
   151  	if len(warns) > 0 {
   152  		t.Fatalf("bad: %#v", warns)
   153  	}
   154  	if err != nil {
   155  		t.Fatalf("should not have error: %s", err)
   156  	}
   157  
   158  	if b.config.GuestAdditionsPath != "foo" {
   159  		t.Fatalf("bad size: %s", b.config.GuestAdditionsPath)
   160  	}
   161  }
   162  
   163  func TestBuilderPrepare_GuestAdditionsSHA256(t *testing.T) {
   164  	var b Builder
   165  	config := testConfig()
   166  
   167  	delete(config, "guest_additions_sha256")
   168  	warns, err := b.Prepare(config)
   169  	if len(warns) > 0 {
   170  		t.Fatalf("bad: %#v", warns)
   171  	}
   172  	if err != nil {
   173  		t.Fatalf("bad err: %s", err)
   174  	}
   175  
   176  	if b.config.GuestAdditionsSHA256 != "" {
   177  		t.Fatalf("bad: %s", b.config.GuestAdditionsSHA256)
   178  	}
   179  
   180  	config["guest_additions_sha256"] = "FOO"
   181  	b = Builder{}
   182  	warns, err = b.Prepare(config)
   183  	if len(warns) > 0 {
   184  		t.Fatalf("bad: %#v", warns)
   185  	}
   186  	if err != nil {
   187  		t.Fatalf("should not have error: %s", err)
   188  	}
   189  
   190  	if b.config.GuestAdditionsSHA256 != "foo" {
   191  		t.Fatalf("bad size: %s", b.config.GuestAdditionsSHA256)
   192  	}
   193  }
   194  
   195  func TestBuilderPrepare_GuestAdditionsURL(t *testing.T) {
   196  	var b Builder
   197  	config := testConfig()
   198  
   199  	config["guest_additions_url"] = ""
   200  	warns, err := b.Prepare(config)
   201  	if len(warns) > 0 {
   202  		t.Fatalf("bad: %#v", warns)
   203  	}
   204  	if err != nil {
   205  		t.Fatalf("err: %s", err)
   206  	}
   207  
   208  	if b.config.GuestAdditionsURL != "" {
   209  		t.Fatalf("should be empty: %s", b.config.GuestAdditionsURL)
   210  	}
   211  
   212  	config["guest_additions_url"] = "http://www.packer.io"
   213  	b = Builder{}
   214  	warns, err = b.Prepare(config)
   215  	if len(warns) > 0 {
   216  		t.Fatalf("bad: %#v", warns)
   217  	}
   218  	if err != nil {
   219  		t.Errorf("should not have error: %s", err)
   220  	}
   221  }
   222  
   223  func TestBuilderPrepare_HardDriveInterface(t *testing.T) {
   224  	var b Builder
   225  	config := testConfig()
   226  
   227  	// Test a default boot_wait
   228  	delete(config, "hard_drive_interface")
   229  	warns, err := b.Prepare(config)
   230  	if len(warns) > 0 {
   231  		t.Fatalf("bad: %#v", warns)
   232  	}
   233  	if err != nil {
   234  		t.Fatalf("err: %s", err)
   235  	}
   236  
   237  	if b.config.HardDriveInterface != "ide" {
   238  		t.Fatalf("bad: %s", b.config.HardDriveInterface)
   239  	}
   240  
   241  	// Test with a bad
   242  	config["hard_drive_interface"] = "fake"
   243  	b = Builder{}
   244  	warns, err = b.Prepare(config)
   245  	if len(warns) > 0 {
   246  		t.Fatalf("bad: %#v", warns)
   247  	}
   248  	if err == nil {
   249  		t.Fatal("should have error")
   250  	}
   251  
   252  	// Test with a good
   253  	config["hard_drive_interface"] = "sata"
   254  	b = Builder{}
   255  	warns, err = b.Prepare(config)
   256  	if len(warns) > 0 {
   257  		t.Fatalf("bad: %#v", warns)
   258  	}
   259  	if err != nil {
   260  		t.Fatalf("should not have error: %s", err)
   261  	}
   262  }
   263  
   264  func TestBuilderPrepare_HTTPPort(t *testing.T) {
   265  	var b Builder
   266  	config := testConfig()
   267  
   268  	// Bad
   269  	config["http_port_min"] = 1000
   270  	config["http_port_max"] = 500
   271  	warns, err := b.Prepare(config)
   272  	if len(warns) > 0 {
   273  		t.Fatalf("bad: %#v", warns)
   274  	}
   275  	if err == nil {
   276  		t.Fatal("should have error")
   277  	}
   278  
   279  	// Bad
   280  	config["http_port_min"] = -500
   281  	b = Builder{}
   282  	warns, err = b.Prepare(config)
   283  	if len(warns) > 0 {
   284  		t.Fatalf("bad: %#v", warns)
   285  	}
   286  	if err == nil {
   287  		t.Fatal("should have error")
   288  	}
   289  
   290  	// Good
   291  	config["http_port_min"] = 500
   292  	config["http_port_max"] = 1000
   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.Fatalf("should not have error: %s", err)
   300  	}
   301  }
   302  
   303  func TestBuilderPrepare_InvalidKey(t *testing.T) {
   304  	var b Builder
   305  	config := testConfig()
   306  
   307  	// Add a random key
   308  	config["i_should_not_be_valid"] = true
   309  	warns, err := b.Prepare(config)
   310  	if len(warns) > 0 {
   311  		t.Fatalf("bad: %#v", warns)
   312  	}
   313  	if err == nil {
   314  		t.Fatal("should have error")
   315  	}
   316  }
   317  
   318  func TestBuilderPrepare_ISOChecksum(t *testing.T) {
   319  	var b Builder
   320  	config := testConfig()
   321  
   322  	// Test bad
   323  	config["iso_checksum"] = ""
   324  	warns, err := b.Prepare(config)
   325  	if len(warns) > 0 {
   326  		t.Fatalf("bad: %#v", warns)
   327  	}
   328  	if err == nil {
   329  		t.Fatal("should have error")
   330  	}
   331  
   332  	// Test good
   333  	config["iso_checksum"] = "FOo"
   334  	b = Builder{}
   335  	warns, err = b.Prepare(config)
   336  	if len(warns) > 0 {
   337  		t.Fatalf("bad: %#v", warns)
   338  	}
   339  	if err != nil {
   340  		t.Fatalf("should not have error: %s", err)
   341  	}
   342  
   343  	if b.config.ISOChecksum != "foo" {
   344  		t.Fatalf("should've lowercased: %s", b.config.ISOChecksum)
   345  	}
   346  }
   347  
   348  func TestBuilderPrepare_ISOChecksumType(t *testing.T) {
   349  	var b Builder
   350  	config := testConfig()
   351  
   352  	// Test bad
   353  	config["iso_checksum_type"] = ""
   354  	warns, err := b.Prepare(config)
   355  	if len(warns) > 0 {
   356  		t.Fatalf("bad: %#v", warns)
   357  	}
   358  	if err == nil {
   359  		t.Fatal("should have error")
   360  	}
   361  
   362  	// Test good
   363  	config["iso_checksum_type"] = "mD5"
   364  	b = Builder{}
   365  	warns, err = b.Prepare(config)
   366  	if len(warns) > 0 {
   367  		t.Fatalf("bad: %#v", warns)
   368  	}
   369  	if err != nil {
   370  		t.Fatalf("should not have error: %s", err)
   371  	}
   372  
   373  	if b.config.ISOChecksumType != "md5" {
   374  		t.Fatalf("should've lowercased: %s", b.config.ISOChecksumType)
   375  	}
   376  
   377  	// Test unknown
   378  	config["iso_checksum_type"] = "fake"
   379  	b = Builder{}
   380  	warns, err = b.Prepare(config)
   381  	if len(warns) > 0 {
   382  		t.Fatalf("bad: %#v", warns)
   383  	}
   384  	if err == nil {
   385  		t.Fatal("should have error")
   386  	}
   387  
   388  	// Test none
   389  	config["iso_checksum_type"] = "none"
   390  	b = Builder{}
   391  	warns, err = b.Prepare(config)
   392  	if len(warns) == 0 {
   393  		t.Fatalf("bad: %#v", warns)
   394  	}
   395  	if err != nil {
   396  		t.Fatalf("should not have error: %s", err)
   397  	}
   398  
   399  	if b.config.ISOChecksumType != "none" {
   400  		t.Fatalf("should've lowercased: %s", b.config.ISOChecksumType)
   401  	}
   402  }
   403  
   404  func TestBuilderPrepare_ISOInterface(t *testing.T) {
   405  	var b Builder
   406  	config := testConfig()
   407  
   408  	// Test a default boot_wait
   409  	delete(config, "iso_interface")
   410  	warns, err := b.Prepare(config)
   411  	if len(warns) > 0 {
   412  		t.Fatalf("bad: %#v", warns)
   413  	}
   414  	if err != nil {
   415  		t.Fatalf("err: %s", err)
   416  	}
   417  
   418  	if b.config.ISOInterface != "ide" {
   419  		t.Fatalf("bad: %s", b.config.ISOInterface)
   420  	}
   421  
   422  	// Test with a bad
   423  	config["iso_interface"] = "fake"
   424  	b = Builder{}
   425  	warns, err = b.Prepare(config)
   426  	if len(warns) > 0 {
   427  		t.Fatalf("bad: %#v", warns)
   428  	}
   429  	if err == nil {
   430  		t.Fatal("should have error")
   431  	}
   432  
   433  	// Test with a good
   434  	config["iso_interface"] = "sata"
   435  	b = Builder{}
   436  	warns, err = b.Prepare(config)
   437  	if len(warns) > 0 {
   438  		t.Fatalf("bad: %#v", warns)
   439  	}
   440  	if err != nil {
   441  		t.Fatalf("should not have error: %s", err)
   442  	}
   443  }
   444  
   445  func TestBuilderPrepare_ISOUrl(t *testing.T) {
   446  	var b Builder
   447  	config := testConfig()
   448  	delete(config, "iso_url")
   449  	delete(config, "iso_urls")
   450  
   451  	// Test both epty
   452  	config["iso_url"] = ""
   453  	b = Builder{}
   454  	warns, err := b.Prepare(config)
   455  	if len(warns) > 0 {
   456  		t.Fatalf("bad: %#v", warns)
   457  	}
   458  	if err == nil {
   459  		t.Fatal("should have error")
   460  	}
   461  
   462  	// Test iso_url set
   463  	config["iso_url"] = "http://www.packer.io"
   464  	b = Builder{}
   465  	warns, err = b.Prepare(config)
   466  	if len(warns) > 0 {
   467  		t.Fatalf("bad: %#v", warns)
   468  	}
   469  	if err != nil {
   470  		t.Errorf("should not have error: %s", err)
   471  	}
   472  
   473  	expected := []string{"http://www.packer.io"}
   474  	if !reflect.DeepEqual(b.config.ISOUrls, expected) {
   475  		t.Fatalf("bad: %#v", b.config.ISOUrls)
   476  	}
   477  
   478  	// Test both set
   479  	config["iso_url"] = "http://www.packer.io"
   480  	config["iso_urls"] = []string{"http://www.packer.io"}
   481  	b = Builder{}
   482  	warns, err = b.Prepare(config)
   483  	if len(warns) > 0 {
   484  		t.Fatalf("bad: %#v", warns)
   485  	}
   486  	if err == nil {
   487  		t.Fatal("should have error")
   488  	}
   489  
   490  	// Test just iso_urls set
   491  	delete(config, "iso_url")
   492  	config["iso_urls"] = []string{
   493  		"http://www.packer.io",
   494  		"http://www.hashicorp.com",
   495  	}
   496  
   497  	b = Builder{}
   498  	warns, err = b.Prepare(config)
   499  	if len(warns) > 0 {
   500  		t.Fatalf("bad: %#v", warns)
   501  	}
   502  	if err != nil {
   503  		t.Errorf("should not have error: %s", err)
   504  	}
   505  
   506  	expected = []string{
   507  		"http://www.packer.io",
   508  		"http://www.hashicorp.com",
   509  	}
   510  	if !reflect.DeepEqual(b.config.ISOUrls, expected) {
   511  		t.Fatalf("bad: %#v", b.config.ISOUrls)
   512  	}
   513  }