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  }