github.com/xyproto/u-root@v6.0.1-0.20200302025726-5528e0c77a3c+incompatible/tools/vpdbootmanager/add_test.go (about) 1 // Copyright 2017-2019 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "encoding/json" 9 "fmt" 10 "io/ioutil" 11 "log" 12 "os" 13 "path" 14 "testing" 15 16 "github.com/u-root/u-root/pkg/booter" 17 18 "github.com/u-root/u-root/pkg/vpd" 19 20 "github.com/stretchr/testify/require" 21 ) 22 23 func TestParseNetboot(t *testing.T) { 24 b, err := parseNetbootFlags("dhcpv4", "aa:bb:cc:dd:ee:ff", []string{}) 25 require.NoError(t, err) 26 require.Equal(t, "netboot", b.Type) 27 require.Equal(t, "dhcpv4", b.Method) 28 require.Equal(t, "aa:bb:cc:dd:ee:ff", b.MAC) 29 require.Nil(t, b.OverrideURL) 30 require.Nil(t, b.Retries) 31 } 32 33 func TestParseNetbootWithFlags(t *testing.T) { 34 b, err := parseNetbootFlags("dhcpv4", "aa:bb:cc:dd:ee:ff", []string{ 35 "-override-url", 36 "http://url", 37 "-retries", 38 "1", 39 "-vpd-dir", 40 "test", 41 }) 42 require.NoError(t, err) 43 require.Equal(t, "http://url", *b.OverrideURL) 44 require.Equal(t, 1, *b.Retries) 45 require.Equal(t, "test", vpd.VpdDir) 46 } 47 48 func TestParseLocalboot(t *testing.T) { 49 b, err := parseLocalbootFlags("grub", []string{}) 50 require.NoError(t, err) 51 require.Equal(t, "grub", b.Method) 52 53 b, err = parseLocalbootFlags("path", []string{ 54 "device", 55 "path", 56 }) 57 require.NoError(t, err) 58 require.Equal(t, "path", b.Method) 59 require.Equal(t, "device", b.DeviceGUID) 60 require.Equal(t, "path", b.Kernel) 61 } 62 63 func TestParseLocalbootWithFlags(t *testing.T) { 64 b, err := parseLocalbootFlags("grub", []string{ 65 "-kernel-args", 66 "kernel-argument-test", 67 "-ramfs", 68 "ramfs-test", 69 "-vpd-dir", 70 "test", 71 }) 72 require.NoError(t, err) 73 require.Equal(t, "grub", b.Method) 74 require.Equal(t, "kernel-argument-test", b.KernelArgs) 75 require.Equal(t, "ramfs-test", b.Initramfs) 76 require.Equal(t, "test", vpd.VpdDir) 77 78 b, err = parseLocalbootFlags("path", []string{ 79 "device", 80 "path", 81 "-kernel-args", 82 "kernel-argument-test", 83 "-ramfs", 84 "ramfs-test", 85 "-vpd-dir", 86 "test", 87 }) 88 require.NoError(t, err) 89 require.Equal(t, "path", b.Method) 90 require.Equal(t, "device", b.DeviceGUID) 91 require.Equal(t, "path", b.Kernel) 92 require.Equal(t, "kernel-argument-test", b.KernelArgs) 93 require.Equal(t, "ramfs-test", b.Initramfs) 94 require.Equal(t, "test", vpd.VpdDir) 95 } 96 97 func TestFailGracefullyMissingArg(t *testing.T) { 98 err := add("localboot", []string{}) 99 require.Equal(t, "You need to provide method", err.Error()) 100 101 err = add("localboot", []string{"path"}) 102 require.Equal(t, "You need to pass DeviceGUID and Kernel path", err.Error()) 103 104 err = add("localboot", []string{"path", "device"}) 105 require.Equal(t, "You need to pass DeviceGUID and Kernel path", err.Error()) 106 107 err = add("netboot", []string{}) 108 require.Equal(t, "You need to pass method and MAC address", err.Error()) 109 110 err = add("netboot", []string{"dhcpv6"}) 111 require.Equal(t, "You need to pass method and MAC address", err.Error()) 112 } 113 114 func TestFailGracefullyBadMACAddress(t *testing.T) { 115 err := add("netboot", []string{"dhcpv6", "test"}) 116 require.Equal(t, "address test: invalid MAC address", err.Error()) 117 } 118 119 func TestFailGracefullyBadNetworkType(t *testing.T) { 120 err := add("netboot", []string{"not-valid", "test"}) 121 require.Equal(t, "Method needs to be either dhcpv4 or dhcpv6", err.Error()) 122 } 123 124 func TestFailGracefullyBadLocalbootType(t *testing.T) { 125 err := add("localboot", []string{"not-valid"}) 126 require.Equal(t, "Method needs to be grub or path", err.Error()) 127 } 128 129 func TestFailGracefullyUnknownEntryType(t *testing.T) { 130 err := add("test", []string{}) 131 require.Equal(t, "Unknown entry type", err.Error()) 132 } 133 134 func TestAddBootEntry(t *testing.T) { 135 dir, err := ioutil.TempDir("", "vpdbootmanager") 136 if err != nil { 137 log.Fatal(err) 138 } 139 os.MkdirAll(path.Join(dir, "rw"), 0700) 140 defer os.RemoveAll(dir) 141 vpd.VpdDir = dir 142 err = addBootEntry(&booter.LocalBooter{ 143 Method: "grub", 144 }) 145 require.NoError(t, err) 146 file, err := ioutil.ReadFile(path.Join(dir, "rw", "Boot0001")) 147 require.NoError(t, err) 148 var out booter.LocalBooter 149 err = json.Unmarshal([]byte(file), &out) 150 require.NoError(t, err) 151 require.Equal(t, "grub", out.Method) 152 } 153 154 func TestAddBootEntryMultiple(t *testing.T) { 155 dir, err := ioutil.TempDir("", "vpdbootmanager") 156 if err != nil { 157 log.Fatal(err) 158 } 159 os.MkdirAll(path.Join(dir, "rw"), 0700) 160 defer os.RemoveAll(dir) 161 vpd.VpdDir = dir 162 for i := 1; i < 5; i++ { 163 err = addBootEntry(&booter.LocalBooter{ 164 Method: "grub", 165 }) 166 require.NoError(t, err) 167 file, err := ioutil.ReadFile(path.Join(dir, "rw", fmt.Sprintf("Boot%04d", i))) 168 require.NoError(t, err) 169 var out booter.LocalBooter 170 err = json.Unmarshal([]byte(file), &out) 171 require.NoError(t, err) 172 require.Equal(t, "grub", out.Method) 173 } 174 }