Changeset View
Changeset View
Standalone View
Standalone View
swh/storage/tests/algos/test_revisions_walker.py
# Copyright (C) 2018-2019 The Software Heritage developers | # Copyright (C) 2018-2021 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import unittest | |||||
from unittest.mock import patch | |||||
from swh.model.hashutil import hash_to_bytes, hash_to_hex | from swh.model.hashutil import hash_to_bytes, hash_to_hex | ||||
from swh.storage.algos.revisions_walker import get_revisions_walker | from swh.storage.algos.revisions_walker import get_revisions_walker | ||||
# For those tests, we will walk the following revisions history | # For those tests, we will walk the following revisions history | ||||
# with different orderings: | # with different orderings: | ||||
# | # | ||||
# * commit b364f53155044e5308a0f73abb3b5f01995a5b7d | # * commit b364f53155044e5308a0f73abb3b5f01995a5b7d | ||||
# |\ Merge: 836d498 b94886c | # |\ Merge: 836d498 b94886c | ||||
▲ Show 20 Lines • Show All 358 Lines • ▼ Show 20 Lines | |||||
] | ] | ||||
_rev_start = "b364f53155044e5308a0f73abb3b5f01995a5b7d" | _rev_start = "b364f53155044e5308a0f73abb3b5f01995a5b7d" | ||||
_rev_missing = "836d498396fb9b5d45c896885f84d8d60a5651dc" | _rev_missing = "836d498396fb9b5d45c896885f84d8d60a5651dc" | ||||
class RevisionsWalkerTest(unittest.TestCase): | |||||
def check_revisions_ordering( | def check_revisions_ordering( | ||||
self, rev_walker_type, expected_result, truncated_history | mocker, rev_walker_type, expected_result, truncated_history | ||||
): | ): | ||||
with patch("swh.storage.postgresql.storage.Storage") as MockStorage: | storage = mocker.patch("swh.storage.postgresql.storage.Storage") | ||||
storage = MockStorage() | |||||
if not truncated_history: | if not truncated_history: | ||||
storage.revision_log.return_value = _revisions_list | storage.revision_log.return_value = _revisions_list | ||||
else: | else: | ||||
revs_lists_truncated = [ | revs_lists_truncated = [ | ||||
None if hash_to_hex(rev["id"]) == _rev_missing else rev | None if hash_to_hex(rev["id"]) == _rev_missing else rev | ||||
for rev in _revisions_list | for rev in _revisions_list | ||||
] | ] | ||||
storage.revision_log.return_value = revs_lists_truncated | storage.revision_log.return_value = revs_lists_truncated | ||||
revs_walker = get_revisions_walker( | revs_walker = get_revisions_walker( | ||||
rev_walker_type, storage, hash_to_bytes(_rev_start) | rev_walker_type, storage, hash_to_bytes(_rev_start) | ||||
) | ) | ||||
self.assertEqual( | assert list(map(hash_to_bytes, expected_result)) == [ | ||||
list(map(hash_to_bytes, expected_result)), | rev["id"] for rev in revs_walker | ||||
[rev["id"] for rev in revs_walker], | ] | ||||
) | |||||
self.assertEqual(revs_walker.is_history_truncated(), truncated_history) | assert revs_walker.is_history_truncated() == truncated_history | ||||
if truncated_history: | if truncated_history: | ||||
missing_revs = revs_walker.missing_revisions() | missing_revs = revs_walker.missing_revisions() | ||||
self.assertEqual(missing_revs, {hash_to_bytes(_rev_missing)}) | assert missing_revs == {hash_to_bytes(_rev_missing)} | ||||
else: | else: | ||||
self.assertEqual(revs_walker.missing_revisions(), set()) | assert revs_walker.missing_revisions() == set() | ||||
def test_revisions_walker_committer_date(self): | def test_revisions_walker_committer_date(mocker): | ||||
# revisions should be returned in reverse chronological order | # revisions should be returned in reverse chronological order | ||||
# of their committer date | # of their committer date | ||||
expected_result = [ | expected_result = [ | ||||
"b364f53155044e5308a0f73abb3b5f01995a5b7d", | "b364f53155044e5308a0f73abb3b5f01995a5b7d", | ||||
"b94886c500c46e32dc3d7ebae8a5409accd592e5", | "b94886c500c46e32dc3d7ebae8a5409accd592e5", | ||||
"0cb6b4611d65bee0f57821dac7f611e2f8a02433", | "0cb6b4611d65bee0f57821dac7f611e2f8a02433", | ||||
"2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | "2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | ||||
"b401c50863475db4440c85c10ac0b6423b61554d", | "b401c50863475db4440c85c10ac0b6423b61554d", | ||||
"9c5051397e5c2e0c258bb639c3dd34406584ca10", | "9c5051397e5c2e0c258bb639c3dd34406584ca10", | ||||
"836d498396fb9b5d45c896885f84d8d60a5651dc", | "836d498396fb9b5d45c896885f84d8d60a5651dc", | ||||
"ee96c2a2d397b79070d2b6fe3051290963748358", | "ee96c2a2d397b79070d2b6fe3051290963748358", | ||||
"8f89dda8e072383cf50d42532ae8f52ad89f8fdf", | "8f89dda8e072383cf50d42532ae8f52ad89f8fdf", | ||||
] | ] | ||||
self.check_revisions_ordering( | check_revisions_ordering( | ||||
"committer_date", expected_result, truncated_history=False | mocker, "committer_date", expected_result, truncated_history=False | ||||
) | ) | ||||
def test_revisions_walker_dfs(self): | |||||
def test_revisions_walker_dfs(mocker): | |||||
# revisions should be returned in the same order they are | # revisions should be returned in the same order they are | ||||
# visited when performing a depth-first search in pre order | # visited when performing a depth-first search in pre order | ||||
# on the revisions DAG | # on the revisions DAG | ||||
expected_result = [ | expected_result = [ | ||||
"b364f53155044e5308a0f73abb3b5f01995a5b7d", | "b364f53155044e5308a0f73abb3b5f01995a5b7d", | ||||
"836d498396fb9b5d45c896885f84d8d60a5651dc", | "836d498396fb9b5d45c896885f84d8d60a5651dc", | ||||
"ee96c2a2d397b79070d2b6fe3051290963748358", | "ee96c2a2d397b79070d2b6fe3051290963748358", | ||||
"8f89dda8e072383cf50d42532ae8f52ad89f8fdf", | "8f89dda8e072383cf50d42532ae8f52ad89f8fdf", | ||||
"b94886c500c46e32dc3d7ebae8a5409accd592e5", | "b94886c500c46e32dc3d7ebae8a5409accd592e5", | ||||
"0cb6b4611d65bee0f57821dac7f611e2f8a02433", | "0cb6b4611d65bee0f57821dac7f611e2f8a02433", | ||||
"2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | "2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | ||||
"b401c50863475db4440c85c10ac0b6423b61554d", | "b401c50863475db4440c85c10ac0b6423b61554d", | ||||
"9c5051397e5c2e0c258bb639c3dd34406584ca10", | "9c5051397e5c2e0c258bb639c3dd34406584ca10", | ||||
] | ] | ||||
self.check_revisions_ordering("dfs", expected_result, truncated_history=False) | check_revisions_ordering(mocker, "dfs", expected_result, truncated_history=False) | ||||
def test_revisions_walker_dfs_post(self): | def test_revisions_walker_dfs_post(mocker): | ||||
# revisions should be returned in the same order they are | # revisions should be returned in the same order they are | ||||
# visited when performing a depth-first search in post order | # visited when performing a depth-first search in post order | ||||
# on the revisions DAG | # on the revisions DAG | ||||
expected_result = [ | expected_result = [ | ||||
"b364f53155044e5308a0f73abb3b5f01995a5b7d", | "b364f53155044e5308a0f73abb3b5f01995a5b7d", | ||||
"b94886c500c46e32dc3d7ebae8a5409accd592e5", | "b94886c500c46e32dc3d7ebae8a5409accd592e5", | ||||
"0cb6b4611d65bee0f57821dac7f611e2f8a02433", | "0cb6b4611d65bee0f57821dac7f611e2f8a02433", | ||||
"2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | "2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | ||||
"b401c50863475db4440c85c10ac0b6423b61554d", | "b401c50863475db4440c85c10ac0b6423b61554d", | ||||
"9c5051397e5c2e0c258bb639c3dd34406584ca10", | "9c5051397e5c2e0c258bb639c3dd34406584ca10", | ||||
"836d498396fb9b5d45c896885f84d8d60a5651dc", | "836d498396fb9b5d45c896885f84d8d60a5651dc", | ||||
"ee96c2a2d397b79070d2b6fe3051290963748358", | "ee96c2a2d397b79070d2b6fe3051290963748358", | ||||
"8f89dda8e072383cf50d42532ae8f52ad89f8fdf", | "8f89dda8e072383cf50d42532ae8f52ad89f8fdf", | ||||
] | ] | ||||
self.check_revisions_ordering( | check_revisions_ordering( | ||||
"dfs_post", expected_result, truncated_history=False | mocker, "dfs_post", expected_result, truncated_history=False | ||||
) | ) | ||||
def test_revisions_walker_bfs(self): | |||||
def test_revisions_walker_bfs(mocker): | |||||
# revisions should be returned in the same order they are | # revisions should be returned in the same order they are | ||||
# visited when performing a breadth-first search on the | # visited when performing a breadth-first search on the | ||||
# revisions DAG | # revisions DAG | ||||
expected_result = [ | expected_result = [ | ||||
"b364f53155044e5308a0f73abb3b5f01995a5b7d", | "b364f53155044e5308a0f73abb3b5f01995a5b7d", | ||||
"836d498396fb9b5d45c896885f84d8d60a5651dc", | "836d498396fb9b5d45c896885f84d8d60a5651dc", | ||||
"b94886c500c46e32dc3d7ebae8a5409accd592e5", | "b94886c500c46e32dc3d7ebae8a5409accd592e5", | ||||
"ee96c2a2d397b79070d2b6fe3051290963748358", | "ee96c2a2d397b79070d2b6fe3051290963748358", | ||||
"0cb6b4611d65bee0f57821dac7f611e2f8a02433", | "0cb6b4611d65bee0f57821dac7f611e2f8a02433", | ||||
"8f89dda8e072383cf50d42532ae8f52ad89f8fdf", | "8f89dda8e072383cf50d42532ae8f52ad89f8fdf", | ||||
"2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | "2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | ||||
"b401c50863475db4440c85c10ac0b6423b61554d", | "b401c50863475db4440c85c10ac0b6423b61554d", | ||||
"9c5051397e5c2e0c258bb639c3dd34406584ca10", | "9c5051397e5c2e0c258bb639c3dd34406584ca10", | ||||
] | ] | ||||
self.check_revisions_ordering("bfs", expected_result, truncated_history=False) | check_revisions_ordering(mocker, "bfs", expected_result, truncated_history=False) | ||||
def test_revisions_walker_truncated_history(self): | def test_revisions_walker_truncated_history(mocker): | ||||
expected_result = [ | expected_result = [ | ||||
"b364f53155044e5308a0f73abb3b5f01995a5b7d", | "b364f53155044e5308a0f73abb3b5f01995a5b7d", | ||||
"b94886c500c46e32dc3d7ebae8a5409accd592e5", | "b94886c500c46e32dc3d7ebae8a5409accd592e5", | ||||
"0cb6b4611d65bee0f57821dac7f611e2f8a02433", | "0cb6b4611d65bee0f57821dac7f611e2f8a02433", | ||||
"2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | "2b0240c6d682bad51532eec15b8a7ed6b75c8d31", | ||||
"b401c50863475db4440c85c10ac0b6423b61554d", | "b401c50863475db4440c85c10ac0b6423b61554d", | ||||
"9c5051397e5c2e0c258bb639c3dd34406584ca10", | "9c5051397e5c2e0c258bb639c3dd34406584ca10", | ||||
] | ] | ||||
for revs_walker_type in ("committer_date", "bfs", "dfs", "dfs_post"): | for revs_walker_type in ("committer_date", "bfs", "dfs", "dfs_post"): | ||||
self.check_revisions_ordering( | check_revisions_ordering( | ||||
revs_walker_type, expected_result, truncated_history=True | mocker, revs_walker_type, expected_result, truncated_history=True | ||||
) | ) |