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 }