smarbs 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +23 -0
- data/History.txt +3 -0
- data/Manifest.txt +28 -0
- data/README.txt +88 -0
- data/Rakefile +10 -0
- data/bin/smarbs +11 -0
- data/lib/backup.rb +275 -0
- data/lib/data/configuration.txt +209 -0
- data/lib/data/iconblue.png +0 -0
- data/lib/data/icongreen.png +0 -0
- data/lib/data/iconred.png +0 -0
- data/lib/data/intro.txt +16 -0
- data/lib/data/outro.txt +15 -0
- data/lib/helpers.rb +438 -0
- data/lib/log.rb +214 -0
- data/lib/script.rb +217 -0
- data/lib/smarbs.rb +5 -0
- data/lib/syslog.rb +98 -0
- data/lib/types.rb +172 -0
- data/test/smarbs_test.rb +114 -0
- data/test/test_backup.rb +171 -0
- data/test/test_helpers.rb +500 -0
- data/test/test_log.rb +128 -0
- data/test/test_script.rb +118 -0
- data/test/test_smarbs.rb +131 -0
- data/test/test_smarbs_test.rb +76 -0
- data/test/test_suite.rb +11 -0
- data/test/test_types.rb +141 -0
- metadata +107 -0
data/test/test_backup.rb
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','test')
|
3
|
+
|
4
|
+
require 'script'
|
5
|
+
require 'smarbs_test'
|
6
|
+
|
7
|
+
class TestBackup < Test::Unit::TestCase;
|
8
|
+
include SmarbsTest
|
9
|
+
|
10
|
+
def setup
|
11
|
+
clean
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
clean_all
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_relative
|
19
|
+
`mkdir -p /tmp/smarbs/backmeup/inside`
|
20
|
+
`touch /tmp/smarbs/backmeup/other`
|
21
|
+
`echo "-preferences-
|
22
|
+
-end of preferences-" > /tmp/smarbs/smarbs/backup1`
|
23
|
+
c = ConfigFile.new("/tmp/smarbs/smarbs/backup1")
|
24
|
+
c.src=(["/tmp/smarbs/backmeup"])
|
25
|
+
c.dest=("/tmp/smarbs/backedup")
|
26
|
+
c.limit=(Size.new("200m"))
|
27
|
+
c.dirspace =(Size.new("100m"))
|
28
|
+
c.relative = false
|
29
|
+
c.write
|
30
|
+
assert_success do
|
31
|
+
Script.new("/tmp/smarbs/smarbs/")
|
32
|
+
end
|
33
|
+
c.read
|
34
|
+
assert_equal Size.new("100m"), c.dirspace
|
35
|
+
assert_equal("inside\nother\n", `ls /tmp/smarbs/backedup/smarbsbackup/*-backup.1/backmeup/`)
|
36
|
+
|
37
|
+
assert_success do
|
38
|
+
Script.new("/tmp/smarbs/smarbs/")
|
39
|
+
end
|
40
|
+
c.read
|
41
|
+
assert_equal Size.new("90m"), c.dirspace
|
42
|
+
|
43
|
+
assert_success do
|
44
|
+
Script.new("/tmp/smarbs/smarbs/")
|
45
|
+
end
|
46
|
+
c.read
|
47
|
+
assert_equal Size.new("81m"), c.dirspace
|
48
|
+
|
49
|
+
c.dirspace = 0
|
50
|
+
c.write
|
51
|
+
assert_success do
|
52
|
+
Script.new("/tmp/smarbs/smarbs/")
|
53
|
+
end
|
54
|
+
c.read
|
55
|
+
assert_equal Size.new("13516.8"), c.dirspace
|
56
|
+
|
57
|
+
c.relative = true
|
58
|
+
c.write
|
59
|
+
assert_success do
|
60
|
+
Script.new("/tmp/smarbs/smarbs/")
|
61
|
+
end
|
62
|
+
assert_equal("inside\nother\n", `ls /tmp/smarbs/backedup/smarbsbackup/*-backup.1/tmp/smarbs/backmeup/`)
|
63
|
+
|
64
|
+
c.src = ["/tmp/smarbs/backmeup/other"]
|
65
|
+
c.write
|
66
|
+
assert_success do
|
67
|
+
Script.new("/tmp/smarbs/smarbs/")
|
68
|
+
end
|
69
|
+
assert_equal("other\n", `ls /tmp/smarbs/backedup/smarbsbackup/*-backup.1/tmp/smarbs/backmeup/`)
|
70
|
+
|
71
|
+
c.execute_before = 'touch /tmp/smarbs/i\ touched\ it'
|
72
|
+
c.execute_after = 'touch /tmp/smarbs/i\ touched\ it\ too'
|
73
|
+
c.write
|
74
|
+
|
75
|
+
assert_success do
|
76
|
+
Script.new("/tmp/smarbs/smarbs/")
|
77
|
+
end
|
78
|
+
assert_equal(true, File.file?("/tmp/smarbs/i touched it"))
|
79
|
+
assert_equal(true, File.file?("/tmp/smarbs/i touched it too"))
|
80
|
+
|
81
|
+
c.execute_before = 'ls /im/not/existing'
|
82
|
+
c.write
|
83
|
+
assert_output("The following error occured: execute_before command 'ls /im/not/existing' was not successful, aborting!
|
84
|
+
This was the output generated:
|
85
|
+
ls: cannot access /im/not/existing: No such file or directory") do
|
86
|
+
Script.new("/tmp/smarbs/smarbs/")
|
87
|
+
end
|
88
|
+
|
89
|
+
c.execute_after = 'ls /im/not/existing/too'
|
90
|
+
c.write
|
91
|
+
assert_output("The following error occured: execute_after command 'ls /im/not/existing/too' was not successful, aborting!
|
92
|
+
This was the output generated:
|
93
|
+
ls: cannot access /im/not/existing/too: No such file or directory
|
94
|
+
|
95
|
+
Also, your backup was aborted: execute_before command 'ls /im/not/existing' was not successful, aborting!
|
96
|
+
This was the output generated:
|
97
|
+
ls: cannot access /im/not/existing: No such file or directory") do
|
98
|
+
|
99
|
+
Script.new("/tmp/smarbs/smarbs/")
|
100
|
+
end
|
101
|
+
|
102
|
+
c.execute_before = 'touch /tmp/smarbs/i\ touched\ it'
|
103
|
+
c.write
|
104
|
+
assert_output("The following error occured: execute_after command 'ls /im/not/existing/too' was not successful, aborting!
|
105
|
+
This was the output generated:
|
106
|
+
ls: cannot access /im/not/existing/too: No such file or directory") do
|
107
|
+
Script.new("/tmp/smarbs/smarbs/")
|
108
|
+
end
|
109
|
+
|
110
|
+
clean
|
111
|
+
cf = default_configfile
|
112
|
+
cf.oldestfirst = true
|
113
|
+
cf.maxbackuplevels = 8
|
114
|
+
cf.write
|
115
|
+
for i in 1..10
|
116
|
+
`mkdir -p /tmp/smarbs/backedup/smarbsbackup/a-backup.#{i}`
|
117
|
+
end
|
118
|
+
assert_backup_dirs([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
119
|
+
|
120
|
+
assert_success do
|
121
|
+
Script.new("/tmp/smarbs/smarbs/")
|
122
|
+
end
|
123
|
+
assert_backup_dirs([1, 2, 3, 4, 5, 6, 7, 8])
|
124
|
+
|
125
|
+
cf.maxbackuplevels = 0
|
126
|
+
cf.limit = "1.525m"
|
127
|
+
cf.write
|
128
|
+
assert_success do
|
129
|
+
Script.new("/tmp/smarbs/smarbs/")
|
130
|
+
end
|
131
|
+
assert_backup_dirs([1, 2, 3, 4, 5, 6])
|
132
|
+
|
133
|
+
clean
|
134
|
+
cf = default_configfile
|
135
|
+
for i in 0..3
|
136
|
+
`mkdir -p /tmp/smarbs/backedup/smarbsbackup/a-backup.#{i}`
|
137
|
+
end
|
138
|
+
assert_fail "Aborted backup directory 'a-backup.0' left in /tmp/smarbs/backedup/smarbsbackup/\nMove or delete it to continue!" do
|
139
|
+
Script.new("/tmp/smarbs/smarbs")
|
140
|
+
end
|
141
|
+
assert_backup_dirs([0, 1, 2, 3])
|
142
|
+
|
143
|
+
|
144
|
+
`rm -r /tmp/smarbs/backedup/smarbsbackup/a-backup.0`
|
145
|
+
assert_success do
|
146
|
+
Script.new("/tmp/smarbs/smarbs")
|
147
|
+
end
|
148
|
+
assert_backup_dirs([1, 2, 3, 4])
|
149
|
+
|
150
|
+
|
151
|
+
cf.ignore_leftovers=true
|
152
|
+
cf.write
|
153
|
+
assert_success do
|
154
|
+
Script.new("/tmp/smarbs/smarbs")
|
155
|
+
end
|
156
|
+
assert_backup_dirs([1, 2, 3, 4, 5])
|
157
|
+
|
158
|
+
|
159
|
+
`mkdir -p /tmp/smarbs/backedup/smarbsbackup/a-backup.0`
|
160
|
+
assert_success "Warning: Aborted backup directory a-backup.0 detected.\nResuming backup there because of ignore_leftovers option." do
|
161
|
+
Script.new("/tmp/smarbs/smarbs")
|
162
|
+
end
|
163
|
+
assert_backup_dirs([1, 2, 3, 4, 5, 6])
|
164
|
+
|
165
|
+
assert_not_equal "a-backup.1", SmarbsBackupDir.new("/tmp/smarbs/backedup/smarbsbackup/").files.sort[2]
|
166
|
+
|
167
|
+
assert_success do
|
168
|
+
Script.new("/tmp/smarbs/smarbs")
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,500 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','test')
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
require 'helpers'
|
6
|
+
require 'smarbs_test'
|
7
|
+
require 'log'
|
8
|
+
|
9
|
+
class TestConfigString < Test::Unit::TestCase;
|
10
|
+
include SmarbsTest
|
11
|
+
|
12
|
+
def test_configstring
|
13
|
+
# One Value
|
14
|
+
cs = ConfigString.new("before", "", "desc1\ndesc2", "do nothing")
|
15
|
+
assert_equal "do nothing", cs.value
|
16
|
+
assert_equal "desc1\ndesc2\nbefore do nothing", cs.to_s
|
17
|
+
|
18
|
+
cs.set("do something")
|
19
|
+
assert_equal "do something", cs.value
|
20
|
+
|
21
|
+
assert_raise_message("Only one 'before' allowed!") do
|
22
|
+
cs.set(["do 1", "do 2"])
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_raise_message("Only one 'before' allowed!") do
|
26
|
+
cs.add("error")
|
27
|
+
end
|
28
|
+
|
29
|
+
cs.clear
|
30
|
+
assert_equal "desc1\ndesc2\nbefore do nothing", cs.to_s
|
31
|
+
|
32
|
+
cs.add("abc")
|
33
|
+
assert_equal "abc", cs.value
|
34
|
+
|
35
|
+
# Many values
|
36
|
+
cs = ConfigString.new("before", "list", "desc1\ndesc2", ["do 1", "do 2"])
|
37
|
+
assert_equal ["do 1", "do 2"], cs.value
|
38
|
+
assert_equal "desc1\ndesc2\nbefore do 1\nbefore do 2", cs.to_s
|
39
|
+
|
40
|
+
cs.set("do something")
|
41
|
+
assert_equal ["do something"], cs.value
|
42
|
+
|
43
|
+
cs.set(["do 3", "do 4", "do 5"])
|
44
|
+
assert_equal ["do 3", "do 4", "do 5"], cs.value
|
45
|
+
|
46
|
+
cs.add(["do 5","do 7"])
|
47
|
+
assert_equal ["do 3", "do 4", "do 5", "do 7"], cs.value
|
48
|
+
|
49
|
+
assert_raise_message("Only one 'before' allowed!") do
|
50
|
+
ConfigString.new("before", "listen,nolist,kelistliste", "", ["do 1","do 2"])
|
51
|
+
end
|
52
|
+
|
53
|
+
assert(ConfigString.new("before", "listen,nolist,list,kelistliste,", "", ["do 1","do 2"]))
|
54
|
+
|
55
|
+
cs = ConfigString.new("before", "", "desc1\ndesc2", " ")
|
56
|
+
assert_equal "desc1\ndesc2\nbefore ", cs.to_s
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class TestConfigDirectory < Test::Unit::TestCase;
|
61
|
+
include SmarbsTest
|
62
|
+
|
63
|
+
def test_configdirectory
|
64
|
+
cs = ConfigDirectory.new("dir", "list", "desc1\ndesc2", " /home/jan/ ")
|
65
|
+
assert_equal ["/home/jan"], cs.value
|
66
|
+
|
67
|
+
cs.add("/ ")
|
68
|
+
assert_equal ["/"], cs.value
|
69
|
+
|
70
|
+
cs.add("/home/jan ")
|
71
|
+
assert_equal ["/", "/home/jan"], cs.value
|
72
|
+
|
73
|
+
cs.set(["/home", "/home2 / "])
|
74
|
+
assert_equal ["/home", "/home2"], cs.value
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class TestConfigSize < Test::Unit::TestCase;
|
79
|
+
include SmarbsTest
|
80
|
+
|
81
|
+
def test_configsize
|
82
|
+
cs = ConfigSize.new("size", "", "desc1\ndesc2", "1k")
|
83
|
+
assert_instance_of(Size, cs.value)
|
84
|
+
assert_equal 1024, cs.value.b
|
85
|
+
|
86
|
+
cs.set(Size.new("1m"))
|
87
|
+
assert_instance_of(Size, cs.value)
|
88
|
+
assert_equal 1024*1024, cs.value.b
|
89
|
+
|
90
|
+
assert_equal cs.to_s, "desc1\ndesc2\nsize 1.0m"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class TestConfigBoolean < Test::Unit::TestCase;
|
95
|
+
include SmarbsTest
|
96
|
+
|
97
|
+
def test_configboolean
|
98
|
+
cs = ConfigBoolean.new("own", "", "desc", "YES")
|
99
|
+
assert_equal true, cs.value
|
100
|
+
assert_equal cs.to_s, "desc\nown yes"
|
101
|
+
|
102
|
+
cs.set(false)
|
103
|
+
assert_equal false, cs.value
|
104
|
+
assert_equal cs.to_s, "desc\nown no"
|
105
|
+
|
106
|
+
cs.clear
|
107
|
+
cs.add("yes")
|
108
|
+
assert_equal cs.value, true
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class TestConfigInteger < Test::Unit::TestCase;
|
113
|
+
include SmarbsTest
|
114
|
+
|
115
|
+
def test_configinteger
|
116
|
+
cs = ConfigInteger.new("num", "", "desc", "3")
|
117
|
+
assert_equal 3, cs.value
|
118
|
+
assert_equal cs.to_s, "desc\nnum 3"
|
119
|
+
|
120
|
+
cs.set(9)
|
121
|
+
assert_equal 9, cs.value
|
122
|
+
|
123
|
+
assert_raise_message("Format 33.8 not valid for an integer in 'num'!") do
|
124
|
+
cs.set("33.8")
|
125
|
+
end
|
126
|
+
|
127
|
+
cs.set(-9)
|
128
|
+
assert_equal(-9, cs.value)
|
129
|
+
|
130
|
+
cs = ConfigInteger.new("num", "positive", "desc", "3")
|
131
|
+
assert_raise_message("'num' must be positive, you set it to -9!") do #TODO all this: configfile errors
|
132
|
+
cs.set(-9)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class TestConfigExclude < Test::Unit::TestCase;
|
138
|
+
include SmarbsTest
|
139
|
+
|
140
|
+
def test_configexclude
|
141
|
+
cs = ConfigExclude.new("exclude", "", "desc", ["this","that"])
|
142
|
+
assert_equal ["this", "that"], cs.value
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class TestSmarbsBackupDir < Test::Unit::TestCase
|
147
|
+
include SmarbsTest
|
148
|
+
|
149
|
+
def setup
|
150
|
+
clean
|
151
|
+
end
|
152
|
+
|
153
|
+
def teardown
|
154
|
+
clean_all
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_smarbsbackupdir
|
158
|
+
`mkdir /tmp/smarbs/smarbsbackup`
|
159
|
+
dir=SmarbsBackupDir.new("/tmp/smarbs/smarbsbackup")
|
160
|
+
dir.remove_except_one
|
161
|
+
assert_equal(dir.files, [])
|
162
|
+
|
163
|
+
`mkdir /tmp/smarbs/smarbsbackup/1023-backup.20`
|
164
|
+
`mkdir /tmp/smarbs/smarbsbackup/1022313-backup.2`
|
165
|
+
`mkdir /tmp/smarbs/smarbsbackup/1033-backup.33`
|
166
|
+
`mkdir /tmp/smarbs/smarbsbackup/10cc233-backup.238`
|
167
|
+
dir=SmarbsBackupDir.new("/tmp/smarbs/smarbsbackup")
|
168
|
+
dir.remove_except_one
|
169
|
+
assert_equal(dir.files, ["1022313-backup.2"])
|
170
|
+
|
171
|
+
clean
|
172
|
+
`mkdir -p /tmp/smarbs/smarbsbackup`
|
173
|
+
`touch /tmp/smarbs/smarbsbackup/232-backup.0`
|
174
|
+
assert_raise_message "File '232-backup.0' left in the destination directory /tmp/smarbs/smarbsbackup/!" do
|
175
|
+
SmarbsBackupDir.new("/tmp/smarbs/smarbsbackup")
|
176
|
+
end
|
177
|
+
|
178
|
+
clean
|
179
|
+
`mkdir -p /tmp/smarbs/smarbsbackup/1023-backup.20`
|
180
|
+
`mkdir /tmp/smarbs/smarbsbackup/10233-backup.2`
|
181
|
+
`touch /tmp/smarbs/smarbsbackup/2928.txt`
|
182
|
+
assert_raise_message "File '2928.txt' left in the destination directory /tmp/smarbs/smarbsbackup/!" do
|
183
|
+
SmarbsBackupDir.new("/tmp/smarbs/smarbsbackup")
|
184
|
+
end
|
185
|
+
|
186
|
+
clean
|
187
|
+
`mkdir -p /tmp/smarbs/test_directory/alpha`
|
188
|
+
assert_raise_message "/tmp/smarbs/test_directory/alpha has wrong format!" do
|
189
|
+
SmarbsBackupDir.new("/tmp/smarbs/test_directory")
|
190
|
+
end
|
191
|
+
|
192
|
+
`rm -r /tmp/smarbs/test_directory/alpha`
|
193
|
+
`mkdir -p /tmp/smarbs/test_directory/a-backup.`
|
194
|
+
assert_raise_message "/tmp/smarbs/test_directory/a-backup. has wrong format!" do
|
195
|
+
SmarbsBackupDir.new("/tmp/smarbs/test_directory")
|
196
|
+
end
|
197
|
+
|
198
|
+
`rm -r /tmp/smarbs/test_directory/a-backup.`
|
199
|
+
`mkdir -p /tmp/smarbs/test_directory/-backup.3`
|
200
|
+
assert_equal ["-backup.3"], SmarbsBackupDir.new("/tmp/smarbs/test_directory").files
|
201
|
+
|
202
|
+
`rm -r /tmp/smarbs/test_directory/-backup.3`
|
203
|
+
`mkdir -p /tmp/smarbs/test_directory/a-backup.3b2`
|
204
|
+
assert_raise_message "/tmp/smarbs/test_directory/a-backup.3b2 has wrong format in number!" do
|
205
|
+
SmarbsBackupDir.new("/tmp/smarbs/test_directory")
|
206
|
+
end
|
207
|
+
|
208
|
+
`rm -r /tmp/smarbs/test_directory/a-backup.3b2`
|
209
|
+
`mkdir -p /tmp/smarbs/test_directory/a-backup.0`
|
210
|
+
assert_raise_message "\nAborted backup directory 'a-backup.0' left in /tmp/smarbs/test_directory/\nMove or delete it to continue!", NoConfigException do
|
211
|
+
SmarbsBackupDir.new("/tmp/smarbs/test_directory")
|
212
|
+
end
|
213
|
+
|
214
|
+
assert_equal "a-backup.0", SmarbsBackupDir.new("/tmp/smarbs/test_directory", true).directory_left
|
215
|
+
|
216
|
+
`rm -r /tmp/smarbs/test_directory/a-backup.0`
|
217
|
+
`mkdir -p /tmp/smarbs/test_directory/a-backup.2 /tmp/smarbs/test_directory/a-backup.3 /tmp/smarbs/test_directory/a-backup.6 /tmp/smarbs/test_directory/a-backup.9`
|
218
|
+
SmarbsBackupDir.new("/tmp/smarbs/test_directory").remove_except_one
|
219
|
+
assert_equal(`ls /tmp/smarbs/test_directory`, "a-backup.2\n")
|
220
|
+
|
221
|
+
assert_equal false, SmarbsBackupDir.new("/tmp/smarbs/test_directory", true).directory_left
|
222
|
+
|
223
|
+
assert_raise_message "/etc/smarbs/ is not writable!" do
|
224
|
+
SmarbsBackupDir.new("/etc/smarbs")
|
225
|
+
end
|
226
|
+
|
227
|
+
clean
|
228
|
+
for i in 1..10
|
229
|
+
`mkdir -p /tmp/smarbs/backedup/smarbsbackup/a-backup.#{i}`
|
230
|
+
end
|
231
|
+
assert_backup_dirs([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
232
|
+
dir = SmarbsBackupDir.new("/tmp/smarbs/backedup/smarbsbackup")
|
233
|
+
assert_output("...removing backup.3...") {dir.delete(Log.new("", true), 0)}
|
234
|
+
assert_backup_dirs([1, 2, 4, 5, 6, 7, 8, 9, 10])
|
235
|
+
|
236
|
+
assert_output("...removing backup.5...") {dir.delete(Log.new("", true), 0)}
|
237
|
+
assert_backup_dirs([1, 2, 4, 6, 7, 8, 9, 10])
|
238
|
+
|
239
|
+
assert_output("...removing backup.6...") {dir.delete(Log.new("", true), 0)}
|
240
|
+
assert_backup_dirs([1, 2, 4, 7, 8, 9, 10])
|
241
|
+
|
242
|
+
assert_output("...removing backup.7...") {dir.delete(Log.new("", true), 0)}
|
243
|
+
assert_backup_dirs([1, 2, 4, 8, 9, 10])
|
244
|
+
|
245
|
+
dir.increment
|
246
|
+
assert_backup_dirs([2, 3, 5, 9, 10, 11])
|
247
|
+
|
248
|
+
assert_output("...removing backup.10...") {dir.delete(Log.new("", true), 0)}
|
249
|
+
assert_backup_dirs([2, 3, 5, 9, 11])
|
250
|
+
|
251
|
+
assert_output("...removing backup.11...") {dir.delete(Log.new("", true), 3)}
|
252
|
+
assert_backup_dirs([2, 3, 5, 9])
|
253
|
+
|
254
|
+
assert_output("...removing backup.9...") {dir.delete(Log.new("", true), 3)}
|
255
|
+
assert_backup_dirs([2, 3, 5])
|
256
|
+
|
257
|
+
assert_raise_message("Not enough space available, next deletion would go below your minbackuplevels of 3!") do
|
258
|
+
dir.delete(Log.new("", true), 3)
|
259
|
+
end
|
260
|
+
assert_backup_dirs([2, 3, 5])
|
261
|
+
|
262
|
+
dir.increment
|
263
|
+
assert_backup_dirs([3, 4, 6])
|
264
|
+
|
265
|
+
assert_output("...removing backup.6...") {dir.delete(Log.new("", true), 0)}
|
266
|
+
assert_backup_dirs([3, 4])
|
267
|
+
|
268
|
+
assert_output("...removing backup.4...") {dir.delete(Log.new("", true), 0)}
|
269
|
+
assert_backup_dirs([3])
|
270
|
+
|
271
|
+
dir.increment
|
272
|
+
assert_backup_dirs([4])
|
273
|
+
|
274
|
+
assert_raise_message("Not enough space available to do an incremental backup!") do
|
275
|
+
dir.delete(Log.new("", true), 0)
|
276
|
+
end
|
277
|
+
assert_backup_dirs([4])
|
278
|
+
|
279
|
+
clean
|
280
|
+
for i in 1..10
|
281
|
+
`mkdir -p /tmp/smarbs/backedup/smarbsbackup/a-backup.#{i}`
|
282
|
+
end
|
283
|
+
assert_backup_dirs([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
284
|
+
dir = SmarbsBackupDir.new("/tmp/smarbs/backedup/smarbsbackup")
|
285
|
+
assert_output("...removing backup.10...") {dir.delete(Log.new("", true), 0, true)}
|
286
|
+
assert_backup_dirs([1, 2, 3, 4, 5, 6, 7, 8, 9])
|
287
|
+
|
288
|
+
assert_output("...removing backup.9...") {dir.delete(Log.new("", true), 0, true)}
|
289
|
+
assert_backup_dirs([1, 2, 3, 4, 5, 6, 7, 8])
|
290
|
+
|
291
|
+
assert_output("...removing backup.8...") {dir.delete(Log.new("", true), 0, true)}
|
292
|
+
assert_backup_dirs([1, 2, 3, 4, 5, 6, 7])
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
class TestConfigTemplate < Test::Unit::TestCase
|
297
|
+
include SmarbsTest
|
298
|
+
|
299
|
+
def setup
|
300
|
+
clean
|
301
|
+
end
|
302
|
+
|
303
|
+
def teardown
|
304
|
+
clean_all
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_config_template
|
308
|
+
t = ConfigTemplate.new
|
309
|
+
assert_raise_message "Order still empty!", InternalError do
|
310
|
+
t.parse_section("src: String\n -- Description1\n -- Description 2\nsrc the_source")
|
311
|
+
end
|
312
|
+
t.parse_section("=preferences=")
|
313
|
+
assert_equal "----------------------------------preferences-----------------------------------\n\n", t.to_s
|
314
|
+
|
315
|
+
t.parse_section("src: String\n -- Description1\n -- Description 2\n -- src test\nsrc the_source")
|
316
|
+
assert_kind_of String, src = t.src
|
317
|
+
assert_equal "the_source", src
|
318
|
+
assert_equal "----------------------------------preferences-----------------------------------
|
319
|
+
|
320
|
+
-- Description1
|
321
|
+
-- Description 2
|
322
|
+
-- src test
|
323
|
+
src the_source\n\n", t.to_s
|
324
|
+
|
325
|
+
t.src = "the_other_source"
|
326
|
+
t.parse_section("i: Integer(positive)\ni 9")
|
327
|
+
assert_raise_message "'i' must be positive, you set it to -3!" do
|
328
|
+
t.i = -3
|
329
|
+
end
|
330
|
+
|
331
|
+
t.parse_section("=advanced=")
|
332
|
+
t.parse_section("a: Size(list)\n -- desc\na 1m\na 2m")
|
333
|
+
|
334
|
+
assert_equal \
|
335
|
+
"----------------------------------preferences-----------------------------------
|
336
|
+
|
337
|
+
-- Description1
|
338
|
+
-- Description 2
|
339
|
+
-- src test
|
340
|
+
src the_other_source
|
341
|
+
|
342
|
+
|
343
|
+
i 9
|
344
|
+
|
345
|
+
------------------------------------advanced------------------------------------
|
346
|
+
|
347
|
+
-- desc
|
348
|
+
a 1.0m
|
349
|
+
a 2.0m
|
350
|
+
|
351
|
+
", t.to_s
|
352
|
+
|
353
|
+
assert_raise NoMethodError do
|
354
|
+
t.not_existing=3
|
355
|
+
end
|
356
|
+
assert_raise NoMethodError do
|
357
|
+
t.not_existing
|
358
|
+
end
|
359
|
+
|
360
|
+
u = ConfigTemplate.new
|
361
|
+
|
362
|
+
`echo '=preferences=
|
363
|
+
|
364
|
+
src: String
|
365
|
+
-- Description1
|
366
|
+
-- Description 2
|
367
|
+
-- src test
|
368
|
+
src the_other_source
|
369
|
+
|
370
|
+
i: Integer(positive)
|
371
|
+
i 9
|
372
|
+
|
373
|
+
=advanced=
|
374
|
+
|
375
|
+
a: Size(list)
|
376
|
+
-- desc
|
377
|
+
a 1m
|
378
|
+
a 2m
|
379
|
+
|
380
|
+
' > /tmp/smarbs/configuration.txt`
|
381
|
+
|
382
|
+
u.read_template("/tmp/smarbs/configuration.txt")
|
383
|
+
assert_equal t.to_s, u.to_s
|
384
|
+
|
385
|
+
text = "
|
386
|
+
i 10
|
387
|
+
a 18m
|
388
|
+
|
389
|
+
-- a 19m
|
390
|
+
a 20m
|
391
|
+
-- j afug
|
392
|
+
|
393
|
+
-- comment
|
394
|
+
"
|
395
|
+
u.parse(text)
|
396
|
+
assert_equal 10, u.i
|
397
|
+
assert_equal [Size.new("18m"),Size.new("20m")], u.a
|
398
|
+
assert_equal "the_other_source", u.src
|
399
|
+
|
400
|
+
assert_raise_message "Only one 'i' allowed!" do
|
401
|
+
u.parse("i 10
|
402
|
+
a 18m
|
403
|
+
i 11")
|
404
|
+
end
|
405
|
+
|
406
|
+
assert_raise_message "No option 'j' existing!" do
|
407
|
+
u.parse("src aaa
|
408
|
+
a 18m
|
409
|
+
j 11")
|
410
|
+
end
|
411
|
+
|
412
|
+
v = ConfigTemplate.new
|
413
|
+
r = ConfigTemplate.new
|
414
|
+
v.read_template("/tmp/smarbs/configuration.txt")
|
415
|
+
r.read_template("/tmp/smarbs/configuration.txt")
|
416
|
+
r.parse(text)
|
417
|
+
v.parse(text.split("\n"))
|
418
|
+
|
419
|
+
assert_equal r.to_s, v.to_s
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
class TestConfigFile < Test::Unit::TestCase
|
424
|
+
include SmarbsTest
|
425
|
+
|
426
|
+
def setup
|
427
|
+
clean
|
428
|
+
end
|
429
|
+
|
430
|
+
def teardown
|
431
|
+
clean_all
|
432
|
+
end
|
433
|
+
|
434
|
+
def test_config_file
|
435
|
+
`echo "=preferences=
|
436
|
+
|
437
|
+
src: Directory(list)
|
438
|
+
-- One or more directories to the source (= directory or file you need a backup
|
439
|
+
-- backup from. One directory / file per line only.
|
440
|
+
src /directory/to/source1
|
441
|
+
src /directory/to/source2
|
442
|
+
|
443
|
+
dest: Directory
|
444
|
+
-- One (!) destination directory:
|
445
|
+
dest /directory/to/the/destination
|
446
|
+
|
447
|
+
limit: Size
|
448
|
+
-- Limit of space to use for the full and all the incremental backups:
|
449
|
+
-- (ignored when using "ownpartition", see below)
|
450
|
+
limit 20m
|
451
|
+
|
452
|
+
=advanced=
|
453
|
+
|
454
|
+
execute_before: String
|
455
|
+
-- A command to execute (in a shell) before the backup is done.
|
456
|
+
-- Example:
|
457
|
+
-- execute_before mount /directory/to/source1
|
458
|
+
execute_before" > /tmp/smarbs/configuration.txt`
|
459
|
+
|
460
|
+
assert_raise_message("/etc is not writable!") do
|
461
|
+
ConfigFile.new("/etc/configfile")
|
462
|
+
end
|
463
|
+
|
464
|
+
assert_raise_message("/etc/fstab~ is not writable!") do
|
465
|
+
ConfigFile.new("/etc/fstab~")
|
466
|
+
end
|
467
|
+
|
468
|
+
cf = nil
|
469
|
+
assert_output("First run:\nConfig file created, edit /tmp/smarbs/smarbs/backup1") do
|
470
|
+
cf = ConfigFile.new("/tmp/smarbs/smarbs/backup1")
|
471
|
+
end
|
472
|
+
|
473
|
+
assert_equal "Smarbs space-managing-rsync-backup-script 0.9.1 (4. September 2009)\nrsync and ruby are required!\n\nFor each different backup you should create a file like this in the directory\n/home/\"user\"/.smarbs/ (or /etc/smarbs/ if you are root).\n\nYou can start a backup using \"smarbs backup1\" or \"smarbs homebackup\" assuming\nthere is a file named \"backup1\" or \"homebackup\" in the smarbs folder.\nA simple \"smarbs\" or a \"smarbs all\" will do a backup with all the different\nconfigurations in the smarbs directory.\n\nSizes: 2394 Bytes (B) => 2394\n 32 Kibibytes (MiB) => 32k\n 54 Mebibytes (MiB) => 54m\n 2 Gibibytes (KiB) => 2g\n\n", cf.intro
|
474
|
+
|
475
|
+
assert_equal "-------------------------------end of preferences-------------------------------\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nSee <http://www.gnu.org/licenses/> for a copy of the GNU General Public License.\n\nFor any suggestions, comments or bug reports, write to rggjan@gmail.com", cf.outro
|
476
|
+
assert_equal "backup1", cf.filename
|
477
|
+
|
478
|
+
assert_equal ["/directory/to/source1","/directory/to/source2"], cf.src
|
479
|
+
cf.src = ["/directory/to/other_source"]
|
480
|
+
assert_equal ["/directory/to/other_source"], cf.src
|
481
|
+
cf.write
|
482
|
+
cf.read
|
483
|
+
assert_equal ["/directory/to/other_source"], cf.src
|
484
|
+
|
485
|
+
assert_output("", :exact) do
|
486
|
+
cf = ConfigFile.new("/tmp/smarbs/smarbs/backup1")
|
487
|
+
end
|
488
|
+
assert_equal ["/directory/to/other_source"], cf.src
|
489
|
+
`echo "abc
|
490
|
+
-preferences-
|
491
|
+
def
|
492
|
+
ghi
|
493
|
+
advanced preferences-
|
494
|
+
jkl" > /tmp/smarbs/smarbs/backup1`
|
495
|
+
|
496
|
+
assert_raise_message("Configfile /tmp/smarbs/smarbs/backup1 is invalid. Please delete it!") do
|
497
|
+
ConfigFile.new("/tmp/smarbs/smarbs/backup1")
|
498
|
+
end
|
499
|
+
end
|
500
|
+
end
|