Changeset View
Changeset View
Standalone View
Standalone View
swh/storage/tests/algos/test_dir_iterator.py
# Copyright (C) 2018 The Software Heritage developers | # Copyright (C) 2018 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 nose.tools import istest, nottest | |||||
from swh.model.from_disk import DentryPerms | from swh.model.from_disk import DentryPerms | ||||
from swh.model.hashutil import hash_to_bytes, MultiHash | from swh.model.hashutil import MultiHash, hash_to_bytes | ||||
from swh.model.identifiers import directory_identifier | from swh.model.identifiers import directory_identifier | ||||
from swh.storage.algos.dir_iterators import dir_iterator | from swh.storage.algos.dir_iterators import dir_iterator | ||||
# flake8: noqa | # flake8: noqa | ||||
class DirectoryModel(object): | class DirectoryModel(object): | ||||
""" | """ | ||||
Quick and dirty directory model to ease the writing | Quick and dirty directory model to ease the writing | ||||
▲ Show 20 Lines • Show All 67 Lines • ▼ Show 20 Lines | def get_path_data(self, path): | ||||
} | } | ||||
else: | else: | ||||
return entry.get_path_data(b'/'.join(path_parts[1:])) | return entry.get_path_data(b'/'.join(path_parts[1:])) | ||||
@patch('swh.storage.algos.dir_iterators._get_dir') | @patch('swh.storage.algos.dir_iterators._get_dir') | ||||
class TestDirectoryIterator(unittest.TestCase): | class TestDirectoryIterator(unittest.TestCase): | ||||
@nottest | |||||
def check_iterated_paths(self, dir_model, expected_paths_order, | def check_iterated_paths(self, dir_model, expected_paths_order, | ||||
mock_get_dir): | mock_get_dir): | ||||
def _get_dir(*args, **kwargs): | def _get_dir(*args, **kwargs): | ||||
return dir_model.get_hash_data(args[1]) | return dir_model.get_hash_data(args[1]) | ||||
mock_get_dir.side_effect = _get_dir # noqa | mock_get_dir.side_effect = _get_dir # noqa | ||||
paths_order = [e['path'] for e in dir_iterator(None, dir_model['target'])] | paths_order = [e['path'] for e in dir_iterator(None, dir_model['target'])] | ||||
self.assertEqual(paths_order, expected_paths_order) | self.assertEqual(paths_order, expected_paths_order) | ||||
@istest | |||||
def test_dir_iterator_empty_dir(self, mock_get_dir): | def test_dir_iterator_empty_dir(self, mock_get_dir): | ||||
dir_model = DirectoryModel() | dir_model = DirectoryModel() | ||||
expected_paths_order = [] | expected_paths_order = [] | ||||
self.check_iterated_paths(dir_model, expected_paths_order, mock_get_dir) | self.check_iterated_paths(dir_model, expected_paths_order, mock_get_dir) | ||||
@istest | |||||
def test_dir_iterator_no_empty_dirs(self, mock_get_dir): | def test_dir_iterator_no_empty_dirs(self, mock_get_dir): | ||||
dir_model = DirectoryModel() | dir_model = DirectoryModel() | ||||
dir_model.add_file(b'xyz/gtr/uhb') | dir_model.add_file(b'xyz/gtr/uhb') | ||||
dir_model.add_file(b'bca/ef') | dir_model.add_file(b'bca/ef') | ||||
dir_model.add_file(b'abc/ab') | dir_model.add_file(b'abc/ab') | ||||
dir_model.add_file(b'abc/bc') | dir_model.add_file(b'abc/bc') | ||||
dir_model.add_file(b'xyz/ouy/poi') | dir_model.add_file(b'xyz/ouy/poi') | ||||
expected_paths_order = [b'abc', | expected_paths_order = [b'abc', | ||||
b'abc/ab', | b'abc/ab', | ||||
b'abc/bc', | b'abc/bc', | ||||
b'bca', | b'bca', | ||||
b'bca/ef', | b'bca/ef', | ||||
b'xyz', | b'xyz', | ||||
b'xyz/gtr', | b'xyz/gtr', | ||||
b'xyz/gtr/uhb', | b'xyz/gtr/uhb', | ||||
b'xyz/ouy', | b'xyz/ouy', | ||||
b'xyz/ouy/poi'] | b'xyz/ouy/poi'] | ||||
self.check_iterated_paths(dir_model, expected_paths_order, mock_get_dir) | self.check_iterated_paths(dir_model, expected_paths_order, mock_get_dir) | ||||
@istest | |||||
def test_dir_iterator_with_empty_dirs(self, mock_get_dir): | def test_dir_iterator_with_empty_dirs(self, mock_get_dir): | ||||
dir_model = DirectoryModel() | dir_model = DirectoryModel() | ||||
dir_model.add_file(b'xyz/gtr/') | dir_model.add_file(b'xyz/gtr/') | ||||
dir_model.add_file(b'bca/ef') | dir_model.add_file(b'bca/ef') | ||||
dir_model.add_file(b'abc/') | dir_model.add_file(b'abc/') | ||||
dir_model.add_file(b'xyz/ouy/poi') | dir_model.add_file(b'xyz/ouy/poi') | ||||
expected_paths_order = [b'abc', | expected_paths_order = [b'abc', | ||||
b'bca', | b'bca', | ||||
b'bca/ef', | b'bca/ef', | ||||
b'xyz', | b'xyz', | ||||
b'xyz/gtr', | b'xyz/gtr', | ||||
b'xyz/ouy', | b'xyz/ouy', | ||||
b'xyz/ouy/poi'] | b'xyz/ouy/poi'] | ||||
self.check_iterated_paths(dir_model, expected_paths_order, mock_get_dir) | self.check_iterated_paths(dir_model, expected_paths_order, mock_get_dir) |