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