1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
import unittest, errno
from commontest import *
from rdiff_backup import rpath, longname, Globals, regress
max_len = 255
class LongNameTest(unittest.TestCase):
"""Test the longname module"""
root_rp = rpath.RPath(Globals.local_connection, "testfiles")
out_rp = root_rp.append_path('output')
def test_length_limit(self):
"""Confirm that length limit is max_len
Some of these tests depend on the length being at most
max_len, so check to make sure it's accurate.
"""
Myrm(self.out_rp.path)
self.out_rp.mkdir()
really_long = self.out_rp.append('a'*max_len)
really_long.touch()
try: too_long = self.out_rp.append("a"*(max_len+1))
except EnvironmentError, e:
assert errno.errorcode[e[0]] == 'ENAMETOOLONG', e
else: assert 0, "File made successfully with length " + str(max_len+1)
def make_input_dirs(self):
"""Create two input directories with long filename(s) in them"""
dir1 = self.root_rp.append('longname1')
dir2 = self.root_rp.append('longname2')
Myrm(dir1.path)
Myrm(dir2.path)
dir1.mkdir()
rp11 = dir1.append('A'*max_len)
rp11.write_string('foobar')
rp12 = dir1.append('B'*max_len)
rp12.mkdir()
rp121 = rp12.append('C'*max_len)
rp121.touch()
dir2.mkdir()
rp21 = dir2.append('A'*max_len)
rp21.write_string('Hello, world')
rp22 = dir2.append('D'*max_len)
rp22.mkdir()
rp221 = rp22.append('C'*max_len)
rp221.touch()
return dir1, dir2
def check_dir1(self, dirrp):
"""Make sure dirrp looks like dir1"""
rp1 = dirrp.append('A'*max_len)
assert rp1.get_data() == 'foobar', "data doesn't match"
rp2 = dirrp.append('B'*max_len)
assert rp2.isdir(), rp2
rp21 = rp2.append('C'*max_len)
assert rp21.isreg(), rp21
def check_dir2(self, dirrp):
"""Make sure dirrp looks like dir2"""
rp1 = dirrp.append('A'*max_len)
assert rp1.get_data() == 'Hello, world', "data doesn't match"
rp2 = dirrp.append('D'*max_len)
assert rp2.isdir(), rp2
rp21 = rp2.append('C'*max_len)
assert rp21.isreg(), rp21
def generic_test(self, inlocal, outlocal, extra_args, compare_back):
"""Used for some of the tests below"""
in1, in2 = self.make_input_dirs()
Myrm(self.out_rp.path)
restore_dir = self.root_rp.append('longname_out')
# Test backing up
rdiff_backup(inlocal, outlocal, in1.path, self.out_rp.path, 10000,
extra_options = extra_args)
if compare_back: self.check_dir1(self.out_rp)
rdiff_backup(inlocal, outlocal, in2.path, self.out_rp.path, 20000,
extra_options = extra_args)
if compare_back: self.check_dir2(self.out_rp)
# Now try restoring
Myrm(restore_dir.path)
rdiff_backup(inlocal, outlocal, self.out_rp.path, restore_dir.path,
30000, extra_options = "-r now " + extra_args)
self.check_dir2(restore_dir)
Myrm(restore_dir.path)
rdiff_backup(1, 1, self.out_rp.path, restore_dir.path, 30000,
extra_options = "-r 10000 " + extra_args)
self.check_dir1(restore_dir)
def test_basic_local(self):
"""Test backup session when increment would be too long"""
self.generic_test(1, 1, "", 1)
def test_quoting_local(self):
"""Test backup session with quoting, so reg files also too long"""
self.generic_test(1, 1, "--override-chars-to-quote A-Z", 0)
def generic_regress_test(self, extra_args):
"""Used for regress tests below"""
in1, in2 = self.make_input_dirs()
Myrm(self.out_rp.path)
restore_dir = self.root_rp.append('longname_out')
Myrm(restore_dir.path)
rdiff_backup(1, 1, in1.path, self.out_rp.path, 10000,
extra_options = extra_args)
rdiff_backup(1, 1, in2.path, self.out_rp.path, 20000,
extra_options = extra_args)
# Regress repository back to in1 condition
Globals.rbdir = self.out_rp.append_path('rdiff-backup-data')
self.add_current_mirror(10000)
self.out_rp.setdata()
regress.Regress(self.out_rp)
# Restore in1 and compare
rdiff_backup(1, 1, self.out_rp.path, restore_dir.path, 30000,
extra_options = '-r now ' + extra_args)
self.check_dir1(restore_dir)
def add_current_mirror(self, time):
"""Add current_mirror marker at given time"""
cur_mirror_rp = Globals.rbdir.append(
"current_mirror.%s.data" % (Time.timetostring(time),))
cur_mirror_rp.touch()
def test_regress_basic(self):
"""Test regressing when increments would be too long"""
self.generic_regress_test('')
if __name__ == "__main__": unittest.main()
|