Changeset View
Changeset View
Standalone View
Standalone View
swh/storage/tests/algos/test_revisions_walker.py
# Copyright (C) 2018 The Software Heritage developers | # Copyright (C) 2018-2019 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 | import unittest | ||||
from unittest.mock import patch | from unittest.mock import patch | ||||
from swh.model.hashutil import hash_to_bytes | 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 | ||||
# | | Author: Adam <adam.janicki@roche.com> | # | | Author: Adam <adam.janicki@roche.com> | ||||
▲ Show 20 Lines • Show All 259 Lines • ▼ Show 20 Lines | [{'author': {'email': b'adam.janicki@roche.com', # noqa | ||||
'metadata': None, | 'metadata': None, | ||||
'parents': [], | 'parents': [], | ||||
'synthetic': False, | 'synthetic': False, | ||||
'type': 'git'}] | 'type': 'git'}] | ||||
_rev_start = 'b364f53155044e5308a0f73abb3b5f01995a5b7d' | _rev_start = 'b364f53155044e5308a0f73abb3b5f01995a5b7d' | ||||
_rev_missing = '836d498396fb9b5d45c896885f84d8d60a5651dc' | |||||
class RevisionsWalkerTest(unittest.TestCase): | class RevisionsWalkerTest(unittest.TestCase): | ||||
@patch('swh.storage.storage.Storage') | |||||
def check_revisions_ordering(self, rev_walker_type, expected_result, | def check_revisions_ordering(self, rev_walker_type, expected_result, | ||||
MockStorage): | truncated_history): | ||||
vlorentz: Why did you replace the decorator with a `with`? | |||||
Done Inline ActionsBecause I wanted to use the new truncated_history argument as a keyword one in tests implementation for better readability. anlambert: Because I wanted to use the new `truncated_history` argument as a keyword one in tests… | |||||
Not Done Inline ActionsDoesn't this work? @patch('swh.storage.storage.Storage') def check_revisions_ordering(self, rev_walker_type, expected_result, truncated_history, MockStorage): vlorentz: Doesn't this work?
```
@patch('swh.storage.storage.Storage')
def check_revisions_ordering(self… | |||||
Done Inline ActionsNope, got this kind of error when proceeding like this: swh/storage/tests/algos/test_revisions_walker.py:404: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (<swh.storage.tests.algos.test_revisions_walker.RevisionsWalkerTest testMethod=test_revisions_walker_truncated_history...40c85c10ac0b6423b61554d', '9c5051397e5c2e0c258bb639c3dd34406584ca10'], <MagicMock name='Storage' id='139885825057680'>) keywargs = {'truncated_history': True}, extra_args = [<MagicMock name='Storage' id='139885825057680'>], entered_patchers = [<unittest.mock._patch object at 0x7f39c1691278>] exc_info = (<class 'TypeError'>, TypeError("check_revisions_ordering() got multiple values for argument 'truncated_history'",), <traceback object at 0x7f39b4e097c8>), patching = <unittest.mock._patch object at 0x7f39c1691278> arg = <MagicMock name='Storage' id='139885825057680'> @wraps(func) def patched(*args, **keywargs): extra_args = [] entered_patchers = [] exc_info = tuple() try: for patching in patched.patchings: arg = patching.__enter__() entered_patchers.append(patching) if patching.attribute_name is not None: keywargs.update(arg) elif patching.new is DEFAULT: extra_args.append(arg) args += tuple(extra_args) > return func(*args, **keywargs) E TypeError: check_revisions_ordering() got multiple values for argument 'truncated_history' /usr/lib/python3.5/unittest/mock.py:1159: TypeError anlambert: Nope, got this kind of error when proceeding like this:
```… | |||||
with patch('swh.storage.storage.Storage') as MockStorage: | |||||
storage = MockStorage() | storage = MockStorage() | ||||
if not truncated_history: | |||||
storage.revision_log.return_value = _revisions_list | storage.revision_log.return_value = _revisions_list | ||||
else: | |||||
revs_lists_truncated = [ | |||||
None if hash_to_hex(rev['id']) == _rev_missing else rev | |||||
for rev in _revisions_list | |||||
] | |||||
Not Done Inline Actionsrevs_lists_truncated = [None if hash_to_hex(rev['id']) == _rev_missing else rev for rev in _revisions_list] vlorentz: ```
revs_lists_truncated = [None if hash_to_hex(rev['id']) == _rev_missing else rev… | |||||
Done Inline Actionslist comprehension, ack anlambert: list comprehension, ack | |||||
storage.revision_log.return_value = revs_lists_truncated | |||||
revs_walker = \ | revs_walker = get_revisions_walker(rev_walker_type, storage, | ||||
get_revisions_walker(rev_walker_type, storage, | |||||
hash_to_bytes(_rev_start)) | hash_to_bytes(_rev_start)) | ||||
self.assertEqual(list(map(hash_to_bytes, expected_result)), | self.assertEqual(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) | |||||
if truncated_history: | |||||
missing_revs = revs_walker.missing_revisions() | |||||
self.assertEqual(missing_revs, {hash_to_bytes(_rev_missing)}) | |||||
else: | |||||
self.assertEqual(revs_walker.missing_revisions(), set()) | |||||
Not Done Inline Actionselse: self.assertEqual(revs_walker.missing_revisions(), set()) vlorentz: ```
else:
self.assertEqual(revs_walker.missing_revisions(), set())
``` | |||||
Done Inline Actionsack anlambert: ack | |||||
def test_revisions_walker_committer_date(self): | def test_revisions_walker_committer_date(self): | ||||
# 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 = ['b364f53155044e5308a0f73abb3b5f01995a5b7d', | expected_result = ['b364f53155044e5308a0f73abb3b5f01995a5b7d', | ||||
'b94886c500c46e32dc3d7ebae8a5409accd592e5', | 'b94886c500c46e32dc3d7ebae8a5409accd592e5', | ||||
'0cb6b4611d65bee0f57821dac7f611e2f8a02433', | '0cb6b4611d65bee0f57821dac7f611e2f8a02433', | ||||
'2b0240c6d682bad51532eec15b8a7ed6b75c8d31', | '2b0240c6d682bad51532eec15b8a7ed6b75c8d31', | ||||
'b401c50863475db4440c85c10ac0b6423b61554d', | 'b401c50863475db4440c85c10ac0b6423b61554d', | ||||
'9c5051397e5c2e0c258bb639c3dd34406584ca10', | '9c5051397e5c2e0c258bb639c3dd34406584ca10', | ||||
'836d498396fb9b5d45c896885f84d8d60a5651dc', | '836d498396fb9b5d45c896885f84d8d60a5651dc', | ||||
'ee96c2a2d397b79070d2b6fe3051290963748358', | 'ee96c2a2d397b79070d2b6fe3051290963748358', | ||||
'8f89dda8e072383cf50d42532ae8f52ad89f8fdf'] | '8f89dda8e072383cf50d42532ae8f52ad89f8fdf'] | ||||
self.check_revisions_ordering('committer_date', expected_result) | self.check_revisions_ordering('committer_date', expected_result, | ||||
truncated_history=False) | |||||
def test_revisions_walker_dfs(self): | def test_revisions_walker_dfs(self): | ||||
# 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 = ['b364f53155044e5308a0f73abb3b5f01995a5b7d', | expected_result = ['b364f53155044e5308a0f73abb3b5f01995a5b7d', | ||||
'836d498396fb9b5d45c896885f84d8d60a5651dc', | '836d498396fb9b5d45c896885f84d8d60a5651dc', | ||||
'ee96c2a2d397b79070d2b6fe3051290963748358', | 'ee96c2a2d397b79070d2b6fe3051290963748358', | ||||
'8f89dda8e072383cf50d42532ae8f52ad89f8fdf', | '8f89dda8e072383cf50d42532ae8f52ad89f8fdf', | ||||
'b94886c500c46e32dc3d7ebae8a5409accd592e5', | 'b94886c500c46e32dc3d7ebae8a5409accd592e5', | ||||
'0cb6b4611d65bee0f57821dac7f611e2f8a02433', | '0cb6b4611d65bee0f57821dac7f611e2f8a02433', | ||||
'2b0240c6d682bad51532eec15b8a7ed6b75c8d31', | '2b0240c6d682bad51532eec15b8a7ed6b75c8d31', | ||||
'b401c50863475db4440c85c10ac0b6423b61554d', | 'b401c50863475db4440c85c10ac0b6423b61554d', | ||||
'9c5051397e5c2e0c258bb639c3dd34406584ca10'] | '9c5051397e5c2e0c258bb639c3dd34406584ca10'] | ||||
self.check_revisions_ordering('dfs', expected_result) | self.check_revisions_ordering('dfs', expected_result, | ||||
truncated_history=False) | |||||
def test_revisions_walker_dfs_post(self): | def test_revisions_walker_dfs_post(self): | ||||
# 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 = ['b364f53155044e5308a0f73abb3b5f01995a5b7d', | expected_result = ['b364f53155044e5308a0f73abb3b5f01995a5b7d', | ||||
'b94886c500c46e32dc3d7ebae8a5409accd592e5', | 'b94886c500c46e32dc3d7ebae8a5409accd592e5', | ||||
'0cb6b4611d65bee0f57821dac7f611e2f8a02433', | '0cb6b4611d65bee0f57821dac7f611e2f8a02433', | ||||
'2b0240c6d682bad51532eec15b8a7ed6b75c8d31', | '2b0240c6d682bad51532eec15b8a7ed6b75c8d31', | ||||
'b401c50863475db4440c85c10ac0b6423b61554d', | 'b401c50863475db4440c85c10ac0b6423b61554d', | ||||
'9c5051397e5c2e0c258bb639c3dd34406584ca10', | '9c5051397e5c2e0c258bb639c3dd34406584ca10', | ||||
'836d498396fb9b5d45c896885f84d8d60a5651dc', | '836d498396fb9b5d45c896885f84d8d60a5651dc', | ||||
'ee96c2a2d397b79070d2b6fe3051290963748358', | 'ee96c2a2d397b79070d2b6fe3051290963748358', | ||||
'8f89dda8e072383cf50d42532ae8f52ad89f8fdf'] | '8f89dda8e072383cf50d42532ae8f52ad89f8fdf'] | ||||
self.check_revisions_ordering('dfs_post', expected_result) | self.check_revisions_ordering('dfs_post', expected_result, | ||||
truncated_history=False) | |||||
def test_revisions_walker_bfs(self): | def test_revisions_walker_bfs(self): | ||||
# 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 = ['b364f53155044e5308a0f73abb3b5f01995a5b7d', | expected_result = ['b364f53155044e5308a0f73abb3b5f01995a5b7d', | ||||
'836d498396fb9b5d45c896885f84d8d60a5651dc', | '836d498396fb9b5d45c896885f84d8d60a5651dc', | ||||
'b94886c500c46e32dc3d7ebae8a5409accd592e5', | 'b94886c500c46e32dc3d7ebae8a5409accd592e5', | ||||
'ee96c2a2d397b79070d2b6fe3051290963748358', | 'ee96c2a2d397b79070d2b6fe3051290963748358', | ||||
'0cb6b4611d65bee0f57821dac7f611e2f8a02433', | '0cb6b4611d65bee0f57821dac7f611e2f8a02433', | ||||
'8f89dda8e072383cf50d42532ae8f52ad89f8fdf', | '8f89dda8e072383cf50d42532ae8f52ad89f8fdf', | ||||
'2b0240c6d682bad51532eec15b8a7ed6b75c8d31', | '2b0240c6d682bad51532eec15b8a7ed6b75c8d31', | ||||
'b401c50863475db4440c85c10ac0b6423b61554d', | 'b401c50863475db4440c85c10ac0b6423b61554d', | ||||
'9c5051397e5c2e0c258bb639c3dd34406584ca10'] | '9c5051397e5c2e0c258bb639c3dd34406584ca10'] | ||||
self.check_revisions_ordering('bfs', expected_result) | self.check_revisions_ordering('bfs', expected_result, | ||||
truncated_history=False) | |||||
def test_revisions_walker_truncated_history(self): | |||||
expected_result = ['b364f53155044e5308a0f73abb3b5f01995a5b7d', | |||||
'b94886c500c46e32dc3d7ebae8a5409accd592e5', | |||||
'0cb6b4611d65bee0f57821dac7f611e2f8a02433', | |||||
'2b0240c6d682bad51532eec15b8a7ed6b75c8d31', | |||||
'b401c50863475db4440c85c10ac0b6423b61554d', | |||||
'9c5051397e5c2e0c258bb639c3dd34406584ca10'] | |||||
for revs_walker_type in ('committer_date', 'bfs', 'dfs', 'dfs_post'): | |||||
self.check_revisions_ordering(revs_walker_type, expected_result, | |||||
truncated_history=True) |
Why did you replace the decorator with a with?