17
17
"""Tests for indices."""
29
class ErrorTests(tests.TestCase):
31
def test_bad_index_format_signature(self):
32
error = _mod_index.BadIndexFormatSignature("foo", "bar")
33
self.assertEqual("foo is not an index of type bar.",
36
def test_bad_index_data(self):
37
error = _mod_index.BadIndexData("foo")
38
self.assertEqual("Error in data for index foo.",
41
def test_bad_index_duplicate_key(self):
42
error = _mod_index.BadIndexDuplicateKey("foo", "bar")
43
self.assertEqual("The key 'foo' is already in index 'bar'.",
46
def test_bad_index_key(self):
47
error = _mod_index.BadIndexKey("foo")
48
self.assertEqual("The key 'foo' is not a valid key.",
51
def test_bad_index_options(self):
52
error = _mod_index.BadIndexOptions("foo")
53
self.assertEqual("Could not parse options for index foo.",
56
def test_bad_index_value(self):
57
error = _mod_index.BadIndexValue("foo")
58
self.assertEqual("The value 'foo' is not a valid value.",
62
29
class TestGraphIndexBuilder(tests.TestCaseWithMemoryTransport):
64
31
def test_build_index_empty(self):
65
builder = _mod_index.GraphIndexBuilder()
32
builder = index.GraphIndexBuilder()
66
33
stream = builder.finish()
67
34
contents = stream.read()
69
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=0\n\n",
36
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=0\n\n",
72
39
def test_build_index_empty_two_element_keys(self):
73
builder = _mod_index.GraphIndexBuilder(key_elements=2)
40
builder = index.GraphIndexBuilder(key_elements=2)
74
41
stream = builder.finish()
75
42
contents = stream.read()
77
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=0\n\n",
44
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=0\n\n",
80
47
def test_build_index_one_reference_list_empty(self):
81
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
48
builder = index.GraphIndexBuilder(reference_lists=1)
82
49
stream = builder.finish()
83
50
contents = stream.read()
85
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=0\n\n",
52
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=0\n\n",
88
55
def test_build_index_two_reference_list_empty(self):
89
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
56
builder = index.GraphIndexBuilder(reference_lists=2)
90
57
stream = builder.finish()
91
58
contents = stream.read()
93
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=0\n\n",
60
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=0\n\n",
96
63
def test_build_index_one_node_no_refs(self):
97
builder = _mod_index.GraphIndexBuilder()
98
builder.add_node((b'akey', ), b'data')
64
builder = index.GraphIndexBuilder()
65
builder.add_node(('akey', ), 'data')
99
66
stream = builder.finish()
100
67
contents = stream.read()
102
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=1\n"
103
b"akey\x00\x00\x00data\n\n", contents)
69
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=1\n"
70
"akey\x00\x00\x00data\n\n", contents)
105
72
def test_build_index_one_node_no_refs_accepts_empty_reflist(self):
106
builder = _mod_index.GraphIndexBuilder()
107
builder.add_node((b'akey', ), b'data', ())
73
builder = index.GraphIndexBuilder()
74
builder.add_node(('akey', ), 'data', ())
108
75
stream = builder.finish()
109
76
contents = stream.read()
111
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=1\n"
112
b"akey\x00\x00\x00data\n\n", contents)
78
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=1\n"
79
"akey\x00\x00\x00data\n\n", contents)
114
81
def test_build_index_one_node_2_element_keys(self):
115
82
# multipart keys are separated by \x00 - because they are fixed length,
116
83
# not variable this does not cause any issues, and seems clearer to the
118
builder = _mod_index.GraphIndexBuilder(key_elements=2)
119
builder.add_node((b'akey', b'secondpart'), b'data')
85
builder = index.GraphIndexBuilder(key_elements=2)
86
builder.add_node(('akey', 'secondpart'), 'data')
120
87
stream = builder.finish()
121
88
contents = stream.read()
123
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=1\n"
124
b"akey\x00secondpart\x00\x00\x00data\n\n", contents)
90
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=1\n"
91
"akey\x00secondpart\x00\x00\x00data\n\n", contents)
126
93
def test_add_node_empty_value(self):
127
builder = _mod_index.GraphIndexBuilder()
128
builder.add_node((b'akey', ), b'')
94
builder = index.GraphIndexBuilder()
95
builder.add_node(('akey', ), '')
129
96
stream = builder.finish()
130
97
contents = stream.read()
132
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=1\n"
133
b"akey\x00\x00\x00\n\n", contents)
99
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=1\n"
100
"akey\x00\x00\x00\n\n", contents)
135
102
def test_build_index_nodes_sorted(self):
136
103
# the highest sorted node comes first.
137
builder = _mod_index.GraphIndexBuilder()
104
builder = index.GraphIndexBuilder()
138
105
# use three to have a good chance of glitching dictionary hash
139
106
# lookups etc. Insert in randomish order that is not correct
140
107
# and not the reverse of the correct order.
141
builder.add_node((b'2002', ), b'data')
142
builder.add_node((b'2000', ), b'data')
143
builder.add_node((b'2001', ), b'data')
108
builder.add_node(('2002', ), 'data')
109
builder.add_node(('2000', ), 'data')
110
builder.add_node(('2001', ), 'data')
144
111
stream = builder.finish()
145
112
contents = stream.read()
146
113
self.assertEqual(
147
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=3\n"
148
b"2000\x00\x00\x00data\n"
149
b"2001\x00\x00\x00data\n"
150
b"2002\x00\x00\x00data\n"
114
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=3\n"
115
"2000\x00\x00\x00data\n"
116
"2001\x00\x00\x00data\n"
117
"2002\x00\x00\x00data\n"
153
120
def test_build_index_2_element_key_nodes_sorted(self):
154
121
# multiple element keys are sorted first-key, second-key.
155
builder = _mod_index.GraphIndexBuilder(key_elements=2)
122
builder = index.GraphIndexBuilder(key_elements=2)
156
123
# use three values of each key element, to have a good chance of
157
124
# glitching dictionary hash lookups etc. Insert in randomish order that
158
125
# is not correct and not the reverse of the correct order.
159
builder.add_node((b'2002', b'2002'), b'data')
160
builder.add_node((b'2002', b'2000'), b'data')
161
builder.add_node((b'2002', b'2001'), b'data')
162
builder.add_node((b'2000', b'2002'), b'data')
163
builder.add_node((b'2000', b'2000'), b'data')
164
builder.add_node((b'2000', b'2001'), b'data')
165
builder.add_node((b'2001', b'2002'), b'data')
166
builder.add_node((b'2001', b'2000'), b'data')
167
builder.add_node((b'2001', b'2001'), b'data')
126
builder.add_node(('2002', '2002'), 'data')
127
builder.add_node(('2002', '2000'), 'data')
128
builder.add_node(('2002', '2001'), 'data')
129
builder.add_node(('2000', '2002'), 'data')
130
builder.add_node(('2000', '2000'), 'data')
131
builder.add_node(('2000', '2001'), 'data')
132
builder.add_node(('2001', '2002'), 'data')
133
builder.add_node(('2001', '2000'), 'data')
134
builder.add_node(('2001', '2001'), 'data')
168
135
stream = builder.finish()
169
136
contents = stream.read()
170
137
self.assertEqual(
171
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=9\n"
172
b"2000\x002000\x00\x00\x00data\n"
173
b"2000\x002001\x00\x00\x00data\n"
174
b"2000\x002002\x00\x00\x00data\n"
175
b"2001\x002000\x00\x00\x00data\n"
176
b"2001\x002001\x00\x00\x00data\n"
177
b"2001\x002002\x00\x00\x00data\n"
178
b"2002\x002000\x00\x00\x00data\n"
179
b"2002\x002001\x00\x00\x00data\n"
180
b"2002\x002002\x00\x00\x00data\n"
138
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=9\n"
139
"2000\x002000\x00\x00\x00data\n"
140
"2000\x002001\x00\x00\x00data\n"
141
"2000\x002002\x00\x00\x00data\n"
142
"2001\x002000\x00\x00\x00data\n"
143
"2001\x002001\x00\x00\x00data\n"
144
"2001\x002002\x00\x00\x00data\n"
145
"2002\x002000\x00\x00\x00data\n"
146
"2002\x002001\x00\x00\x00data\n"
147
"2002\x002002\x00\x00\x00data\n"
183
150
def test_build_index_reference_lists_are_included_one(self):
184
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
185
builder.add_node((b'key', ), b'data', ([], ))
151
builder = index.GraphIndexBuilder(reference_lists=1)
152
builder.add_node(('key', ), 'data', ([], ))
186
153
stream = builder.finish()
187
154
contents = stream.read()
188
155
self.assertEqual(
189
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
190
b"key\x00\x00\x00data\n"
156
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
157
"key\x00\x00\x00data\n"
193
160
def test_build_index_reference_lists_with_2_element_keys(self):
194
builder = _mod_index.GraphIndexBuilder(
195
reference_lists=1, key_elements=2)
196
builder.add_node((b'key', b'key2'), b'data', ([], ))
161
builder = index.GraphIndexBuilder(reference_lists=1, key_elements=2)
162
builder.add_node(('key', 'key2'), 'data', ([], ))
197
163
stream = builder.finish()
198
164
contents = stream.read()
199
165
self.assertEqual(
200
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=2\nlen=1\n"
201
b"key\x00key2\x00\x00\x00data\n"
166
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=2\nlen=1\n"
167
"key\x00key2\x00\x00\x00data\n"
204
170
def test_build_index_reference_lists_are_included_two(self):
205
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
206
builder.add_node((b'key', ), b'data', ([], []))
171
builder = index.GraphIndexBuilder(reference_lists=2)
172
builder.add_node(('key', ), 'data', ([], []))
207
173
stream = builder.finish()
208
174
contents = stream.read()
209
175
self.assertEqual(
210
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
211
b"key\x00\x00\t\x00data\n"
176
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
177
"key\x00\x00\t\x00data\n"
214
180
def test_clear_cache(self):
215
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
181
builder = index.GraphIndexBuilder(reference_lists=2)
216
182
# This is a no-op, but the api should exist
217
183
builder.clear_cache()
219
185
def test_node_references_are_byte_offsets(self):
220
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
221
builder.add_node((b'reference', ), b'data', ([], ))
222
builder.add_node((b'key', ), b'data', ([(b'reference', )], ))
186
builder = index.GraphIndexBuilder(reference_lists=1)
187
builder.add_node(('reference', ), 'data', ([], ))
188
builder.add_node(('key', ), 'data', ([('reference', )], ))
223
189
stream = builder.finish()
224
190
contents = stream.read()
225
191
self.assertEqual(
226
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=2\n"
227
b"key\x00\x0072\x00data\n"
228
b"reference\x00\x00\x00data\n"
192
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=2\n"
193
"key\x00\x0072\x00data\n"
194
"reference\x00\x00\x00data\n"
231
197
def test_node_references_are_cr_delimited(self):
232
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
233
builder.add_node((b'reference', ), b'data', ([], ))
234
builder.add_node((b'reference2', ), b'data', ([], ))
235
builder.add_node((b'key', ), b'data',
236
([(b'reference', ), (b'reference2', )], ))
198
builder = index.GraphIndexBuilder(reference_lists=1)
199
builder.add_node(('reference', ), 'data', ([], ))
200
builder.add_node(('reference2', ), 'data', ([], ))
201
builder.add_node(('key', ), 'data',
202
([('reference', ), ('reference2', )], ))
237
203
stream = builder.finish()
238
204
contents = stream.read()
239
205
self.assertEqual(
240
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=3\n"
241
b"key\x00\x00077\r094\x00data\n"
242
b"reference\x00\x00\x00data\n"
243
b"reference2\x00\x00\x00data\n"
206
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=3\n"
207
"key\x00\x00077\r094\x00data\n"
208
"reference\x00\x00\x00data\n"
209
"reference2\x00\x00\x00data\n"
246
212
def test_multiple_reference_lists_are_tab_delimited(self):
247
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
248
builder.add_node((b'keference', ), b'data', ([], []))
249
builder.add_node((b'rey', ), b'data',
250
([(b'keference', )], [(b'keference', )]))
213
builder = index.GraphIndexBuilder(reference_lists=2)
214
builder.add_node(('keference', ), 'data', ([], []))
215
builder.add_node(('rey', ), 'data',
216
([('keference', )], [('keference', )]))
251
217
stream = builder.finish()
252
218
contents = stream.read()
253
219
self.assertEqual(
254
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=2\n"
255
b"keference\x00\x00\t\x00data\n"
256
b"rey\x00\x0059\t59\x00data\n"
220
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=2\n"
221
"keference\x00\x00\t\x00data\n"
222
"rey\x00\x0059\t59\x00data\n"
259
225
def test_add_node_referencing_missing_key_makes_absent(self):
260
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
261
builder.add_node((b'rey', ), b'data',
262
([(b'beference', ), (b'aeference2', )], ))
226
builder = index.GraphIndexBuilder(reference_lists=1)
227
builder.add_node(('rey', ), 'data',
228
([('beference', ), ('aeference2', )], ))
263
229
stream = builder.finish()
264
230
contents = stream.read()
265
231
self.assertEqual(
266
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
267
b"aeference2\x00a\x00\x00\n"
268
b"beference\x00a\x00\x00\n"
269
b"rey\x00\x00074\r059\x00data\n"
232
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
233
"aeference2\x00a\x00\x00\n"
234
"beference\x00a\x00\x00\n"
235
"rey\x00\x00074\r059\x00data\n"
272
238
def test_node_references_three_digits(self):
273
239
# test the node digit expands as needed.
274
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
275
references = [((b"%d" % val), ) for val in range(8, -1, -1)]
276
builder.add_node((b'2-key', ), b'', (references, ))
240
builder = index.GraphIndexBuilder(reference_lists=1)
241
references = [(str(val), ) for val in range(8, -1, -1)]
242
builder.add_node(('2-key', ), '', (references, ))
277
243
stream = builder.finish()
278
244
contents = stream.read()
279
245
self.assertEqualDiff(
280
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
284
b"2-key\x00\x00151\r145\r139\r133\r127\r121\r071\r065\r059\x00\n"
246
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
250
"2-key\x00\x00151\r145\r139\r133\r127\r121\r071\r065\r059\x00\n"
293
259
def test_absent_has_no_reference_overhead(self):
294
260
# the offsets after an absent record should be correct when there are
295
261
# >1 reference lists.
296
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
297
builder.add_node((b'parent', ), b'', ([(b'aail', ), (b'zther', )], []))
262
builder = index.GraphIndexBuilder(reference_lists=2)
263
builder.add_node(('parent', ), '', ([('aail', ), ('zther', )], []))
298
264
stream = builder.finish()
299
265
contents = stream.read()
300
266
self.assertEqual(
301
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
302
b"aail\x00a\x00\x00\n"
303
b"parent\x00\x0059\r84\t\x00\n"
304
b"zther\x00a\x00\x00\n"
267
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
268
"aail\x00a\x00\x00\n"
269
"parent\x00\x0059\r84\t\x00\n"
270
"zther\x00a\x00\x00\n"
307
273
def test_add_node_bad_key(self):
308
builder = _mod_index.GraphIndexBuilder()
309
for bad_char in bytearray(b'\t\n\x0b\x0c\r\x00 '):
310
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
311
(b'a%skey' % bytes([bad_char]), ), b'data')
312
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
314
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
315
b'not-a-tuple', b'data')
274
builder = index.GraphIndexBuilder()
275
for bad_char in '\t\n\x0b\x0c\r\x00 ':
276
self.assertRaises(errors.BadIndexKey, builder.add_node,
277
('a%skey' % bad_char, ), 'data')
278
self.assertRaises(errors.BadIndexKey, builder.add_node,
280
self.assertRaises(errors.BadIndexKey, builder.add_node,
281
'not-a-tuple', 'data')
316
282
# not enough length
317
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
283
self.assertRaises(errors.BadIndexKey, builder.add_node,
320
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
321
(b'primary', b'secondary'), b'data')
286
self.assertRaises(errors.BadIndexKey, builder.add_node,
287
('primary', 'secondary'), 'data')
322
288
# secondary key elements get checked too:
323
builder = _mod_index.GraphIndexBuilder(key_elements=2)
324
for bad_char in bytearray(b'\t\n\x0b\x0c\r\x00 '):
325
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
326
(b'prefix', b'a%skey' % bytes([bad_char])), b'data')
289
builder = index.GraphIndexBuilder(key_elements=2)
290
for bad_char in '\t\n\x0b\x0c\r\x00 ':
291
self.assertRaises(errors.BadIndexKey, builder.add_node,
292
('prefix', 'a%skey' % bad_char), 'data')
328
294
def test_add_node_bad_data(self):
329
builder = _mod_index.GraphIndexBuilder()
330
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
332
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
295
builder = index.GraphIndexBuilder()
296
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
298
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
335
301
def test_add_node_bad_mismatched_ref_lists_length(self):
336
builder = _mod_index.GraphIndexBuilder()
337
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
339
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
340
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
342
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
344
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
345
b'data aa', ([], []))
346
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
347
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
349
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
351
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
352
b'data aa', ([], [], []))
302
builder = index.GraphIndexBuilder()
303
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
305
builder = index.GraphIndexBuilder(reference_lists=1)
306
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
308
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
310
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
312
builder = index.GraphIndexBuilder(reference_lists=2)
313
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
315
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
317
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
318
'data aa', ([], [], []))
354
320
def test_add_node_bad_key_in_reference_lists(self):
355
321
# first list, first key - trivial
356
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
357
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
358
b'data aa', ([(b'a key', )], ))
322
builder = index.GraphIndexBuilder(reference_lists=1)
323
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
324
'data aa', ([('a key', )], ))
359
325
# references keys must be tuples too
360
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
361
b'data aa', (['not-a-tuple'], ))
326
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
327
'data aa', (['not-a-tuple'], ))
362
328
# not enough length
363
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
364
b'data aa', ([()], ))
329
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
366
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
367
b'data aa', ([(b'primary', b'secondary')], ))
332
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
333
'data aa', ([('primary', 'secondary')], ))
368
334
# need to check more than the first key in the list
369
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
370
b'data aa', ([(b'agoodkey', ), (b'that is a bad key', )], ))
335
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
336
'data aa', ([('agoodkey', ), ('that is a bad key', )], ))
371
337
# and if there is more than one list it should be getting checked
373
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
374
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
375
b'data aa', ([], ['a bad key']))
339
builder = index.GraphIndexBuilder(reference_lists=2)
340
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
341
'data aa', ([], ['a bad key']))
377
343
def test_add_duplicate_key(self):
378
builder = _mod_index.GraphIndexBuilder()
379
builder.add_node((b'key', ), b'data')
380
self.assertRaises(_mod_index.BadIndexDuplicateKey,
381
builder.add_node, (b'key', ), b'data')
344
builder = index.GraphIndexBuilder()
345
builder.add_node(('key', ), 'data')
346
self.assertRaises(errors.BadIndexDuplicateKey,
347
builder.add_node, ('key', ), 'data')
383
349
def test_add_duplicate_key_2_elements(self):
384
builder = _mod_index.GraphIndexBuilder(key_elements=2)
385
builder.add_node((b'key', b'key'), b'data')
386
self.assertRaises(_mod_index.BadIndexDuplicateKey, builder.add_node,
387
(b'key', b'key'), b'data')
350
builder = index.GraphIndexBuilder(key_elements=2)
351
builder.add_node(('key', 'key'), 'data')
352
self.assertRaises(errors.BadIndexDuplicateKey, builder.add_node,
353
('key', 'key'), 'data')
389
355
def test_add_key_after_referencing_key(self):
390
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
391
builder.add_node((b'key', ), b'data', ([(b'reference', )], ))
392
builder.add_node((b'reference', ), b'data', ([],))
356
builder = index.GraphIndexBuilder(reference_lists=1)
357
builder.add_node(('key', ), 'data', ([('reference', )], ))
358
builder.add_node(('reference', ), 'data', ([],))
394
360
def test_add_key_after_referencing_key_2_elements(self):
395
builder = _mod_index.GraphIndexBuilder(
396
reference_lists=1, key_elements=2)
397
builder.add_node((b'k', b'ey'), b'data',
398
([(b'reference', b'tokey')], ))
399
builder.add_node((b'reference', b'tokey'), b'data', ([],))
361
builder = index.GraphIndexBuilder(reference_lists=1, key_elements=2)
362
builder.add_node(('k', 'ey'), 'data', ([('reference', 'tokey')], ))
363
builder.add_node(('reference', 'tokey'), 'data', ([],))
401
365
def test_set_optimize(self):
402
builder = _mod_index.GraphIndexBuilder(
403
reference_lists=1, key_elements=2)
366
builder = index.GraphIndexBuilder(reference_lists=1, key_elements=2)
404
367
builder.set_optimize(for_size=True)
405
368
self.assertTrue(builder._optimize_for_size)
406
369
builder.set_optimize(for_size=False)
829
789
def test_iter_entries_references_resolved(self):
830
790
index = self.make_index(1, nodes=[
831
((b'name', ), b'data', ([(b'ref', ), (b'ref', )], )),
832
((b'ref', ), b'refdata', ([], ))])
833
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',), (b'ref',)),)),
834
(index, (b'ref', ), b'refdata', ((), ))},
835
set(index.iter_entries([(b'name',), (b'ref',)])))
791
(('name', ), 'data', ([('ref', ), ('ref', )], )),
792
(('ref', ), 'refdata', ([], ))])
793
self.assertEqual({(index, ('name', ), 'data', ((('ref',),('ref',)),)),
794
(index, ('ref', ), 'refdata', ((), ))},
795
set(index.iter_entries([('name',), ('ref',)])))
837
797
def test_iter_entries_references_2_refs_resolved(self):
838
798
index = self.make_index(2, nodes=[
839
((b'name', ), b'data', ([(b'ref', )], [(b'ref', )])),
840
((b'ref', ), b'refdata', ([], []))])
841
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),), ((b'ref',),))),
842
(index, (b'ref', ), b'refdata', ((), ()))},
843
set(index.iter_entries([(b'name',), (b'ref',)])))
799
(('name', ), 'data', ([('ref', )], [('ref', )])),
800
(('ref', ), 'refdata', ([], []))])
801
self.assertEqual({(index, ('name', ), 'data', ((('ref',),), (('ref',),))),
802
(index, ('ref', ), 'refdata', ((), ()))},
803
set(index.iter_entries([('name',), ('ref',)])))
845
805
def test_iteration_absent_skipped(self):
846
806
index = self.make_index(1, nodes=[
847
((b'name', ), b'data', ([(b'ref', )], ))])
848
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
849
set(index.iter_all_entries()))
850
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
851
set(index.iter_entries([(b'name', )])))
852
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
807
(('name', ), 'data', ([('ref', )], ))])
808
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
809
set(index.iter_all_entries()))
810
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
811
set(index.iter_entries([('name', )])))
812
self.assertEqual([], list(index.iter_entries([('ref', )])))
854
814
def test_iteration_absent_skipped_2_element_keys(self):
855
815
index = self.make_index(1, key_elements=2, nodes=[
856
((b'name', b'fin'), b'data', ([(b'ref', b'erence')], ))])
857
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
858
list(index.iter_all_entries()))
859
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
860
list(index.iter_entries([(b'name', b'fin')])))
861
self.assertEqual([], list(index.iter_entries([(b'ref', b'erence')])))
816
(('name', 'fin'), 'data', ([('ref', 'erence')], ))])
817
self.assertEqual({(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))},
818
set(index.iter_all_entries()))
819
self.assertEqual({(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))},
820
set(index.iter_entries([('name', 'fin')])))
821
self.assertEqual([], list(index.iter_entries([('ref', 'erence')])))
863
823
def test_iter_all_keys(self):
864
824
index = self.make_index(1, nodes=[
865
((b'name', ), b'data', ([(b'ref', )], )),
866
((b'ref', ), b'refdata', ([], ))])
867
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
868
(index, (b'ref', ), b'refdata', ((), ))},
869
set(index.iter_entries([(b'name', ), (b'ref', )])))
825
(('name', ), 'data', ([('ref', )], )),
826
(('ref', ), 'refdata', ([], ))])
827
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
828
(index, ('ref', ), 'refdata', ((), ))},
829
set(index.iter_entries([('name', ), ('ref', )])))
871
831
def test_iter_nothing_empty(self):
872
832
index = self.make_index()
875
835
def test_iter_missing_entry_empty(self):
876
836
index = self.make_index()
877
self.assertEqual([], list(index.iter_entries([(b'a', )])))
837
self.assertEqual([], list(index.iter_entries([('a', )])))
879
839
def test_iter_missing_entry_empty_no_size(self):
880
840
idx = self.make_index()
881
idx = _mod_index.GraphIndex(idx._transport, 'index', None)
882
self.assertEqual([], list(idx.iter_entries([(b'a', )])))
841
idx = index.GraphIndex(idx._transport, 'index', None)
842
self.assertEqual([], list(idx.iter_entries([('a', )])))
884
844
def test_iter_key_prefix_1_element_key_None(self):
885
845
index = self.make_index()
886
self.assertRaises(_mod_index.BadIndexKey, list,
887
index.iter_entries_prefix([(None, )]))
846
self.assertRaises(errors.BadIndexKey, list,
847
index.iter_entries_prefix([(None, )]))
889
849
def test_iter_key_prefix_wrong_length(self):
890
850
index = self.make_index()
891
self.assertRaises(_mod_index.BadIndexKey, list,
892
index.iter_entries_prefix([(b'foo', None)]))
851
self.assertRaises(errors.BadIndexKey, list,
852
index.iter_entries_prefix([('foo', None)]))
893
853
index = self.make_index(key_elements=2)
894
self.assertRaises(_mod_index.BadIndexKey, list,
895
index.iter_entries_prefix([(b'foo', )]))
896
self.assertRaises(_mod_index.BadIndexKey, list,
897
index.iter_entries_prefix([(b'foo', None, None)]))
854
self.assertRaises(errors.BadIndexKey, list,
855
index.iter_entries_prefix([('foo', )]))
856
self.assertRaises(errors.BadIndexKey, list,
857
index.iter_entries_prefix([('foo', None, None)]))
899
859
def test_iter_key_prefix_1_key_element_no_refs(self):
900
index = self.make_index(nodes=[
901
((b'name', ), b'data', ()),
902
((b'ref', ), b'refdata', ())])
903
self.assertEqual({(index, (b'name', ), b'data'),
904
(index, (b'ref', ), b'refdata')},
905
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
860
index = self.make_index( nodes=[
861
(('name', ), 'data', ()),
862
(('ref', ), 'refdata', ())])
863
self.assertEqual({(index, ('name', ), 'data'),
864
(index, ('ref', ), 'refdata')},
865
set(index.iter_entries_prefix([('name', ), ('ref', )])))
907
867
def test_iter_key_prefix_1_key_element_refs(self):
908
868
index = self.make_index(1, nodes=[
909
((b'name', ), b'data', ([(b'ref', )], )),
910
((b'ref', ), b'refdata', ([], ))])
911
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
912
(index, (b'ref', ), b'refdata', ((), ))},
913
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
869
(('name', ), 'data', ([('ref', )], )),
870
(('ref', ), 'refdata', ([], ))])
871
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
872
(index, ('ref', ), 'refdata', ((), ))},
873
set(index.iter_entries_prefix([('name', ), ('ref', )])))
915
875
def test_iter_key_prefix_2_key_element_no_refs(self):
916
876
index = self.make_index(key_elements=2, nodes=[
917
((b'name', b'fin1'), b'data', ()),
918
((b'name', b'fin2'), b'beta', ()),
919
((b'ref', b'erence'), b'refdata', ())])
920
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
921
(index, (b'ref', b'erence'), b'refdata')},
922
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
923
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
924
(index, (b'name', b'fin2'), b'beta')},
925
set(index.iter_entries_prefix([(b'name', None)])))
877
(('name', 'fin1'), 'data', ()),
878
(('name', 'fin2'), 'beta', ()),
879
(('ref', 'erence'), 'refdata', ())])
880
self.assertEqual({(index, ('name', 'fin1'), 'data'),
881
(index, ('ref', 'erence'), 'refdata')},
882
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
883
self.assertEqual({(index, ('name', 'fin1'), 'data'),
884
(index, ('name', 'fin2'), 'beta')},
885
set(index.iter_entries_prefix([('name', None)])))
927
887
def test_iter_key_prefix_2_key_element_refs(self):
928
888
index = self.make_index(1, key_elements=2, nodes=[
929
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], )),
930
((b'name', b'fin2'), b'beta', ([], )),
931
((b'ref', b'erence'), b'refdata', ([], ))])
932
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
933
(index, (b'ref', b'erence'), b'refdata', ((), ))},
934
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
935
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
936
(index, (b'name', b'fin2'), b'beta', ((), ))},
937
set(index.iter_entries_prefix([(b'name', None)])))
889
(('name', 'fin1'), 'data', ([('ref', 'erence')], )),
890
(('name', 'fin2'), 'beta', ([], )),
891
(('ref', 'erence'), 'refdata', ([], ))])
892
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
893
(index, ('ref', 'erence'), 'refdata', ((), ))},
894
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
895
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
896
(index, ('name', 'fin2'), 'beta', ((), ))},
897
set(index.iter_entries_prefix([('name', None)])))
939
899
def test_key_count_empty(self):
940
900
index = self.make_index()
941
901
self.assertEqual(0, index.key_count())
943
903
def test_key_count_one(self):
944
index = self.make_index(nodes=[((b'name', ), b'', ())])
904
index = self.make_index(nodes=[(('name', ), '', ())])
945
905
self.assertEqual(1, index.key_count())
947
907
def test_key_count_two(self):
948
908
index = self.make_index(nodes=[
949
((b'name', ), b'', ()), ((b'foo', ), b'', ())])
909
(('name', ), '', ()), (('foo', ), '', ())])
950
910
self.assertEqual(2, index.key_count())
952
912
def test_read_and_parse_tracks_real_read_value(self):
1179
1136
log.append(self._index)
1180
1137
return self._index.clear_cache()
1182
idx = _mod_index.CombinedGraphIndex([])
1183
idx1 = self.make_index('name', 0, nodes=[((b'key', ), b'', ())])
1139
idx = index.CombinedGraphIndex([])
1140
idx1 = self.make_index('name', 0, nodes=[(('key', ), '', ())])
1184
1141
idx.insert_index(0, ClearCacheProxy(idx1))
1185
idx2 = self.make_index('name', 0, nodes=[((b'key', ), b'', ())])
1142
idx2 = self.make_index('name', 0, nodes=[(('key', ), '', ())])
1186
1143
idx.insert_index(1, ClearCacheProxy(idx2))
1187
1144
# CombinedGraphIndex should call 'clear_cache()' on all children
1188
1145
idx.clear_cache()
1189
1146
self.assertEqual(sorted([idx1, idx2]), sorted(log))
1191
1148
def test_iter_all_entries_empty(self):
1192
idx = _mod_index.CombinedGraphIndex([])
1149
idx = index.CombinedGraphIndex([])
1193
1150
self.assertEqual([], list(idx.iter_all_entries()))
1195
1152
def test_iter_all_entries_children_empty(self):
1196
1153
idx1 = self.make_index('name')
1197
idx = _mod_index.CombinedGraphIndex([idx1])
1154
idx = index.CombinedGraphIndex([idx1])
1198
1155
self.assertEqual([], list(idx.iter_all_entries()))
1200
1157
def test_iter_all_entries_simple(self):
1201
idx1 = self.make_index('name', nodes=[((b'name', ), b'data', ())])
1202
idx = _mod_index.CombinedGraphIndex([idx1])
1203
self.assertEqual([(idx1, (b'name', ), b'data')],
1204
list(idx.iter_all_entries()))
1158
idx1 = self.make_index('name', nodes=[(('name', ), 'data', ())])
1159
idx = index.CombinedGraphIndex([idx1])
1160
self.assertEqual([(idx1, ('name', ), 'data')],
1161
list(idx.iter_all_entries()))
1206
1163
def test_iter_all_entries_two_indices(self):
1207
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1208
idx2 = self.make_index('name2', nodes=[((b'2', ), b'', ())])
1209
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1210
self.assertEqual([(idx1, (b'name', ), b'data'),
1211
(idx2, (b'2', ), b'')],
1164
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1165
idx2 = self.make_index('name2', nodes=[(('2', ), '', ())])
1166
idx = index.CombinedGraphIndex([idx1, idx2])
1167
self.assertEqual([(idx1, ('name', ), 'data'),
1168
(idx2, ('2', ), '')],
1212
1169
list(idx.iter_all_entries()))
1214
1171
def test_iter_entries_two_indices_dup_key(self):
1215
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1216
idx2 = self.make_index('name2', nodes=[((b'name', ), b'data', ())])
1217
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1218
self.assertEqual([(idx1, (b'name', ), b'data')],
1219
list(idx.iter_entries([(b'name', )])))
1172
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1173
idx2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1174
idx = index.CombinedGraphIndex([idx1, idx2])
1175
self.assertEqual([(idx1, ('name', ), 'data')],
1176
list(idx.iter_entries([('name', )])))
1221
1178
def test_iter_all_entries_two_indices_dup_key(self):
1222
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1223
idx2 = self.make_index('name2', nodes=[((b'name', ), b'data', ())])
1224
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1225
self.assertEqual([(idx1, (b'name', ), b'data')],
1179
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1180
idx2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1181
idx = index.CombinedGraphIndex([idx1, idx2])
1182
self.assertEqual([(idx1, ('name', ), 'data')],
1226
1183
list(idx.iter_all_entries()))
1228
1185
def test_iter_key_prefix_2_key_element_refs(self):
1229
1186
idx1 = self.make_index('1', 1, key_elements=2, nodes=[
1230
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], ))])
1187
(('name', 'fin1'), 'data', ([('ref', 'erence')], ))])
1231
1188
idx2 = self.make_index('2', 1, key_elements=2, nodes=[
1232
((b'name', b'fin2'), b'beta', ([], )),
1233
((b'ref', b'erence'), b'refdata', ([], ))])
1234
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1235
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1236
(((b'ref', b'erence'),),)),
1237
(idx2, (b'ref', b'erence'), b'refdata', ((), ))},
1238
set(idx.iter_entries_prefix([(b'name', b'fin1'),
1239
(b'ref', b'erence')])))
1240
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1241
(((b'ref', b'erence'),),)),
1242
(idx2, (b'name', b'fin2'), b'beta', ((), ))},
1243
set(idx.iter_entries_prefix([(b'name', None)])))
1189
(('name', 'fin2'), 'beta', ([], )),
1190
(('ref', 'erence'), 'refdata', ([], ))])
1191
idx = index.CombinedGraphIndex([idx1, idx2])
1192
self.assertEqual({(idx1, ('name', 'fin1'), 'data',
1193
((('ref', 'erence'),),)),
1194
(idx2, ('ref', 'erence'), 'refdata', ((), ))},
1195
set(idx.iter_entries_prefix([('name', 'fin1'),
1196
('ref', 'erence')])))
1197
self.assertEqual({(idx1, ('name', 'fin1'), 'data',
1198
((('ref', 'erence'),),)),
1199
(idx2, ('name', 'fin2'), 'beta', ((), ))},
1200
set(idx.iter_entries_prefix([('name', None)])))
1245
1202
def test_iter_nothing_empty(self):
1246
idx = _mod_index.CombinedGraphIndex([])
1203
idx = index.CombinedGraphIndex([])
1247
1204
self.assertEqual([], list(idx.iter_entries([])))
1249
1206
def test_iter_nothing_children_empty(self):
1250
1207
idx1 = self.make_index('name')
1251
idx = _mod_index.CombinedGraphIndex([idx1])
1208
idx = index.CombinedGraphIndex([idx1])
1252
1209
self.assertEqual([], list(idx.iter_entries([])))
1254
1211
def test_iter_all_keys(self):
1255
idx1 = self.make_index('1', 1, nodes=[((b'name', ), b'data',
1257
idx2 = self.make_index(
1258
'2', 1, nodes=[((b'ref', ), b'refdata', ((), ))])
1259
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1260
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref', ), ), )),
1261
(idx2, (b'ref', ), b'refdata', ((), ))},
1262
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1212
idx1 = self.make_index('1', 1, nodes=[(('name', ), 'data',
1214
idx2 = self.make_index('2', 1, nodes=[(('ref', ), 'refdata', ((), ))])
1215
idx = index.CombinedGraphIndex([idx1, idx2])
1216
self.assertEqual({(idx1, ('name', ), 'data', ((('ref', ), ), )),
1217
(idx2, ('ref', ), 'refdata', ((), ))},
1218
set(idx.iter_entries([('name', ), ('ref', )])))
1264
1220
def test_iter_all_keys_dup_entry(self):
1265
idx1 = self.make_index('1', 1, nodes=[((b'name', ), b'data',
1267
((b'ref', ), b'refdata', ([], ))])
1268
idx2 = self.make_index(
1269
'2', 1, nodes=[((b'ref', ), b'refdata', ([], ))])
1270
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1271
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref',),),)),
1272
(idx1, (b'ref', ), b'refdata', ((), ))},
1273
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1221
idx1 = self.make_index('1', 1, nodes=[(('name', ), 'data',
1223
(('ref', ), 'refdata', ([], ))])
1224
idx2 = self.make_index('2', 1, nodes=[(('ref', ), 'refdata', ([], ))])
1225
idx = index.CombinedGraphIndex([idx1, idx2])
1226
self.assertEqual({(idx1, ('name', ), 'data', ((('ref',),),)),
1227
(idx1, ('ref', ), 'refdata', ((), ))},
1228
set(idx.iter_entries([('name', ), ('ref', )])))
1275
1230
def test_iter_missing_entry_empty(self):
1276
idx = _mod_index.CombinedGraphIndex([])
1231
idx = index.CombinedGraphIndex([])
1277
1232
self.assertEqual([], list(idx.iter_entries([('a', )])))
1279
1234
def test_iter_missing_entry_one_index(self):
1280
1235
idx1 = self.make_index('1')
1281
idx = _mod_index.CombinedGraphIndex([idx1])
1282
self.assertEqual([], list(idx.iter_entries([(b'a', )])))
1236
idx = index.CombinedGraphIndex([idx1])
1237
self.assertEqual([], list(idx.iter_entries([('a', )])))
1284
1239
def test_iter_missing_entry_two_index(self):
1285
1240
idx1 = self.make_index('1')
1286
1241
idx2 = self.make_index('2')
1287
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1242
idx = index.CombinedGraphIndex([idx1, idx2])
1288
1243
self.assertEqual([], list(idx.iter_entries([('a', )])))
1290
1245
def test_iter_entry_present_one_index_only(self):
1291
idx1 = self.make_index('1', nodes=[((b'key', ), b'', ())])
1246
idx1 = self.make_index('1', nodes=[(('key', ), '', ())])
1292
1247
idx2 = self.make_index('2', nodes=[])
1293
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1294
self.assertEqual([(idx1, (b'key', ), b'')],
1295
list(idx.iter_entries([(b'key', )])))
1248
idx = index.CombinedGraphIndex([idx1, idx2])
1249
self.assertEqual([(idx1, ('key', ), '')],
1250
list(idx.iter_entries([('key', )])))
1296
1251
# and in the other direction
1297
idx = _mod_index.CombinedGraphIndex([idx2, idx1])
1298
self.assertEqual([(idx1, (b'key', ), b'')],
1299
list(idx.iter_entries([(b'key', )])))
1252
idx = index.CombinedGraphIndex([idx2, idx1])
1253
self.assertEqual([(idx1, ('key', ), '')],
1254
list(idx.iter_entries([('key', )])))
1301
1256
def test_key_count_empty(self):
1302
1257
idx1 = self.make_index('1', nodes=[])
1303
1258
idx2 = self.make_index('2', nodes=[])
1304
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1259
idx = index.CombinedGraphIndex([idx1, idx2])
1305
1260
self.assertEqual(0, idx.key_count())
1307
1262
def test_key_count_sums_index_keys(self):
1308
1263
idx1 = self.make_index('1', nodes=[
1310
((b'2',), b'', ())])
1311
idx2 = self.make_index('2', nodes=[((b'1',), b'', ())])
1312
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1266
idx2 = self.make_index('2', nodes=[(('1',), '', ())])
1267
idx = index.CombinedGraphIndex([idx1, idx2])
1313
1268
self.assertEqual(3, idx.key_count())
1315
1270
def test_validate_bad_child_index_errors(self):
1316
1271
trans = self.get_transport()
1317
trans.put_bytes('name', b"not an index\n")
1318
idx1 = _mod_index.GraphIndex(trans, 'name', 13)
1319
idx = _mod_index.CombinedGraphIndex([idx1])
1320
self.assertRaises(_mod_index.BadIndexFormatSignature, idx.validate)
1272
trans.put_bytes('name', "not an index\n")
1273
idx1 = index.GraphIndex(trans, 'name', 13)
1274
idx = index.CombinedGraphIndex([idx1])
1275
self.assertRaises(errors.BadIndexFormatSignature, idx.validate)
1322
1277
def test_validate_empty(self):
1323
idx = _mod_index.CombinedGraphIndex([])
1278
idx = index.CombinedGraphIndex([])
1326
1281
def test_key_count_reloads(self):
1611
1565
self.assertEqual([], list(index.iter_all_entries()))
1613
1567
def test_iter_all_entries_simple(self):
1614
index = self.make_index(nodes=[((b'name', ), b'data')])
1615
self.assertEqual([(index, (b'name', ), b'data')],
1616
list(index.iter_all_entries()))
1568
index = self.make_index(nodes=[(('name', ), 'data')])
1569
self.assertEqual([(index, ('name', ), 'data')],
1570
list(index.iter_all_entries()))
1618
1572
def test_iter_all_entries_references(self):
1619
1573
index = self.make_index(1, nodes=[
1620
((b'name', ), b'data', ([(b'ref', )], )),
1621
((b'ref', ), b'refdata', ([], ))])
1622
self.assertEqual({(index, (b'name', ), b'data', (((b'ref', ),),)),
1623
(index, (b'ref', ), b'refdata', ((), ))},
1624
set(index.iter_all_entries()))
1574
(('name', ), 'data', ([('ref', )], )),
1575
(('ref', ), 'refdata', ([], ))])
1576
self.assertEqual({(index, ('name', ), 'data', ((('ref', ),),)),
1577
(index, ('ref', ), 'refdata', ((), ))},
1578
set(index.iter_all_entries()))
1626
1580
def test_iteration_absent_skipped(self):
1627
1581
index = self.make_index(1, nodes=[
1628
((b'name', ), b'data', ([(b'ref', )], ))])
1629
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1630
set(index.iter_all_entries()))
1631
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1632
set(index.iter_entries([(b'name', )])))
1633
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
1582
(('name', ), 'data', ([('ref', )], ))])
1583
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
1584
set(index.iter_all_entries()))
1585
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
1586
set(index.iter_entries([('name', )])))
1587
self.assertEqual([], list(index.iter_entries([('ref', )])))
1635
1589
def test_iter_all_keys(self):
1636
1590
index = self.make_index(1, nodes=[
1637
((b'name', ), b'data', ([(b'ref', )], )),
1638
((b'ref', ), b'refdata', ([], ))])
1639
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
1640
(index, (b'ref', ), b'refdata', ((), ))},
1641
set(index.iter_entries([(b'name', ), (b'ref', )])))
1591
(('name', ), 'data', ([('ref', )], )),
1592
(('ref', ), 'refdata', ([], ))])
1593
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
1594
(index, ('ref', ), 'refdata', ((), ))},
1595
set(index.iter_entries([('name', ), ('ref', )])))
1643
1597
def test_iter_key_prefix_1_key_element_no_refs(self):
1644
index = self.make_index(nodes=[
1645
((b'name', ), b'data'),
1646
((b'ref', ), b'refdata')])
1647
self.assertEqual({(index, (b'name', ), b'data'),
1648
(index, (b'ref', ), b'refdata')},
1649
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1598
index = self.make_index( nodes=[
1599
(('name', ), 'data'),
1600
(('ref', ), 'refdata')])
1601
self.assertEqual({(index, ('name', ), 'data'),
1602
(index, ('ref', ), 'refdata')},
1603
set(index.iter_entries_prefix([('name', ), ('ref', )])))
1651
1605
def test_iter_key_prefix_1_key_element_refs(self):
1652
1606
index = self.make_index(1, nodes=[
1653
((b'name', ), b'data', ([(b'ref', )], )),
1654
((b'ref', ), b'refdata', ([], ))])
1655
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
1656
(index, (b'ref', ), b'refdata', ((), ))},
1657
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1607
(('name', ), 'data', ([('ref', )], )),
1608
(('ref', ), 'refdata', ([], ))])
1609
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
1610
(index, ('ref', ), 'refdata', ((), ))},
1611
set(index.iter_entries_prefix([('name', ), ('ref', )])))
1659
1613
def test_iter_key_prefix_2_key_element_no_refs(self):
1660
1614
index = self.make_index(key_elements=2, nodes=[
1661
((b'name', b'fin1'), b'data'),
1662
((b'name', b'fin2'), b'beta'),
1663
((b'ref', b'erence'), b'refdata')])
1664
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
1665
(index, (b'ref', b'erence'), b'refdata')},
1666
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
1667
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
1668
(index, (b'name', b'fin2'), b'beta')},
1669
set(index.iter_entries_prefix([(b'name', None)])))
1615
(('name', 'fin1'), 'data'),
1616
(('name', 'fin2'), 'beta'),
1617
(('ref', 'erence'), 'refdata')])
1618
self.assertEqual({(index, ('name', 'fin1'), 'data'),
1619
(index, ('ref', 'erence'), 'refdata')},
1620
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
1621
self.assertEqual({(index, ('name', 'fin1'), 'data'),
1622
(index, ('name', 'fin2'), 'beta')},
1623
set(index.iter_entries_prefix([('name', None)])))
1671
1625
def test_iter_key_prefix_2_key_element_refs(self):
1672
1626
index = self.make_index(1, key_elements=2, nodes=[
1673
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], )),
1674
((b'name', b'fin2'), b'beta', ([], )),
1675
((b'ref', b'erence'), b'refdata', ([], ))])
1676
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
1677
(index, (b'ref', b'erence'), b'refdata', ((), ))},
1678
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
1679
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
1680
(index, (b'name', b'fin2'), b'beta', ((), ))},
1681
set(index.iter_entries_prefix([(b'name', None)])))
1627
(('name', 'fin1'), 'data', ([('ref', 'erence')], )),
1628
(('name', 'fin2'), 'beta', ([], )),
1629
(('ref', 'erence'), 'refdata', ([], ))])
1630
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
1631
(index, ('ref', 'erence'), 'refdata', ((), ))},
1632
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
1633
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
1634
(index, ('name', 'fin2'), 'beta', ((), ))},
1635
set(index.iter_entries_prefix([('name', None)])))
1683
1637
def test_iter_nothing_empty(self):
1684
1638
index = self.make_index()
1714
1668
def make_index(self, ref_lists=1, key_elements=2, nodes=[],
1715
1669
add_callback=False):
1716
result = _mod_index.InMemoryGraphIndex(
1717
ref_lists, key_elements=key_elements)
1670
result = index.InMemoryGraphIndex(ref_lists, key_elements=key_elements)
1718
1671
result.add_nodes(nodes)
1719
1672
if add_callback:
1720
1673
add_nodes_callback = result.add_nodes
1722
1675
add_nodes_callback = None
1723
adapter = _mod_index.GraphIndexPrefixAdapter(
1724
result, (b'prefix', ), key_elements - 1,
1676
adapter = index.GraphIndexPrefixAdapter(
1677
result, ('prefix', ), key_elements - 1,
1725
1678
add_nodes_callback=add_nodes_callback)
1726
1679
return result, adapter
1728
1681
def test_add_node(self):
1729
1682
index, adapter = self.make_index(add_callback=True)
1730
adapter.add_node((b'key',), b'value', (((b'ref',),),))
1731
self.assertEqual({(index, (b'prefix', b'key'), b'value',
1732
(((b'prefix', b'ref'),),))},
1733
set(index.iter_all_entries()))
1683
adapter.add_node(('key',), 'value', ((('ref',),),))
1684
self.assertEqual({(index, ('prefix', 'key'), 'value',
1685
((('prefix', 'ref'),),))},
1686
set(index.iter_all_entries()))
1735
1688
def test_add_nodes(self):
1736
1689
index, adapter = self.make_index(add_callback=True)
1737
1690
adapter.add_nodes((
1738
((b'key',), b'value', (((b'ref',),),)),
1739
((b'key2',), b'value2', ((),)),
1691
(('key',), 'value', ((('ref',),),)),
1692
(('key2',), 'value2', ((),)),
1741
1694
self.assertEqual({
1742
(index, (b'prefix', b'key2'), b'value2', ((),)),
1743
(index, (b'prefix', b'key'), b'value', (((b'prefix', b'ref'),),))
1695
(index, ('prefix', 'key2'), 'value2', ((),)),
1696
(index, ('prefix', 'key'), 'value', ((('prefix', 'ref'),),))
1745
1698
set(index.iter_all_entries()))
1747
1700
def test_construct(self):
1748
idx = _mod_index.InMemoryGraphIndex()
1749
adapter = _mod_index.GraphIndexPrefixAdapter(idx, (b'prefix', ), 1)
1701
idx = index.InMemoryGraphIndex()
1702
adapter = index.GraphIndexPrefixAdapter(idx, ('prefix', ), 1)
1751
1704
def test_construct_with_callback(self):
1752
idx = _mod_index.InMemoryGraphIndex()
1753
adapter = _mod_index.GraphIndexPrefixAdapter(idx, (b'prefix', ), 1,
1705
idx = index.InMemoryGraphIndex()
1706
adapter = index.GraphIndexPrefixAdapter(idx, ('prefix', ), 1,
1756
1709
def test_iter_all_entries_cross_prefix_map_errors(self):
1757
1710
index, adapter = self.make_index(nodes=[
1758
((b'prefix', b'key1'), b'data1', (((b'prefixaltered', b'key2'),),))])
1759
self.assertRaises(_mod_index.BadIndexData, list,
1760
adapter.iter_all_entries())
1711
(('prefix', 'key1'), 'data1', ((('prefixaltered', 'key2'),),))])
1712
self.assertRaises(errors.BadIndexData, list, adapter.iter_all_entries())
1762
1714
def test_iter_all_entries(self):
1763
1715
index, adapter = self.make_index(nodes=[
1764
((b'notprefix', b'key1'), b'data', ((), )),
1765
((b'prefix', b'key1'), b'data1', ((), )),
1766
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1767
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1768
(index, (b'key2', ), b'data2', (((b'key1',),),))},
1769
set(adapter.iter_all_entries()))
1716
(('notprefix', 'key1'), 'data', ((), )),
1717
(('prefix', 'key1'), 'data1', ((), )),
1718
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1719
self.assertEqual({(index, ('key1', ), 'data1', ((),)),
1720
(index, ('key2', ), 'data2', ((('key1',),),))},
1721
set(adapter.iter_all_entries()))
1771
1723
def test_iter_entries(self):
1772
1724
index, adapter = self.make_index(nodes=[
1773
((b'notprefix', b'key1'), b'data', ((), )),
1774
((b'prefix', b'key1'), b'data1', ((), )),
1775
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1725
(('notprefix', 'key1'), 'data', ((), )),
1726
(('prefix', 'key1'), 'data1', ((), )),
1727
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1776
1728
# ask for many - get all
1777
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1778
(index, (b'key2', ), b'data2', (((b'key1', ),),))},
1779
set(adapter.iter_entries([(b'key1', ), (b'key2', )])))
1729
self.assertEqual({(index, ('key1', ), 'data1', ((),)),
1730
(index, ('key2', ), 'data2', ((('key1', ),),))},
1731
set(adapter.iter_entries([('key1', ), ('key2', )])))
1780
1732
# ask for one, get one
1781
self.assertEqual({(index, (b'key1', ), b'data1', ((),))},
1782
set(adapter.iter_entries([(b'key1', )])))
1733
self.assertEqual({(index, ('key1', ), 'data1', ((),))},
1734
set(adapter.iter_entries([('key1', )])))
1783
1735
# ask for missing, get none
1784
1736
self.assertEqual(set(),
1785
set(adapter.iter_entries([(b'key3', )])))
1737
set(adapter.iter_entries([('key3', )])))
1787
1739
def test_iter_entries_prefix(self):
1788
1740
index, adapter = self.make_index(key_elements=3, nodes=[
1789
((b'notprefix', b'foo', b'key1'), b'data', ((), )),
1790
((b'prefix', b'prefix2', b'key1'), b'data1', ((), )),
1791
((b'prefix', b'prefix2', b'key2'), b'data2', (((b'prefix', b'prefix2', b'key1'),),))])
1741
(('notprefix', 'foo', 'key1'), 'data', ((), )),
1742
(('prefix', 'prefix2', 'key1'), 'data1', ((), )),
1743
(('prefix', 'prefix2', 'key2'), 'data2', ((('prefix', 'prefix2', 'key1'),),))])
1792
1744
# ask for a prefix, get the results for just that prefix, adjusted.
1793
self.assertEqual({(index, (b'prefix2', b'key1', ), b'data1', ((),)),
1794
(index, (b'prefix2', b'key2', ), b'data2', (((b'prefix2', b'key1', ),),))},
1795
set(adapter.iter_entries_prefix([(b'prefix2', None)])))
1745
self.assertEqual({(index, ('prefix2', 'key1', ), 'data1', ((),)),
1746
(index, ('prefix2', 'key2', ), 'data2', ((('prefix2', 'key1', ),),))},
1747
set(adapter.iter_entries_prefix([('prefix2', None)])))
1797
1749
def test_key_count_no_matching_keys(self):
1798
1750
index, adapter = self.make_index(nodes=[
1799
((b'notprefix', b'key1'), b'data', ((), ))])
1751
(('notprefix', 'key1'), 'data', ((), ))])
1800
1752
self.assertEqual(0, adapter.key_count())
1802
1754
def test_key_count_some_keys(self):
1803
1755
index, adapter = self.make_index(nodes=[
1804
((b'notprefix', b'key1'), b'data', ((), )),
1805
((b'prefix', b'key1'), b'data1', ((), )),
1806
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1756
(('notprefix', 'key1'), 'data', ((), )),
1757
(('prefix', 'key1'), 'data1', ((), )),
1758
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1807
1759
self.assertEqual(2, adapter.key_count())
1809
1761
def test_validate(self):
1810
1762
index, adapter = self.make_index()
1813
1764
def validate():
1814
1765
calls.append('called')
1815
1766
index.validate = validate