github.com/daniellockard/packer@v0.7.6-0.20141210173435-5a9390934716/builder/vmware/iso/builder_test.go (about)

     1  package iso
     2  
     3  import (
     4  	"github.com/mitchellh/packer/packer"
     5  	"io/ioutil"
     6  	"os"
     7  	"reflect"
     8  	"testing"
     9  	"time"
    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_ISOChecksum(t *testing.T) {
    33  	var b Builder
    34  	config := testConfig()
    35  
    36  	// Test bad
    37  	config["iso_checksum"] = ""
    38  	warns, err := b.Prepare(config)
    39  	if len(warns) > 0 {
    40  		t.Fatalf("bad: %#v", warns)
    41  	}
    42  	if err == nil {
    43  		t.Fatal("should have error")
    44  	}
    45  
    46  	// Test good
    47  	config["iso_checksum"] = "FOo"
    48  	b = Builder{}
    49  	warns, err = b.Prepare(config)
    50  	if len(warns) > 0 {
    51  		t.Fatalf("bad: %#v", warns)
    52  	}
    53  	if err != nil {
    54  		t.Fatalf("should not have error: %s", err)
    55  	}
    56  
    57  	if b.config.ISOChecksum != "foo" {
    58  		t.Fatalf("should've lowercased: %s", b.config.ISOChecksum)
    59  	}
    60  }
    61  
    62  func TestBuilderPrepare_ISOChecksumType(t *testing.T) {
    63  	var b Builder
    64  	config := testConfig()
    65  
    66  	// Test bad
    67  	config["iso_checksum_type"] = ""
    68  	warns, err := b.Prepare(config)
    69  	if len(warns) > 0 {
    70  		t.Fatalf("bad: %#v", warns)
    71  	}
    72  	if err == nil {
    73  		t.Fatal("should have error")
    74  	}
    75  
    76  	// Test good
    77  	config["iso_checksum_type"] = "mD5"
    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.ISOChecksumType != "md5" {
    88  		t.Fatalf("should've lowercased: %s", b.config.ISOChecksumType)
    89  	}
    90  
    91  	// Test unknown
    92  	config["iso_checksum_type"] = "fake"
    93  	b = Builder{}
    94  	warns, err = b.Prepare(config)
    95  	if len(warns) > 0 {
    96  		t.Fatalf("bad: %#v", warns)
    97  	}
    98  	if err == nil {
    99  		t.Fatal("should have error")
   100  	}
   101  
   102  	// Test none
   103  	config["iso_checksum_type"] = "none"
   104  	b = Builder{}
   105  	warns, err = b.Prepare(config)
   106  	if len(warns) == 0 {
   107  		t.Fatalf("bad: %#v", warns)
   108  	}
   109  	if err != nil {
   110  		t.Fatalf("should not have error: %s", err)
   111  	}
   112  
   113  	if b.config.ISOChecksumType != "none" {
   114  		t.Fatalf("should've lowercased: %s", b.config.ISOChecksumType)
   115  	}
   116  }
   117  
   118  func TestBuilderPrepare_Defaults(t *testing.T) {
   119  	var b Builder
   120  	config := testConfig()
   121  	warns, err := b.Prepare(config)
   122  	if len(warns) > 0 {
   123  		t.Fatalf("bad: %#v", warns)
   124  	}
   125  	if err != nil {
   126  		t.Fatalf("should not have error: %s", err)
   127  	}
   128  
   129  	if b.config.DiskName != "disk" {
   130  		t.Errorf("bad disk name: %s", b.config.DiskName)
   131  	}
   132  
   133  	if b.config.OutputDir != "output-foo" {
   134  		t.Errorf("bad output dir: %s", b.config.OutputDir)
   135  	}
   136  
   137  	if b.config.Version != "9" {
   138  		t.Errorf("bad Version: %s", b.config.Version)
   139  	}
   140  
   141  	if b.config.SSHWaitTimeout != (20 * time.Minute) {
   142  		t.Errorf("bad wait timeout: %s", b.config.SSHWaitTimeout)
   143  	}
   144  
   145  	if b.config.VMName != "packer-foo" {
   146  		t.Errorf("bad vm name: %s", b.config.VMName)
   147  	}
   148  }
   149  
   150  func TestBuilderPrepare_DiskSize(t *testing.T) {
   151  	var b Builder
   152  	config := testConfig()
   153  
   154  	delete(config, "disk_size")
   155  	warns, err := b.Prepare(config)
   156  	if len(warns) > 0 {
   157  		t.Fatalf("bad: %#v", warns)
   158  	}
   159  	if err != nil {
   160  		t.Fatalf("bad err: %s", err)
   161  	}
   162  
   163  	if b.config.DiskSize != 40000 {
   164  		t.Fatalf("bad size: %d", b.config.DiskSize)
   165  	}
   166  
   167  	config["disk_size"] = 60000
   168  	b = Builder{}
   169  	warns, err = b.Prepare(config)
   170  	if len(warns) > 0 {
   171  		t.Fatalf("bad: %#v", warns)
   172  	}
   173  	if err != nil {
   174  		t.Fatalf("should not have error: %s", err)
   175  	}
   176  
   177  	if b.config.DiskSize != 60000 {
   178  		t.Fatalf("bad size: %s", b.config.DiskSize)
   179  	}
   180  }
   181  
   182  func TestBuilderPrepare_FloppyFiles(t *testing.T) {
   183  	var b Builder
   184  	config := testConfig()
   185  
   186  	delete(config, "floppy_files")
   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 len(b.config.FloppyFiles) != 0 {
   196  		t.Fatalf("bad: %#v", b.config.FloppyFiles)
   197  	}
   198  
   199  	config["floppy_files"] = []string{"foo", "bar"}
   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  	expected := []string{"foo", "bar"}
   210  	if !reflect.DeepEqual(b.config.FloppyFiles, expected) {
   211  		t.Fatalf("bad: %#v", b.config.FloppyFiles)
   212  	}
   213  }
   214  
   215  func TestBuilderPrepare_HTTPPort(t *testing.T) {
   216  	var b Builder
   217  	config := testConfig()
   218  
   219  	// Bad
   220  	config["http_port_min"] = 1000
   221  	config["http_port_max"] = 500
   222  	warns, err := b.Prepare(config)
   223  	if len(warns) > 0 {
   224  		t.Fatalf("bad: %#v", warns)
   225  	}
   226  	if err == nil {
   227  		t.Fatal("should have error")
   228  	}
   229  
   230  	// Bad
   231  	config["http_port_min"] = -500
   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.Fatal("should have error")
   239  	}
   240  
   241  	// Good
   242  	config["http_port_min"] = 500
   243  	config["http_port_max"] = 1000
   244  	b = Builder{}
   245  	warns, err = b.Prepare(config)
   246  	if len(warns) > 0 {
   247  		t.Fatalf("bad: %#v", warns)
   248  	}
   249  	if err != nil {
   250  		t.Fatalf("should not have error: %s", err)
   251  	}
   252  }
   253  
   254  func TestBuilderPrepare_InvalidKey(t *testing.T) {
   255  	var b Builder
   256  	config := testConfig()
   257  
   258  	// Add a random key
   259  	config["i_should_not_be_valid"] = true
   260  	warns, err := b.Prepare(config)
   261  	if len(warns) > 0 {
   262  		t.Fatalf("bad: %#v", warns)
   263  	}
   264  	if err == nil {
   265  		t.Fatal("should have error")
   266  	}
   267  }
   268  
   269  func TestBuilderPrepare_ISOUrl(t *testing.T) {
   270  	var b Builder
   271  	config := testConfig()
   272  	delete(config, "iso_url")
   273  	delete(config, "iso_urls")
   274  
   275  	// Test both epty
   276  	config["iso_url"] = ""
   277  	b = Builder{}
   278  	warns, err := b.Prepare(config)
   279  	if len(warns) > 0 {
   280  		t.Fatalf("bad: %#v", warns)
   281  	}
   282  	if err == nil {
   283  		t.Fatal("should have error")
   284  	}
   285  
   286  	// Test iso_url set
   287  	config["iso_url"] = "http://www.packer.io"
   288  	b = Builder{}
   289  	warns, err = b.Prepare(config)
   290  	if len(warns) > 0 {
   291  		t.Fatalf("bad: %#v", warns)
   292  	}
   293  	if err != nil {
   294  		t.Errorf("should not have error: %s", err)
   295  	}
   296  
   297  	expected := []string{"http://www.packer.io"}
   298  	if !reflect.DeepEqual(b.config.ISOUrls, expected) {
   299  		t.Fatalf("bad: %#v", b.config.ISOUrls)
   300  	}
   301  
   302  	// Test both set
   303  	config["iso_url"] = "http://www.packer.io"
   304  	config["iso_urls"] = []string{"http://www.packer.io"}
   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.Fatal("should have error")
   312  	}
   313  
   314  	// Test just iso_urls set
   315  	delete(config, "iso_url")
   316  	config["iso_urls"] = []string{
   317  		"http://www.packer.io",
   318  		"http://www.hashicorp.com",
   319  	}
   320  
   321  	b = Builder{}
   322  	warns, err = b.Prepare(config)
   323  	if len(warns) > 0 {
   324  		t.Fatalf("bad: %#v", warns)
   325  	}
   326  	if err != nil {
   327  		t.Errorf("should not have error: %s", err)
   328  	}
   329  
   330  	expected = []string{
   331  		"http://www.packer.io",
   332  		"http://www.hashicorp.com",
   333  	}
   334  	if !reflect.DeepEqual(b.config.ISOUrls, expected) {
   335  		t.Fatalf("bad: %#v", b.config.ISOUrls)
   336  	}
   337  }
   338  
   339  func TestBuilderPrepare_OutputDir(t *testing.T) {
   340  	var b Builder
   341  	config := testConfig()
   342  
   343  	// Test with existing dir
   344  	dir, err := ioutil.TempDir("", "packer")
   345  	if err != nil {
   346  		t.Fatalf("err: %s", err)
   347  	}
   348  	defer os.RemoveAll(dir)
   349  
   350  	config["output_directory"] = dir
   351  	b = Builder{}
   352  	warns, err := b.Prepare(config)
   353  	if len(warns) > 0 {
   354  		t.Fatalf("bad: %#v", warns)
   355  	}
   356  	if err == nil {
   357  		t.Fatal("should have error")
   358  	}
   359  
   360  	// Test with a good one
   361  	config["output_directory"] = "i-hope-i-dont-exist"
   362  	b = Builder{}
   363  	warns, err = b.Prepare(config)
   364  	if len(warns) > 0 {
   365  		t.Fatalf("bad: %#v", warns)
   366  	}
   367  	if err != nil {
   368  		t.Fatalf("should not have error: %s", err)
   369  	}
   370  }
   371  
   372  func TestBuilderPrepare_ToolsUploadPath(t *testing.T) {
   373  	var b Builder
   374  	config := testConfig()
   375  
   376  	// Test a default
   377  	delete(config, "tools_upload_path")
   378  	warns, err := b.Prepare(config)
   379  	if len(warns) > 0 {
   380  		t.Fatalf("bad: %#v", warns)
   381  	}
   382  	if err != nil {
   383  		t.Fatalf("err: %s", err)
   384  	}
   385  
   386  	if b.config.ToolsUploadPath == "" {
   387  		t.Fatalf("bad value: %s", b.config.ToolsUploadPath)
   388  	}
   389  
   390  	// Test with a bad value
   391  	config["tools_upload_path"] = "{{{nope}"
   392  	b = Builder{}
   393  	warns, err = b.Prepare(config)
   394  	if len(warns) > 0 {
   395  		t.Fatalf("bad: %#v", warns)
   396  	}
   397  	if err == nil {
   398  		t.Fatal("should have error")
   399  	}
   400  
   401  	// Test with a good one
   402  	config["tools_upload_path"] = "hey"
   403  	b = Builder{}
   404  	warns, err = b.Prepare(config)
   405  	if len(warns) > 0 {
   406  		t.Fatalf("bad: %#v", warns)
   407  	}
   408  	if err != nil {
   409  		t.Fatalf("should not have error: %s", err)
   410  	}
   411  }
   412  
   413  func TestBuilderPrepare_VMXTemplatePath(t *testing.T) {
   414  	var b Builder
   415  	config := testConfig()
   416  
   417  	// Test bad
   418  	config["vmx_template_path"] = "/i/dont/exist/forreal"
   419  	warns, err := b.Prepare(config)
   420  	if len(warns) > 0 {
   421  		t.Fatalf("bad: %#v", warns)
   422  	}
   423  	if err == nil {
   424  		t.Fatal("should have error")
   425  	}
   426  
   427  	// Test good
   428  	tf, err := ioutil.TempFile("", "packer")
   429  	if err != nil {
   430  		t.Fatalf("err: %s", err)
   431  	}
   432  	defer os.Remove(tf.Name())
   433  	defer tf.Close()
   434  
   435  	if _, err := tf.Write([]byte("HELLO!")); err != nil {
   436  		t.Fatalf("err: %s", err)
   437  	}
   438  
   439  	config["vmx_template_path"] = tf.Name()
   440  	b = Builder{}
   441  	warns, err = b.Prepare(config)
   442  	if len(warns) > 0 {
   443  		t.Fatalf("bad: %#v", warns)
   444  	}
   445  	if err != nil {
   446  		t.Fatalf("should not have error: %s", err)
   447  	}
   448  
   449  	// Bad template
   450  	tf2, err := ioutil.TempFile("", "packer")
   451  	if err != nil {
   452  		t.Fatalf("err: %s", err)
   453  	}
   454  	defer os.Remove(tf2.Name())
   455  	defer tf2.Close()
   456  
   457  	if _, err := tf2.Write([]byte("{{foo}")); err != nil {
   458  		t.Fatalf("err: %s", err)
   459  	}
   460  
   461  	config["vmx_template_path"] = tf2.Name()
   462  	b = Builder{}
   463  	warns, err = b.Prepare(config)
   464  	if len(warns) > 0 {
   465  		t.Fatalf("bad: %#v", warns)
   466  	}
   467  	if err == nil {
   468  		t.Fatal("should have error")
   469  	}
   470  }
   471  
   472  func TestBuilderPrepare_VNCPort(t *testing.T) {
   473  	var b Builder
   474  	config := testConfig()
   475  
   476  	// Bad
   477  	config["vnc_port_min"] = 1000
   478  	config["vnc_port_max"] = 500
   479  	warns, err := b.Prepare(config)
   480  	if len(warns) > 0 {
   481  		t.Fatalf("bad: %#v", warns)
   482  	}
   483  	if err == nil {
   484  		t.Fatal("should have error")
   485  	}
   486  
   487  	// Bad
   488  	config["vnc_port_min"] = -500
   489  	b = Builder{}
   490  	warns, err = b.Prepare(config)
   491  	if len(warns) > 0 {
   492  		t.Fatalf("bad: %#v", warns)
   493  	}
   494  	if err == nil {
   495  		t.Fatal("should have error")
   496  	}
   497  
   498  	// Good
   499  	config["vnc_port_min"] = 500
   500  	config["vnc_port_max"] = 1000
   501  	b = Builder{}
   502  	warns, err = b.Prepare(config)
   503  	if len(warns) > 0 {
   504  		t.Fatalf("bad: %#v", warns)
   505  	}
   506  	if err != nil {
   507  		t.Fatalf("should not have error: %s", err)
   508  	}
   509  }