Skip to content

Commit fc13282

Browse files
Merge pull request #34 from keep-network/max-file-length
Max file length of 128 characters, moveAll error handling improvements
2 parents 07d2a79 + 892c8da commit fc13282

2 files changed

Lines changed: 195 additions & 28 deletions

File tree

pkg/persistence/disk_persistence.go

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
const (
1010
currentDir = "current"
1111
archiveDir = "archive"
12+
13+
maxFileNameLength = 128
1214
)
1315

1416
// NewDiskHandle creates on-disk data persistence handle
@@ -38,20 +40,44 @@ type diskPersistence struct {
3840
}
3941

4042
func (ds *diskPersistence) Save(data []byte, dirName, fileName string) error {
43+
if len(dirName) > maxFileNameLength {
44+
return fmt.Errorf(
45+
"the maximum directory name length of [%v] exceeded for [%v]",
46+
maxFileNameLength,
47+
dirName,
48+
)
49+
}
50+
51+
if len(fileName) > maxFileNameLength {
52+
return fmt.Errorf(
53+
"the maximum file name length of [%v] exceeded for [%v]",
54+
maxFileNameLength,
55+
fileName,
56+
)
57+
}
58+
4159
dirPath := ds.getStorageCurrentDirPath()
4260
err := createDir(dirPath, dirName)
4361
if err != nil {
4462
return err
4563
}
4664

47-
return write(fmt.Sprintf("%s/%s%s", dirPath, dirName, fileName), data)
65+
return write(fmt.Sprintf("%s/%s/%s", dirPath, dirName, fileName), data)
4866
}
4967

5068
func (ds *diskPersistence) ReadAll() (<-chan DataDescriptor, <-chan error) {
5169
return readAll(ds.getStorageCurrentDirPath())
5270
}
5371

