Skip to content

Commit 29271f8

Browse files
Add tests
Signed-off-by: Marius Sincovici <[email protected]> * Test that FileWrite will set the correct file permissions if the file already exists * Check that the moose DB permissions are correctly set
1 parent c86b1e6 commit 29271f8

File tree

4 files changed

+95
-27
lines changed

4 files changed

+95
-27
lines changed

cmd/daemon/main.go

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,9 @@ func main() {
280280
dnsHostSetter := dns.NewHostsFileSetter(dns.HostsFilePath)
281281

282282
eventsDbPath := filepath.Join(internal.DatFilesPathCommon, "moose.db")
283-
createMooseDB(eventsDbPath)
283+
if err := assignMooseDBPermissions(eventsDbPath); err != nil {
284+
log.Fatalln(err)
285+
}
284286

285287
machineID := machineIdGenerator.GetMachineID()
286288

@@ -633,29 +635,26 @@ func main() {
633635
}
634636
}
635637

636-
// createMooseDB creates the moose DB with the desired permissions.
637-
// If the file already exists then its permissions and user group are updated
638-
func createMooseDB(eventsDbPath string) {
639-
var permissions os.FileMode = internal.PermUserRWGroupRW
638+
// assignMooseDBPermissions updates moose DB permissions.
639+
// If the file doesn't exist it will be created withe the desired permissions.
640+
func assignMooseDBPermissions(eventsDbPath string) error {
641+
const permissions os.FileMode = internal.PermUserRWGroupRW
640642

641643
if !internal.FileExists(eventsDbPath) {
642-
file, err := internal.FileCreate(eventsDbPath, permissions)
643-
if err != nil {
644-
log.Fatalln(err)
645-
}
646-
defer file.Close()
647-
} else {
648-
// Change permission of the existing DB, because older versions had read for everyone
649-
if err := os.Chmod(eventsDbPath, permissions); err != nil {
650-
log.Println(err)
651-
}
644+
_, err := internal.FileCreate(eventsDbPath, permissions)
645+
return err
646+
}
647+
// Change permission of the existing DB, because older versions had read for everyone
648+
if err := os.Chmod(eventsDbPath, permissions); err != nil {
649+
log.Println(err)
650+
}
652651

653-
if gid, err := internal.GetNordvpnGid(); err == nil {
654-
if err := os.Chown(eventsDbPath, os.Getuid(), gid); err != nil {
655-
log.Println(err)
656-
}
657-
} else {
652+
if gid, err := internal.GetNordvpnGid(); err == nil {
653+
if err := os.Chown(eventsDbPath, os.Getuid(), gid); err != nil {
658654
log.Println(err)
659655
}
656+
} else {
657+
log.Println(err)
660658
}
659+
return nil
661660
}

cmd/daemon/moose_db_creation_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/NordSecurity/nordvpn-linux/internal"
8+
"github.com/NordSecurity/nordvpn-linux/test/category"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
const TestDataPath = "testdata/"
13+
14+
func TestCreateMooseDB(t *testing.T) {
15+
category.Set(t, category.Unit)
16+
17+
path := TestDataPath + "test_moose_db.db"
18+
const perm os.FileMode = internal.PermUserRWGroupRW
19+
defer os.Remove(path)
20+
21+
checkPermissionsFn := func() {
22+
info, err := os.Stat(path)
23+
assert.NoError(t, err)
24+
assert.Equal(t, perm, info.Mode().Perm())
25+
}
26+
27+
// create DB
28+
assignMooseDBPermissions(path)
29+
30+
assert.FileExists(t, path)
31+
checkPermissionsFn()
32+
33+
// file exists, check that the permissions are updated
34+
os.Chmod(path, internal.PermUserRW)
35+
assignMooseDBPermissions(path)
36+
37+
checkPermissionsFn()
38+
}

internal/filesystem.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -236,17 +236,19 @@ func EnsureDirFull(path string) error {
236236

237237
// FileWrite writes the given string array to file, previously flushing it clean
238238
func FileWrite(path string, contents []byte, permissions os.FileMode) error {
239-
err := EnsureDir(path)
240-
if err != nil {
241-
return err
239+
if err := EnsureDir(path); err != nil {
240+
return fmt.Errorf("failed to create parent folders: %w", err)
242241
}
243-
err = os.WriteFile(path, contents, permissions)
244-
if err != nil {
245-
return err
242+
243+
if err := os.WriteFile(path, contents, permissions); err != nil {
244+
return fmt.Errorf("writing file: %w", err)
246245
}
247246
// if file exists os.WriteFile is not changing the permissions,
248247
// ensure file has expected permissions
249-
return os.Chmod(path, permissions)
248+
if err := os.Chmod(path, permissions); err != nil {
249+
return fmt.Errorf("change permissions failed: %w", err)
250+
}
251+
return nil
250252
}
251253

252254
// FileCreate with the given permissions, but leave the closing to the caller.

internal/filesystem_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ func TestFileWrite(t *testing.T) {
103103
assert.NoError(t, err)
104104

105105
file, err := os.OpenFile(path, os.O_RDONLY|os.O_EXCL, item.permissions)
106+
assert.NoError(t, err)
106107
defer func() {
107108
file.Close()
108109
os.Remove(file.Name())
@@ -112,10 +113,38 @@ func TestFileWrite(t *testing.T) {
112113
_, err = file.Read(got)
113114
assert.NoError(t, err)
114115
assert.EqualValues(t, got, []byte(item.data))
116+
117+
info, err := os.Stat(path)
118+
assert.NoError(t, err)
119+
perm := info.Mode().Perm()
120+
assert.Equal(t, item.permissions, perm)
115121
})
116122
}
117123
}
118124

125+
func TestFileWriteSetsCorrectPermissionsWhenFileExists(t *testing.T) {
126+
category.Set(t, category.File)
127+
128+
createFileAndCheckPerms := func(path string, permissions os.FileMode) {
129+
err := FileWrite(path, []byte("data"), permissions)
130+
assert.NoError(t, err)
131+
132+
info, err := os.Stat(path)
133+
assert.NoError(t, err)
134+
assert.Equal(t, permissions, info.Mode().Perm())
135+
}
136+
137+
fileName := "tst_" + time.Now().String() + ".txt"
138+
path := TestDataPath + fileName
139+
defer os.Remove(path)
140+
141+
// create the file and check that the permissions are correct
142+
createFileAndCheckPerms(path, PermUserRWGroupROthersR)
143+
144+
// file already exists, the permissions are updated
145+
createFileAndCheckPerms(path, PermUserRW)
146+
}
147+
119148
func TestFileCreate(t *testing.T) {
120149
category.Set(t, category.File)
121150

0 commit comments

Comments
 (0)