791
772
# The entire index should have been read linearly.
792
773
self.assertEqual([('readv', 'index', [(0, size)], False, None)],
794
self.assertEqualApproxCompressed(1488, size)
775
self.assertEqual(1488, size)
796
777
def test_validate_two_pages(self):
797
778
builder = btree_index.BTreeBuilder(key_elements=2, reference_lists=2)
798
779
nodes = self.make_nodes(80, 2, 2)
799
780
for node in nodes:
800
781
builder.add_node(*node)
801
t = transport.get_transport_from_url('trace+' + self.get_url(''))
782
t = transport.get_transport('trace+' + self.get_url(''))
802
783
size = t.put_file('index', builder.finish())
803
784
# Root page, 2 leaf pages
804
self.assertEqualApproxCompressed(9339, size)
785
self.assertEqual(9339, size)
805
786
index = btree_index.BTreeGraphIndex(t, 'index', size)
806
787
del t._activity[:]
807
788
self.assertEqual([], t._activity)
809
rem = size - 8192 # Number of remaining bytes after second block
810
790
# The entire index should have been read linearly.
811
791
self.assertEqual(
812
792
[('readv', 'index', [(0, 4096)], False, None),
813
('readv', 'index', [(4096, 4096), (8192, rem)], False, None)],
793
('readv', 'index', [(4096, 4096), (8192, 1147)], False, None)],
815
795
# XXX: TODO: write some badly-ordered nodes, and some pointers-to-wrong
816
796
# node and make validate find them.
818
798
def test_eq_ne(self):
819
799
# two indices are equal when constructed with the same parameters:
820
t1 = transport.get_transport_from_url('trace+' + self.get_url(''))
821
t2 = self.get_transport()
823
btree_index.BTreeGraphIndex(t1, 'index', None)
824
== btree_index.BTreeGraphIndex(t1, 'index', None))
826
btree_index.BTreeGraphIndex(t1, 'index', 20)
827
== btree_index.BTreeGraphIndex(t1, 'index', 20))
829
btree_index.BTreeGraphIndex(t1, 'index', 20)
830
== btree_index.BTreeGraphIndex(t2, 'index', 20))
832
btree_index.BTreeGraphIndex(t1, 'inde1', 20)
833
== btree_index.BTreeGraphIndex(t1, 'inde2', 20))
835
btree_index.BTreeGraphIndex(t1, 'index', 10)
836
== btree_index.BTreeGraphIndex(t1, 'index', 20))
838
btree_index.BTreeGraphIndex(t1, 'index', None)
839
!= btree_index.BTreeGraphIndex(t1, 'index', None))
841
btree_index.BTreeGraphIndex(t1, 'index', 20)
842
!= btree_index.BTreeGraphIndex(t1, 'index', 20))
844
btree_index.BTreeGraphIndex(t1, 'index', 20)
845
!= btree_index.BTreeGraphIndex(t2, 'index', 20))
847
btree_index.BTreeGraphIndex(t1, 'inde1', 20)
848
!= btree_index.BTreeGraphIndex(t1, 'inde2', 20))
850
btree_index.BTreeGraphIndex(t1, 'index', 10)
851
!= btree_index.BTreeGraphIndex(t1, 'index', 20))
853
def test_key_too_big(self):
854
# the size that matters here is the _compressed_ size of the key, so we can't
855
# do a simple character repeat.
856
bigKey = b''.join(b'%d' % n for n in range(btree_index._PAGE_SIZE))
857
self.assertRaises(_mod_index.BadIndexKey,
859
nodes=[((bigKey,), b'value', ())])
800
t1 = transport.get_transport('trace+' + self.get_url(''))
801
t2 = transport.get_transport(self.get_url(''))
803
btree_index.BTreeGraphIndex(t1, 'index', None) ==
804
btree_index.BTreeGraphIndex(t1, 'index', None))
806
btree_index.BTreeGraphIndex(t1, 'index', 20) ==
807
btree_index.BTreeGraphIndex(t1, 'index', 20))
809
btree_index.BTreeGraphIndex(t1, 'index', 20) ==
810
btree_index.BTreeGraphIndex(t2, 'index', 20))
812
btree_index.BTreeGraphIndex(t1, 'inde1', 20) ==
813
btree_index.BTreeGraphIndex(t1, 'inde2', 20))
815
btree_index.BTreeGraphIndex(t1, 'index', 10) ==
816
btree_index.BTreeGraphIndex(t1, 'index', 20))
818
btree_index.BTreeGraphIndex(t1, 'index', None) !=
819
btree_index.BTreeGraphIndex(t1, 'index', None))
821
btree_index.BTreeGraphIndex(t1, 'index', 20) !=
822
btree_index.BTreeGraphIndex(t1, 'index', 20))
824
btree_index.BTreeGraphIndex(t1, 'index', 20) !=
825
btree_index.BTreeGraphIndex(t2, 'index', 20))
827
btree_index.BTreeGraphIndex(t1, 'inde1', 20) !=
828
btree_index.BTreeGraphIndex(t1, 'inde2', 20))
830
btree_index.BTreeGraphIndex(t1, 'index', 10) !=
831
btree_index.BTreeGraphIndex(t1, 'index', 20))
861
833
def test_iter_all_only_root_no_size(self):
862
self.make_index(nodes=[((b'key',), b'value', ())])
863
t = transport.get_transport_from_url('trace+' + self.get_url(''))
834
self.make_index(nodes=[(('key',), 'value', ())])
835
t = transport.get_transport('trace+' + self.get_url(''))
864
836
index = btree_index.BTreeGraphIndex(t, 'index', None)
865
837
del t._activity[:]
866
self.assertEqual([((b'key',), b'value')],
838
self.assertEqual([(('key',), 'value')],
867
839
[x[1:] for x in index.iter_all_entries()])
868
840
self.assertEqual([('get', 'index')], t._activity)
940
922
self.assertEqual(nodes[30], bare_nodes[0])
941
923
# Should have read the root node, then one leaf page:
942
924
self.assertEqual([('readv', 'index', [(0, 4096)], False, None),
943
('readv', 'index', [(8192, 4096), ], False, None)],
925
('readv', 'index', [(8192, 4096), ], False, None)],
946
928
def test_iter_key_prefix_1_element_key_None(self):
947
929
index = self.make_index()
948
self.assertRaises(_mod_index.BadIndexKey, list,
949
index.iter_entries_prefix([(None, )]))
930
self.assertRaises(errors.BadIndexKey, list,
931
index.iter_entries_prefix([(None, )]))
951
933
def test_iter_key_prefix_wrong_length(self):
952
934
index = self.make_index()
953
self.assertRaises(_mod_index.BadIndexKey, list,
954
index.iter_entries_prefix([(b'foo', None)]))
935
self.assertRaises(errors.BadIndexKey, list,
936
index.iter_entries_prefix([('foo', None)]))
955
937
index = self.make_index(key_elements=2)
956
self.assertRaises(_mod_index.BadIndexKey, list,
957
index.iter_entries_prefix([(b'foo', )]))
958
self.assertRaises(_mod_index.BadIndexKey, list,
959
index.iter_entries_prefix([(b'foo', None, None)]))
938
self.assertRaises(errors.BadIndexKey, list,
939
index.iter_entries_prefix([('foo', )]))
940
self.assertRaises(errors.BadIndexKey, list,
941
index.iter_entries_prefix([('foo', None, None)]))
961
943
def test_iter_key_prefix_1_key_element_no_refs(self):
962
index = self.make_index(nodes=[
963
((b'name', ), b'data', ()),
964
((b'ref', ), b'refdata', ())])
965
self.assertEqual({(index, (b'name', ), b'data'),
966
(index, (b'ref', ), b'refdata')},
967
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
944
index = self.make_index( nodes=[
945
(('name', ), 'data', ()),
946
(('ref', ), 'refdata', ())])
947
self.assertEqual(set([(index, ('name', ), 'data'),
948
(index, ('ref', ), 'refdata')]),
949
set(index.iter_entries_prefix([('name', ), ('ref', )])))
969
951
def test_iter_key_prefix_1_key_element_refs(self):
970
952
index = self.make_index(1, nodes=[
971
((b'name', ), b'data', ([(b'ref', )], )),
972
((b'ref', ), b'refdata', ([], ))])
973
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
974
(index, (b'ref', ), b'refdata', ((), ))},
975
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
953
(('name', ), 'data', ([('ref', )], )),
954
(('ref', ), 'refdata', ([], ))])
955
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),)),
956
(index, ('ref', ), 'refdata', ((), ))]),
957
set(index.iter_entries_prefix([('name', ), ('ref', )])))
977
959
def test_iter_key_prefix_2_key_element_no_refs(self):
978
960
index = self.make_index(key_elements=2, nodes=[
979
((b'name', b'fin1'), b'data', ()),
980
((b'name', b'fin2'), b'beta', ()),
981
((b'ref', b'erence'), b'refdata', ())])
982
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
983
(index, (b'ref', b'erence'), b'refdata')},
984
set(index.iter_entries_prefix(
985
[(b'name', b'fin1'), (b'ref', b'erence')])))
986
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
987
(index, (b'name', b'fin2'), b'beta')},
988
set(index.iter_entries_prefix([(b'name', None)])))
961
(('name', 'fin1'), 'data', ()),
962
(('name', 'fin2'), 'beta', ()),
963
(('ref', 'erence'), 'refdata', ())])
964
self.assertEqual(set([(index, ('name', 'fin1'), 'data'),
965
(index, ('ref', 'erence'), 'refdata')]),
966
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
967
self.assertEqual(set([(index, ('name', 'fin1'), 'data'),
968
(index, ('name', 'fin2'), 'beta')]),
969
set(index.iter_entries_prefix([('name', None)])))
990
971
def test_iter_key_prefix_2_key_element_refs(self):
991
972
index = self.make_index(1, key_elements=2, nodes=[
992
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], )),
993
((b'name', b'fin2'), b'beta', ([], )),
994
((b'ref', b'erence'), b'refdata', ([], ))])
996
{(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
997
(index, (b'ref', b'erence'), b'refdata', ((), ))},
998
set(index.iter_entries_prefix(
999
[(b'name', b'fin1'), (b'ref', b'erence')])))
1001
{(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
1002
(index, (b'name', b'fin2'), b'beta', ((), ))},
1003
set(index.iter_entries_prefix([(b'name', None)])))
973
(('name', 'fin1'), 'data', ([('ref', 'erence')], )),
974
(('name', 'fin2'), 'beta', ([], )),
975
(('ref', 'erence'), 'refdata', ([], ))])
976
self.assertEqual(set([(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
977
(index, ('ref', 'erence'), 'refdata', ((), ))]),
978
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
979
self.assertEqual(set([(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
980
(index, ('name', 'fin2'), 'beta', ((), ))]),
981
set(index.iter_entries_prefix([('name', None)])))
1005
983
# XXX: external_references tests are duplicated in test_index. We
1006
984
# probably should have per_graph_index tests...
1011
989
def test_external_references_no_results(self):
1012
990
index = self.make_index(ref_lists=1, nodes=[
1013
((b'key',), b'value', ([],))])
991
(('key',), 'value', ([],))])
1014
992
self.assertEqual(set(), index.external_references(0))
1016
994
def test_external_references_missing_ref(self):
1017
missing_key = (b'missing',)
995
missing_key = ('missing',)
1018
996
index = self.make_index(ref_lists=1, nodes=[
1019
((b'key',), b'value', ([missing_key],))])
1020
self.assertEqual({missing_key}, index.external_references(0))
997
(('key',), 'value', ([missing_key],))])
998
self.assertEqual(set([missing_key]), index.external_references(0))
1022
1000
def test_external_references_multiple_ref_lists(self):
1023
missing_key = (b'missing',)
1001
missing_key = ('missing',)
1024
1002
index = self.make_index(ref_lists=2, nodes=[
1025
((b'key',), b'value', ([], [missing_key]))])
1003
(('key',), 'value', ([], [missing_key]))])
1026
1004
self.assertEqual(set([]), index.external_references(0))
1027
self.assertEqual({missing_key}, index.external_references(1))
1005
self.assertEqual(set([missing_key]), index.external_references(1))
1029
1007
def test_external_references_two_records(self):
1030
1008
index = self.make_index(ref_lists=1, nodes=[
1031
((b'key-1',), b'value', ([(b'key-2',)],)),
1032
((b'key-2',), b'value', ([],)),
1009
(('key-1',), 'value', ([('key-2',)],)),
1010
(('key-2',), 'value', ([],)),
1034
1012
self.assertEqual(set([]), index.external_references(0))
1036
1014
def test__find_ancestors_one_page(self):
1039
1017
index = self.make_index(ref_lists=1, key_elements=1, nodes=[
1040
(key1, b'value', ([key2],)),
1041
(key2, b'value', ([],)),
1018
(key1, 'value', ([key2],)),
1019
(key2, 'value', ([],)),
1043
1021
parent_map = {}
1044
1022
missing_keys = set()
1045
search_keys = index._find_ancestors(
1046
[key1], 0, parent_map, missing_keys)
1023
search_keys = index._find_ancestors([key1], 0, parent_map, missing_keys)
1047
1024
self.assertEqual({key1: (key2,), key2: ()}, parent_map)
1048
1025
self.assertEqual(set(), missing_keys)
1049
1026
self.assertEqual(set(), search_keys)
1051
1028
def test__find_ancestors_one_page_w_missing(self):
1055
1032
index = self.make_index(ref_lists=1, key_elements=1, nodes=[
1056
(key1, b'value', ([key2],)),
1057
(key2, b'value', ([],)),
1033
(key1, 'value', ([key2],)),
1034
(key2, 'value', ([],)),
1059
1036
parent_map = {}
1060
1037
missing_keys = set()
1209
1186
class TestBTreeNodes(BTreeTestCase):
1211
scenarios = btreeparser_scenarios()
1213
1188
def setUp(self):
1214
super(TestBTreeNodes, self).setUp()
1189
BTreeTestCase.setUp(self)
1215
1190
self.overrideAttr(btree_index, '_btree_serializer', self.parse_btree)
1217
1192
def test_LeafNode_1_0(self):
1218
node_bytes = (b"type=leaf\n"
1219
b"0000000000000000000000000000000000000000\x00\x00value:0\n"
1220
b"1111111111111111111111111111111111111111\x00\x00value:1\n"
1221
b"2222222222222222222222222222222222222222\x00\x00value:2\n"
1222
b"3333333333333333333333333333333333333333\x00\x00value:3\n"
1223
b"4444444444444444444444444444444444444444\x00\x00value:4\n")
1193
node_bytes = ("type=leaf\n"
1194
"0000000000000000000000000000000000000000\x00\x00value:0\n"
1195
"1111111111111111111111111111111111111111\x00\x00value:1\n"
1196
"2222222222222222222222222222222222222222\x00\x00value:2\n"
1197
"3333333333333333333333333333333333333333\x00\x00value:3\n"
1198
"4444444444444444444444444444444444444444\x00\x00value:4\n")
1224
1199
node = btree_index._LeafNode(node_bytes, 1, 0)
1225
1200
# We do direct access, or don't care about order, to leaf nodes most of
1226
1201
# the time, so a dict is useful:
1227
1202
self.assertEqual({
1228
(b"0000000000000000000000000000000000000000",): (b"value:0", ()),
1229
(b"1111111111111111111111111111111111111111",): (b"value:1", ()),
1230
(b"2222222222222222222222222222222222222222",): (b"value:2", ()),
1231
(b"3333333333333333333333333333333333333333",): (b"value:3", ()),
1232
(b"4444444444444444444444444444444444444444",): (b"value:4", ()),
1233
}, dict(node.all_items()))
1203
("0000000000000000000000000000000000000000",): ("value:0", ()),
1204
("1111111111111111111111111111111111111111",): ("value:1", ()),
1205
("2222222222222222222222222222222222222222",): ("value:2", ()),
1206
("3333333333333333333333333333333333333333",): ("value:3", ()),
1207
("4444444444444444444444444444444444444444",): ("value:4", ()),
1235
1210
def test_LeafNode_2_2(self):
1236
node_bytes = (b"type=leaf\n"
1237
b"00\x0000\x00\t00\x00ref00\x00value:0\n"
1238
b"00\x0011\x0000\x00ref00\t00\x00ref00\r01\x00ref01\x00value:1\n"
1239
b"11\x0033\x0011\x00ref22\t11\x00ref22\r11\x00ref22\x00value:3\n"
1240
b"11\x0044\x00\t11\x00ref00\x00value:4\n"
1211
node_bytes = ("type=leaf\n"
1212
"00\x0000\x00\t00\x00ref00\x00value:0\n"
1213
"00\x0011\x0000\x00ref00\t00\x00ref00\r01\x00ref01\x00value:1\n"
1214
"11\x0033\x0011\x00ref22\t11\x00ref22\r11\x00ref22\x00value:3\n"
1215
"11\x0044\x00\t11\x00ref00\x00value:4\n"
1243
1218
node = btree_index._LeafNode(node_bytes, 2, 2)
1244
1219
# We do direct access, or don't care about order, to leaf nodes most of
1245
1220
# the time, so a dict is useful:
1246
1221
self.assertEqual({
1247
(b'00', b'00'): (b'value:0', ((), ((b'00', b'ref00'),))),
1248
(b'00', b'11'): (b'value:1', (((b'00', b'ref00'),),
1249
((b'00', b'ref00'), (b'01', b'ref01')))),
1250
(b'11', b'33'): (b'value:3', (((b'11', b'ref22'),),
1251
((b'11', b'ref22'), (b'11', b'ref22')))),
1252
(b'11', b'44'): (b'value:4', ((), ((b'11', b'ref00'),)))
1253
}, dict(node.all_items()))
1222
('00', '00'): ('value:0', ((), (('00', 'ref00'),))),
1223
('00', '11'): ('value:1',
1224
((('00', 'ref00'),), (('00', 'ref00'), ('01', 'ref01')))),
1225
('11', '33'): ('value:3',
1226
((('11', 'ref22'),), (('11', 'ref22'), ('11', 'ref22')))),
1227
('11', '44'): ('value:4', ((), (('11', 'ref00'),)))
1255
1230
def test_InternalNode_1(self):
1256
node_bytes = (b"type=internal\n"
1258
b"0000000000000000000000000000000000000000\n"
1259
b"1111111111111111111111111111111111111111\n"
1260
b"2222222222222222222222222222222222222222\n"
1261
b"3333333333333333333333333333333333333333\n"
1262
b"4444444444444444444444444444444444444444\n"
1231
node_bytes = ("type=internal\n"
1233
"0000000000000000000000000000000000000000\n"
1234
"1111111111111111111111111111111111111111\n"
1235
"2222222222222222222222222222222222222222\n"
1236
"3333333333333333333333333333333333333333\n"
1237
"4444444444444444444444444444444444444444\n"
1264
1239
node = btree_index._InternalNode(node_bytes)
1265
1240
# We want to bisect to find the right children from this node, so a
1266
1241
# vector is most useful.
1267
1242
self.assertEqual([
1268
(b"0000000000000000000000000000000000000000",),
1269
(b"1111111111111111111111111111111111111111",),
1270
(b"2222222222222222222222222222222222222222",),
1271
(b"3333333333333333333333333333333333333333",),
1272
(b"4444444444444444444444444444444444444444",),
1243
("0000000000000000000000000000000000000000",),
1244
("1111111111111111111111111111111111111111",),
1245
("2222222222222222222222222222222222222222",),
1246
("3333333333333333333333333333333333333333",),
1247
("4444444444444444444444444444444444444444",),
1274
1249
self.assertEqual(1, node.offset)
1276
1251
def test_LeafNode_2_2(self):
1277
node_bytes = (b"type=leaf\n"
1278
b"00\x0000\x00\t00\x00ref00\x00value:0\n"
1279
b"00\x0011\x0000\x00ref00\t00\x00ref00\r01\x00ref01\x00value:1\n"
1280
b"11\x0033\x0011\x00ref22\t11\x00ref22\r11\x00ref22\x00value:3\n"
1281
b"11\x0044\x00\t11\x00ref00\x00value:4\n"
1252
node_bytes = ("type=leaf\n"
1253
"00\x0000\x00\t00\x00ref00\x00value:0\n"
1254
"00\x0011\x0000\x00ref00\t00\x00ref00\r01\x00ref01\x00value:1\n"
1255
"11\x0033\x0011\x00ref22\t11\x00ref22\r11\x00ref22\x00value:3\n"
1256
"11\x0044\x00\t11\x00ref00\x00value:4\n"
1284
1259
node = btree_index._LeafNode(node_bytes, 2, 2)
1285
1260
# We do direct access, or don't care about order, to leaf nodes most of
1286
1261
# the time, so a dict is useful:
1287
1262
self.assertEqual({
1288
(b'00', b'00'): (b'value:0', ((), ((b'00', b'ref00'),))),
1289
(b'00', b'11'): (b'value:1', (((b'00', b'ref00'),),
1290
((b'00', b'ref00'), (b'01', b'ref01')))),
1291
(b'11', b'33'): (b'value:3', (((b'11', b'ref22'),),
1292
((b'11', b'ref22'), (b'11', b'ref22')))),
1293
(b'11', b'44'): (b'value:4', ((), ((b'11', b'ref00'),)))
1294
}, dict(node.all_items()))
1263
('00', '00'): ('value:0', ((), (('00', 'ref00'),))),
1264
('00', '11'): ('value:1',
1265
((('00', 'ref00'),), (('00', 'ref00'), ('01', 'ref01')))),
1266
('11', '33'): ('value:3',
1267
((('11', 'ref22'),), (('11', 'ref22'), ('11', 'ref22')))),
1268
('11', '44'): ('value:4', ((), (('11', 'ref00'),)))
1296
1271
def assertFlattened(self, expected, key, value, refs):
1297
1272
flat_key, flat_line = self.parse_btree._flatten_node(
1298
1273
(None, key, value, refs), bool(refs))
1299
self.assertEqual(b'\x00'.join(key), flat_key)
1274
self.assertEqual('\x00'.join(key), flat_key)
1300
1275
self.assertEqual(expected, flat_line)
1302
1277
def test__flatten_node(self):
1303
self.assertFlattened(b'key\0\0value\n', (b'key',), b'value', [])
1304
self.assertFlattened(b'key\0tuple\0\0value str\n',
1305
(b'key', b'tuple'), b'value str', [])
1306
self.assertFlattened(b'key\0tuple\0triple\0\0value str\n',
1307
(b'key', b'tuple', b'triple'), b'value str', [])
1308
self.assertFlattened(b'k\0t\0s\0ref\0value str\n',
1309
(b'k', b't', b's'), b'value str', [[(b'ref',)]])
1310
self.assertFlattened(b'key\0tuple\0ref\0key\0value str\n',
1311
(b'key', b'tuple'), b'value str', [[(b'ref', b'key')]])
1312
self.assertFlattened(b"00\x0000\x00\t00\x00ref00\x00value:0\n",
1313
(b'00', b'00'), b'value:0', ((), ((b'00', b'ref00'),)))
1314
self.assertFlattened(
1315
b"00\x0011\x0000\x00ref00\t00\x00ref00\r01\x00ref01\x00value:1\n",
1316
(b'00', b'11'), b'value:1',
1317
(((b'00', b'ref00'),), ((b'00', b'ref00'), (b'01', b'ref01'))))
1318
self.assertFlattened(
1319
b"11\x0033\x0011\x00ref22\t11\x00ref22\r11\x00ref22\x00value:3\n",
1320
(b'11', b'33'), b'value:3',
1321
(((b'11', b'ref22'),), ((b'11', b'ref22'), (b'11', b'ref22'))))
1322
self.assertFlattened(
1323
b"11\x0044\x00\t11\x00ref00\x00value:4\n",
1324
(b'11', b'44'), b'value:4', ((), ((b'11', b'ref00'),)))
1278
self.assertFlattened('key\0\0value\n', ('key',), 'value', [])
1279
self.assertFlattened('key\0tuple\0\0value str\n',
1280
('key', 'tuple'), 'value str', [])
1281
self.assertFlattened('key\0tuple\0triple\0\0value str\n',
1282
('key', 'tuple', 'triple'), 'value str', [])
1283
self.assertFlattened('k\0t\0s\0ref\0value str\n',
1284
('k', 't', 's'), 'value str', [[('ref',)]])
1285
self.assertFlattened('key\0tuple\0ref\0key\0value str\n',
1286
('key', 'tuple'), 'value str', [[('ref', 'key')]])
1287
self.assertFlattened("00\x0000\x00\t00\x00ref00\x00value:0\n",
1288
('00', '00'), 'value:0', ((), (('00', 'ref00'),)))
1289
self.assertFlattened(
1290
"00\x0011\x0000\x00ref00\t00\x00ref00\r01\x00ref01\x00value:1\n",
1291
('00', '11'), 'value:1',
1292
((('00', 'ref00'),), (('00', 'ref00'), ('01', 'ref01'))))
1293
self.assertFlattened(
1294
"11\x0033\x0011\x00ref22\t11\x00ref22\r11\x00ref22\x00value:3\n",
1295
('11', '33'), 'value:3',
1296
((('11', 'ref22'),), (('11', 'ref22'), ('11', 'ref22'))))
1297
self.assertFlattened(
1298
"11\x0044\x00\t11\x00ref00\x00value:4\n",
1299
('11', '44'), 'value:4', ((), (('11', 'ref00'),)))
1327
1302
class TestCompiledBtree(tests.TestCase):