package grub import ( "fmt" "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" fakeFile "edge-infra.dev/pkg/sds/lib/os/file/fake" ) var ( 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}") 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}") testMenuEntry = []byte("menuentry \"Run\" --unrestricted {\n linux /live/vmlinuz boot=live zynstra/opmode=operation hostname=ien-1\n initrd /live/initrd\n}") grubVolumeMountPath = "/boot" grubConfigFileName = "grub.cfg" efiPath = filepath.Join("efi", "EFI", "grub") legacyPath = filepath.Join("grub") ) func TestGetGrubConfigPath(t *testing.T) { fakeFileHandler, fileMock := fakeFile.NewFake() cfgPath := filepath.Join(grubVolumeMountPath, efiPath, grubConfigFileName) cfgPathLegacy := filepath.Join(grubVolumeMountPath, legacyPath, grubConfigFileName) fileMock.On("Exists", cfgPath).Return(false) fileMock.On("Exists", cfgPathLegacy).Return(false) _, err := GetGrubConfigPath(fakeFileHandler, grubVolumeMountPath, grubConfigFileName) assert.Error(t, err) fakeFileHandler, fileMock = fakeFile.NewFake() fileMock.On("Exists", cfgPath).Return(true) fileMock.On("Exists", cfgPathLegacy).Return(false) path, err := GetGrubConfigPath(fakeFileHandler, grubVolumeMountPath, grubConfigFileName) assert.NoError(t, err) assert.Equal(t, path, cfgPath) fakeFileHandler, fileMock = fakeFile.NewFake() fileMock.On("Exists", cfgPath).Return(false) fileMock.On("Exists", cfgPathLegacy).Return(true) path, err = GetGrubConfigPath(fakeFileHandler, grubVolumeMountPath, grubConfigFileName) assert.NoError(t, err) assert.Equal(t, path, cfgPathLegacy) } func TestReadWriteGrubCfg(t *testing.T) { fakeFileHandler, fileMock := fakeFile.NewFake() cfgPath := filepath.Join(grubVolumeMountPath, efiPath, grubConfigFileName) fileMock.On("Read", cfgPath).Return(string(testGrubConfigData), nil) cfgFile, err := ReadGrubCfg(fakeFileHandler, cfgPath) assert.NoError(t, err) assert.False(t, cfgFile.UpdateRequired()) cfgFile.SetProperty("timeout", "10") assert.Equal(t, []byte(cfgFile.(*grubFile).Contents), testGrubConfigDataSetProperty) assert.True(t, cfgFile.UpdateRequired()) fileMock.On("Write", mock.Anything, mock.Anything, mock.Anything).Return(nil) fileMock.On("Rename", mock.Anything, mock.Anything).Return(nil) assert.NoError(t, cfgFile.WriteGrubCfg(fakeFileHandler, cfgPath)) } func TestWriteGrubCfgReadWrite(t *testing.T) { grubCfg := &grubFile{ Contents: string(testGrubConfigData), OriginalContents: string(testGrubConfigData), } fakeFileHandler, fileMock := fakeFile.NewFake() fileMock.On("WriteWithFsReadWrite", grubVolumeMountPath, efiPath, testGrubConfigData, mock.Anything).Return(nil) assert.NoError(t, grubCfg.WriteGrubCfgReadWrite(fakeFileHandler, grubVolumeMountPath, efiPath)) } func TestMenuEntries(t *testing.T) { grubCfg := &grubFile{ Contents: string(testGrubConfigData), OriginalContents: string(testGrubConfigData), } menuEntries := grubCfg.GetMenuEntries() assert.NotEmpty(t, menuEntries) fmt.Println(string(testGrubConfigData)) fmt.Println(menuEntries[0].String()) assert.Equal(t, string(testMenuEntry), menuEntries[0].String()) grubCfg.DeleteMenuEntry(menuEntries[0].Name) assert.NotContains(t, grubCfg.Contents, menuEntries[0].String()) grubCfg.AddMenuEntry(menuEntries[0]) assert.Contains(t, grubCfg.Contents, menuEntries[0].String()) grubCfg.AddMenuEntry(menuEntries[0]) assert.Equal(t, len(grubCfg.GetMenuEntries()), 2) }