tests/test-rust-revlog.py
author Georges Racinet <georges.racinet@cloudcrane.io>
Sun, 22 Dec 2024 20:26:57 +0100
changeset 52783 07740bd86fd9
child 52786 4e34e8fd46d4
permissions -rw-r--r--
rust-pyo3: reviving test-rust-revlog.py This test file was removed in 7346f93be7a4. Adaptation to the new `InnerRevlog` / `RustIndexProxy` structure was as easy as redefining the `parserustindex()` method to use `RustIndexProxy`. As we did before with `test-rust-ancestors.py`, we are preparing a mixin class that will contain tests for both bindings. Existing tests will migrate from `RustInnerRevlogTest` (the one for `hg-cpython`) to the mixin.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52783
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     1
import struct
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     2
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     3
from mercurial.node import (
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     4
    bin as node_bin,
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     5
    hex,
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     6
)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     7
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     8
try:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     9
    from mercurial import rustext
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    10
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    11
    rustext.__name__  # trigger immediate actual import
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    12
except ImportError:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    13
    rustext = None
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    14
else:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    15
    # this would fail already without appropriate ancestor.__package__
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    16
    from mercurial.rustext.ancestor import LazyAncestors
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    17
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    18
from mercurial.testing import revlog as revlogtesting
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    19
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    20
header = struct.unpack(">I", revlogtesting.data_non_inlined[:4])[0]
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    21
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    22
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    23
class RustInnerRevlogTestMixin:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    24
    """Common tests for both Rust Python bindings."""
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    25
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    26
    node_hex0 = b'd1f4bbb0befc13bd8cd39d0fcdd93b8c078c4a2f'
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    27
    node0 = node_bin(node_hex0)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    28
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    29
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    30
# Conditional skipping done by the base class
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    31
class RustInnerRevlogTest(
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    32
    revlogtesting.RustRevlogBasedTestBase, RustInnerRevlogTestMixin
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    33
):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    34
    """For reference"""
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    35
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    36
    def test_heads(self):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    37
        idx = self.parserustindex()
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    38
        self.assertEqual(idx.headrevs(), [3])
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    39
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    40
    def test_len(self):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    41
        idx = self.parserustindex()
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    42
        self.assertEqual(len(idx), 4)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    43
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    44
    def test_ancestors(self):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    45
        rustidx = self.parserustindex()
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    46
        lazy = LazyAncestors(rustidx, [3], 0, True)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    47
        # we have two more references to the index:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    48
        # - in its inner iterator for __contains__ and __bool__
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    49
        # - in the LazyAncestors instance itself (to spawn new iterators)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    50
        self.assertTrue(2 in lazy)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    51
        self.assertTrue(bool(lazy))
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    52
        self.assertEqual(list(lazy), [3, 2, 1, 0])
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    53
        # a second time to validate that we spawn new iterators
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    54
        self.assertEqual(list(lazy), [3, 2, 1, 0])
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    55
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    56
        # let's check bool for an empty one
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    57
        self.assertFalse(LazyAncestors(rustidx, [0], 0, False))
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    58
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    59
    def test_standalone_nodetree(self):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    60
        idx = self.parserustindex()
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    61
        nt = self.nodetree(idx)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    62
        for i in range(4):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    63
            nt.insert(i)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    64
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    65
        bin_nodes = [entry[7] for entry in idx]
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    66
        hex_nodes = [hex(n) for n in bin_nodes]
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    67
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    68
        for i, node in enumerate(hex_nodes):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    69
            self.assertEqual(nt.prefix_rev_lookup(node), i)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    70
            self.assertEqual(nt.prefix_rev_lookup(node[:5]), i)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    71
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    72
        # all 4 revisions in idx (standard data set) have different
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    73
        # first nybbles in their Node IDs,
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    74
        # hence `nt.shortest()` should return 1 for them, except when
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    75
        # the leading nybble is 0 (ambiguity with NULL_NODE)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    76
        for i, (bin_node, hex_node) in enumerate(zip(bin_nodes, hex_nodes)):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    77
            shortest = nt.shortest(bin_node)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    78
            expected = 2 if hex_node[0] == ord('0') else 1
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    79
            self.assertEqual(shortest, expected)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    80
            self.assertEqual(nt.prefix_rev_lookup(hex_node[:shortest]), i)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    81
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    82
        # test invalidation (generation poisoning) detection
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    83
        del idx[3]
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    84
        self.assertTrue(nt.is_invalidated())
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    85
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    86
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    87
# Conditional skipping done by the base class
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    88
class PyO3InnerRevlogTest(
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    89
    revlogtesting.PyO3RevlogBasedTestBase, RustInnerRevlogTestMixin
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    90
):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    91
    """Testing new PyO3 bindings, by comparison with rust-cpython bindings."""
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    92
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    93
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    94
if __name__ == '__main__':
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    95
    import silenttestrunner
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    96
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    97
    silenttestrunner.main(__name__)