##// END OF EJS Templates
rust-revlog: using the ad-hoc `NodeTree` in scmutil...
rust-revlog: using the ad-hoc `NodeTree` in scmutil Now that we have an independent `NodeTree` class able to work natively on the pure Rust index, we use it in `mercurial.scmutil`, with automatic invalidation after mutation of the index. This code path is tested by `test-revisions.t` and `test-template-functions.t`

File last commit:

r52144:0409bd6b default
r52145:fd1aa5e1 default
Show More
test-rust-revlog.py
98 lines | 3.4 KiB | text/x-python | PythonLexer
/ tests / test-rust-revlog.py
Raphaël Gomès
rust-revlog: teach the revlog opening code to read the repo options...
r52084 import struct
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413 import unittest
Georges Racinet
rust-revlog: bare minimal NodeTree exposition...
r52142 from mercurial.node import hex
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413 try:
from mercurial import rustext
rustext.__name__ # trigger immediate actual import
except ImportError:
rustext = None
else:
from mercurial.rustext import revlog
rust-index: handle `MixedIndex` in `pyindex_to_graph`...
r44463 # this would fail already without appropriate ancestor.__package__
from mercurial.rustext.ancestor import LazyAncestors
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413 from mercurial.testing import revlog as revlogtesting
Raphaël Gomès
rust-revlog: teach the revlog opening code to read the repo options...
r52084 header = struct.unpack(">I", revlogtesting.data_non_inlined[:4])[0]
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413
@unittest.skipIf(
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 rustext is None,
"rustext module revlog relies on is not available",
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413 )
class RustRevlogIndexTest(revlogtesting.RevlogBasedTestBase):
def test_heads(self):
idx = self.parseindex()
Raphaël Gomès
rust-revlog: teach the revlog opening code to read the repo options...
r52084 rustidx = revlog.MixedIndex(idx, revlogtesting.data_non_inlined, header)
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413 self.assertEqual(rustidx.headrevs(), idx.headrevs())
Georges Racinet
rust-index: expose a method to retrieve the C index...
r44464 def test_get_cindex(self):
# drop me once we no longer need the method for shortest node
idx = self.parseindex()
Raphaël Gomès
rust-revlog: teach the revlog opening code to read the repo options...
r52084 rustidx = revlog.MixedIndex(idx, revlogtesting.data_non_inlined, header)
Georges Racinet
rust-index: expose a method to retrieve the C index...
r44464 cidx = rustidx.get_cindex()
self.assertTrue(idx is cidx)
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413 def test_len(self):
idx = self.parseindex()
Raphaël Gomès
rust-revlog: teach the revlog opening code to read the repo options...
r52084 rustidx = revlog.MixedIndex(idx, revlogtesting.data_non_inlined, header)
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413 self.assertEqual(len(rustidx), len(idx))
rust-index: handle `MixedIndex` in `pyindex_to_graph`...
r44463 def test_ancestors(self):
idx = self.parseindex()
Raphaël Gomès
rust-revlog: teach the revlog opening code to read the repo options...
r52084 rustidx = revlog.MixedIndex(idx, revlogtesting.data_non_inlined, header)
rust-index: handle `MixedIndex` in `pyindex_to_graph`...
r44463 lazy = LazyAncestors(rustidx, [3], 0, True)
# we have two more references to the index:
# - in its inner iterator for __contains__ and __bool__
# - in the LazyAncestors instance itself (to spawn new iterators)
self.assertTrue(2 in lazy)
self.assertTrue(bool(lazy))
self.assertEqual(list(lazy), [3, 2, 1, 0])
# a second time to validate that we spawn new iterators
self.assertEqual(list(lazy), [3, 2, 1, 0])
# let's check bool for an empty one
Georges Racinet
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set...
r52132 self.assertFalse(LazyAncestors(rustidx, [0], 0, False))
rust-index: handle `MixedIndex` in `pyindex_to_graph`...
r44463
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413
Georges Racinet
rust-revlog: bare minimal NodeTree exposition...
r52142 @unittest.skipIf(
rustext is None,
"rustext module revlog relies on is not available",
)
class RustRevlogNodeTreeClassTest(revlogtesting.RustRevlogBasedTestBase):
def test_standalone_nodetree(self):
idx = self.parserustindex()
nt = revlog.NodeTree(idx)
for i in range(4):
nt.insert(i)
bin_nodes = [entry[7] for entry in idx]
hex_nodes = [hex(n) for n in bin_nodes]
for i, node in enumerate(hex_nodes):
self.assertEqual(nt.prefix_rev_lookup(node), i)
self.assertEqual(nt.prefix_rev_lookup(node[:5]), i)
# all 4 revisions in idx (standard data set) have different
# first nybbles in their Node IDs,
# hence `nt.shortest()` should return 1 for them, except when
# the leading nybble is 0 (ambiguity with NULL_NODE)
for i, (bin_node, hex_node) in enumerate(zip(bin_nodes, hex_nodes)):
shortest = nt.shortest(bin_node)
expected = 2 if hex_node[0] == ord('0') else 1
self.assertEqual(shortest, expected)
self.assertEqual(nt.prefix_rev_lookup(hex_node[:shortest]), i)
Georges Racinet
rust-revlog: add invalidation detection to `NodeTree` class...
r52144 # test invalidation (generation poisoning) detection
del idx[3]
self.assertTrue(nt.is_invalidated())
Georges Racinet
rust-revlog: bare minimal NodeTree exposition...
r52142
Georges Racinet
rust-index: add a struct wrapping the C index...
r44413 if __name__ == '__main__':
import silenttestrunner
silenttestrunner.main(__name__)