github.com/cloudfoundry-incubator/stembuild@v0.0.0-20211223202937-5b61d62226c6/templates/vmx_test.go (about)

     1  package templates_test
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"strconv"
    11  	"strings"
    12  	"testing"
    13  
    14  	"github.com/cloudfoundry-incubator/stembuild/templates"
    15  )
    16  
    17  func parseVMX(vmx string) (map[string]string, error) {
    18  	m := make(map[string]string)
    19  	for _, s := range strings.Split(vmx, "\n") {
    20  		if s == "" {
    21  			continue
    22  		}
    23  		n := strings.IndexByte(s, '=')
    24  		if n == -1 {
    25  			return nil, fmt.Errorf("parse vmx: invalid line: %s", s)
    26  		}
    27  		k := strings.TrimSpace(s[:n])
    28  		v, err := strconv.Unquote(strings.TrimSpace(s[n+1:]))
    29  		if err != nil {
    30  			return nil, err
    31  		}
    32  		if _, ok := m[k]; ok {
    33  			return nil, fmt.Errorf("parse vmx: duplicate key: %s", k)
    34  		}
    35  		m[k] = v
    36  	}
    37  	if len(m) == 0 {
    38  		return nil, errors.New("parse vmx: empty vmx")
    39  	}
    40  	return m, nil
    41  }
    42  
    43  func checkVMXTemplate(t *testing.T, hwVersion int, vmdkPath, vmxContent string) {
    44  	const vmdkPathKeyName = "scsi0:0.fileName"
    45  	const hwVersionKeyName = "virtualHW.version"
    46  
    47  	m, err := parseVMX(vmxContent)
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	if s := m[vmdkPathKeyName]; s != vmdkPath {
    52  		t.Errorf("VMXTemplate: key: %q want: %q got: %q", vmdkPathKeyName, vmdkPath, s)
    53  	}
    54  
    55  	expectedHWVersion := strconv.Itoa(hwVersion)
    56  	if s := m[hwVersionKeyName]; s != expectedHWVersion {
    57  		t.Errorf("VMXTemplate: key: %q want: %q got: %q", hwVersionKeyName, expectedHWVersion, s)
    58  	}
    59  }
    60  
    61  const vmdkPath = "FooBarBaz.vmdk"
    62  const virtualHWVersion = 60
    63  
    64  func TestVMXTemplate(t *testing.T) {
    65  	var buf bytes.Buffer
    66  	if err := templates.VMXTemplate(vmdkPath, virtualHWVersion, &buf); err != nil {
    67  		t.Fatal(err)
    68  	}
    69  	checkVMXTemplate(t, virtualHWVersion, vmdkPath, buf.String())
    70  
    71  	if err := templates.VMXTemplate("", 0, &buf); err == nil {
    72  		t.Error("VMXTemplate: expected error for empty vmx filename")
    73  	}
    74  }
    75  
    76  func TestWriteVMXTemplate(t *testing.T) {
    77  	tmpdir, err := ioutil.TempDir("", "test-")
    78  	if err != nil {
    79  		t.Fatal(err)
    80  	}
    81  	vmxPath := filepath.Join(tmpdir, "FooBarBaz.vmx")
    82  
    83  	if err := templates.WriteVMXTemplate(vmdkPath, virtualHWVersion, vmxPath); err != nil {
    84  		t.Fatal(err)
    85  	}
    86  	b, err := ioutil.ReadFile(vmxPath)
    87  	if err != nil {
    88  		t.Fatal(err)
    89  	}
    90  	checkVMXTemplate(t, virtualHWVersion, vmdkPath, string(b))
    91  
    92  	if err := os.Remove(vmxPath); err != nil {
    93  		t.Fatal(err)
    94  	}
    95  
    96  	// vmx file is deleted if there is an error
    97  	if err := templates.WriteVMXTemplate("", 0, vmxPath); err == nil {
    98  		t.Error("WriteVMXTemplate: expected error for empty vmx filename")
    99  	}
   100  	if _, err := os.Stat(vmxPath); err == nil {
   101  		t.Errorf("WriteVMXTemplate: failed to delete vmx file on error: %s", vmxPath)
   102  	}
   103  }