5472
func (ds *diskPersistence) Archive(directory string) error {
73+
if len(directory) > maxFileNameLength {
74+
return fmt.Errorf(
75+
"the maximum directory name length of [%v] exceeded for [%v]",
76+
maxFileNameLength,
77+
directory,
78+
)
79+
}
80+
5581
from := fmt.Sprintf("%s/%s/%s", ds.dataDir, currentDir, directory)
5682
to := fmt.Sprintf("%s/%s/%s", ds.dataDir, archiveDir, directory)
5783

@@ -184,26 +210,41 @@ func readAll(directoryPath string) (<-chan DataDescriptor, <-chan error) {
184210
}
185211

186212
func moveAll(directoryFromPath, directoryToPath string) error {
187-
if _, err := os.Stat(directoryToPath); !os.IsNotExist(err) {
188-
files, _ := ioutil.ReadDir(directoryFromPath)
189-
for _, file := range files {
190-
from := fmt.Sprintf("%s/%s", directoryFromPath, file.Name())
191-
to := fmt.Sprintf("%s/%s", directoryToPath, file.Name())
192-
err := os.Rename(from, to)
193-
if err != nil {
194-
return err
195-
}
196-
}
197-
err = os.RemoveAll(directoryFromPath)
198-
if err != nil {
199-
return fmt.Errorf("error occurred while removing archived dir: [%v]", err)
200-
}
201-
} else {
213+
_, err := os.Stat(directoryToPath)
214+
215+
// target directory does not exist, we can move everything
216+
if os.IsNotExist(err) {
202217
err := os.Rename(directoryFromPath, directoryToPath)
203218
if err != nil {
204219
return fmt.Errorf("error occurred while moving a dir: [%v]", err)
205220
}
221+
222+
return nil
223+
}
224+
225+
// unexpected error occurred while checking target directory existence,
226+
// returning
227+
if err != nil {
228+
return fmt.Errorf("could not stat target directory: [%v]", err)
229+
}
230+
231+
// target directory does exit, we need to append files
232+
files, err := ioutil.ReadDir(directoryFromPath)
233+
if err != nil {
234+
return fmt.Errorf("could not read directory [%v]: [%v]", directoryFromPath, err)
235+
}
236+
for _, file := range files {
237+
from := fmt.Sprintf("%s/%s", directoryFromPath, file.Name())
238+
to := fmt.Sprintf("%s/%s", directoryToPath, file.Name())
239+
err := os.Rename(from, to)
240+
if err != nil {
241+
return err
242+
}
243+
}
244+
err = os.RemoveAll(directoryFromPath)
245+
if err != nil {
246+
return fmt.Errorf("error occurred while removing archived dir: [%v]", err)
206247
}
207248

208249
return nil
209-
}
250+
}

pkg/persistence/disk_persistence_test.go

Lines changed: 137 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package persistence
22

33
import (
44
"bytes"
5-
"errors"
65
"fmt"
76
"io/ioutil"
87
"os"
@@ -18,37 +17,97 @@ var (
1817
dirArchive = "archive"
1918

2019
dirName1 = "0x424242"
21-
fileName11 = "/file11"
22-
fileName12 = "/file12"
20+
fileName11 = "file11"
21+
fileName12 = "file12"
2322

2423
dirName2 = "0x777777"
25-
fileName21 = "/file21"
24+
fileName21 = "file21"
2625

2726
pathToCurrent = fmt.Sprintf("%s/%s", dataDir, dirCurrent)
2827
pathToArchive = fmt.Sprintf("%s/%s", dataDir, dirArchive)
2928

30-
errExpectedRead = errors.New("cannot read from the storage directory: ")
31-
errExpectedWrite = errors.New("cannot write to the storage directory: ")
29+
errExpectedRead = fmt.Errorf("cannot read from the storage directory: ")
30+
errExpectedWrite = fmt.Errorf("cannot write to the storage directory: ")
31+
32+
// 128 characters
33+
maxAllowedName = "0cc2abf49e067b3bede8426d9369c6952655d33629f44610536445c00c974c7e2740dfac967dbfceeeec0af88cd48a5d8c1c167df93cad1b8301a4a204c9f235"
34+
// 129 charactes
35+
notAllowedName = "0cc2abf49e067b3bede8426d9369c6952655d33629f44610536445c00c974c7e2740dfac967dbfceeeec0af88cd48a5d8c1c167df93cad1b8301a4a204c9f235a"
36+
37+
errDirectoryNameLength = fmt.Errorf("the maximum directory name length of [128] exceeded for [%v]", notAllowedName)
38+
errFileNameLength = fmt.Errorf("the maximum file name length of [128] exceeded for [%v]", notAllowedName)
3239
)
3340

34-
func TestMain(m *testing.M) {
35-
code := m.Run()
41+
func cleanup() {
3642
os.RemoveAll(pathToCurrent)
3743
os.RemoveAll(pathToArchive)
38-
os.Exit(code)
3944
}
4045

4146
func TestDiskPersistence_Save(t *testing.T) {
4247
diskPersistence, _ := NewDiskHandle(dataDir)
4348
bytesToTest := []byte{115, 111, 109, 101, 10}
4449

45-
diskPersistence.Save(bytesToTest, dirName1, fileName11)
50+
err := diskPersistence.Save(bytesToTest, dirName1, fileName11)
51+
if err != nil {
52+
t.Fatal(err)
53+
}
4654

47-
pathToFile := fmt.Sprintf("%s/%s%s", pathToCurrent, dirName1, fileName11)
55+
pathToFile := fmt.Sprintf("%s/%s/%s", pathToCurrent, dirName1, fileName11)
4856

4957
if _, err := os.Stat(pathToFile); os.IsNotExist(err) {
5058
t.Fatalf("file [%+v] was supposed to be created", pathToFile)
5159
}
60+
61+
cleanup()
62+
}
63+
64+
func TestDiskPersistence_SaveMaxAllowed(t *testing.T) {
65+
diskPersistence, _ := NewDiskHandle(dataDir)
66+
bytesToTest := []byte{115, 111, 109, 101, 10}
67+
68+
err := diskPersistence.Save(bytesToTest, maxAllowedName, maxAllowedName)
69+
if err != nil {
70+
t.Fatal(err)
71+
}
72+
73+
pathToFile := fmt.Sprintf("%s/%s/%s", pathToCurrent, maxAllowedName, maxAllowedName)
74+
75+
if _, err := os.Stat(pathToFile); os.IsNotExist(err) {
76+
t.Fatalf("file [%+v] was supposed to be created", pathToFile)
77+
}
78+
79+
cleanup()
80+
}
81+
82+
func TestDiskPersistence_RefuseSave(t *testing.T) {
83+
diskPersistence, _ := NewDiskHandle(dataDir)
84+
bytesToTest := []byte{115, 111, 109, 101, 10}
85+
86+
err := diskPersistence.Save(bytesToTest, notAllowedName, fileName11)
87+
if err == nil {
88+
t.Fatalf("expected error")
89+
}
90+
if errDirectoryNameLength.Error() != err.Error() {
91+
t.Fatalf(
92+
"unexpected error returned\nexpected: [%v]\nactual: [%v]",
93+
errDirectoryNameLength.Error(),
94+
err.Error(),
95+
)
96+
}
97+
98+
err = diskPersistence.Save(bytesToTest, dirName1, notAllowedName)
99+
if err == nil {
100+
t.Fatalf("expected error")
101+
}
102+
if errFileNameLength.Error() != err.Error() {
103+
t.Fatalf(
104+
"unexpected error returned\nexpected: [%v]\nactual: [%v]",
105+
errFileNameLength.Error(),
106+
err.Error(),
107+
)
108+
}
109+
110+
cleanup()
52111
}
53112

54113
func TestDiskPersistence_StoragePermission(t *testing.T) {
@@ -71,6 +130,8 @@ func TestDiskPersistence_StoragePermission(t *testing.T) {
71130
if err == nil || !strings.Contains(err.Error(), errExpectedWrite.Error()) {
72131
t.Fatalf("error on write was supposed to be returned")
73132
}
133+
134+
cleanup()
74135
}
75136

76137
func TestDiskPersistence_ReadAll(t *testing.T) {
@@ -134,6 +195,8 @@ func TestDiskPersistence_ReadAll(t *testing.T) {
134195
)
135196
}
136197
}
198+
199+
cleanup()
137200
}
138201

139202
func TestDiskPersistence_Archive(t *testing.T) {
@@ -171,6 +234,68 @@ func TestDiskPersistence_Archive(t *testing.T) {
171234
t.Fatalf("Dir [%+v] was supposed to be created", pathMoveTo)
172235
}
173236
}
237+
238+
cleanup()
239+
}
240+
241+
func TestDiskPersistence_ArchiveMaxAllowed(t *testing.T) {
242+
diskPersistence, _ := NewDiskHandle(dataDir)
243+
244+
pathMoveFrom := fmt.Sprintf("%s/%s", pathToCurrent, maxAllowedName)
245+
pathMoveTo := fmt.Sprintf("%s/%s", pathToArchive, maxAllowedName)
246+
247+
bytesToTest := []byte{115, 111, 109, 101, 10}
248+
249+
diskPersistence.Save(bytesToTest, maxAllowedName, maxAllowedName)
250+
251+
if _, err := os.Stat(pathMoveFrom); os.IsNotExist(err) {
252+
if err != nil {
253+
t.Fatalf("Dir [%+v] was supposed to be created", pathMoveFrom)
254+
}
255+
}
256+
257+
if _, err := os.Stat(pathMoveTo); !os.IsNotExist(err) {
258+
if err != nil {
259+
t.Fatalf("Dir [%+v] was supposed to be empty", pathMoveTo)
260+
}
261+
}
262+
263+
err := diskPersistence.Archive(maxAllowedName)
264+
if err != nil {
265+
t.Fatal(err)
266+
}
267+
268+
if _, err := os.Stat(pathMoveFrom); !os.IsNotExist(err) {
269+
if err != nil {
270+
t.Fatalf("Dir [%+v] was supposed to be moved", pathMoveFrom)
271+
}
272+
}
273+
274+
if _, err := os.Stat(pathMoveTo); os.IsNotExist(err) {
275+
if err != nil {
276+
t.Fatalf("Dir [%+v] was supposed to be created", pathMoveTo)
277+
}
278+
}
279+
280+
cleanup()
281+
}
282+
283+
func TestDiskPersistence_RefuseArchive(t *testing.T) {
284+
diskPersistence, _ := NewDiskHandle(dataDir)
285+
286+
err := diskPersistence.Archive(notAllowedName)
287+
if err == nil {
288+
t.Fatalf("expected error")
289+
}
290+
if errDirectoryNameLength.Error() != err.Error() {
291+
t.Fatalf(
292+
"unexpected error returned\nexpected: [%v]\nactual: [%v]",
293+
errDirectoryNameLength.Error(),
294+
err.Error(),
295+
)
296+
}
297+
298+
cleanup()
174299
}
175300

176301
func TestDiskPersistence_AppendToArchive(t *testing.T) {
@@ -198,4 +323,5 @@ func TestDiskPersistence_AppendToArchive(t *testing.T) {
198323
t.Fatalf("Number of all files was supposed to be [%+v]", 4)
199324
}
200325

326+
cleanup()
201327
}

0 commit comments

Comments
 (0)