summaryrefslogtreecommitdiff
path: root/rdiff-backup/testing/longnametest.py
blob: 87d30bfe88ef97bd79a49418548ff69c2807439c (plain)
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()