github.com/rahart/packer@v0.12.2-0.20161229105310-282bb6ad370f/builder/vmware/iso/builder_test.go (about)

     1  package iso
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"reflect"
     8  	"testing"
     9  
    10  	"github.com/mitchellh/packer/packer"
    11  )
    12  
    13  func testConfig() map[string]interface{} {
    14  	return map[string]interface{}{
    15  		"iso_checksum":      "foo",
    16  		"iso_checksum_type": "md5",
    17  		"iso_url":           "http://www.packer.io",
    18  		"shutdown_command":  "foo",
    19  		"ssh_username":      "foo",
    20  
    21  		packer.BuildNameConfigKey: "foo",
    22  	}
    23  }
    24  
    25  func TestBuilder_ImplementsBuilder(t *testing.T) {
    26  	var raw interface{}
    27  	raw = &Builder{}
    28  	if _, ok := raw.(packer.Builder); !ok {
    29  		t.Error("Builder must implement builder.")
    30  	}
    31  }
    32  
    33  func TestBuilderPrepare_Defaults(t *testing.T) {
    34  	var b Builder
    35  	config := testConfig()
    36  	warns, err := b.Prepare(config)
    37  	if len(warns) > 0 {
    38  		t.Fatalf("bad: %#v", warns)
    39  	}
    40  	if err != nil {
    41  		t.Fatalf("should not have error: %s", err)
    42  	}
    43  
    44  	if b.config.DiskName != "disk" {
    45  		t.Errorf("bad disk name: %s", b.config.DiskName)
    46  	}
    47  
    48  	if b.config.OutputDir != "output-foo" {
    49  		t.Errorf("bad output dir: %s", b.config.OutputDir)
    50  	}
    51  
    52  	if b.config.Version != "9" {
    53  		t.Errorf("bad Version: %s", b.config.Version)
    54  	}
    55  
    56  	if b.config.VMName != "packer-foo" {
    57  		t.Errorf("bad vm name: %s", b.config.VMName)
    58  	}
    59  }
    60  
    61  func TestBuilderPrepare_DiskSize(t *testing.T) {
    62  	var b Builder
    63  	config := testConfig()
    64  
    65  	delete(config, "disk_size")
    66  	warns, err := b.Prepare(config)
    67  	if len(warns) > 0 {
    68  		t.Fatalf("bad: %#v", warns)
    69  	}
    70  	if err != nil {
    71  		t.Fatalf("bad err: %s", err)
    72  	}
    73  
    74  	if b.config.DiskSize != 40000 {
    75  		t.Fatalf("bad size: %d", b.config.DiskSize)
    76  	}
    77  
    78  	config["disk_size"] = 60000
    79  	b = Builder{}
    80  	warns, err = b.Prepare(config)
    81  	if len(warns) > 0 {
    82  		t.Fatalf("bad: %#v", warns)
    83  	}
    84  	if err != nil {
    85  		t.Fatalf("should not have error: %s", err)
    86  	}
    87  
    88  	if b.config.DiskSize != 60000 {
    89  		t.Fatalf("bad size: %d", b.config.DiskSize)
    90  	}
    91  }
    92  
    93  func TestBuilderPrepare_FloppyFiles(t *testing.T) {
    94  	var b Builder
    95  	config := testConfig()
    96  
    97  	delete(config, "floppy_files")
    98  	warns, err := b.Prepare(config)
    99  	if len(warns) > 0 {
   100  		t.Fatalf("bad: %#v", warns)
   101  	}
   102  	if err != nil {
   103  		t.Fatalf("bad err: %s", err)
   104  	}
   105  
   106  	if len(b.config.FloppyFiles) != 0 {
   107  		t.Fatalf("bad: %#v", b.config.FloppyFiles)
   108  	}
   109  
   110  	floppies_path := "../../../common/test-fixtures/floppies"
   111  	config["floppy_files"] = []string{fmt.Sprintf("%s/bar.bat", floppies_path), fmt.Sprintf("%s/foo.ps1", floppies_path)}
   112  	b = Builder{}
   113  	warns, err = b.Prepare(config)
   114  	if len(warns) > 0 {
   115  		t.Fatalf("bad: %#v", warns)
   116  	}
   117  	if err != nil {
   118  		t.Fatalf("should not have error: %s", err)
   119  	}
   120  
   121  	expected := []string{fmt.Sprintf("%s/bar.bat", floppies_path), fmt.Sprintf("%s/foo.ps1", floppies_path)}
   122  	if !reflect.DeepEqual(b.config.FloppyFiles, expected) {
   123  		t.Fatalf("bad: %#v", b.config.FloppyFiles)
   124  	}
   125  }
   126  
   127  func TestBuilderPrepare_InvalidFloppies(t *testing.T) {
   128  	var b Builder
   129  	config := testConfig()
   130  	config["floppy_files"] = []string{"nonexistant.bat", "nonexistant.ps1"}
   131  	b = Builder{}
   132  	_, errs := b.Prepare(config)
   133  	if errs == nil {
   134  		t.Fatalf("Non existant floppies should trigger multierror")
   135  	}
   136  
   137  	if len(errs.(*packer.MultiError).Errors) != 2 {
   138  		t.Fatalf("Multierror should work and report 2 errors")
   139  	}
   140  }
   141  
   142  func TestBuilderPrepare_Format(t *testing.T) {
   143  	var b Builder
   144  	config := testConfig()
   145  
   146  	// Bad
   147  	config["format"] = "foobar"
   148  	warns, err := b.Prepare(config)
   149  	if len(warns) > 0 {
   150  		t.Fatalf("bad: %#v", warns)
   151  	}
   152  	if err == nil {
   153  		t.Fatal("should have error")
   154  	}
   155  
   156  	goodFormats := []string{"ova", "ovf", "vmx"}
   157  
   158  	for _, format := range goodFormats {
   159  		// Good
   160  		config["format"] = format
   161  		b = Builder{}
   162  		warns, err = b.Prepare(config)
   163  		if len(warns) > 0 {
   164  			t.Fatalf("bad: %#v", warns)
   165  		}
   166  		if err != nil {
   167  			t.Fatalf("should not have error: %s", err)
   168  		}
   169  	}
   170  }
   171  
   172  func TestBuilderPrepare_InvalidKey(t *testing.T) {
   173  	var b Builder
   174  	config := testConfig()
   175  
   176  	// Add a random key
   177  	config["i_should_not_be_valid"] = true
   178  	warns, err := b.Prepare(config)
   179  	if len(warns) > 0 {
   180  		t.Fatalf("bad: %#v", warns)
   181  	}
   182  	if err == nil {
   183  		t.Fatal("should have error")
   184  	}
   185  }
   186  
   187  func TestBuilderPrepare_OutputDir(t *testing.T) {
   188  	var b Builder
   189  	config := testConfig()
   190  
   191  	// Test with existing dir
   192  	dir, err := ioutil.TempDir("", "packer")
   193  	if err != nil {
   194  		t.Fatalf("err: %s", err)
   195  	}
   196  	defer os.RemoveAll(dir)
   197  
   198  	config["output_directory"] = dir
   199  	b = Builder{}
   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  	// Test with a good one
   209  	config["output_directory"] = "i-hope-i-dont-exist"
   210  	b = Builder{}
   211  	warns, err = b.Prepare(config)
   212  	if len(warns) > 0 {
   213  		t.Fatalf("bad: %#v", warns)
   214  	}
   215  	if err != nil {
   216  		t.Fatalf("should not have error: %s", err)
   217  	}
   218  }
   219  
   220  func TestBuilderPrepare_ToolsUploadPath(t *testing.T) {
   221  	var b Builder
   222  	config := testConfig()
   223  
   224  	// Test a default
   225  	delete(config, "tools_upload_path")
   226  	warns, err := b.Prepare(config)
   227  	if len(warns) > 0 {
   228  		t.Fatalf("bad: %#v", warns)
   229  	}
   230  	if err != nil {
   231  		t.Fatalf("err: %s", err)
   232  	}
   233  
   234  	if b.config.ToolsUploadPath == "" {
   235  		t.Fatalf("bad value: %s", b.config.ToolsUploadPath)
   236  	}
   237  
   238  	// Test with a bad value
   239  	config["tools_upload_path"] = "{{{nope}"
   240  	b = Builder{}
   241  	warns, err = b.Prepare(config)
   242  	if len(warns) > 0 {
   243  		t.Fatalf("bad: %#v", warns)
   244  	}
   245  	if err == nil {
   246  		t.Fatal("should have error")
   247  	}
   248  
   249  	// Test with a good one
   250  	config["tools_upload_path"] = "hey"
   251  	b = Builder{}
   252  	warns, err = b.Prepare(config)
   253  	if len(warns) > 0 {
   254  		t.Fatalf("bad: %#v", warns)
   255  	}
   256  	if err != nil {
   257  		t.Fatalf("should not have error: %s", err)
   258  	}
   259  }
   260  
   261  func TestBuilderPrepare_VMXTemplatePath(t *testing.T) {
   262  	var b Builder
   263  	config := testConfig()
   264  
   265  	// Test bad
   266  	config["vmx_template_path"] = "/i/dont/exist/forreal"
   267  	warns, err := b.Prepare(config)
   268  	if len(warns) > 0 {
   269  		t.Fatalf("bad: %#v", warns)
   270  	}
   271  	if err == nil {
   272  		t.Fatal("should have error")
   273  	}
   274  
   275  	// Test good
   276  	tf, err := ioutil.TempFile("", "packer")
   277  	if err != nil {
   278  		t.Fatalf("err: %s", err)
   279  	}
   280  	defer os.Remove(tf.Name())
   281  	defer tf.Close()
   282  
   283  	if _, err := tf.Write([]byte("HELLO!")); err != nil {
   284  		t.Fatalf("err: %s", err)
   285  	}
   286  
   287  	config["vmx_template_path"] = tf.Name()
   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.Fatalf("should not have error: %s", err)
   295  	}
   296  
   297  	// Bad template
   298  	tf2, err := ioutil.TempFile("", "packer")
   299  	if err != nil {
   300  		t.Fatalf("err: %s", err)
   301  	}
   302  	defer os.Remove(tf2.Name())
   303  	defer tf2.Close()
   304  
   305  	if _, err := tf2.Write([]byte("{{foo}")); err != nil {
   306  		t.Fatalf("err: %s", err)
   307  	}
   308  
   309  	config["vmx_template_path"] = tf2.Name()
   310  	b = Builder{}
   311  	warns, err = b.Prepare(config)
   312  	if len(warns) > 0 {
   313  		t.Fatalf("bad: %#v", warns)
   314  	}
   315  	if err == nil {
   316  		t.Fatal("should have error")
   317  	}
   318  }
   319  
   320  func TestBuilderPrepare_VNCPort(t *testing.T) {
   321  	var b Builder
   322  	config := testConfig()
   323  
   324  	// Bad
   325  	config["vnc_port_min"] = 1000
   326  	config["vnc_port_max"] = 500
   327  	warns, err := b.Prepare(config)
   328  	if len(warns) > 0 {
   329  		t.Fatalf("bad: %#v", warns)
   330  	}
   331  	if err == nil {
   332  		t.Fatal("should have error")
   333  	}
   334  
   335  	// Bad
   336  	config["vnc_port_min"] = -500
   337  	b = Builder{}
   338  	warns, err = b.Prepare(config)
   339  	if len(warns) > 0 {
   340  		t.Fatalf("bad: %#v", warns)
   341  	}
   342  	if err == nil {
   343  		t.Fatal("should have error")
   344  	}
   345  
   346  	// Good
   347  	config["vnc_port_min"] = 500
   348  	config["vnc_port_max"] = 1000
   349  	b = Builder{}
   350  	warns, err = b.Prepare(config)
   351  	if len(warns) > 0 {
   352  		t.Fatalf("bad: %#v", warns)
   353  	}
   354  	if err != nil {
   355  		t.Fatalf("should not have error: %s", err)
   356  	}
   357  }
   358  
   359  func TestBuilderPrepare_CommConfig(t *testing.T) {
   360  	// Test Winrm
   361  	{
   362  		config := testConfig()
   363  		config["communicator"] = "winrm"
   364  		config["winrm_username"] = "username"
   365  		config["winrm_password"] = "password"
   366  		config["winrm_host"] = "1.2.3.4"
   367  
   368  		var b Builder
   369  		warns, err := b.Prepare(config)
   370  		if len(warns) > 0 {
   371  			t.Fatalf("bad: %#v", warns)
   372  		}
   373  		if err != nil {
   374  			t.Fatalf("should not have error: %s", err)
   375  		}
   376  
   377  		if b.config.CommConfig.WinRMUser != "username" {
   378  			t.Errorf("bad winrm_username: %s", b.config.CommConfig.WinRMUser)
   379  		}
   380  		if b.config.CommConfig.WinRMPassword != "password" {
   381  			t.Errorf("bad winrm_password: %s", b.config.CommConfig.WinRMPassword)
   382  		}
   383  		if host := b.config.CommConfig.Host(); host != "1.2.3.4" {
   384  			t.Errorf("bad host: %s", host)
   385  		}
   386  	}
   387  
   388  	// Test SSH
   389  	{
   390  		config := testConfig()
   391  		config["communicator"] = "ssh"
   392  		config["ssh_username"] = "username"
   393  		config["ssh_password"] = "password"
   394  		config["ssh_host"] = "1.2.3.4"
   395  
   396  		var b Builder
   397  		warns, err := b.Prepare(config)
   398  		if len(warns) > 0 {
   399  			t.Fatalf("bad: %#v", warns)
   400  		}
   401  		if err != nil {
   402  			t.Fatalf("should not have error: %s", err)
   403  		}
   404  
   405  		if b.config.CommConfig.SSHUsername != "username" {
   406  			t.Errorf("bad ssh_username: %s", b.config.CommConfig.SSHUsername)
   407  		}
   408  		if b.config.CommConfig.SSHPassword != "password" {
   409  			t.Errorf("bad ssh_password: %s", b.config.CommConfig.SSHPassword)
   410  		}
   411  		if host := b.config.CommConfig.Host(); host != "1.2.3.4" {
   412  			t.Errorf("bad host: %s", host)
   413  		}
   414  	}
   415  }