github.com/rothwerx/packer@v0.9.0/builder/vmware/iso/builder_test.go (about)

     1  package iso
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"reflect"
     7  	"testing"
     8  
     9  	"github.com/mitchellh/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.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_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.DiskName != "disk" {
    44  		t.Errorf("bad disk name: %s", b.config.DiskName)
    45  	}
    46  
    47  	if b.config.OutputDir != "output-foo" {
    48  		t.Errorf("bad output dir: %s", b.config.OutputDir)
    49  	}
    50  
    51  	if b.config.Version != "9" {
    52  		t.Errorf("bad Version: %s", b.config.Version)
    53  	}
    54  
    55  	if b.config.VMName != "packer-foo" {
    56  		t.Errorf("bad vm name: %s", b.config.VMName)
    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  	config["floppy_files"] = []string{"foo", "bar"}
   110  	b = Builder{}
   111  	warns, err = b.Prepare(config)
   112  	if len(warns) > 0 {
   113  		t.Fatalf("bad: %#v", warns)
   114  	}
   115  	if err != nil {
   116  		t.Fatalf("should not have error: %s", err)
   117  	}
   118  
   119  	expected := []string{"foo", "bar"}
   120  	if !reflect.DeepEqual(b.config.FloppyFiles, expected) {
   121  		t.Fatalf("bad: %#v", b.config.FloppyFiles)
   122  	}
   123  }
   124  
   125  func TestBuilderPrepare_Format(t *testing.T) {
   126  	var b Builder
   127  	config := testConfig()
   128  
   129  	// Bad
   130  	config["format"] = "foobar"
   131  	warns, err := b.Prepare(config)
   132  	if len(warns) > 0 {
   133  		t.Fatalf("bad: %#v", warns)
   134  	}
   135  	if err == nil {
   136  		t.Fatal("should have error")
   137  	}
   138  
   139  	goodFormats := []string{"ova", "ovf", "vmx"}
   140  
   141  	for _, format := range goodFormats {
   142  		// Good
   143  		config["format"] = format
   144  		b = Builder{}
   145  		warns, err = b.Prepare(config)
   146  		if len(warns) > 0 {
   147  			t.Fatalf("bad: %#v", warns)
   148  		}
   149  		if err != nil {
   150  			t.Fatalf("should not have error: %s", err)
   151  		}
   152  	}
   153  }
   154  
   155  func TestBuilderPrepare_InvalidKey(t *testing.T) {
   156  	var b Builder
   157  	config := testConfig()
   158  
   159  	// Add a random key
   160  	config["i_should_not_be_valid"] = true
   161  	warns, err := b.Prepare(config)
   162  	if len(warns) > 0 {
   163  		t.Fatalf("bad: %#v", warns)
   164  	}
   165  	if err == nil {
   166  		t.Fatal("should have error")
   167  	}
   168  }
   169  
   170  func TestBuilderPrepare_OutputDir(t *testing.T) {
   171  	var b Builder
   172  	config := testConfig()
   173  
   174  	// Test with existing dir
   175  	dir, err := ioutil.TempDir("", "packer")
   176  	if err != nil {
   177  		t.Fatalf("err: %s", err)
   178  	}
   179  	defer os.RemoveAll(dir)
   180  
   181  	config["output_directory"] = dir
   182  	b = Builder{}
   183  	warns, err := b.Prepare(config)
   184  	if len(warns) > 0 {
   185  		t.Fatalf("bad: %#v", warns)
   186  	}
   187  	if err != nil {
   188  		t.Fatalf("err: %s", err)
   189  	}
   190  
   191  	// Test with a good one
   192  	config["output_directory"] = "i-hope-i-dont-exist"
   193  	b = Builder{}
   194  	warns, err = b.Prepare(config)
   195  	if len(warns) > 0 {
   196  		t.Fatalf("bad: %#v", warns)
   197  	}
   198  	if err != nil {
   199  		t.Fatalf("should not have error: %s", err)
   200  	}
   201  }
   202  
   203  func TestBuilderPrepare_ToolsUploadPath(t *testing.T) {
   204  	var b Builder
   205  	config := testConfig()
   206  
   207  	// Test a default
   208  	delete(config, "tools_upload_path")
   209  	warns, err := b.Prepare(config)
   210  	if len(warns) > 0 {
   211  		t.Fatalf("bad: %#v", warns)
   212  	}
   213  	if err != nil {
   214  		t.Fatalf("err: %s", err)
   215  	}
   216  
   217  	if b.config.ToolsUploadPath == "" {
   218  		t.Fatalf("bad value: %s", b.config.ToolsUploadPath)
   219  	}
   220  
   221  	// Test with a bad value
   222  	config["tools_upload_path"] = "{{{nope}"
   223  	b = Builder{}
   224  	warns, err = b.Prepare(config)
   225  	if len(warns) > 0 {
   226  		t.Fatalf("bad: %#v", warns)
   227  	}
   228  	if err == nil {
   229  		t.Fatal("should have error")
   230  	}
   231  
   232  	// Test with a good one
   233  	config["tools_upload_path"] = "hey"
   234  	b = Builder{}
   235  	warns, err = b.Prepare(config)
   236  	if len(warns) > 0 {
   237  		t.Fatalf("bad: %#v", warns)
   238  	}
   239  	if err != nil {
   240  		t.Fatalf("should not have error: %s", err)
   241  	}
   242  }
   243  
   244  func TestBuilderPrepare_VMXTemplatePath(t *testing.T) {
   245  	var b Builder
   246  	config := testConfig()
   247  
   248  	// Test bad
   249  	config["vmx_template_path"] = "/i/dont/exist/forreal"
   250  	warns, err := b.Prepare(config)
   251  	if len(warns) > 0 {
   252  		t.Fatalf("bad: %#v", warns)
   253  	}
   254  	if err == nil {
   255  		t.Fatal("should have error")
   256  	}
   257  
   258  	// Test good
   259  	tf, err := ioutil.TempFile("", "packer")
   260  	if err != nil {
   261  		t.Fatalf("err: %s", err)
   262  	}
   263  	defer os.Remove(tf.Name())
   264  	defer tf.Close()
   265  
   266  	if _, err := tf.Write([]byte("HELLO!")); err != nil {
   267  		t.Fatalf("err: %s", err)
   268  	}
   269  
   270  	config["vmx_template_path"] = tf.Name()
   271  	b = Builder{}
   272  	warns, err = b.Prepare(config)
   273  	if len(warns) > 0 {
   274  		t.Fatalf("bad: %#v", warns)
   275  	}
   276  	if err != nil {
   277  		t.Fatalf("should not have error: %s", err)
   278  	}
   279  
   280  	// Bad template
   281  	tf2, err := ioutil.TempFile("", "packer")
   282  	if err != nil {
   283  		t.Fatalf("err: %s", err)
   284  	}
   285  	defer os.Remove(tf2.Name())
   286  	defer tf2.Close()
   287  
   288  	if _, err := tf2.Write([]byte("{{foo}")); err != nil {
   289  		t.Fatalf("err: %s", err)
   290  	}
   291  
   292  	config["vmx_template_path"] = tf2.Name()
   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.Fatal("should have error")
   300  	}
   301  }
   302  
   303  func TestBuilderPrepare_VNCPort(t *testing.T) {
   304  	var b Builder
   305  	config := testConfig()
   306  
   307  	// Bad
   308  	config["vnc_port_min"] = 1000
   309  	config["vnc_port_max"] = 500
   310  	warns, err := b.Prepare(config)
   311  	if len(warns) > 0 {
   312  		t.Fatalf("bad: %#v", warns)
   313  	}
   314  	if err == nil {
   315  		t.Fatal("should have error")
   316  	}
   317  
   318  	// Bad
   319  	config["vnc_port_min"] = -500
   320  	b = Builder{}
   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  	// Good
   330  	config["vnc_port_min"] = 500
   331  	config["vnc_port_max"] = 1000
   332  	b = Builder{}
   333  	warns, err = b.Prepare(config)
   334  	if len(warns) > 0 {
   335  		t.Fatalf("bad: %#v", warns)
   336  	}
   337  	if err != nil {
   338  		t.Fatalf("should not have error: %s", err)
   339  	}
   340  }