8
"github.com/stretchr/testify/assert"
9
"github.com/wal-g/wal-g/internal"
10
"github.com/wal-g/wal-g/pkg/storages/memory"
11
"github.com/wal-g/wal-g/pkg/storages/storage"
12
"github.com/wal-g/wal-g/testtools"
13
"github.com/wal-g/wal-g/utility"
17
testStreamBackup = internal.BackupTime{
18
BackupName: "stream_20210329T125616Z",
23
func TestGetBackups_emptyFolder(t *testing.T) {
24
folder := testtools.MakeDefaultInMemoryStorageFolder()
25
_ = folder.PutObject("base_123312", &bytes.Buffer{})
27
backups, err := internal.GetBackups(folder)
29
assert.Empty(t, backups)
30
assert.Error(t, err, internal.NoBackupsFoundError{})
33
func TestGetBackups(t *testing.T) {
34
folder := testtools.MakeDefaultInMemoryStorageFolder()
35
_ = folder.PutObject("base_123312", &bytes.Buffer{})
36
_ = folder.PutObject(testStreamBackup.BackupName+utility.SentinelSuffix, &bytes.Buffer{})
38
backups, _ := internal.GetBackups(folder)
40
assert.Equal(t, 1, len(backups))
41
assert.Equal(t, testStreamBackup.BackupName, backups[0].BackupName)
44
func TestGetBackupsAndGarbage_emptyList(t *testing.T) {
45
folder := testtools.MakeDefaultInMemoryStorageFolder()
46
_ = folder.PutObject("base_123312", &bytes.Buffer{})
48
backups, garbage, _ := internal.GetBackupsAndGarbage(folder)
50
assert.Empty(t, backups)
51
assert.Empty(t, garbage)
54
func TestGetBackupsAndGarbage(t *testing.T) {
55
folder := testtools.MakeDefaultInMemoryStorageFolder()
56
_ = folder.PutObject("base_123312", &bytes.Buffer{})
57
_ = folder.PutObject("base_321/nop", &bytes.Buffer{})
58
_ = folder.PutObject(testStreamBackup.BackupName+utility.SentinelSuffix, &bytes.Buffer{})
60
backups, garbage, _ := internal.GetBackupsAndGarbage(folder)
62
assert.Equal(t, 1, len(backups))
63
assert.Equal(t, 1, len(garbage))
64
assert.Equal(t, testStreamBackup.BackupName, backups[0].BackupName)
65
assert.Equal(t, "base_321", garbage[0])
68
func TestGetBackupTimeSlices_emptyList(t *testing.T) {
69
folder := testtools.MakeDefaultInMemoryStorageFolder()
70
_ = folder.PutObject("base_123312", &bytes.Buffer{})
71
objects, _, _ := folder.ListFolder()
72
result := internal.GetBackupTimeSlices(objects)
73
assert.Equalf(t, []internal.BackupTime{}, result, "GetBackupTimeSlices returned not empty list: something wrong")
76
func TestGetBackupTimeSlices_List(t *testing.T) {
77
folder := testtools.MakeDefaultInMemoryStorageFolder()
78
_ = folder.PutObject("base_123312", &bytes.Buffer{})
79
_ = folder.PutObject(testStreamBackup.BackupName+utility.SentinelSuffix, &bytes.Buffer{})
81
objects, _, _ := folder.ListFolder()
83
result := internal.GetBackupTimeSlices(objects)
85
assert.Equalf(t, 1, len(result), "GetBackupTimeSlices returned wrong count of backup: something wrong")
86
assert.Equalf(t, testStreamBackup.BackupName, result[0].BackupName, "GetBackupTimeSlices returned strange name")
87
assert.True(t, testStreamBackup.Time.Before(result[0].Time), "GetBackupTimeSlices returned bad time: storage time less than mock time")
90
func TestGetBackupTimeSlices_OrderCheck(t *testing.T) {
91
folder := testtools.MakeDefaultInMemoryStorageFolder()
92
_ = folder.PutObject(testStreamBackup.BackupName+".1"+utility.SentinelSuffix, &bytes.Buffer{})
93
time.Sleep(time.Second)
94
_ = folder.PutObject(testStreamBackup.BackupName+".2"+utility.SentinelSuffix, &bytes.Buffer{})
96
objects, _, _ := folder.ListFolder()
98
result := internal.GetBackupTimeSlices(objects)
99
internal.SortBackupTimeSlices(result)
101
assert.Equalf(t, 2, len(result), "GetBackupTimeSlices returned wrong count of backup: something wrong")
102
assert.True(t, result[0].BackupName == testStreamBackup.BackupName+".1", "GetBackupTimeSlices returned bad time ordering: "+testStreamBackup.BackupName+".1 should be first, because second was added earlier")
103
assert.True(t, result[0].Time.Before(result[1].Time), "GetBackupTimeSlices returned bad time ordering: order should be Ascending")
106
func TestGetLastBackupName(t *testing.T) {
107
folder := testtools.MakeDefaultInMemoryStorageFolder()
108
b1 := testStreamBackup.BackupName + ".1" + utility.SentinelSuffix
109
b2 := testStreamBackup.BackupName + ".2" + utility.SentinelSuffix
110
_, _ = folder.PutObject(b1, &bytes.Buffer{}), folder.PutObject(b2, &bytes.Buffer{})
111
lastB, _ := internal.GetLatestBackup(folder)
112
assert.Equalf(t, lastB.Name+utility.SentinelSuffix, b2, "Last Backup is not b2")
115
func TestGetLatestBackupName_EmptyWhenNoBackups(t *testing.T) {
116
folder := testtools.MakeDefaultInMemoryStorageFolder()
117
lastB, _ := internal.GetLatestBackup(folder)
118
assert.Equal(t, "", lastB.Name)
121
func TestGetGarbageFromPrefix(t *testing.T) {
122
backupNames := []string{"backup", "garbage", "garbage_0"}
123
folders := make([]storage.Folder, 0)
124
nonGarbage := []internal.BackupTime{{BackupName: "backup", Time: time.Now(), WalFileName: "ZZZZZZZZZZZZZZZZZZZZZZZZ"}}
126
for _, prefix := range backupNames {
127
folders = append(folders, memory.NewFolder(prefix, memory.NewKVS()))
130
garbage := internal.GetGarbageFromPrefix(folders, nonGarbage)
131
assert.Equal(t, garbage, []string{"garbage", "garbage_0"})
134
func TestGetGarbageFromPrefix_emptyNonGarbage(t *testing.T) {
135
backupNames := []string{"backup", "garbage", "garbage_0"}
136
folders := make([]storage.Folder, 0)
137
nonGarbage := make([]internal.BackupTime, 0)
139
for _, prefix := range backupNames {
140
folders = append(folders, memory.NewFolder(prefix, memory.NewKVS()))
143
garbage := internal.GetGarbageFromPrefix(folders, nonGarbage)
144
assert.Equal(t, garbage, []string{"backup", "garbage", "garbage_0"})
147
func TestGetGarbageFromPrefix_emptyFolders(t *testing.T) {
148
folders := make([]storage.Folder, 0)
149
nonGarbage := make([]internal.BackupTime, 0)
151
garbage := internal.GetGarbageFromPrefix(folders, nonGarbage)
152
assert.Equal(t, garbage, make([]string, 0))
155
func TestDeleteGarbage_emptyFolder(t *testing.T) {
157
folder := testtools.MakeDefaultInMemoryStorageFolder()
159
objects, folders, _ := folder.ListFolder()
160
assert.Equal(t, 0, len(objects))
161
assert.Equal(t, 0, len(folders))
163
err := internal.DeleteGarbage(folder, []string{"backup1", "backup2", "backup3"})
164
assert.Equal(t, nil, err)
166
objects, folders, _ = folder.ListFolder()
167
assert.Equal(t, 0, len(objects))
168
assert.Equal(t, 0, len(folders))
171
func TestDeleteGarbage_nonRecursive(t *testing.T) {
172
folder := testtools.MakeDefaultInMemoryStorageFolder()
173
_ = folder.PutObject("backup1/file.json", &bytes.Buffer{})
174
_ = folder.PutObject("backup2/file.json", &bytes.Buffer{})
176
objects, folders, _ := folder.ListFolder()
177
assert.Equal(t, 0, len(objects))
178
assert.Equal(t, 2, len(folders))
180
err := internal.DeleteGarbage(folder, []string{"backup1"})
181
assert.Equal(t, nil, err)
183
objects, folders, _ = folder.ListFolder()
184
assert.Equal(t, 0, len(objects))
185
assert.Equal(t, 1, len(folders))
186
assert.Equal(t, folders[0].GetPath(), "in_memory/backup2/")
189
func TestDeleteGarbage_recursive(t *testing.T) {
190
folder := testtools.MakeDefaultInMemoryStorageFolder()
191
_ = folder.PutObject("backup1/folder1/obj1.tar", &bytes.Buffer{})
192
_ = folder.PutObject("backup1/folder2/obj2.zip", &bytes.Buffer{})
193
_ = folder.PutObject("backup1/meta.json", &bytes.Buffer{})
194
_ = folder.PutObject("backup2/meta_b2.json", &bytes.Buffer{})
195
_ = folder.PutObject("backup2/folder1/obj1.tar", &bytes.Buffer{})
197
objects, folders, _ := folder.ListFolder()
198
assert.Equal(t, 0, len(objects))
199
assert.Equal(t, 2, len(folders))
201
err := internal.DeleteGarbage(folder, []string{"backup1"})
202
assert.Equal(t, nil, err)
204
objects, folders, _ = folder.ListFolder()
205
assert.Equal(t, 0, len(objects))
206
assert.Equal(t, 1, len(folders))
207
backup2 := folders[0]
208
assert.Equal(t, backup2.GetPath(), "in_memory/backup2/")
209
objects, folders, _ = backup2.ListFolder()
210
assert.Equal(t, 1, len(objects))
211
assert.Equal(t, 1, len(folders))
212
assert.Equal(t, objects[0].GetName(), "meta_b2.json")
213
assert.Equal(t, folders[0].GetPath(), "in_memory/backup2/folder1/")