29
29
def load_tests(loader, standard_tests, pattern):
30
30
suite, _ = tests.permute_tests_for_extension(standard_tests, loader,
31
'breezy.bzr._chk_map_py', 'breezy.bzr._chk_map_pyx')
31
'breezy.bzr._chk_map_py', 'breezy.bzr._chk_map_pyx')
35
35
class TestSearchKeys(tests.TestCase):
37
module = None # Filled in by test parameterization
37
module = None # Filled in by test parameterization
39
39
def assertSearchKey16(self, expected, key):
40
40
self.assertEqual(expected, self.module._search_key_16(key))
44
44
self.assertEqual(expected, actual, 'actual: %r' % (actual,))
46
46
def test_simple_16(self):
47
self.assertSearchKey16(b'8C736521', stuple('foo',))
48
self.assertSearchKey16(b'8C736521\x008C736521', stuple('foo', 'foo'))
49
self.assertSearchKey16(b'8C736521\x0076FF8CAA', stuple('foo', 'bar'))
50
self.assertSearchKey16(b'ED82CD11', stuple('abcd',))
47
self.assertSearchKey16(b'8C736521', stuple(b'foo',))
48
self.assertSearchKey16(b'8C736521\x008C736521', stuple(b'foo', b'foo'))
49
self.assertSearchKey16(b'8C736521\x0076FF8CAA', stuple(b'foo', b'bar'))
50
self.assertSearchKey16(b'ED82CD11', stuple(b'abcd',))
52
52
def test_simple_255(self):
53
self.assertSearchKey255(b'\x8cse!', stuple('foo',))
54
self.assertSearchKey255(b'\x8cse!\x00\x8cse!', stuple('foo', 'foo'))
55
self.assertSearchKey255(b'\x8cse!\x00v\xff\x8c\xaa', stuple('foo', 'bar'))
53
self.assertSearchKey255(b'\x8cse!', stuple(b'foo',))
54
self.assertSearchKey255(b'\x8cse!\x00\x8cse!', stuple(b'foo', b'foo'))
55
self.assertSearchKey255(
56
b'\x8cse!\x00v\xff\x8c\xaa', stuple(b'foo', b'bar'))
56
57
# The standard mapping for these would include '\n', so it should be
58
self.assertSearchKey255(b'\xfdm\x93_\x00P_\x1bL', stuple('<', 'V'))
59
self.assertSearchKey255(b'\xfdm\x93_\x00P_\x1bL', stuple(b'<', b'V'))
60
61
def test_255_does_not_include_newline(self):
61
62
# When mapping via _search_key_255, we should never have the '\n'
62
63
# character, but all other 255 values should be present
64
65
for char_in in range(256):
65
search_key = self.module._search_key_255(stuple(chr(char_in),))
66
chars_used.update(search_key)
67
all_chars = {chr(x) for x in range(256)}
66
search_key = self.module._search_key_255(
67
stuple(bytes([char_in]),))
68
chars_used.update([bytes([x]) for x in search_key])
69
all_chars = {bytes([x]) for x in range(256)}
68
70
unused_chars = all_chars.symmetric_difference(chars_used)
69
self.assertEqual(set(b'\n'), unused_chars)
71
self.assertEqual({b'\n'}, unused_chars)
72
74
class TestDeserialiseLeafNode(tests.TestCase):
76
78
def assertDeserialiseErrors(self, text):
77
79
self.assertRaises((ValueError, IndexError),
78
self.module._deserialise_leaf_node, text, b'not-a-real-sha')
80
self.module._deserialise_leaf_node, text, b'not-a-real-sha')
80
82
def test_raises_on_non_leaf(self):
81
83
self.assertDeserialiseErrors(b'')
105
107
self.assertEqual(2, len(node))
106
108
self.assertEqual([((b"foo bar",), b"baz"), ((b"quux",), b"blarh")],
107
sorted(node.iteritems(None)))
109
sorted(node.iteritems(None)))
109
111
def test_deserialise_item_with_null_width_1(self):
110
112
node = self.module._deserialise_leaf_node(
113
115
self.assertEqual(2, len(node))
114
116
self.assertEqual([((b"foo",), b"bar\x00baz"), ((b"quux",), b"blarh")],
115
sorted(node.iteritems(None)))
117
sorted(node.iteritems(None)))
117
119
def test_deserialise_item_with_null_width_2(self):
118
120
node = self.module._deserialise_leaf_node(
120
122
b"quux\x00\x001\nblarh\n",
122
124
self.assertEqual(2, len(node))
123
self.assertEqual([((b"foo", "1"), b"bar\x00baz"), ((b"quux", ""), b"blarh")],
124
sorted(node.iteritems(None)))
125
self.assertEqual([((b"foo", b"1"), b"bar\x00baz"), ((b"quux", b""), b"blarh")],
126
sorted(node.iteritems(None)))
126
128
def test_iteritems_selected_one_of_two_items(self):
127
129
node = self.module._deserialise_leaf_node(
130
132
self.assertEqual(2, len(node))
131
133
self.assertEqual([((b"quux",), b"blarh")],
132
sorted(node.iteritems(None, [(b"quux",), (b"qaz",)])))
134
sorted(node.iteritems(None, [(b"quux",), (b"qaz",)])))
134
136
def test_deserialise_item_with_common_prefix(self):
135
137
node = self.module._deserialise_leaf_node(
138
140
self.assertEqual(2, len(node))
139
141
self.assertEqual([((b"foo", b"1"), b"bar\x00baz"), ((b"foo", b"2"), b"blarh")],
140
sorted(node.iteritems(None)))
142
sorted(node.iteritems(None)))
141
143
self.assertIs(chk_map._unknown, node._search_prefix)
142
144
self.assertEqual(b'foo\x00', node._common_serialised_prefix)
148
150
self.assertEqual(2, len(node))
149
151
self.assertEqual([((b"foo", b"1"), b"bar\nbaz"),
150
152
((b"foo", b"2"), b"blarh\n"),
151
], sorted(node.iteritems(None)))
153
], sorted(node.iteritems(None)))
152
154
self.assertIs(chk_map._unknown, node._search_prefix)
153
155
self.assertEqual(b'foo\x00', node._common_serialised_prefix)
173
175
def assertDeserialiseErrors(self, text):
174
176
self.assertRaises((ValueError, IndexError),
175
self.module._deserialise_internal_node, text,
176
stuple(b'not-a-real-sha',))
177
self.module._deserialise_internal_node, text,
178
stuple(b'not-a-real-sha',))
178
180
def test_raises_on_non_internal(self):
179
181
self.assertDeserialiseErrors(b'')
257
259
def test_file(self):
258
260
self.assertBytesToTextKey((b'file-id', b'revision-id'),
259
b'file: file-id\nparent-id\nname\nrevision-id\n'
260
b'da39a3ee5e6b4b0d3255bfef95601890afd80709\n100\nN')
261
b'file: file-id\nparent-id\nname\nrevision-id\n'
262
b'da39a3ee5e6b4b0d3255bfef95601890afd80709\n100\nN')
262
264
def test_invalid_no_kind(self):
263
265
self.assertBytesToTextKeyRaises(
264
b'file file-id\nparent-id\nname\nrevision-id\n'
265
b'da39a3ee5e6b4b0d3255bfef95601890afd80709\n100\nN')
266
b'file file-id\nparent-id\nname\nrevision-id\n'
267
b'da39a3ee5e6b4b0d3255bfef95601890afd80709\n100\nN')
267
269
def test_invalid_no_space(self):
268
270
self.assertBytesToTextKeyRaises(
269
b'file:file-id\nparent-id\nname\nrevision-id\n'
270
b'da39a3ee5e6b4b0d3255bfef95601890afd80709\n100\nN')
271
b'file:file-id\nparent-id\nname\nrevision-id\n'
272
b'da39a3ee5e6b4b0d3255bfef95601890afd80709\n100\nN')
272
274
def test_invalid_too_short_file_id(self):
273
275
self.assertBytesToTextKeyRaises(b'file:file-id')