bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2592.1.4
by Robert Collins
Create a GraphIndexBuilder. |
1 |
# Copyright (C) 2007 Canonical Ltd
|
2 |
#
|
|
3 |
# This program is free software; you can redistribute it and/or modify
|
|
4 |
# it under the terms of the GNU General Public License as published by
|
|
5 |
# the Free Software Foundation; either version 2 of the License, or
|
|
6 |
# (at your option) any later version.
|
|
7 |
#
|
|
8 |
# This program is distributed in the hope that it will be useful,
|
|
9 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11 |
# GNU General Public License for more details.
|
|
12 |
#
|
|
13 |
# You should have received a copy of the GNU General Public License
|
|
14 |
# along with this program; if not, write to the Free Software
|
|
15 |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
16 |
||
17 |
"""Tests for indices."""
|
|
18 |
||
2592.1.5
by Robert Collins
Trivial index reading. |
19 |
from bzrlib import errors |
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
20 |
from bzrlib.index import * |
2592.1.4
by Robert Collins
Create a GraphIndexBuilder. |
21 |
from bzrlib.tests import TestCaseWithMemoryTransport |
22 |
||
23 |
||
24 |
class TestGraphIndexBuilder(TestCaseWithMemoryTransport): |
|
25 |
||
26 |
def test_build_index_empty(self): |
|
27 |
builder = GraphIndexBuilder() |
|
28 |
stream = builder.finish() |
|
29 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
30 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n\n", contents) |
2592.1.6
by Robert Collins
Record the number of node reference lists a particular index has. |
31 |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
32 |
def test_build_index_empty_two_element_keys(self): |
33 |
builder = GraphIndexBuilder(key_elements=2) |
|
34 |
stream = builder.finish() |
|
35 |
contents = stream.read() |
|
36 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\n\n", contents) |
|
37 |
||
2592.1.6
by Robert Collins
Record the number of node reference lists a particular index has. |
38 |
def test_build_index_one_reference_list_empty(self): |
39 |
builder = GraphIndexBuilder(reference_lists=1) |
|
40 |
stream = builder.finish() |
|
41 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
42 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n\n", contents) |
2592.1.4
by Robert Collins
Create a GraphIndexBuilder. |
43 |
|
2592.1.10
by Robert Collins
Make validate detect node reference parsing errors. |
44 |
def test_build_index_two_reference_list_empty(self): |
45 |
builder = GraphIndexBuilder(reference_lists=2) |
|
46 |
stream = builder.finish() |
|
47 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
48 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\n\n", contents) |
2592.1.10
by Robert Collins
Make validate detect node reference parsing errors. |
49 |
|
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
50 |
def test_build_index_one_node_no_refs(self): |
51 |
builder = GraphIndexBuilder() |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
52 |
builder.add_node(('akey', ), 'data') |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
53 |
stream = builder.finish() |
54 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
55 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n" |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
56 |
"akey\x00\x00\x00data\n\n", contents) |
57 |
||
58 |
def test_build_index_one_node_no_refs_accepts_empty_reflist(self): |
|
59 |
builder = GraphIndexBuilder() |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
60 |
builder.add_node(('akey', ), 'data', ()) |
2592.1.12
by Robert Collins
Handle basic node adds. |
61 |
stream = builder.finish() |
62 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
63 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n" |
2592.1.43
by Robert Collins
Various index tweaks and test clarity from John's review. |
64 |
"akey\x00\x00\x00data\n\n", contents) |
2592.1.12
by Robert Collins
Handle basic node adds. |
65 |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
66 |
def test_build_index_one_node_2_element_keys(self): |
2624.2.11
by Robert Collins
Review comments. |
67 |
# multipart keys are separated by \x00 - because they are fixed length,
|
68 |
# not variable this does not cause any issues, and seems clearer to the
|
|
69 |
# author.
|
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
70 |
builder = GraphIndexBuilder(key_elements=2) |
71 |
builder.add_node(('akey', 'secondpart'), 'data') |
|
72 |
stream = builder.finish() |
|
73 |
contents = stream.read() |
|
74 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\n" |
|
75 |
"akey\x00secondpart\x00\x00\x00data\n\n", contents) |
|
76 |
||
2592.1.21
by Robert Collins
Empty values are ok. |
77 |
def test_add_node_empty_value(self): |
78 |
builder = GraphIndexBuilder() |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
79 |
builder.add_node(('akey', ), '') |
2592.1.21
by Robert Collins
Empty values are ok. |
80 |
stream = builder.finish() |
81 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
82 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n" |
2592.1.43
by Robert Collins
Various index tweaks and test clarity from John's review. |
83 |
"akey\x00\x00\x00\n\n", contents) |
2592.1.21
by Robert Collins
Empty values are ok. |
84 |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
85 |
def test_build_index_nodes_sorted(self): |
2592.1.17
by Robert Collins
Multi node sort order is defined. |
86 |
# the highest sorted node comes first.
|
87 |
builder = GraphIndexBuilder() |
|
88 |
# use three to have a good chance of glitching dictionary hash
|
|
89 |
# lookups etc. Insert in randomish order that is not correct
|
|
90 |
# and not the reverse of the correct order.
|
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
91 |
builder.add_node(('2002', ), 'data') |
92 |
builder.add_node(('2000', ), 'data') |
|
93 |
builder.add_node(('2001', ), 'data') |
|
2592.1.17
by Robert Collins
Multi node sort order is defined. |
94 |
stream = builder.finish() |
95 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
96 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n" |
2592.1.43
by Robert Collins
Various index tweaks and test clarity from John's review. |
97 |
"2000\x00\x00\x00data\n" |
98 |
"2001\x00\x00\x00data\n" |
|
99 |
"2002\x00\x00\x00data\n" |
|
2592.1.17
by Robert Collins
Multi node sort order is defined. |
100 |
"\n", contents) |
101 |
||
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
102 |
def test_build_index_2_element_key_nodes_sorted(self): |
103 |
# multiple element keys are sorted first-key, second-key.
|
|
104 |
builder = GraphIndexBuilder(key_elements=2) |
|
105 |
# use three values of each key element, to have a good chance of
|
|
106 |
# glitching dictionary hash lookups etc. Insert in randomish order that
|
|
107 |
# is not correct and not the reverse of the correct order.
|
|
108 |
builder.add_node(('2002', '2002'), 'data') |
|
109 |
builder.add_node(('2002', '2000'), 'data') |
|
110 |
builder.add_node(('2002', '2001'), 'data') |
|
111 |
builder.add_node(('2000', '2002'), 'data') |
|
112 |
builder.add_node(('2000', '2000'), 'data') |
|
113 |
builder.add_node(('2000', '2001'), 'data') |
|
114 |
builder.add_node(('2001', '2002'), 'data') |
|
115 |
builder.add_node(('2001', '2000'), 'data') |
|
116 |
builder.add_node(('2001', '2001'), 'data') |
|
117 |
stream = builder.finish() |
|
118 |
contents = stream.read() |
|
119 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\n" |
|
120 |
"2000\x002000\x00\x00\x00data\n" |
|
121 |
"2000\x002001\x00\x00\x00data\n" |
|
122 |
"2000\x002002\x00\x00\x00data\n" |
|
123 |
"2001\x002000\x00\x00\x00data\n" |
|
124 |
"2001\x002001\x00\x00\x00data\n" |
|
125 |
"2001\x002002\x00\x00\x00data\n" |
|
126 |
"2002\x002000\x00\x00\x00data\n" |
|
127 |
"2002\x002001\x00\x00\x00data\n" |
|
128 |
"2002\x002002\x00\x00\x00data\n" |
|
129 |
"\n", contents) |
|
130 |
||
2592.1.19
by Robert Collins
Node references are tab separated. |
131 |
def test_build_index_reference_lists_are_included_one(self): |
132 |
builder = GraphIndexBuilder(reference_lists=1) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
133 |
builder.add_node(('key', ), 'data', ([], )) |
2592.1.19
by Robert Collins
Node references are tab separated. |
134 |
stream = builder.finish() |
135 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
136 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n" |
2592.1.43
by Robert Collins
Various index tweaks and test clarity from John's review. |
137 |
"key\x00\x00\x00data\n" |
2592.1.19
by Robert Collins
Node references are tab separated. |
138 |
"\n", contents) |
139 |
||
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
140 |
def test_build_index_reference_lists_with_2_element_keys(self): |
141 |
builder = GraphIndexBuilder(reference_lists=1, key_elements=2) |
|
142 |
builder.add_node(('key', 'key2'), 'data', ([], )) |
|
143 |
stream = builder.finish() |
|
144 |
contents = stream.read() |
|
145 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=2\n" |
|
146 |
"key\x00key2\x00\x00\x00data\n" |
|
147 |
"\n", contents) |
|
148 |
||
2592.1.19
by Robert Collins
Node references are tab separated. |
149 |
def test_build_index_reference_lists_are_included_two(self): |
150 |
builder = GraphIndexBuilder(reference_lists=2) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
151 |
builder.add_node(('key', ), 'data', ([], [])) |
2592.1.19
by Robert Collins
Node references are tab separated. |
152 |
stream = builder.finish() |
153 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
154 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\n" |
2592.1.43
by Robert Collins
Various index tweaks and test clarity from John's review. |
155 |
"key\x00\x00\t\x00data\n" |
2592.1.19
by Robert Collins
Node references are tab separated. |
156 |
"\n", contents) |
157 |
||
2592.1.22
by Robert Collins
Node references are byte offsets. |
158 |
def test_node_references_are_byte_offsets(self): |
159 |
builder = GraphIndexBuilder(reference_lists=1) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
160 |
builder.add_node(('reference', ), 'data', ([], )) |
161 |
builder.add_node(('key', ), 'data', ([('reference', )], )) |
|
2592.1.22
by Robert Collins
Node references are byte offsets. |
162 |
stream = builder.finish() |
163 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
164 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n" |
165 |
"key\x00\x0066\x00data\n" |
|
2592.1.40
by Robert Collins
Reverse index ordering - we do not have date prefixed revids. |
166 |
"reference\x00\x00\x00data\n" |
2592.1.22
by Robert Collins
Node references are byte offsets. |
167 |
"\n", contents) |
168 |
||
2592.1.23
by Robert Collins
node reference delimiting tested. |
169 |
def test_node_references_are_cr_delimited(self): |
170 |
builder = GraphIndexBuilder(reference_lists=1) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
171 |
builder.add_node(('reference', ), 'data', ([], )) |
172 |
builder.add_node(('reference2', ), 'data', ([], )) |
|
173 |
builder.add_node(('key', ), 'data', ([('reference', ), ('reference2', )], )) |
|
2592.1.23
by Robert Collins
node reference delimiting tested. |
174 |
stream = builder.finish() |
175 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
176 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n" |
177 |
"key\x00\x00071\r088\x00data\n" |
|
2592.1.43
by Robert Collins
Various index tweaks and test clarity from John's review. |
178 |
"reference\x00\x00\x00data\n" |
179 |
"reference2\x00\x00\x00data\n" |
|
2592.1.23
by Robert Collins
node reference delimiting tested. |
180 |
"\n", contents) |
181 |
||
2592.1.24
by Robert Collins
Delimiting of multiple reference lists is by \t |
182 |
def test_multiple_reference_lists_are_tab_delimited(self): |
183 |
builder = GraphIndexBuilder(reference_lists=2) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
184 |
builder.add_node(('keference', ), 'data', ([], [])) |
185 |
builder.add_node(('rey', ), 'data', ([('keference', )], [('keference', )])) |
|
2592.1.24
by Robert Collins
Delimiting of multiple reference lists is by \t |
186 |
stream = builder.finish() |
187 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
188 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\n" |
2592.1.43
by Robert Collins
Various index tweaks and test clarity from John's review. |
189 |
"keference\x00\x00\t\x00data\n" |
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
190 |
"rey\x00\x0053\t53\x00data\n" |
2592.1.24
by Robert Collins
Delimiting of multiple reference lists is by \t |
191 |
"\n", contents) |
192 |
||
2592.1.25
by Robert Collins
Fix and tune node offset calculation. |
193 |
def test_add_node_referencing_missing_key_makes_absent(self): |
194 |
builder = GraphIndexBuilder(reference_lists=1) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
195 |
builder.add_node(('rey', ), 'data', ([('beference', ), ('aeference2', )], )) |
2592.1.25
by Robert Collins
Fix and tune node offset calculation. |
196 |
stream = builder.finish() |
197 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
198 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n" |
2592.1.43
by Robert Collins
Various index tweaks and test clarity from John's review. |
199 |
"aeference2\x00a\x00\x00\n" |
200 |
"beference\x00a\x00\x00\n" |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
201 |
"rey\x00\x0068\r53\x00data\n" |
2592.1.25
by Robert Collins
Fix and tune node offset calculation. |
202 |
"\n", contents) |
203 |
||
2592.1.26
by Robert Collins
Test digit buffering is accurate. |
204 |
def test_node_references_three_digits(self): |
205 |
# test the node digit expands as needed.
|
|
206 |
builder = GraphIndexBuilder(reference_lists=1) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
207 |
references = [(str(val), ) for val in reversed(range(9))] |
208 |
builder.add_node(('2-key', ), '', (references, )) |
|
2592.1.26
by Robert Collins
Test digit buffering is accurate. |
209 |
stream = builder.finish() |
210 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
211 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n" |
2592.1.40
by Robert Collins
Reverse index ordering - we do not have date prefixed revids. |
212 |
"0\x00a\x00\x00\n" |
213 |
"1\x00a\x00\x00\n" |
|
214 |
"2\x00a\x00\x00\n" |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
215 |
"2-key\x00\x00145\r139\r133\r127\r121\r115\r065\r059\r053\x00\n" |
2592.1.40
by Robert Collins
Reverse index ordering - we do not have date prefixed revids. |
216 |
"3\x00a\x00\x00\n" |
217 |
"4\x00a\x00\x00\n" |
|
218 |
"5\x00a\x00\x00\n" |
|
219 |
"6\x00a\x00\x00\n" |
|
220 |
"7\x00a\x00\x00\n" |
|
2592.1.26
by Robert Collins
Test digit buffering is accurate. |
221 |
"8\x00a\x00\x00\n" |
2592.1.40
by Robert Collins
Reverse index ordering - we do not have date prefixed revids. |
222 |
"\n", contents) |
223 |
||
224 |
def test_absent_has_no_reference_overhead(self): |
|
225 |
# the offsets after an absent record should be correct when there are
|
|
226 |
# >1 reference lists.
|
|
227 |
builder = GraphIndexBuilder(reference_lists=2) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
228 |
builder.add_node(('parent', ), '', ([('aail', ), ('zther', )], [])) |
2592.1.40
by Robert Collins
Reverse index ordering - we do not have date prefixed revids. |
229 |
stream = builder.finish() |
230 |
contents = stream.read() |
|
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
231 |
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\n" |
2592.1.40
by Robert Collins
Reverse index ordering - we do not have date prefixed revids. |
232 |
"aail\x00a\x00\x00\n" |
2624.2.8
by Robert Collins
Explicitly mark the number of keys elements in use in GraphIndex files. |
233 |
"parent\x00\x0053\r78\t\x00\n" |
2592.1.40
by Robert Collins
Reverse index ordering - we do not have date prefixed revids. |
234 |
"zther\x00a\x00\x00\n" |
2592.1.26
by Robert Collins
Test digit buffering is accurate. |
235 |
"\n", contents) |
236 |
||
2592.1.13
by Robert Collins
Handle mismatched numbers of reference lists. |
237 |
def test_add_node_bad_key(self): |
2592.1.12
by Robert Collins
Handle basic node adds. |
238 |
builder = GraphIndexBuilder() |
2592.1.14
by Robert Collins
Detect bad reference key values. |
239 |
for bad_char in '\t\n\x0b\x0c\r\x00 ': |
240 |
self.assertRaises(errors.BadIndexKey, builder.add_node, |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
241 |
('a%skey' % bad_char, ), 'data') |
242 |
self.assertRaises(errors.BadIndexKey, builder.add_node, |
|
243 |
('', ), 'data') |
|
244 |
self.assertRaises(errors.BadIndexKey, builder.add_node, |
|
245 |
'not-a-tuple', 'data') |
|
246 |
# not enough length
|
|
247 |
self.assertRaises(errors.BadIndexKey, builder.add_node, |
|
248 |
(), 'data') |
|
249 |
# too long
|
|
250 |
self.assertRaises(errors.BadIndexKey, builder.add_node, |
|
251 |
('primary', 'secondary'), 'data') |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
252 |
# secondary key elements get checked too:
|
253 |
builder = GraphIndexBuilder(key_elements=2) |
|
254 |
for bad_char in '\t\n\x0b\x0c\r\x00 ': |
|
255 |
self.assertRaises(errors.BadIndexKey, builder.add_node, |
|
256 |
('prefix', 'a%skey' % bad_char), 'data') |
|
2592.1.12
by Robert Collins
Handle basic node adds. |
257 |
|
2592.1.13
by Robert Collins
Handle mismatched numbers of reference lists. |
258 |
def test_add_node_bad_data(self): |
2592.1.12
by Robert Collins
Handle basic node adds. |
259 |
builder = GraphIndexBuilder() |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
260 |
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
261 |
'data\naa') |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
262 |
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
263 |
'data\x00aa') |
2592.1.12
by Robert Collins
Handle basic node adds. |
264 |
|
2592.1.13
by Robert Collins
Handle mismatched numbers of reference lists. |
265 |
def test_add_node_bad_mismatched_ref_lists_length(self): |
266 |
builder = GraphIndexBuilder() |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
267 |
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
268 |
'data aa', ([], )) |
2592.1.13
by Robert Collins
Handle mismatched numbers of reference lists. |
269 |
builder = GraphIndexBuilder(reference_lists=1) |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
270 |
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
271 |
'data aa') |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
272 |
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
273 |
'data aa', (), ) |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
274 |
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
275 |
'data aa', ([], [])) |
2592.1.13
by Robert Collins
Handle mismatched numbers of reference lists. |
276 |
builder = GraphIndexBuilder(reference_lists=2) |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
277 |
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
278 |
'data aa') |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
279 |
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
280 |
'data aa', ([], )) |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
281 |
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
282 |
'data aa', ([], [], [])) |
2592.1.13
by Robert Collins
Handle mismatched numbers of reference lists. |
283 |
|
2592.1.14
by Robert Collins
Detect bad reference key values. |
284 |
def test_add_node_bad_key_in_reference_lists(self): |
285 |
# first list, first key - trivial
|
|
286 |
builder = GraphIndexBuilder(reference_lists=1) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
287 |
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ), |
288 |
'data aa', ([('a key', )], )) |
|
289 |
# references keys must be tuples too
|
|
290 |
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ), |
|
291 |
'data aa', (['not-a-tuple'], )) |
|
292 |
# not enough length
|
|
293 |
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ), |
|
294 |
'data aa', ([()], )) |
|
295 |
# too long
|
|
296 |
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ), |
|
297 |
'data aa', ([('primary', 'secondary')], )) |
|
2592.1.14
by Robert Collins
Detect bad reference key values. |
298 |
# need to check more than the first key in the list
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
299 |
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ), |
300 |
'data aa', ([('agoodkey', ), ('that is a bad key', )], )) |
|
2592.1.14
by Robert Collins
Detect bad reference key values. |
301 |
# and if there is more than one list it should be getting checked
|
302 |
# too
|
|
303 |
builder = GraphIndexBuilder(reference_lists=2) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
304 |
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ), |
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
305 |
'data aa', ([], ['a bad key'])) |
2592.1.14
by Robert Collins
Detect bad reference key values. |
306 |
|
2592.1.15
by Robert Collins
Detect duplicate key insertion. |
307 |
def test_add_duplicate_key(self): |
308 |
builder = GraphIndexBuilder() |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
309 |
builder.add_node(('key', ), 'data') |
310 |
self.assertRaises(errors.BadIndexDuplicateKey, builder.add_node, ('key', ), |
|
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
311 |
'data') |
2592.1.15
by Robert Collins
Detect duplicate key insertion. |
312 |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
313 |
def test_add_duplicate_key_2_elements(self): |
314 |
builder = GraphIndexBuilder(key_elements=2) |
|
315 |
builder.add_node(('key', 'key'), 'data') |
|
316 |
self.assertRaises(errors.BadIndexDuplicateKey, builder.add_node, |
|
317 |
('key', 'key'), 'data') |
|
318 |
||
2592.1.16
by Robert Collins
Can add keys after referencing them. |
319 |
def test_add_key_after_referencing_key(self): |
320 |
builder = GraphIndexBuilder(reference_lists=1) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
321 |
builder.add_node(('key', ), 'data', ([('reference', )], )) |
322 |
builder.add_node(('reference', ), 'data', ([],)) |
|
2592.1.16
by Robert Collins
Can add keys after referencing them. |
323 |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
324 |
def test_add_key_after_referencing_key_2_elements(self): |
325 |
builder = GraphIndexBuilder(reference_lists=1, key_elements=2) |
|
326 |
builder.add_node(('k', 'ey'), 'data', ([('reference', 'tokey')], )) |
|
327 |
builder.add_node(('reference', 'tokey'), 'data', ([],)) |
|
328 |
||
2592.1.5
by Robert Collins
Trivial index reading. |
329 |
|
330 |
class TestGraphIndex(TestCaseWithMemoryTransport): |
|
331 |
||
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
332 |
def make_index(self, ref_lists=0, key_elements=1, nodes=[]): |
333 |
builder = GraphIndexBuilder(ref_lists, key_elements=key_elements) |
|
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
334 |
for node, value, references in nodes: |
335 |
builder.add_node(node, value, references) |
|
2592.1.5
by Robert Collins
Trivial index reading. |
336 |
stream = builder.finish() |
337 |
trans = self.get_transport() |
|
2592.1.6
by Robert Collins
Record the number of node reference lists a particular index has. |
338 |
trans.put_file('index', stream) |
2592.1.5
by Robert Collins
Trivial index reading. |
339 |
return GraphIndex(trans, 'index') |
340 |
||
2592.1.7
by Robert Collins
A validate that goes boom. |
341 |
def test_open_bad_index_no_error(self): |
342 |
trans = self.get_transport() |
|
343 |
trans.put_bytes('name', "not an index\n") |
|
344 |
index = GraphIndex(trans, 'name') |
|
345 |
||
2592.1.5
by Robert Collins
Trivial index reading. |
346 |
def test_iter_all_entries_empty(self): |
347 |
index = self.make_index() |
|
348 |
self.assertEqual([], list(index.iter_all_entries())) |
|
349 |
||
2592.1.27
by Robert Collins
Test missing end lines with non-empty indices. |
350 |
def test_iter_all_entries_simple(self): |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
351 |
index = self.make_index(nodes=[(('name', ), 'data', ())]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
352 |
self.assertEqual([(index, ('name', ), 'data')], |
2592.1.27
by Robert Collins
Test missing end lines with non-empty indices. |
353 |
list(index.iter_all_entries())) |
354 |
||
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
355 |
def test_iter_all_entries_simple_2_elements(self): |
356 |
index = self.make_index(key_elements=2, |
|
357 |
nodes=[(('name', 'surname'), 'data', ())]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
358 |
self.assertEqual([(index, ('name', 'surname'), 'data')], |
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
359 |
list(index.iter_all_entries())) |
360 |
||
2592.1.28
by Robert Collins
Basic two pass iter_all_entries. |
361 |
def test_iter_all_entries_references_resolved(self): |
362 |
index = self.make_index(1, nodes=[ |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
363 |
(('name', ), 'data', ([('ref', )], )), |
364 |
(('ref', ), 'refdata', ([], ))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
365 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),)), |
366 |
(index, ('ref', ), 'refdata', ((), ))]), |
|
2592.1.28
by Robert Collins
Basic two pass iter_all_entries. |
367 |
set(index.iter_all_entries())) |
368 |
||
2592.1.30
by Robert Collins
Absent entries are not yeilded. |
369 |
def test_iteration_absent_skipped(self): |
370 |
index = self.make_index(1, nodes=[ |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
371 |
(('name', ), 'data', ([('ref', )], ))]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
372 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),))]), |
2592.1.30
by Robert Collins
Absent entries are not yeilded. |
373 |
set(index.iter_all_entries())) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
374 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),))]), |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
375 |
set(index.iter_entries([('name', )]))) |
376 |
self.assertEqual([], list(index.iter_entries([('ref', )]))) |
|
2592.1.30
by Robert Collins
Absent entries are not yeilded. |
377 |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
378 |
def test_iteration_absent_skipped_2_element_keys(self): |
379 |
index = self.make_index(1, key_elements=2, nodes=[ |
|
380 |
(('name', 'fin'), 'data', ([('ref', 'erence')], ))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
381 |
self.assertEqual(set([(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))]), |
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
382 |
set(index.iter_all_entries())) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
383 |
self.assertEqual(set([(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))]), |
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
384 |
set(index.iter_entries([('name', 'fin')]))) |
385 |
self.assertEqual([], list(index.iter_entries([('ref', 'erence')]))) |
|
386 |
||
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
387 |
def test_iter_all_keys(self): |
2592.1.29
by Robert Collins
Basic iter_entries working. |
388 |
index = self.make_index(1, nodes=[ |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
389 |
(('name', ), 'data', ([('ref', )], )), |
390 |
(('ref', ), 'refdata', ([], ))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
391 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),)), |
392 |
(index, ('ref', ), 'refdata', ((), ))]), |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
393 |
set(index.iter_entries([('name', ), ('ref', )]))) |
2592.1.29
by Robert Collins
Basic iter_entries working. |
394 |
|
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
395 |
def test_iter_nothing_empty(self): |
2592.1.9
by Robert Collins
Iterating no keys should work too. |
396 |
index = self.make_index() |
397 |
self.assertEqual([], list(index.iter_entries([]))) |
|
398 |
||
2592.1.5
by Robert Collins
Trivial index reading. |
399 |
def test_iter_missing_entry_empty(self): |
400 |
index = self.make_index() |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
401 |
self.assertEqual([], list(index.iter_entries([('a', )]))) |
2592.1.7
by Robert Collins
A validate that goes boom. |
402 |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
403 |
def test_iter_key_prefix_1_element_key_None(self): |
404 |
index = self.make_index() |
|
405 |
self.assertRaises(errors.BadIndexKey, list, |
|
406 |
index.iter_entries_prefix([(None, )])) |
|
407 |
||
408 |
def test_iter_key_prefix_wrong_length(self): |
|
409 |
index = self.make_index() |
|
410 |
self.assertRaises(errors.BadIndexKey, list, |
|
411 |
index.iter_entries_prefix([('foo', None)])) |
|
412 |
index = self.make_index(key_elements=2) |
|
413 |
self.assertRaises(errors.BadIndexKey, list, |
|
414 |
index.iter_entries_prefix([('foo', )])) |
|
415 |
self.assertRaises(errors.BadIndexKey, list, |
|
416 |
index.iter_entries_prefix([('foo', None, None)])) |
|
417 |
||
418 |
def test_iter_key_prefix_1_key_element_no_refs(self): |
|
419 |
index = self.make_index( nodes=[ |
|
420 |
(('name', ), 'data', ()), |
|
421 |
(('ref', ), 'refdata', ())]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
422 |
self.assertEqual(set([(index, ('name', ), 'data'), |
423 |
(index, ('ref', ), 'refdata')]), |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
424 |
set(index.iter_entries_prefix([('name', ), ('ref', )]))) |
425 |
||
426 |
def test_iter_key_prefix_1_key_element_refs(self): |
|
427 |
index = self.make_index(1, nodes=[ |
|
428 |
(('name', ), 'data', ([('ref', )], )), |
|
429 |
(('ref', ), 'refdata', ([], ))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
430 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),)), |
431 |
(index, ('ref', ), 'refdata', ((), ))]), |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
432 |
set(index.iter_entries_prefix([('name', ), ('ref', )]))) |
433 |
||
434 |
def test_iter_key_prefix_2_key_element_no_refs(self): |
|
435 |
index = self.make_index(key_elements=2, nodes=[ |
|
436 |
(('name', 'fin1'), 'data', ()), |
|
437 |
(('name', 'fin2'), 'beta', ()), |
|
438 |
(('ref', 'erence'), 'refdata', ())]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
439 |
self.assertEqual(set([(index, ('name', 'fin1'), 'data'), |
440 |
(index, ('ref', 'erence'), 'refdata')]), |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
441 |
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')]))) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
442 |
self.assertEqual(set([(index, ('name', 'fin1'), 'data'), |
443 |
(index, ('name', 'fin2'), 'beta')]), |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
444 |
set(index.iter_entries_prefix([('name', None)]))) |
445 |
||
446 |
def test_iter_key_prefix_2_key_element_refs(self): |
|
447 |
index = self.make_index(1, key_elements=2, nodes=[ |
|
448 |
(('name', 'fin1'), 'data', ([('ref', 'erence')], )), |
|
449 |
(('name', 'fin2'), 'beta', ([], )), |
|
450 |
(('ref', 'erence'), 'refdata', ([], ))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
451 |
self.assertEqual(set([(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)), |
452 |
(index, ('ref', 'erence'), 'refdata', ((), ))]), |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
453 |
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')]))) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
454 |
self.assertEqual(set([(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)), |
455 |
(index, ('name', 'fin2'), 'beta', ((), ))]), |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
456 |
set(index.iter_entries_prefix([('name', None)]))) |
457 |
||
2592.1.7
by Robert Collins
A validate that goes boom. |
458 |
def test_validate_bad_index_errors(self): |
459 |
trans = self.get_transport() |
|
460 |
trans.put_bytes('name', "not an index\n") |
|
461 |
index = GraphIndex(trans, 'name') |
|
462 |
self.assertRaises(errors.BadIndexFormatSignature, index.validate) |
|
2592.1.8
by Robert Collins
Empty files should validate ok. |
463 |
|
2592.1.10
by Robert Collins
Make validate detect node reference parsing errors. |
464 |
def test_validate_bad_node_refs(self): |
465 |
index = self.make_index(2) |
|
466 |
trans = self.get_transport() |
|
467 |
content = trans.get_bytes('index') |
|
468 |
# change the options line to end with a rather than a parseable number
|
|
469 |
new_content = content[:-2] + 'a\n\n' |
|
470 |
trans.put_bytes('index', new_content) |
|
471 |
self.assertRaises(errors.BadIndexOptions, index.validate) |
|
472 |
||
2592.1.27
by Robert Collins
Test missing end lines with non-empty indices. |
473 |
def test_validate_missing_end_line_empty(self): |
2592.1.11
by Robert Collins
Detect truncated indices. |
474 |
index = self.make_index(2) |
475 |
trans = self.get_transport() |
|
476 |
content = trans.get_bytes('index') |
|
477 |
# truncate the last byte
|
|
478 |
trans.put_bytes('index', content[:-1]) |
|
479 |
self.assertRaises(errors.BadIndexData, index.validate) |
|
480 |
||
2592.1.27
by Robert Collins
Test missing end lines with non-empty indices. |
481 |
def test_validate_missing_end_line_nonempty(self): |
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
482 |
index = self.make_index(2, nodes=[(('key', ), '', ([], []))]) |
2592.1.27
by Robert Collins
Test missing end lines with non-empty indices. |
483 |
trans = self.get_transport() |
484 |
content = trans.get_bytes('index') |
|
485 |
# truncate the last byte
|
|
486 |
trans.put_bytes('index', content[:-1]) |
|
487 |
self.assertRaises(errors.BadIndexData, index.validate) |
|
488 |
||
2592.1.8
by Robert Collins
Empty files should validate ok. |
489 |
def test_validate_empty(self): |
490 |
index = self.make_index() |
|
491 |
index.validate() |
|
2592.1.12
by Robert Collins
Handle basic node adds. |
492 |
|
493 |
def test_validate_no_refs_content(self): |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
494 |
index = self.make_index(nodes=[(('key', ), 'value', ())]) |
2592.1.12
by Robert Collins
Handle basic node adds. |
495 |
index.validate() |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
496 |
|
497 |
||
498 |
class TestCombinedGraphIndex(TestCaseWithMemoryTransport): |
|
499 |
||
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
500 |
def make_index(self, name, ref_lists=0, key_elements=1, nodes=[]): |
501 |
builder = GraphIndexBuilder(ref_lists, key_elements=key_elements) |
|
2592.1.46
by Robert Collins
Make GraphIndex accept nodes as key, value, references, so that the method |
502 |
for node, value, references in nodes: |
503 |
builder.add_node(node, value, references) |
|
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
504 |
stream = builder.finish() |
505 |
trans = self.get_transport() |
|
506 |
trans.put_file(name, stream) |
|
507 |
return GraphIndex(trans, name) |
|
508 |
||
509 |
def test_open_missing_index_no_error(self): |
|
510 |
trans = self.get_transport() |
|
511 |
index1 = GraphIndex(trans, 'missing') |
|
512 |
index = CombinedGraphIndex([index1]) |
|
513 |
||
2592.1.37
by Robert Collins
Add CombinedGraphIndex.insert_index. |
514 |
def test_add_index(self): |
515 |
index = CombinedGraphIndex([]) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
516 |
index1 = self.make_index('name', 0, nodes=[(('key', ), '', ())]) |
2592.1.37
by Robert Collins
Add CombinedGraphIndex.insert_index. |
517 |
index.insert_index(0, index1) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
518 |
self.assertEqual([(index1, ('key', ), '')], list(index.iter_all_entries())) |
2592.1.37
by Robert Collins
Add CombinedGraphIndex.insert_index. |
519 |
|
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
520 |
def test_iter_all_entries_empty(self): |
521 |
index = CombinedGraphIndex([]) |
|
522 |
self.assertEqual([], list(index.iter_all_entries())) |
|
523 |
||
524 |
def test_iter_all_entries_children_empty(self): |
|
525 |
index1 = self.make_index('name') |
|
526 |
index = CombinedGraphIndex([index1]) |
|
527 |
self.assertEqual([], list(index.iter_all_entries())) |
|
528 |
||
529 |
def test_iter_all_entries_simple(self): |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
530 |
index1 = self.make_index('name', nodes=[(('name', ), 'data', ())]) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
531 |
index = CombinedGraphIndex([index1]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
532 |
self.assertEqual([(index1, ('name', ), 'data')], |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
533 |
list(index.iter_all_entries())) |
534 |
||
535 |
def test_iter_all_entries_two_indices(self): |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
536 |
index1 = self.make_index('name1', nodes=[(('name', ), 'data', ())]) |
537 |
index2 = self.make_index('name2', nodes=[(('2', ), '', ())]) |
|
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
538 |
index = CombinedGraphIndex([index1, index2]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
539 |
self.assertEqual([(index1, ('name', ), 'data'), |
540 |
(index2, ('2', ), '')], |
|
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
541 |
list(index.iter_all_entries())) |
542 |
||
2592.1.39
by Robert Collins
CombinedGraphIndex.iter_entries does not need to see all entries. |
543 |
def test_iter_entries_two_indices_dup_key(self): |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
544 |
index1 = self.make_index('name1', nodes=[(('name', ), 'data', ())]) |
545 |
index2 = self.make_index('name2', nodes=[(('name', ), 'data', ())]) |
|
2592.1.39
by Robert Collins
CombinedGraphIndex.iter_entries does not need to see all entries. |
546 |
index = CombinedGraphIndex([index1, index2]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
547 |
self.assertEqual([(index1, ('name', ), 'data')], |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
548 |
list(index.iter_entries([('name', )]))) |
2592.1.39
by Robert Collins
CombinedGraphIndex.iter_entries does not need to see all entries. |
549 |
|
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
550 |
def test_iter_all_entries_two_indices_dup_key(self): |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
551 |
index1 = self.make_index('name1', nodes=[(('name', ), 'data', ())]) |
552 |
index2 = self.make_index('name2', nodes=[(('name', ), 'data', ())]) |
|
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
553 |
index = CombinedGraphIndex([index1, index2]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
554 |
self.assertEqual([(index1, ('name', ), 'data')], |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
555 |
list(index.iter_all_entries())) |
556 |
||
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
557 |
def test_iter_key_prefix_2_key_element_refs(self): |
558 |
index1 = self.make_index('1', 1, key_elements=2, nodes=[ |
|
559 |
(('name', 'fin1'), 'data', ([('ref', 'erence')], ))]) |
|
560 |
index2 = self.make_index('2', 1, key_elements=2, nodes=[ |
|
561 |
(('name', 'fin2'), 'beta', ([], )), |
|
562 |
(('ref', 'erence'), 'refdata', ([], ))]) |
|
563 |
index = CombinedGraphIndex([index1, index2]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
564 |
self.assertEqual(set([(index1, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)), |
565 |
(index2, ('ref', 'erence'), 'refdata', ((), ))]), |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
566 |
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')]))) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
567 |
self.assertEqual(set([(index1, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)), |
568 |
(index2, ('name', 'fin2'), 'beta', ((), ))]), |
|
2624.2.9
by Robert Collins
Introduce multiple component keys, which is what is needed to combine multiple knit indices into one. |
569 |
set(index.iter_entries_prefix([('name', None)]))) |
570 |
||
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
571 |
def test_iter_nothing_empty(self): |
572 |
index = CombinedGraphIndex([]) |
|
573 |
self.assertEqual([], list(index.iter_entries([]))) |
|
574 |
||
575 |
def test_iter_nothing_children_empty(self): |
|
576 |
index1 = self.make_index('name') |
|
577 |
index = CombinedGraphIndex([index1]) |
|
578 |
self.assertEqual([], list(index.iter_entries([]))) |
|
579 |
||
580 |
def test_iter_all_keys(self): |
|
581 |
index1 = self.make_index('1', 1, nodes=[ |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
582 |
(('name', ), 'data', ([('ref', )], ))]) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
583 |
index2 = self.make_index('2', 1, nodes=[ |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
584 |
(('ref', ), 'refdata', ((), ))]) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
585 |
index = CombinedGraphIndex([index1, index2]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
586 |
self.assertEqual(set([(index1, ('name', ), 'data', ((('ref', ), ), )), |
587 |
(index2, ('ref', ), 'refdata', ((), ))]), |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
588 |
set(index.iter_entries([('name', ), ('ref', )]))) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
589 |
|
590 |
def test_iter_all_keys_dup_entry(self): |
|
591 |
index1 = self.make_index('1', 1, nodes=[ |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
592 |
(('name', ), 'data', ([('ref', )], )), |
593 |
(('ref', ), 'refdata', ([], ))]) |
|
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
594 |
index2 = self.make_index('2', 1, nodes=[ |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
595 |
(('ref', ), 'refdata', ([], ))]) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
596 |
index = CombinedGraphIndex([index1, index2]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
597 |
self.assertEqual(set([(index1, ('name', ), 'data', ((('ref',),),)), |
598 |
(index1, ('ref', ), 'refdata', ((), ))]), |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
599 |
set(index.iter_entries([('name', ), ('ref', )]))) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
600 |
|
601 |
def test_iter_missing_entry_empty(self): |
|
602 |
index = CombinedGraphIndex([]) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
603 |
self.assertEqual([], list(index.iter_entries([('a', )]))) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
604 |
|
605 |
def test_iter_missing_entry_one_index(self): |
|
606 |
index1 = self.make_index('1') |
|
607 |
index = CombinedGraphIndex([index1]) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
608 |
self.assertEqual([], list(index.iter_entries([('a', )]))) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
609 |
|
610 |
def test_iter_missing_entry_two_index(self): |
|
611 |
index1 = self.make_index('1') |
|
612 |
index2 = self.make_index('2') |
|
613 |
index = CombinedGraphIndex([index1, index2]) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
614 |
self.assertEqual([], list(index.iter_entries([('a', )]))) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
615 |
|
616 |
def test_iter_entry_present_one_index_only(self): |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
617 |
index1 = self.make_index('1', nodes=[(('key', ), '', ())]) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
618 |
index2 = self.make_index('2', nodes=[]) |
619 |
index = CombinedGraphIndex([index1, index2]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
620 |
self.assertEqual([(index1, ('key', ), '')], |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
621 |
list(index.iter_entries([('key', )]))) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
622 |
# and in the other direction
|
623 |
index = CombinedGraphIndex([index2, index1]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
624 |
self.assertEqual([(index1, ('key', ), '')], |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
625 |
list(index.iter_entries([('key', )]))) |
2592.1.31
by Robert Collins
Build a combined graph index to use multiple indices at once. |
626 |
|
627 |
def test_validate_bad_child_index_errors(self): |
|
628 |
trans = self.get_transport() |
|
629 |
trans.put_bytes('name', "not an index\n") |
|
630 |
index1 = GraphIndex(trans, 'name') |
|
631 |
index = CombinedGraphIndex([index1]) |
|
632 |
self.assertRaises(errors.BadIndexFormatSignature, index.validate) |
|
633 |
||
634 |
def test_validate_empty(self): |
|
635 |
index = CombinedGraphIndex([]) |
|
636 |
index.validate() |
|
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
637 |
|
638 |
||
639 |
class TestInMemoryGraphIndex(TestCaseWithMemoryTransport): |
|
640 |
||
2624.2.10
by Robert Collins
Also add iter_key_prefix support to InMemoryGraphIndex. |
641 |
def make_index(self, ref_lists=0, key_elements=1, nodes=[]): |
642 |
result = InMemoryGraphIndex(ref_lists, key_elements=key_elements) |
|
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
643 |
result.add_nodes(nodes) |
644 |
return result |
|
645 |
||
2624.2.1
by Robert Collins
InMemoryGraphIndex.add_nodes was inconsistent with other metods for non-node-reference indices. |
646 |
def test_add_nodes_no_refs(self): |
647 |
index = self.make_index(0) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
648 |
index.add_nodes([(('name', ), 'data')]) |
649 |
index.add_nodes([(('name2', ), ''), (('name3', ), '')]) |
|
2624.2.1
by Robert Collins
InMemoryGraphIndex.add_nodes was inconsistent with other metods for non-node-reference indices. |
650 |
self.assertEqual(set([ |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
651 |
(index, ('name', ), 'data'), |
652 |
(index, ('name2', ), ''), |
|
653 |
(index, ('name3', ), ''), |
|
2624.2.1
by Robert Collins
InMemoryGraphIndex.add_nodes was inconsistent with other metods for non-node-reference indices. |
654 |
]), set(index.iter_all_entries())) |
655 |
||
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
656 |
def test_add_nodes(self): |
657 |
index = self.make_index(1) |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
658 |
index.add_nodes([(('name', ), 'data', ([],))]) |
659 |
index.add_nodes([(('name2', ), '', ([],)), (('name3', ), '', ([('r', )],))]) |
|
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
660 |
self.assertEqual(set([ |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
661 |
(index, ('name', ), 'data', ((),)), |
662 |
(index, ('name2', ), '', ((),)), |
|
663 |
(index, ('name3', ), '', ((('r', ), ), )), |
|
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
664 |
]), set(index.iter_all_entries())) |
665 |
||
666 |
def test_iter_all_entries_empty(self): |
|
667 |
index = self.make_index() |
|
668 |
self.assertEqual([], list(index.iter_all_entries())) |
|
669 |
||
670 |
def test_iter_all_entries_simple(self): |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
671 |
index = self.make_index(nodes=[(('name', ), 'data')]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
672 |
self.assertEqual([(index, ('name', ), 'data')], |
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
673 |
list(index.iter_all_entries())) |
674 |
||
675 |
def test_iter_all_entries_references(self): |
|
676 |
index = self.make_index(1, nodes=[ |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
677 |
(('name', ), 'data', ([('ref', )], )), |
678 |
(('ref', ), 'refdata', ([], ))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
679 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref', ),),)), |
680 |
(index, ('ref', ), 'refdata', ((), ))]), |
|
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
681 |
set(index.iter_all_entries())) |
682 |
||
683 |
def test_iteration_absent_skipped(self): |
|
684 |
index = self.make_index(1, nodes=[ |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
685 |
(('name', ), 'data', ([('ref', )], ))]) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
686 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),))]), |
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
687 |
set(index.iter_all_entries())) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
688 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),))]), |
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
689 |
set(index.iter_entries([('name', )]))) |
690 |
self.assertEqual([], list(index.iter_entries([('ref', )]))) |
|
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
691 |
|
692 |
def test_iter_all_keys(self): |
|
693 |
index = self.make_index(1, nodes=[ |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
694 |
(('name', ), 'data', ([('ref', )], )), |
695 |
(('ref', ), 'refdata', ([], ))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
696 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),)), |
697 |
(index, ('ref', ), 'refdata', ((), ))]), |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
698 |
set(index.iter_entries([('name', ), ('ref', )]))) |
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
699 |
|
2624.2.10
by Robert Collins
Also add iter_key_prefix support to InMemoryGraphIndex. |
700 |
def test_iter_key_prefix_1_key_element_no_refs(self): |
701 |
index = self.make_index( nodes=[ |
|
702 |
(('name', ), 'data'), |
|
703 |
(('ref', ), 'refdata')]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
704 |
self.assertEqual(set([(index, ('name', ), 'data'), |
705 |
(index, ('ref', ), 'refdata')]), |
|
2624.2.10
by Robert Collins
Also add iter_key_prefix support to InMemoryGraphIndex. |
706 |
set(index.iter_entries_prefix([('name', ), ('ref', )]))) |
707 |
||
708 |
def test_iter_key_prefix_1_key_element_refs(self): |
|
709 |
index = self.make_index(1, nodes=[ |
|
710 |
(('name', ), 'data', ([('ref', )], )), |
|
711 |
(('ref', ), 'refdata', ([], ))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
712 |
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),)), |
713 |
(index, ('ref', ), 'refdata', ((), ))]), |
|
2624.2.10
by Robert Collins
Also add iter_key_prefix support to InMemoryGraphIndex. |
714 |
set(index.iter_entries_prefix([('name', ), ('ref', )]))) |
715 |
||
716 |
def test_iter_key_prefix_2_key_element_no_refs(self): |
|
717 |
index = self.make_index(key_elements=2, nodes=[ |
|
718 |
(('name', 'fin1'), 'data'), |
|
719 |
(('name', 'fin2'), 'beta'), |
|
720 |
(('ref', 'erence'), 'refdata')]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
721 |
self.assertEqual(set([(index, ('name', 'fin1'), 'data'), |
722 |
(index, ('ref', 'erence'), 'refdata')]), |
|
2624.2.10
by Robert Collins
Also add iter_key_prefix support to InMemoryGraphIndex. |
723 |
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')]))) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
724 |
self.assertEqual(set([(index, ('name', 'fin1'), 'data'), |
725 |
(index, ('name', 'fin2'), 'beta')]), |
|
2624.2.10
by Robert Collins
Also add iter_key_prefix support to InMemoryGraphIndex. |
726 |
set(index.iter_entries_prefix([('name', None)]))) |
727 |
||
728 |
def test_iter_key_prefix_2_key_element_refs(self): |
|
729 |
index = self.make_index(1, key_elements=2, nodes=[ |
|
730 |
(('name', 'fin1'), 'data', ([('ref', 'erence')], )), |
|
731 |
(('name', 'fin2'), 'beta', ([], )), |
|
732 |
(('ref', 'erence'), 'refdata', ([], ))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
733 |
self.assertEqual(set([(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)), |
734 |
(index, ('ref', 'erence'), 'refdata', ((), ))]), |
|
2624.2.10
by Robert Collins
Also add iter_key_prefix support to InMemoryGraphIndex. |
735 |
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')]))) |
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
736 |
self.assertEqual(set([(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)), |
737 |
(index, ('name', 'fin2'), 'beta', ((), ))]), |
|
2624.2.10
by Robert Collins
Also add iter_key_prefix support to InMemoryGraphIndex. |
738 |
set(index.iter_entries_prefix([('name', None)]))) |
739 |
||
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
740 |
def test_iter_nothing_empty(self): |
741 |
index = self.make_index() |
|
742 |
self.assertEqual([], list(index.iter_entries([]))) |
|
743 |
||
744 |
def test_iter_missing_entry_empty(self): |
|
745 |
index = self.make_index() |
|
746 |
self.assertEqual([], list(index.iter_entries(['a']))) |
|
747 |
||
748 |
def test_validate_empty(self): |
|
749 |
index = self.make_index() |
|
750 |
index.validate() |
|
751 |
||
752 |
def test_validate_no_refs_content(self): |
|
2624.2.5
by Robert Collins
Change bzrlib.index.Index keys to be 1-tuples, not strings. |
753 |
index = self.make_index(nodes=[(('key', ), 'value')]) |
2592.1.38
by Robert Collins
Create an InMemoryGraphIndex for temporary indexing. |
754 |
index.validate() |
755 |
||
756 |
||
2624.2.12
by Robert Collins
Create an adapter between indices with differing key lengths. |
757 |
class TestGraphIndexPrefixAdapter(TestCaseWithMemoryTransport): |
758 |
||
2624.2.13
by Robert Collins
Implement add_node/add_nodes to the GraphIndexPrefixAdapter. |
759 |
def make_index(self, ref_lists=1, key_elements=2, nodes=[], add_callback=False): |
2624.2.12
by Robert Collins
Create an adapter between indices with differing key lengths. |
760 |
result = InMemoryGraphIndex(ref_lists, key_elements=key_elements) |
761 |
result.add_nodes(nodes) |
|
2624.2.13
by Robert Collins
Implement add_node/add_nodes to the GraphIndexPrefixAdapter. |
762 |
if add_callback: |
763 |
add_nodes_callback=result.add_nodes |
|
764 |
else: |
|
765 |
add_nodes_callback=None |
|
766 |
adapter = GraphIndexPrefixAdapter(result, ('prefix', ), key_elements - 1, |
|
767 |
add_nodes_callback=add_nodes_callback) |
|
2624.2.12
by Robert Collins
Create an adapter between indices with differing key lengths. |
768 |
return result, adapter |
769 |
||
2624.2.13
by Robert Collins
Implement add_node/add_nodes to the GraphIndexPrefixAdapter. |
770 |
def test_add_node(self): |
771 |
index, adapter = self.make_index(add_callback=True) |
|
772 |
adapter.add_node(('key',), 'value', ((('ref',),),)) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
773 |
self.assertEqual(set([(index, ('prefix', 'key'), 'value', ((('prefix', 'ref'),),))]), |
2624.2.13
by Robert Collins
Implement add_node/add_nodes to the GraphIndexPrefixAdapter. |
774 |
set(index.iter_all_entries())) |
775 |
||
776 |
def test_add_nodes(self): |
|
777 |
index, adapter = self.make_index(add_callback=True) |
|
778 |
adapter.add_nodes(( |
|
779 |
(('key',), 'value', ((('ref',),),)), |
|
780 |
(('key2',), 'value2', ((),)), |
|
781 |
))
|
|
782 |
self.assertEqual(set([ |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
783 |
(index, ('prefix', 'key2'), 'value2', ((),)), |
784 |
(index, ('prefix', 'key'), 'value', ((('prefix', 'ref'),),)) |
|
2624.2.13
by Robert Collins
Implement add_node/add_nodes to the GraphIndexPrefixAdapter. |
785 |
]),
|
786 |
set(index.iter_all_entries())) |
|
787 |
||
2624.2.12
by Robert Collins
Create an adapter between indices with differing key lengths. |
788 |
def test_construct(self): |
789 |
index = InMemoryGraphIndex() |
|
790 |
adapter = GraphIndexPrefixAdapter(index, ('prefix', ), 1) |
|
791 |
||
792 |
def test_construct_with_callback(self): |
|
793 |
index = InMemoryGraphIndex() |
|
794 |
adapter = GraphIndexPrefixAdapter(index, ('prefix', ), 1, index.add_nodes) |
|
795 |
||
796 |
def test_iter_all_entries_cross_prefix_map_errors(self): |
|
797 |
index, adapter = self.make_index(nodes=[ |
|
798 |
(('prefix', 'key1'), 'data1', ((('prefixaltered', 'key2'),),))]) |
|
799 |
self.assertRaises(errors.BadIndexData, list, adapter.iter_all_entries()) |
|
800 |
||
801 |
def test_iter_all_entries(self): |
|
802 |
index, adapter = self.make_index(nodes=[ |
|
803 |
(('notprefix', 'key1'), 'data', ((), )), |
|
804 |
(('prefix', 'key1'), 'data1', ((), )), |
|
805 |
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))]) |
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
806 |
self.assertEqual(set([(index, ('key1', ), 'data1', ((),)), |
807 |
(index, ('key2', ), 'data2', ((('key1',),),))]), |
|
2624.2.12
by Robert Collins
Create an adapter between indices with differing key lengths. |
808 |
set(adapter.iter_all_entries())) |
809 |
||
810 |
def test_iter_entries(self): |
|
811 |
index, adapter = self.make_index(nodes=[ |
|
812 |
(('notprefix', 'key1'), 'data', ((), )), |
|
813 |
(('prefix', 'key1'), 'data1', ((), )), |
|
814 |
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))]) |
|
815 |
# ask for many - get all
|
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
816 |
self.assertEqual(set([(index, ('key1', ), 'data1', ((),)), |
817 |
(index, ('key2', ), 'data2', ((('key1', ),),))]), |
|
2624.2.12
by Robert Collins
Create an adapter between indices with differing key lengths. |
818 |
set(adapter.iter_entries([('key1', ), ('key2', )]))) |
819 |
# ask for one, get one
|
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
820 |
self.assertEqual(set([(index, ('key1', ), 'data1', ((),))]), |
2624.2.12
by Robert Collins
Create an adapter between indices with differing key lengths. |
821 |
set(adapter.iter_entries([('key1', )]))) |
822 |
# ask for missing, get none
|
|
823 |
self.assertEqual(set(), |
|
824 |
set(adapter.iter_entries([('key3', )]))) |
|
825 |
||
826 |
def test_iter_entries_prefix(self): |
|
827 |
index, adapter = self.make_index(key_elements=3, nodes=[ |
|
828 |
(('notprefix', 'foo', 'key1'), 'data', ((), )), |
|
829 |
(('prefix', 'prefix2', 'key1'), 'data1', ((), )), |
|
830 |
(('prefix', 'prefix2', 'key2'), 'data2', ((('prefix', 'prefix2', 'key1'),),))]) |
|
831 |
# ask for a prefix, get the results for just that prefix, adjusted.
|
|
2624.2.14
by Robert Collins
Add source index to the index iteration API to allow mapping back to the origin of retrieved data. |
832 |
self.assertEqual(set([(index, ('prefix2', 'key1', ), 'data1', ((),)), |
833 |
(index, ('prefix2', 'key2', ), 'data2', ((('prefix2', 'key1', ),),))]), |
|
2624.2.12
by Robert Collins
Create an adapter between indices with differing key lengths. |
834 |
set(adapter.iter_entries_prefix([('prefix2', None)]))) |
835 |
||
836 |
def test_validate(self): |
|
837 |
index, adapter = self.make_index() |
|
838 |
calls = [] |
|
839 |
def validate(): |
|
840 |
calls.append('called') |
|
841 |
index.validate = validate |
|
842 |
adapter.validate() |
|
843 |
self.assertEqual(['called'], calls) |