...

Source file src/edge-infra.dev/pkg/sds/lib/os/grub/grub_test.go

Documentation: edge-infra.dev/pkg/sds/lib/os/grub

     1  package grub
     2  
     3  import (
     4  	"fmt"
     5  	"path/filepath"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/mock"
    10  
    11  	fakeFile "edge-infra.dev/pkg/sds/lib/os/file/fake"
    12  )
    13  
    14  var (
    15  	testGrubConfigData            = []byte("insmod all_video\nset default=\"0\"\nset timeout=5\nset root=(lvm/ien-lvboot)\n\nset superusers=\"oldGrubUser\"\npassword_pbkdf2 oldGrubUser grub.pbkdf2.sha512.10000.oldSalt.oldHash\nexport superusers\n\nmenuentry \"Run\" --unrestricted {\n    linux /live/vmlinuz boot=live zynstra/opmode=operation hostname=ien-1\n    initrd /live/initrd\n}")
    16  	testGrubConfigDataSetProperty = []byte("insmod all_video\nset default=\"0\"\nset timeout=10\nset root=(lvm/ien-lvboot)\n\nset superusers=\"oldGrubUser\"\npassword_pbkdf2 oldGrubUser grub.pbkdf2.sha512.10000.oldSalt.oldHash\nexport superusers\n\nmenuentry \"Run\" --unrestricted {\n    linux /live/vmlinuz boot=live zynstra/opmode=operation hostname=ien-1\n    initrd /live/initrd\n}")
    17  	testMenuEntry                 = []byte("menuentry \"Run\" --unrestricted {\n    linux /live/vmlinuz boot=live zynstra/opmode=operation hostname=ien-1\n    initrd /live/initrd\n}")
    18  
    19  	grubVolumeMountPath = "/boot"
    20  	grubConfigFileName  = "grub.cfg"
    21  	efiPath             = filepath.Join("efi", "EFI", "grub")
    22  	legacyPath          = filepath.Join("grub")
    23  )
    24  
    25  func TestGetGrubConfigPath(t *testing.T) {
    26  	fakeFileHandler, fileMock := fakeFile.NewFake()
    27  
    28  	cfgPath := filepath.Join(grubVolumeMountPath, efiPath, grubConfigFileName)
    29  	cfgPathLegacy := filepath.Join(grubVolumeMountPath, legacyPath, grubConfigFileName)
    30  
    31  	fileMock.On("Exists", cfgPath).Return(false)
    32  	fileMock.On("Exists", cfgPathLegacy).Return(false)
    33  
    34  	_, err := GetGrubConfigPath(fakeFileHandler, grubVolumeMountPath, grubConfigFileName)
    35  	assert.Error(t, err)
    36  
    37  	fakeFileHandler, fileMock = fakeFile.NewFake()
    38  	fileMock.On("Exists", cfgPath).Return(true)
    39  	fileMock.On("Exists", cfgPathLegacy).Return(false)
    40  
    41  	path, err := GetGrubConfigPath(fakeFileHandler, grubVolumeMountPath, grubConfigFileName)
    42  	assert.NoError(t, err)
    43  	assert.Equal(t, path, cfgPath)
    44  
    45  	fakeFileHandler, fileMock = fakeFile.NewFake()
    46  	fileMock.On("Exists", cfgPath).Return(false)
    47  	fileMock.On("Exists", cfgPathLegacy).Return(true)
    48  
    49  	path, err = GetGrubConfigPath(fakeFileHandler, grubVolumeMountPath, grubConfigFileName)
    50  	assert.NoError(t, err)
    51  	assert.Equal(t, path, cfgPathLegacy)
    52  }
    53  
    54  func TestReadWriteGrubCfg(t *testing.T) {
    55  	fakeFileHandler, fileMock := fakeFile.NewFake()
    56  	cfgPath := filepath.Join(grubVolumeMountPath, efiPath, grubConfigFileName)
    57  	fileMock.On("Read", cfgPath).Return(string(testGrubConfigData), nil)
    58  	cfgFile, err := ReadGrubCfg(fakeFileHandler, cfgPath)
    59  	assert.NoError(t, err)
    60  	assert.False(t, cfgFile.UpdateRequired())
    61  
    62  	cfgFile.SetProperty("timeout", "10")
    63  	assert.Equal(t, []byte(cfgFile.(*grubFile).Contents), testGrubConfigDataSetProperty)
    64  	assert.True(t, cfgFile.UpdateRequired())
    65  
    66  	fileMock.On("Write", mock.Anything, mock.Anything, mock.Anything).Return(nil)
    67  	fileMock.On("Rename", mock.Anything, mock.Anything).Return(nil)
    68  	assert.NoError(t, cfgFile.WriteGrubCfg(fakeFileHandler, cfgPath))
    69  }
    70  
    71  func TestWriteGrubCfgReadWrite(t *testing.T) {
    72  	grubCfg := &grubFile{
    73  		Contents:         string(testGrubConfigData),
    74  		OriginalContents: string(testGrubConfigData),
    75  	}
    76  	fakeFileHandler, fileMock := fakeFile.NewFake()
    77  	fileMock.On("WriteWithFsReadWrite", grubVolumeMountPath, efiPath, testGrubConfigData, mock.Anything).Return(nil)
    78  	assert.NoError(t, grubCfg.WriteGrubCfgReadWrite(fakeFileHandler, grubVolumeMountPath, efiPath))
    79  }
    80  
    81  func TestMenuEntries(t *testing.T) {
    82  	grubCfg := &grubFile{
    83  		Contents:         string(testGrubConfigData),
    84  		OriginalContents: string(testGrubConfigData),
    85  	}
    86  	menuEntries := grubCfg.GetMenuEntries()
    87  	assert.NotEmpty(t, menuEntries)
    88  	fmt.Println(string(testGrubConfigData))
    89  	fmt.Println(menuEntries[0].String())
    90  	assert.Equal(t, string(testMenuEntry), menuEntries[0].String())
    91  
    92  	grubCfg.DeleteMenuEntry(menuEntries[0].Name)
    93  	assert.NotContains(t, grubCfg.Contents, menuEntries[0].String())
    94  
    95  	grubCfg.AddMenuEntry(menuEntries[0])
    96  	assert.Contains(t, grubCfg.Contents, menuEntries[0].String())
    97  
    98  	grubCfg.AddMenuEntry(menuEntries[0])
    99  	assert.Equal(t, len(grubCfg.GetMenuEntries()), 2)
   100  }
   101  

View as plain text