Skip to content

Commit 1363a51

Browse files
Merge pull request #25 from keep-network/storage-dir-validation
Checking if a storage dir is readable and writable
2 parents 7228425 + 36e6cb1 commit 1363a51

File tree

2 files changed

+61
-21
lines changed

2 files changed

+61
-21
lines changed

pkg/persistence/disk_persistence.go

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,25 @@ const (
1212
)
1313

1414
// NewDiskHandle creates on-disk data persistence handle
15-
func NewDiskHandle(path string) Handle {
16-
err := createDir(path, currentDir)
15+
func NewDiskHandle(path string) (Handle, error) {
16+
err := checkStoragePermission(path)
1717
if err != nil {
18-
logger.Errorf(
19-
"failed while creating directory [%v]: [%v]",
20-
currentDir,
21-
err,
22-
)
18+
return nil, err
19+
}
20+
21+
err = createDir(path, currentDir)
22+
if err != nil {
23+
return nil, err
2324
}
2425

2526
err = createDir(path, archiveDir)
2627
if err != nil {
27-
logger.Errorf(
28-
"failed while creating directory [%v]: [%v]",
29-
archiveDir,
30-
err,
31-
)
28+
return nil, err
3229
}
3330

3431
return &diskPersistence{
3532
dataDir: path,
36-
}
33+
}, nil
3734
}
3835

3936
type diskPersistence struct {
@@ -65,6 +62,22 @@ func (ds *diskPersistence) getStorageCurrentDirPath() string {
6562
return fmt.Sprintf("%s/%s", ds.dataDir, currentDir)
6663
}
6764

65+
func checkStoragePermission(dirBasePath string) error {
66+
_, err := ioutil.ReadDir(dirBasePath)
67+
if err != nil {
68+
return fmt.Errorf("cannot read from the storage directory: [%v]", err)
69+
}
70+
71+
tempFile, err := ioutil.TempFile(dirBasePath, "write-test.*.tmp")
72+
if err != nil {
73+
return fmt.Errorf("cannot write to the storage directory: [%v]", err)
74+
}
75+
76+
defer os.RemoveAll(tempFile.Name())
77+
78+
return nil
79+
}
80+
6881
func createDir(dirBasePath, newDirName string) error {
6982
dirPath := fmt.Sprintf("%s/%s", dirBasePath, newDirName)
7083
if _, err := os.Stat(dirPath); os.IsNotExist(err) {

pkg/persistence/disk_persistence_test.go

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package persistence
22

33
import (
44
"bytes"
5+
"errors"
56
"fmt"
7+
"io/ioutil"
68
"os"
9+
"strings"
710
"sync"
811
"testing"
9-
"io/ioutil"
1012
)
1113

1214
var (
@@ -24,6 +26,9 @@ var (
2426

2527
pathToCurrent = fmt.Sprintf("%s/%s", dataDir, dirCurrent)
2628
pathToArchive = fmt.Sprintf("%s/%s", dataDir, dirArchive)
29+
30+
errExpectedRead = errors.New("cannot read from the storage directory: ")
31+
errExpectedWrite = errors.New("cannot write to the storage directory: ")
2732
)
2833

2934
func TestMain(m *testing.M) {
@@ -34,7 +39,7 @@ func TestMain(m *testing.M) {
3439
}
3540

3641
func TestDiskPersistence_Save(t *testing.T) {
37-
diskPersistence := NewDiskHandle(dataDir)
42+
diskPersistence, _ := NewDiskHandle(dataDir)
3843
bytesToTest := []byte{115, 111, 109, 101, 10}
3944

4045
diskPersistence.Save(bytesToTest, dirName1, fileName11)
@@ -46,8 +51,30 @@ func TestDiskPersistence_Save(t *testing.T) {
4651
}
4752
}
4853

54+
func TestDiskPersistence_StoragePermission(t *testing.T) {
55+
tempDir := "./data_storage"
56+
57+
err := os.Mkdir(tempDir, 0000) // d---------
58+
if _, err := os.Stat(tempDir); os.IsNotExist(err) {
59+
t.Fatalf("dir [%+v] was supposed to be created", tempDir)
60+
}
61+
defer os.RemoveAll(tempDir)
62+
63+
_, err = NewDiskHandle(tempDir)
64+
if err == nil || !strings.Contains(err.Error(), errExpectedRead.Error()) {
65+
t.Fatalf("error on read was supposed to be returned")
66+
}
67+
68+
os.Chmod(tempDir, 0444) // dr--r--r
69+
70+
_, err = NewDiskHandle(tempDir)
71+
if err == nil || !strings.Contains(err.Error(), errExpectedWrite.Error()) {
72+
t.Fatalf("error on write was supposed to be returned")
73+
}
74+
}
75+
4976
func TestDiskPersistence_ReadAll(t *testing.T) {
50-
diskPersistence := NewDiskHandle(dataDir)
77+
diskPersistence, _ := NewDiskHandle(dataDir)
5178

5279
bytesToTest := []byte{115, 111, 109, 101, 10}
5380
expectedBytes := [][]byte{bytesToTest, bytesToTest, bytesToTest}
@@ -110,7 +137,7 @@ func TestDiskPersistence_ReadAll(t *testing.T) {
110137
}
111138

112139
func TestDiskPersistence_Archive(t *testing.T) {
113-
diskPersistence := NewDiskHandle(dataDir)
140+
diskPersistence, _ := NewDiskHandle(dataDir)
114141

115142
pathMoveFrom := fmt.Sprintf("%s/%s", pathToCurrent, dirName1)
116143
pathMoveTo := fmt.Sprintf("%s/%s", pathToArchive, dirName1)
@@ -147,7 +174,7 @@ func TestDiskPersistence_Archive(t *testing.T) {
147174
}
148175

149176
func TestDiskPersistence_AppendToArchive(t *testing.T) {
150-
diskPersistence := NewDiskHandle(dataDir)
177+
diskPersistence, _ := NewDiskHandle(dataDir)
151178

152179
pathMoveFrom := fmt.Sprintf("%s/%s", pathToCurrent, dirName1)
153180
pathMoveTo := fmt.Sprintf("%s/%s", pathToArchive, dirName1)
@@ -157,11 +184,11 @@ func TestDiskPersistence_AppendToArchive(t *testing.T) {
157184
diskPersistence.Save(bytesToTest, dirName1, fileName11)
158185
diskPersistence.Save(bytesToTest, dirName1, fileName12)
159186
diskPersistence.Archive(dirName1)
160-
187+
161188
diskPersistence.Save(bytesToTest, dirName1, "/file13")
162189
diskPersistence.Save(bytesToTest, dirName1, "/file14")
163190
diskPersistence.Archive(dirName1)
164-
191+
165192
if _, err := os.Stat(pathMoveFrom); !os.IsNotExist(err) {
166193
t.Fatalf("Dir [%+v] was supposed to be removed", pathMoveFrom)
167194
}
@@ -171,4 +198,4 @@ func TestDiskPersistence_AppendToArchive(t *testing.T) {
171198
t.Fatalf("Number of all files was supposed to be [%+v]", 4)
172199
}
173200

174-
}
201+
}

0 commit comments

Comments
 (0)