-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathtest_filtering.py
170 lines (140 loc) · 9.07 KB
/
test_filtering.py
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
from dataclasses import dataclass
from difflib import diff_bytes, unified_diff
from pathlib import Path, PurePath
from tempfile import NamedTemporaryFile
import unittest
from ..svndumpfilter import parse_dump
class ParseDumpTestCase(unittest.TestCase):
# Set up structure equivalent to parsed options in main program to pass on to filtering routine
@dataclass
class OPTIONS:
drop_empty: bool = True
renumber_revs: bool = True
strip_merge: bool = False
quiet: bool = False
start_revision: int = None
scan: bool = False
file: str = None
repo: str = '../repos/python'
debug: bool = False
empty_rev_message = None
# Directory location of test dumpfiles and expected filtered dump files
DUMPFILE_DIRECTORY = PurePath(Path(__file__).resolve().parent, 'data')
def setUp(self):
super().setUp()
self.DEFAULT_OPTIONS = self.OPTIONS(True, True, False, False, None, False, None, '../repos/python', False)
def filtered_dumpfile_differences(self, expected_dumpfile, filtered_dumpfile):
""" Compute difference between the expected filtered dumpfile and the filtered dumpfile.
The dumpfiles are split based on newlines and differences are returned
as unified diffs
"""
expected_dumpfile_lines = open(expected_dumpfile, '+rb').read().split(b'\n')
filtered_dumpfile_lines = open(filtered_dumpfile, '+rb').read().split(b'\n')
diff_generator = diff_bytes(unified_diff,
expected_dumpfile_lines,
filtered_dumpfile_lines,
fromfile=b'Expected Filtered Dump',
tofile=b'Actual Filtered Dump')
diff = b''
for diff_line in diff_generator:
diff += diff_line
return diff
def test_only_empty_revisions_removed(self):
""" Test filtering dump file with only empty revisions removes them """
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_empty_revs_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_empty_revs_removed_filtered_dump')
opt = self.OPTIONS()
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['foo'], False, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)
def test_only_empty_revisions_preserved(self):
""" Test filtering dump file with only empty revisions preserving them """
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_empty_revs_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_empty_revs_preserved_filtered_dump')
opt = self.OPTIONS()
opt.drop_empty = False
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['foo'], False, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)
def test_only_empty_revisions_preserved_stop_renumbering(self):
""" Test filtering dump file with only empty revisions preserving them and stop re-numbering"""
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_empty_revs_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_empty_revs_preserved_stop_renumbering_filtered_dump')
opt = self.OPTIONS()
opt.drop_empty = False
opt.renumber_revs = False
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['foo'], False, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)
def test_non_existing_excluded_node_empty_with_revisions_removed(self):
""" Test filtering dump file with nodes and empty revisions, exclude non-existing node, remove empty revisions """
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_nodes_empty_revs_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_non_existing_node_excluded_empty_revs_removed')
opt = self.OPTIONS()
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['foo'], False, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)
def test_non_existing_excluded_node_empty_with_revisions_preserved(self):
""" Test filtering dump file with nodes and empty revisions, exclude non-existing node, preserve empty revisions """
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_nodes_empty_revs_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_non_existing_node_excluded_empty_revs_preserved')
opt = self.OPTIONS()
opt.drop_empty = False
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['foo'], False, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)
def test_existing_excluded_node_empty_with_revisions_removed(self):
""" Test filtering dump file with nodes and empty revisions, exclude existing node, remove empty revisions """
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_nodes_empty_revs_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_existing_node_excluded_empty_revs_removed')
opt = self.OPTIONS()
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['python/trunk/Doc/Makefile'], False, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)
def test_existing_included_node_empty_with_revisions_removed(self):
""" Test filtering dump file with nodes and empty revisions, include existing node, remove empty revisions """
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_nodes_empty_revs_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_existing_node_included_empty_revs_removed')
opt = self.OPTIONS()
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['python/trunk/Doc/README'], True, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)
def test_merginfo_properties_removal_no_renumbering(self):
""" Test filtering dump file with to ensure mergeinfo properties are removed and stop renumbering"""
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_mergeinfo_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_mergeinfo_removed_no_renumber')
opt = self.OPTIONS()
opt.strip_merge = True
opt.renumber_revs = False
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['foo'], False, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)
def test_large_binary_file_include(self):
""" Test correctly including large files (greater then the read buffer) and filtering others """
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_include_large_file_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_include_large_file_dump')
opt = self.OPTIONS()
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['python/trunk/Include'], True, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)
def test_empty_revs_message(self):
""" Test correctly filtering empty revs with a custom message """
input_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'test_nodes_empty_revs_dump')
expected_filtered_dumpfile = PurePath(self.DUMPFILE_DIRECTORY, 'expected_existing_node_excluded_empty_revs_message')
opt = self.OPTIONS()
opt.drop_empty = False
opt.renumber_revs = False
opt.empty_rev_message = "This is an empty revision for padding."
with NamedTemporaryFile() as filtered_output_file:
parse_dump(input_dumpfile, filtered_output_file.name, ['python/trunk/Doc/README'], False, opt)
diff = self.filtered_dumpfile_differences(expected_filtered_dumpfile, filtered_output_file.name)
self.assertEqual(b'', diff)