Changeset View
Standalone View
swh/loader/svn/tests/test_loader.py
# Copyright (C) 2016-2018 The Software Heritage developers | # Copyright (C) 2016-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 | ||||
from nose.tools import istest | from nose.tools import istest | ||||
from test_base import BaseTestSvnLoader | from test_base import BaseSvnLoaderTest | ||||
from unittest import TestCase | from unittest import TestCase | ||||
from swh.model import hashutil | from swh.model import hashutil | ||||
from swh.loader.svn.loader import build_swh_snapshot, DEFAULT_BRANCH | from swh.loader.svn.loader import build_swh_snapshot, DEFAULT_BRANCH | ||||
from swh.loader.svn.loader import SWHSvnLoader | from swh.loader.svn.loader import SvnLoader | ||||
from swh.loader.svn.exception import SvnLoaderEventful, SvnLoaderUneventful | |||||
from swh.loader.svn.exception import SvnLoaderHistoryAltered | |||||
class TestSWHSnapshot(TestCase): | class TestSnapshot(TestCase): | ||||
@istest | @istest | ||||
def build_swh_snapshot(self): | def build_swh_snapshot(self): | ||||
actual_snap = build_swh_snapshot('revision-id') | actual_snap = build_swh_snapshot('revision-id') | ||||
self.assertEquals(actual_snap, { | self.assertEquals(actual_snap, { | ||||
'id': None, | 'id': None, | ||||
'branches': { | 'branches': { | ||||
DEFAULT_BRANCH: { | DEFAULT_BRANCH: { | ||||
'target': 'revision-id', | 'target': 'revision-id', | ||||
'target_type': 'revision', | 'target_type': 'revision', | ||||
} | } | ||||
} | } | ||||
}) | }) | ||||
# Define loaders with no storage | # Define loaders with no storage | ||||
# They'll just accumulate the data in place | # They'll just accumulate the data in place | ||||
# Only for testing purposes. | # Only for testing purposes. | ||||
class TestSvnLoader: | class LoaderNoStorage: | ||||
"""Mixin class to inhibit the persistence and keep in memory the data | """Mixin class to inhibit the persistence and keep in memory the data | ||||
sent for storage. | sent for storage. | ||||
cf. SWHSvnLoaderNoStorage | cf. SvnLoaderNoStorage | ||||
""" | """ | ||||
def __init__(self): | def __init__(self): | ||||
super().__init__() | super().__init__() | ||||
self.all_contents = [] | self.all_contents = [] | ||||
self.all_directories = [] | self.all_directories = [] | ||||
self.all_revisions = [] | self.all_revisions = [] | ||||
self.all_releases = [] | self.all_releases = [] | ||||
self.all_snapshots = [] | |||||
# Check at each svn revision that the hash tree computation | # Check at each svn revision that the hash tree computation | ||||
# does not diverge | # does not diverge | ||||
self.check_revision = 10 | self.check_revision = 10 | ||||
# typed data | # typed data | ||||
self.objects = { | self.objects = { | ||||
'content': self.all_contents, | 'content': self.all_contents, | ||||
'directory': self.all_directories, | 'directory': self.all_directories, | ||||
'revision': self.all_revisions, | 'revision': self.all_revisions, | ||||
'release': self.all_releases, | 'release': self.all_releases, | ||||
'snapshot': self.all_snapshots, | |||||
} | } | ||||
def _add(self, type, l): | def _add(self, type, l): | ||||
"""Add without duplicates and keeping the insertion order. | """Add without duplicates and keeping the insertion order. | ||||
Args: | Args: | ||||
type (str): Type of objects concerned by the action | type (str): Type of objects concerned by the action | ||||
l ([object]): List of 'type' object | l ([object]): List of 'type' object | ||||
Show All 12 Lines | def maybe_load_directories(self, all_directories): | ||||
self._add('directory', all_directories) | self._add('directory', all_directories) | ||||
def maybe_load_revisions(self, all_revisions): | def maybe_load_revisions(self, all_revisions): | ||||
self._add('revision', all_revisions) | self._add('revision', all_revisions) | ||||
def maybe_load_releases(self, releases): | def maybe_load_releases(self, releases): | ||||
raise ValueError('If called, the test must break.') | raise ValueError('If called, the test must break.') | ||||
def maybe_load_snapshot(self, snapshot): | |||||
self._add('snapshot', [snapshot]) | |||||
def _store_origin_visit(self): | |||||
pass | |||||
def open_fetch_history(self): | |||||
pass | |||||
def close_fetch_history_success(self, fetch_history_id): | |||||
pass | |||||
def close_fetch_history_failure(self, fetch_history_id): | |||||
pass | |||||
def update_origin_visit(self, origin_id, visit, status): | |||||
pass | |||||
# Override to do nothing at the end | # Override to do nothing at the end | ||||
def close_failure(self): | def close_failure(self): | ||||
pass | pass | ||||
def close_success(self): | def close_success(self): | ||||
pass | pass | ||||
def prepare(self, *args, **kwargs): | def pre_cleanup(self): | ||||
ardumont: All this green is needed because now we test the full loading of the loader (and not some… | |||||
# Override to only prepare the svn repository | pass | ||||
self.svnrepo = self.get_svn_repo(*args) | |||||
origin_id = 10 | |||||
self.latest_snapshot = self.swh_latest_snapshot_revision( | |||||
origin_id, None) | |||||
class LoaderWithState: | |||||
"""Additional state setup (bypassed by some override for test purposes) | |||||
""" | |||||
def __init__(self): | |||||
super().__init__() | |||||
self.origin = { | |||||
'id': 1, | |||||
'url': '/dev/null', | |||||
'type': 'svn', | |||||
} | |||||
self.visit = { | |||||
'origin': 1, | |||||
'visit': 1, | |||||
Not Done Inline ActionsThat's a gory detail. ardumont: That's a gory detail.
I added it as inheritance because that allowed to split the setup… | |||||
} | |||||
class SWHSvnLoaderNoStorage(TestSvnLoader, SWHSvnLoader): | |||||
"""An SWHSVNLoader with no persistence. | class SvnLoaderNoStorage(LoaderNoStorage, LoaderWithState, SvnLoader): | ||||
"""An SVNLoader with no persistence. | |||||
Context: | Context: | ||||
Load a new svn repository using the swh policy (so no update). | Load a new svn repository using the swh policy (so no update). | ||||
""" | """ | ||||
def swh_latest_snapshot_revision(self, origin_id, prev_swh_revision=None): | def swh_latest_snapshot_revision(self, origin_id, prev_swh_revision=None): | ||||
"""We do not know this repository so no revision. | """We do not know this repository so no revision. | ||||
""" | """ | ||||
return {} | return {} | ||||
class SWHSvnLoaderUpdateNoStorage(TestSvnLoader, SWHSvnLoader): | class SvnLoaderUpdateNoStorage(LoaderNoStorage, LoaderWithState, SvnLoader): | ||||
"""An SWHSVNLoader with no persistence. | """An SVNLoader with no persistence. | ||||
Context: | Context: | ||||
Load a known svn repository using the swh policy. | Load a known svn repository using the swh policy. | ||||
We can either: | We can either: | ||||
- do nothing since it does not contain any new commit (so no | - do nothing since it does not contain any new commit (so no | ||||
change) | change) | ||||
- either check its history is not altered and update in | - either check its history is not altered and update in | ||||
consequence by loading the new revision | consequence by loading the new revision | ||||
""" | """ | ||||
def swh_latest_snapshot_revision(self, origin_id, prev_swh_revision=None): | def swh_latest_snapshot_revision(self, origin_id, prev_swh_revision=None): | ||||
"""Avoid the storage persistence call and return the expected previous | """Avoid the storage persistence call and return the expected previous | ||||
revision for that repository. | revision for that repository. | ||||
Check the following for explanation about the hashes: | Check the following for explanation about the hashes: | ||||
- test_loader.org for (swh policy). | - test_loader.org for (swh policy). | ||||
- cf. SWHSvnLoaderITTest | - cf. SvnLoaderITTest | ||||
""" | """ | ||||
return { | return { | ||||
'snapshot': None, | 'snapshot': 'something', # need a snapshot of sort | ||||
'revision': { | 'revision': { | ||||
'id': hashutil.hash_to_bytes( | 'id': hashutil.hash_to_bytes( | ||||
'4876cb10aec6f708f7466dddf547567b65f6c39c'), | '4876cb10aec6f708f7466dddf547567b65f6c39c'), | ||||
'parents': [hashutil.hash_to_bytes( | 'parents': [hashutil.hash_to_bytes( | ||||
'a3a577948fdbda9d1061913b77a1588695eadb41')], | 'a3a577948fdbda9d1061913b77a1588695eadb41')], | ||||
'directory': hashutil.hash_to_bytes( | 'directory': hashutil.hash_to_bytes( | ||||
'0deab3023ac59398ae467fc4bff5583008af1ee2'), | '0deab3023ac59398ae467fc4bff5583008af1ee2'), | ||||
'target_type': 'revision', | 'target_type': 'revision', | ||||
'metadata': { | 'metadata': { | ||||
'extra_headers': [ | 'extra_headers': [ | ||||
['svn_repo_uuid', | ['svn_repo_uuid', | ||||
'3187e211-bb14-4c82-9596-0b59d67cd7f4'], | '3187e211-bb14-4c82-9596-0b59d67cd7f4'], | ||||
['svn_revision', '6'] | ['svn_revision', '6'] | ||||
] | ] | ||||
} | } | ||||
} | } | ||||
} | } | ||||
class SWHSvnLoaderUpdateHistoryAlteredNoStorage(TestSvnLoader, SWHSvnLoader): | class SvnLoaderUpdateHistoryAlteredNoStorage(LoaderNoStorage, LoaderWithState, | ||||
"""An SWHSVNLoader with no persistence. | SvnLoader): | ||||
"""Context: Load a known svn repository using the swh policy with its | |||||
Context: Load a known svn repository using the swh policy with its | |||||
history altered so we do not update it. | history altered so we do not update it. | ||||
""" | """ | ||||
def swh_latest_snapshot_revision(self, origin_id, prev_swh_revision=None): | def swh_latest_snapshot_revision(self, origin_id, prev_swh_revision=None): | ||||
"""Avoid the storage persistence call and return the expected previous | """Avoid the storage persistence call and return the expected previous | ||||
revision for that repository. | revision for that repository. | ||||
Check the following for explanation about the hashes: | Check the following for explanation about the hashes: | ||||
- test_loader.org for (swh policy). | - test_loader.org for (swh policy). | ||||
- cf. SWHSvnLoaderITTest | - cf. SvnLoaderITTest | ||||
""" | """ | ||||
return { | return { | ||||
'snapshot': None, | 'snapshot': None, | ||||
'revision': { | 'revision': { | ||||
# Changed the revision id's hash to simulate history altered | # Changed the revision id's hash to simulate history altered | ||||
'id': hashutil.hash_to_bytes( | 'id': hashutil.hash_to_bytes( | ||||
'badbadbadbadf708f7466dddf547567b65f6c39d'), | 'badbadbadbadf708f7466dddf547567b65f6c39d'), | ||||
'parents': [hashutil.hash_to_bytes( | 'parents': [hashutil.hash_to_bytes( | ||||
'a3a577948fdbda9d1061913b77a1588695eadb41')], | 'a3a577948fdbda9d1061913b77a1588695eadb41')], | ||||
'directory': hashutil.hash_to_bytes( | 'directory': hashutil.hash_to_bytes( | ||||
'0deab3023ac59398ae467fc4bff5583008af1ee2'), | '0deab3023ac59398ae467fc4bff5583008af1ee2'), | ||||
'target_type': 'revision', | 'target_type': 'revision', | ||||
'metadata': { | 'metadata': { | ||||
'extra_headers': [ | 'extra_headers': [ | ||||
['svn_repo_uuid', | ['svn_repo_uuid', | ||||
'3187e211-bb14-4c82-9596-0b59d67cd7f4'], | '3187e211-bb14-4c82-9596-0b59d67cd7f4'], | ||||
['svn_revision', b'6'] | ['svn_revision', b'6'] | ||||
] | ] | ||||
} | } | ||||
} | } | ||||
} | } | ||||
class SWHSvnLoaderNewRepositoryITTest(BaseTestSvnLoader): | class SvnLoaderITest1(BaseSvnLoaderTest): | ||||
"""Load an unknown svn repository results in new data. | |||||
""" | |||||
def setUp(self): | def setUp(self): | ||||
super().setUp() | super().setUp() | ||||
self.loader = SvnLoaderNoStorage() | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | |||||
self.origin_visit = { | |||||
'origin': self.origin['id'], | |||||
'visit': 2, | |||||
} | |||||
self.loader = SWHSvnLoaderNoStorage() | |||||
self.loader.prepare( | |||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""Process a new repository with swh policy should be ok. | """Load a new repository results in new swh object and snapshot | ||||
""" | """ | ||||
# when | # when | ||||
self.loader.process_repository(self.origin_visit) | self.loader.load( | ||||
svn_url=self.svn_mirror_url, | |||||
destination_path=self.destination_path) | |||||
# then | # then | ||||
self.assertEquals(len(self.loader.all_revisions), 6) | self.assertEquals(len(self.loader.all_revisions), 6) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
last_revision = '4876cb10aec6f708f7466dddf547567b65f6c39c' | last_revision = '4876cb10aec6f708f7466dddf547567b65f6c39c' | ||||
# cf. test_loader.org for explaining from where those hashes | # cf. test_loader.org for explaining from where those hashes | ||||
# come from | # come from | ||||
expected_revisions = { | expected_revisions = { | ||||
# revision hash | directory hash | # revision hash | directory hash | ||||
'0d7dd5f751cef8fe17e8024f7d6b0e3aac2cfd71': '669a71cce6c424a81ba42b7dc5d560d32252f0ca', # noqa | '0d7dd5f751cef8fe17e8024f7d6b0e3aac2cfd71': '669a71cce6c424a81ba42b7dc5d560d32252f0ca', # noqa | ||||
'95edacc8848369d6fb1608e887d6d2474fd5224f': '008ac97a1118560797c50e3392fa1443acdaa349', # noqa | '95edacc8848369d6fb1608e887d6d2474fd5224f': '008ac97a1118560797c50e3392fa1443acdaa349', # noqa | ||||
'fef26ea45a520071711ba2b9d16a2985ee837021': '3780effbe846a26751a95a8c95c511fb72be15b4', # noqa | 'fef26ea45a520071711ba2b9d16a2985ee837021': '3780effbe846a26751a95a8c95c511fb72be15b4', # noqa | ||||
'3f51abf3b3d466571be0855dfa67e094f9ceff1b': 'ffcca9b09c5827a6b8137322d4339c8055c3ee1e', # noqa | '3f51abf3b3d466571be0855dfa67e094f9ceff1b': 'ffcca9b09c5827a6b8137322d4339c8055c3ee1e', # noqa | ||||
'a3a577948fdbda9d1061913b77a1588695eadb41': '7dc52cc04c3b8bd7c085900d60c159f7b846f866', # noqa | 'a3a577948fdbda9d1061913b77a1588695eadb41': '7dc52cc04c3b8bd7c085900d60c159f7b846f866', # noqa | ||||
last_revision: '0deab3023ac59398ae467fc4bff5583008af1ee2', # noqa | last_revision: '0deab3023ac59398ae467fc4bff5583008af1ee2', # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SvnLoaderITest2(BaseSvnLoaderTest): | |||||
"""Load a visited repository with no new change results in no data | |||||
change. | |||||
class SWHSvnLoaderUpdateWithNoChangeITTest(BaseTestSvnLoader): | """ | ||||
def setUp(self): | def setUp(self): | ||||
super().setUp() | super().setUp() | ||||
self.loader = SvnLoaderUpdateNoStorage() | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | |||||
self.origin_visit = { | |||||
'origin': self.origin['id'], | |||||
'visit': 3, | |||||
} | |||||
self.loader = SWHSvnLoaderUpdateNoStorage() | |||||
self.loader.prepare( | |||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""Process a known repository with swh policy and no new data should | """Load a repository without new changes results in same snapshot | ||||
be ok. | |||||
""" | """ | ||||
# when | # when | ||||
with self.assertRaises(SvnLoaderUneventful): | self.loader.load( | ||||
self.loader.process_repository(self.origin_visit) | svn_url=self.svn_mirror_url, | ||||
destination_path=self.destination_path) | |||||
# then | # then | ||||
self.assertEquals(len(self.loader.all_contents), 0) | |||||
self.assertEquals(len(self.loader.all_directories), 0) | |||||
self.assertEquals(len(self.loader.all_revisions), 0) | self.assertEquals(len(self.loader.all_revisions), 0) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'uneventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SvnLoaderITest3(BaseSvnLoaderTest): | |||||
"""In this scenario, the dump has been tampered with to modify the | |||||
commit log. This results in a hash divergence which is | |||||
detected at startup. | |||||
class SWHSvnLoaderUpdateWithHistoryAlteredITTest(BaseTestSvnLoader): | In effect, that stops the loading and do nothing. | ||||
""" | |||||
def setUp(self): | def setUp(self): | ||||
# the svn repository pkg-gourmet has been updated with changes | # the svn repository pkg-gourmet has been updated with changes | ||||
super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | ||||
self.loader = SvnLoaderUpdateHistoryAlteredNoStorage() | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | |||||
self.origin_visit = { | |||||
'origin': self.origin['id'], | |||||
'visit': 4, | |||||
} | |||||
self.loader = SWHSvnLoaderUpdateHistoryAlteredNoStorage() | |||||
self.loader.prepare( | |||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""Process a known repository with swh policy and history altered | """Load known repository with history altered should do nothing | ||||
should stop and do nothing. | |||||
""" | """ | ||||
# when | # when | ||||
with self.assertRaises(SvnLoaderHistoryAltered): | self.loader.load(svn_url=self.svn_mirror_url, | ||||
self.loader.args = (self.origin_visit,) | destination_path=self.destination_path) | ||||
self.loader.process_repository(self.origin_visit) | |||||
# then | # then | ||||
# we got the previous run's last revision (rev 6) | # we got the previous run's last revision (rev 6) | ||||
# so 2 news + 1 old | # so 2 news + 1 old | ||||
self.assertEquals(len(self.loader.all_contents), 0) | |||||
self.assertEquals(len(self.loader.all_directories), 0) | |||||
self.assertEquals(len(self.loader.all_revisions), 0) | self.assertEquals(len(self.loader.all_revisions), 0) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
self.assertEquals(len(self.loader.all_snapshots), 0) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'uneventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'partial') | |||||
class SvnLoaderITest4(BaseSvnLoaderTest): | |||||
"""In this scenario, the repository has been updated with new changes. | |||||
The loading visit should result in new objects stored and 1 new | |||||
snapshot. | |||||
class SWHSvnLoaderUpdateWithChangesITTest(BaseTestSvnLoader): | """ | ||||
def setUp(self): | def setUp(self): | ||||
# the svn repository pkg-gourmet has been updated with changes | # the svn repository pkg-gourmet has been updated with changes | ||||
super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | ||||
self.loader = SvnLoaderUpdateNoStorage() | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | |||||
self.origin_visit = { | |||||
'origin': self.origin['id'], | |||||
'visit': 5, | |||||
} | |||||
self.loader = SWHSvnLoaderUpdateNoStorage() | |||||
self.loader.prepare( | |||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def process_repository(self): | ||||
"""Process updated repository should yield new revisions | """Process updated repository should yield new objects | ||||
""" | """ | ||||
# when | # when | ||||
self.loader.process_repository(self.origin_visit) | self.loader.load(svn_url=self.svn_mirror_url, | ||||
destination_path=self.destination_path) | |||||
# then | # then | ||||
# we got the previous run's last revision (rev 6) | # we got the previous run's last revision (rev 6) | ||||
# so 2 new | # so 2 new | ||||
self.assertEquals(len(self.loader.all_revisions), 5) | self.assertEquals(len(self.loader.all_revisions), 5) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
last_revision = '171dc35522bfd17dda4e90a542a0377fb2fc707a' | last_revision = '171dc35522bfd17dda4e90a542a0377fb2fc707a' | ||||
# cf. test_loader.org for explaining from where those hashes | # cf. test_loader.org for explaining from where those hashes | ||||
# come from | # come from | ||||
expected_revisions = { | expected_revisions = { | ||||
# revision hash | directory hash | # revision hash | directory hash | ||||
'7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | '7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | ||||
'38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | '38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | ||||
'99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | '99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | ||||
'902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | '902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | ||||
last_revision: 'fd24a76c87a3207428e06612b49860fc78e9f6dc' # noqa | last_revision: 'fd24a76c87a3207428e06612b49860fc78e9f6dc' # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SWHSvnLoaderUpdateWithChangesStartFromScratchITTest(BaseTestSvnLoader): | |||||
def setUp(self): | |||||
# the svn repository pkg-gourmet has been updated with changes | |||||
super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | class SvnLoaderITTest5(BaseSvnLoaderTest): | ||||
"""Context: | |||||
self.origin_visit = { | - Repository already injected with successfull data | ||||
'origin': self.origin['id'], | - New visit from scratch done with successfull load | ||||
'visit': 5, | |||||
} | |||||
self.loader = SWHSvnLoaderUpdateNoStorage() | """ | ||||
self.loader.prepare( | def setUp(self): | ||||
self.svn_mirror_url, self.destination_path, self.origin) | # the svn repository pkg-gourmet has been updated with changes | ||||
super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | |||||
self.loader = SvnLoaderUpdateNoStorage() | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""Process known repository from scratch should yield revisions again | """Load an existing repository from scratch yields same swh objects | ||||
""" | """ | ||||
# when | # when | ||||
self.loader.process_repository(self.origin_visit, | self.loader.load(svn_url=self.svn_mirror_url, | ||||
destination_path=self.destination_path, | |||||
start_from_scratch=True) | start_from_scratch=True) | ||||
# then | # then | ||||
# we got the previous run's last revision (rev 6) | # we got the previous run's last revision (rev 6) | ||||
# but we do not inspect that as we start from from scratch so | # but we do not inspect that as we start from from scratch so | ||||
# we should have all revisions so 11 | # we should have all revisions so 11 | ||||
self.assertEquals(len(self.loader.all_revisions), 11) | self.assertEquals(len(self.loader.all_revisions), 11) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
expected_revisions = { | expected_revisions = { | ||||
'0d7dd5f751cef8fe17e8024f7d6b0e3aac2cfd71': '669a71cce6c424a81ba42b7dc5d560d32252f0ca', # noqa | '0d7dd5f751cef8fe17e8024f7d6b0e3aac2cfd71': '669a71cce6c424a81ba42b7dc5d560d32252f0ca', # noqa | ||||
'95edacc8848369d6fb1608e887d6d2474fd5224f': '008ac97a1118560797c50e3392fa1443acdaa349', # noqa | '95edacc8848369d6fb1608e887d6d2474fd5224f': '008ac97a1118560797c50e3392fa1443acdaa349', # noqa | ||||
'fef26ea45a520071711ba2b9d16a2985ee837021': '3780effbe846a26751a95a8c95c511fb72be15b4', # noqa | 'fef26ea45a520071711ba2b9d16a2985ee837021': '3780effbe846a26751a95a8c95c511fb72be15b4', # noqa | ||||
'3f51abf3b3d466571be0855dfa67e094f9ceff1b': 'ffcca9b09c5827a6b8137322d4339c8055c3ee1e', # noqa | '3f51abf3b3d466571be0855dfa67e094f9ceff1b': 'ffcca9b09c5827a6b8137322d4339c8055c3ee1e', # noqa | ||||
'a3a577948fdbda9d1061913b77a1588695eadb41': '7dc52cc04c3b8bd7c085900d60c159f7b846f866', # noqa | 'a3a577948fdbda9d1061913b77a1588695eadb41': '7dc52cc04c3b8bd7c085900d60c159f7b846f866', # noqa | ||||
'4876cb10aec6f708f7466dddf547567b65f6c39c': '0deab3023ac59398ae467fc4bff5583008af1ee2', # noqa | '4876cb10aec6f708f7466dddf547567b65f6c39c': '0deab3023ac59398ae467fc4bff5583008af1ee2', # noqa | ||||
'7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | '7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | ||||
'38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | '38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | ||||
'99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | '99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | ||||
'902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | '902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | ||||
'171dc35522bfd17dda4e90a542a0377fb2fc707a': 'fd24a76c87a3207428e06612b49860fc78e9f6dc', # noqa | '171dc35522bfd17dda4e90a542a0377fb2fc707a': 'fd24a76c87a3207428e06612b49860fc78e9f6dc', # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SWHSvnLoaderUpdateWithUnfinishedLoadingChangesITTest(BaseTestSvnLoader): | |||||
def setUp(self): | |||||
super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | class SvnLoaderWithPreviousRevisionNoStorage(LoaderNoStorage, LoaderWithState, | ||||
SvnLoader): | |||||
"""An SVNLoader with no persistence. | |||||
self.origin_visit = { | Context: Load a known svn repository using the swh policy with its | ||||
'origin': self.origin['id'], | history altered so we do not update it. | ||||
'visit': 6 | |||||
} | |||||
self.loader = SWHSvnLoaderNoStorage() | """ | ||||
self.loader.prepare( | def swh_latest_snapshot_revision(self, origin_id, prev_swh_revision=None): | ||||
self.svn_mirror_url, self.destination_path, self.origin) | """Avoid the storage persistence call and return the expected previous | ||||
revision for that repository. | |||||
@istest | Check the following for explanation about the hashes: | ||||
def process_repository(self): | - test_loader.org for (swh policy). | ||||
"""Process partially visited repository should finish loading | - cf. SvnLoaderITTest | ||||
""" | """ | ||||
previous_unfinished_revision = { | return { | ||||
'snapshot': None, | |||||
'revision': { | |||||
'id': hashutil.hash_to_bytes( | 'id': hashutil.hash_to_bytes( | ||||
'4876cb10aec6f708f7466dddf547567b65f6c39c'), | '4876cb10aec6f708f7466dddf547567b65f6c39c'), | ||||
'parents': [hashutil.hash_to_bytes( | 'parents': [hashutil.hash_to_bytes( | ||||
'a3a577948fdbda9d1061913b77a1588695eadb41')], | 'a3a577948fdbda9d1061913b77a1588695eadb41')], | ||||
'directory': hashutil.hash_to_bytes( | 'directory': hashutil.hash_to_bytes( | ||||
'0deab3023ac59398ae467fc4bff5583008af1ee2'), | '0deab3023ac59398ae467fc4bff5583008af1ee2'), | ||||
'target_type': 'revision', | 'target_type': 'revision', | ||||
'metadata': { | 'metadata': { | ||||
'extra_headers': [ | 'extra_headers': [ | ||||
['svn_repo_uuid', '3187e211-bb14-4c82-9596-0b59d67cd7f4'], | ['svn_repo_uuid', '3187e211-bb14-4c82-9596-0b59d67cd7f4'], # noqa | ||||
['svn_revision', '6'] | ['svn_revision', '6'] | ||||
] | ] | ||||
} | } | ||||
} | } | ||||
} | |||||
class SvnLoaderITTest6(BaseSvnLoaderTest): | |||||
"""Context: | |||||
- repository already visited with load successfull | |||||
- Changes on existing repository | |||||
- New Visit done with successful new data | |||||
""" | |||||
def setUp(self): | |||||
super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | |||||
self.loader = SvnLoaderWithPreviousRevisionNoStorage() | |||||
@istest | |||||
def load(self): | |||||
"""Load from partial previous visit result in new changes | |||||
""" | |||||
# when | # when | ||||
self.loader.process_repository( | self.loader.load( | ||||
self.origin_visit, | svn_url=self.svn_mirror_url, | ||||
last_known_swh_revision=previous_unfinished_revision) | destination_path=self.destination_path) | ||||
# then | # then | ||||
# we got the previous run's last revision (rev 6) | # we got the previous run's last revision (rev 6) | ||||
# so 2 new | # so 2 new | ||||
self.assertEquals(len(self.loader.all_revisions), 5) | self.assertEquals(len(self.loader.all_revisions), 5) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
last_revision = '171dc35522bfd17dda4e90a542a0377fb2fc707a' | last_revision = '171dc35522bfd17dda4e90a542a0377fb2fc707a' | ||||
# cf. test_loader.org for explaining from where those hashes | # cf. test_loader.org for explaining from where those hashes | ||||
# come from | # come from | ||||
expected_revisions = { | expected_revisions = { | ||||
# revision hash | directory hash | # revision hash | directory hash | ||||
'7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | '7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | ||||
'38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | '38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | ||||
'99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | '99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | ||||
'902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | '902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | ||||
last_revision: 'fd24a76c87a3207428e06612b49860fc78e9f6dc' # noqa | last_revision: 'fd24a76c87a3207428e06612b49860fc78e9f6dc' # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SvnLoaderITest7(BaseSvnLoaderTest): | |||||
"""Context: | |||||
- repository already visited with load successfull | |||||
- Changes on existing repository | |||||
- New Visit done with successful new data | |||||
class SWHSvnLoaderUpdateWithUnfinishedLoadingChangesButVisitDoneITTest( | """ | ||||
BaseTestSvnLoader): | |||||
def setUp(self): | def setUp(self): | ||||
super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | ||||
self.loader = SvnLoaderUpdateNoStorage() | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | |||||
self.origin_visit = { | |||||
'origin': self.origin['id'], | |||||
'visit': 9, | |||||
} | |||||
self.loader = SWHSvnLoaderUpdateNoStorage() | |||||
self.loader.prepare( | |||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""Process known and partial repository should start from last visit | """Load known and partial repository should start from last visit | ||||
""" | """ | ||||
previous_unfinished_revision = { | previous_unfinished_revision = { | ||||
'id': hashutil.hash_to_bytes( | 'id': hashutil.hash_to_bytes( | ||||
'a3a577948fdbda9d1061913b77a1588695eadb41'), | 'a3a577948fdbda9d1061913b77a1588695eadb41'), | ||||
'parents': [hashutil.hash_to_bytes( | 'parents': [hashutil.hash_to_bytes( | ||||
'3f51abf3b3d466571be0855dfa67e094f9ceff1b')], | '3f51abf3b3d466571be0855dfa67e094f9ceff1b')], | ||||
'directory': hashutil.hash_to_bytes( | 'directory': hashutil.hash_to_bytes( | ||||
'7dc52cc04c3b8bd7c085900d60c159f7b846f866'), | '7dc52cc04c3b8bd7c085900d60c159f7b846f866'), | ||||
'target_type': 'revision', | 'target_type': 'revision', | ||||
'metadata': { | 'metadata': { | ||||
'extra_headers': [ | 'extra_headers': [ | ||||
['svn_repo_uuid', '3187e211-bb14-4c82-9596-0b59d67cd7f4'], | ['svn_repo_uuid', '3187e211-bb14-4c82-9596-0b59d67cd7f4'], | ||||
['svn_revision', '5'] | ['svn_revision', '5'] | ||||
] | ] | ||||
} | } | ||||
} | } | ||||
# when | # when | ||||
self.loader.process_repository( | self.loader.load( | ||||
self.origin_visit, | svn_url=self.svn_mirror_url, | ||||
last_known_swh_revision=previous_unfinished_revision) | destination_path=self.destination_path, | ||||
swh_revision=previous_unfinished_revision) | |||||
# then | # then | ||||
# we got the previous run's last revision (rev 6) | # we got the previous run's last revision (rev 6) | ||||
# so 2 new | # so 2 new | ||||
self.assertEquals(len(self.loader.all_revisions), 5) | self.assertEquals(len(self.loader.all_revisions), 5) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
last_revision = '171dc35522bfd17dda4e90a542a0377fb2fc707a' | last_revision = '171dc35522bfd17dda4e90a542a0377fb2fc707a' | ||||
# cf. test_loader.org for explaining from where those hashes | # cf. test_loader.org for explaining from where those hashes | ||||
# come from | # come from | ||||
expected_revisions = { | expected_revisions = { | ||||
# revision hash | directory hash | # revision hash | directory hash | ||||
'7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | '7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | ||||
'38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | '38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | ||||
'99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | '99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | ||||
'902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | '902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | ||||
last_revision: 'fd24a76c87a3207428e06612b49860fc78e9f6dc' # noqa | last_revision: 'fd24a76c87a3207428e06612b49860fc78e9f6dc' # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SWHSvnLoaderUpdateLessRecentNoStorage(TestSvnLoader, SWHSvnLoader): | class SvnLoaderUpdateLessRecentNoStorage(LoaderNoStorage, LoaderWithState, | ||||
"""An SWHSVNLoader with no persistence. | SvnLoader): | ||||
"""Context: | |||||
Context: | Load a known svn repository. The last visit seen is less | ||||
Load a known svn repository using the swh policy. The last | recent than a previous unfinished crawl. | ||||
visit seen is less recent than a previous unfinished crawl. | |||||
""" | """ | ||||
def swh_latest_snapshot_revision(self, origin_id, prev_swh_revision=None): | def swh_latest_snapshot_revision(self, origin_id, prev_swh_revision=None): | ||||
"""Avoid the storage persistence call and return the expected previous | """Avoid the storage persistence call and return the expected previous | ||||
revision for that repository. | revision for that repository. | ||||
Check the following for explanation about the hashes: | Check the following for explanation about the hashes: | ||||
- test_loader.org for (swh policy). | - test_loader.org for (swh policy). | ||||
- cf. SWHSvnLoaderITTest | - cf. SvnLoaderITTest | ||||
""" | """ | ||||
return { | return { | ||||
'snapshot': None, | 'snapshot': None, | ||||
'revision': { | 'revision': { | ||||
'id': hashutil.hash_to_bytes( | 'id': hashutil.hash_to_bytes( | ||||
'a3a577948fdbda9d1061913b77a1588695eadb41'), | 'a3a577948fdbda9d1061913b77a1588695eadb41'), | ||||
'parents': [hashutil.hash_to_bytes( | 'parents': [hashutil.hash_to_bytes( | ||||
'3f51abf3b3d466571be0855dfa67e094f9ceff1b')], | '3f51abf3b3d466571be0855dfa67e094f9ceff1b')], | ||||
'directory': hashutil.hash_to_bytes( | 'directory': hashutil.hash_to_bytes( | ||||
'7dc52cc04c3b8bd7c085900d60c159f7b846f866'), | '7dc52cc04c3b8bd7c085900d60c159f7b846f866'), | ||||
'target_type': 'revision', | 'target_type': 'revision', | ||||
'metadata': { | 'metadata': { | ||||
'extra_headers': [ | 'extra_headers': [ | ||||
['svn_repo_uuid', | ['svn_repo_uuid', | ||||
'3187e211-bb14-4c82-9596-0b59d67cd7f4'], | '3187e211-bb14-4c82-9596-0b59d67cd7f4'], | ||||
['svn_revision', '5'] | ['svn_revision', '5'] | ||||
] | ] | ||||
} | } | ||||
} | } | ||||
} | } | ||||
class SWHSvnLoaderUnfinishedLoadingChangesSinceLastVisitITTest( | class SvnLoaderITest8(BaseSvnLoaderTest): | ||||
BaseTestSvnLoader): | """Context: | ||||
def setUp(self): | |||||
super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | |||||
self.origin_visit = { | - Previous visit on existing repository done | ||||
'origin': self.origin['id'], | - Starting the loading from the last unfinished visit | ||||
'visit': 1, | - New objects are created (1 new snapshot) | ||||
} | |||||
self.loader = SWHSvnLoaderUpdateLessRecentNoStorage() | """ | ||||
self.loader.prepare( | def setUp(self): | ||||
self.svn_mirror_url, self.destination_path, self.origin) | super().setUp(archive_name='pkg-gourmet-with-updates.tgz') | ||||
self.loader = SvnLoaderUpdateLessRecentNoStorage() | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""Process updated repository should yield revisions from last visit | """Load repository should yield revisions starting from last visit | ||||
""" | """ | ||||
previous_unfinished_revision = { | previous_unfinished_revision = { | ||||
'id': hashutil.hash_to_bytes( | 'id': hashutil.hash_to_bytes( | ||||
'4876cb10aec6f708f7466dddf547567b65f6c39c'), | '4876cb10aec6f708f7466dddf547567b65f6c39c'), | ||||
'parents': [hashutil.hash_to_bytes( | 'parents': [hashutil.hash_to_bytes( | ||||
'a3a577948fdbda9d1061913b77a1588695eadb41')], | 'a3a577948fdbda9d1061913b77a1588695eadb41')], | ||||
'directory': hashutil.hash_to_bytes( | 'directory': hashutil.hash_to_bytes( | ||||
'0deab3023ac59398ae467fc4bff5583008af1ee2'), | '0deab3023ac59398ae467fc4bff5583008af1ee2'), | ||||
'target_type': 'revision', | 'target_type': 'revision', | ||||
'metadata': { | 'metadata': { | ||||
'extra_headers': [ | 'extra_headers': [ | ||||
['svn_repo_uuid', '3187e211-bb14-4c82-9596-0b59d67cd7f4'], | ['svn_repo_uuid', '3187e211-bb14-4c82-9596-0b59d67cd7f4'], | ||||
['svn_revision', '6'] | ['svn_revision', '6'] | ||||
] | ] | ||||
} | } | ||||
} | } | ||||
# when | # when | ||||
self.loader.process_repository( | self.loader.load( | ||||
self.origin_visit, | svn_url=self.svn_mirror_url, | ||||
last_known_swh_revision=previous_unfinished_revision) | destination_path=self.destination_path, | ||||
swh_revision=previous_unfinished_revision) | |||||
# then | # then | ||||
# we got the previous run's last revision (rev 6) | # we got the previous run's last revision (rev 6) | ||||
# so 2 new | # so 2 new | ||||
self.assertEquals(len(self.loader.all_revisions), 5) | self.assertEquals(len(self.loader.all_revisions), 5) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
last_revision = '171dc35522bfd17dda4e90a542a0377fb2fc707a' | last_revision = '171dc35522bfd17dda4e90a542a0377fb2fc707a' | ||||
# cf. test_loader.org for explaining from where those hashes | # cf. test_loader.org for explaining from where those hashes | ||||
# come from | # come from | ||||
expected_revisions = { | expected_revisions = { | ||||
# revision hash | directory hash | # revision hash | directory hash | ||||
'7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | '7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | ||||
'38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | '38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | ||||
'99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | '99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | ||||
'902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | '902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | ||||
last_revision: 'fd24a76c87a3207428e06612b49860fc78e9f6dc' # noqa | last_revision: 'fd24a76c87a3207428e06612b49860fc78e9f6dc' # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SWHSvnLoaderTestCornerCaseAboutCrlfEolInRepoITTest(BaseTestSvnLoader): | class SvnLoaderTTest9(BaseSvnLoaderTest): | ||||
""" | """Check that a svn repo containing a versioned file with CRLF line | ||||
Check that a svn repo containing a versioned file with CRLF line | endings with svn:eol-style property set to 'native' (this is a | ||||
endings with svn:eol-style property set to 'native' (this is | violation of svn specification as the file should have been | ||||
a violation of svn specification as the file should have been | |||||
stored with LF line endings) can be loaded anyway. | stored with LF line endings) can be loaded anyway. | ||||
""" | """ | ||||
def setUp(self): | def setUp(self): | ||||
super().setUp(archive_name='mediawiki-repo-r407-eol-native-crlf.tgz', | super().setUp(archive_name='mediawiki-repo-r407-eol-native-crlf.tgz', | ||||
filename='mediawiki-repo-r407-eol-native-crlf') | filename='mediawiki-repo-r407-eol-native-crlf') | ||||
self.loader = SvnLoaderNoStorage() | |||||
self.origin = {'id': 1, 'type': 'svn', | |||||
'url': 'https://code.google.com/p/pyang/pyang-repo'} | |||||
self.origin_visit = { | |||||
'origin': self.origin['id'], | |||||
'visit': 1, | |||||
} | |||||
self.loader = SWHSvnLoaderNoStorage() | |||||
self.loader.prepare( | |||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def process_repository(self): | ||||
""" | """Load repository with CRLF endings (svn:eol-style: native) is ok | ||||
Process repository with CRLF line endings and svn:eol-style set to 'native' | |||||
""" # noqa | """ # noqa | ||||
# when | # when | ||||
self.loader.process_repository(self.origin_visit) | self.loader.load(svn_url=self.svn_mirror_url, | ||||
destination_path=self.destination_path) | |||||
expected_revisions = { | expected_revisions = { | ||||
'7da4975c363101b819756d33459f30a866d01b1b': 'f63637223ee0f7d4951ffd2d4d9547a4882c5d8b' # noqa | '7da4975c363101b819756d33459f30a866d01b1b': 'f63637223ee0f7d4951ffd2d4d9547a4882c5d8b' # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SWHSvnLoaderTestCornerCaseAboutMixedCrlfLfEolInRepoITTest(BaseTestSvnLoader): # noqa | class SvnLoaderITest10(BaseSvnLoaderTest): # noqa | ||||
""" | """Check that a svn repo containing a versioned file with mixed | ||||
Check that a svn repo containing a versioned file with mixed | |||||
CRLF/LF line endings with svn:eol-style property set to 'native' | CRLF/LF line endings with svn:eol-style property set to 'native' | ||||
(this is a violation of svn specification as mixed line endings | (this is a violation of svn specification as mixed line endings | ||||
for textual content should not be stored when the svn:eol-style | for textual content should not be stored when the svn:eol-style | ||||
property is set) can be loaded anyway. | property is set) can be loaded anyway. | ||||
""" | """ | ||||
def setUp(self): | def setUp(self): | ||||
super().setUp(archive_name='pyang-repo-r343-eol-native-mixed-lf-crlf.tgz', # noqa | super().setUp( | ||||
archive_name='pyang-repo-r343-eol-native-mixed-lf-crlf.tgz', | |||||
filename='pyang-repo-r343-eol-native-mixed-lf-crlf') | filename='pyang-repo-r343-eol-native-mixed-lf-crlf') | ||||
self.loader = SvnLoaderNoStorage() | |||||
self.origin = {'id': 1, 'type': 'svn', | |||||
'url': 'https://code.google.com/m/mediawiki/mediawiki-repo'} # noqa | |||||
self.origin_visit = { | |||||
'origin': self.origin['id'], | |||||
'visit': 1, | |||||
} | |||||
self.loader = SWHSvnLoaderNoStorage() | |||||
self.loader.prepare( | |||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""Load repo with mixed CRLF/LF endings (svn:eol-style:native) is ok | |||||
""" | """ | ||||
Process repository with mixed CRLF/LF line endings and svn:eol-style set to 'native' | self.loader.load(svn_url=self.svn_mirror_url, | ||||
""" # noqa | destination_path=self.destination_path) | ||||
self.loader.process_repository(self.origin_visit) | |||||
expected_revisions = { | expected_revisions = { | ||||
'9c6962eeb9164a636c374be700672355e34a98a7': '16aa6b6271f3456d4643999d234cf39fe3d0cc5a' # noqa | '9c6962eeb9164a636c374be700672355e34a98a7': '16aa6b6271f3456d4643999d234cf39fe3d0cc5a' # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
# self.assertEquals(self.loader.all_snapshots[0], {}) | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SWHSvnLoaderExternalIdCornerCaseITTest(BaseTestSvnLoader): | class SvnLoaderITest11(BaseSvnLoaderTest): | ||||
def setUp(self): | """Context: | ||||
super().setUp(archive_name='pkg-gourmet-with-external-id.tgz') | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | |||||
self.origin_visit = { | - Repository with svn:external (which is not deal with for now) | ||||
'origin': self.origin['id'], | - Visit is partial with as much data loaded as possible | ||||
'visit': 1, | |||||
} | |||||
self.loader = SWHSvnLoaderNoStorage() | """ | ||||
# override revision-block size | def setUp(self): | ||||
self.loader.config['revision_packet_size'] = 3 | super().setUp(archive_name='pkg-gourmet-with-external-id.tgz') | ||||
self.loader.prepare( | self.loader = SvnLoaderNoStorage() | ||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""Repository with svn:externals property, will stop raising an error | """Repository with svn:externals property, will stop raising an error | ||||
""" | """ | ||||
previous_unfinished_revision = None | previous_unfinished_revision = None | ||||
# when | # when | ||||
with self.assertRaises(SvnLoaderEventful) as exc: | self.loader.load( | ||||
self.loader.process_repository( | svn_url=self.svn_mirror_url, | ||||
self.origin_visit, | destination_path=self.destination_path, | ||||
last_known_swh_revision=previous_unfinished_revision) | swh_revision=previous_unfinished_revision) | ||||
actual_raised_revision = exc.exception.swh_revision | |||||
# then repositories holds 21 revisions, but the last commit | # then repositories holds 21 revisions, but the last commit | ||||
# one holds an 'svn:externals' property which will make the | # one holds an 'svn:externals' property which will make the | ||||
# loader-svn stops. This will then stop at the 6th iterations | # loader-svn stops at the last revision prior to the bad one | ||||
# of 3-revision block size, so only 18 revisions will be | self.assertEquals(len(self.loader.all_revisions), 20) | ||||
# flushed | |||||
self.assertEquals(len(self.loader.all_revisions), 18) | |||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
last_revision = 'ffa901b69ca0f46a2261f42948838d19709cb9f8' | last_revision = '82a7a4a09f9549223429143ba36ad77375e33c5c' | ||||
expected_revisions = { | expected_revisions = { | ||||
# revision hash | directory hash | # revision hash | directory hash | ||||
'0d7dd5f751cef8fe17e8024f7d6b0e3aac2cfd71': '669a71cce6c424a81ba42b7dc5d560d32252f0ca', # noqa | '0d7dd5f751cef8fe17e8024f7d6b0e3aac2cfd71': '669a71cce6c424a81ba42b7dc5d560d32252f0ca', # noqa | ||||
'95edacc8848369d6fb1608e887d6d2474fd5224f': '008ac97a1118560797c50e3392fa1443acdaa349', # noqa | '95edacc8848369d6fb1608e887d6d2474fd5224f': '008ac97a1118560797c50e3392fa1443acdaa349', # noqa | ||||
'fef26ea45a520071711ba2b9d16a2985ee837021': '3780effbe846a26751a95a8c95c511fb72be15b4', # noqa | 'fef26ea45a520071711ba2b9d16a2985ee837021': '3780effbe846a26751a95a8c95c511fb72be15b4', # noqa | ||||
'3f51abf3b3d466571be0855dfa67e094f9ceff1b': 'ffcca9b09c5827a6b8137322d4339c8055c3ee1e', # noqa | '3f51abf3b3d466571be0855dfa67e094f9ceff1b': 'ffcca9b09c5827a6b8137322d4339c8055c3ee1e', # noqa | ||||
'a3a577948fdbda9d1061913b77a1588695eadb41': '7dc52cc04c3b8bd7c085900d60c159f7b846f866', # noqa | 'a3a577948fdbda9d1061913b77a1588695eadb41': '7dc52cc04c3b8bd7c085900d60c159f7b846f866', # noqa | ||||
'4876cb10aec6f708f7466dddf547567b65f6c39c': '0deab3023ac59398ae467fc4bff5583008af1ee2', # noqa | '4876cb10aec6f708f7466dddf547567b65f6c39c': '0deab3023ac59398ae467fc4bff5583008af1ee2', # noqa | ||||
'7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | '7f5bc909c29d4e93d8ccfdda516e51ed44930ee1': '752c52134dcbf2fff13c7be1ce4e9e5dbf428a59', # noqa | ||||
'38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | '38d81702cb28db4f1a6821e64321e5825d1f7fd6': '39c813fb4717a4864bacefbd90b51a3241ae4140', # noqa | ||||
'99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | '99c27ebbd43feca179ac0e895af131d8314cafe1': '3397ca7f709639cbd36b18a0d1b70bce80018c45', # noqa | ||||
'902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | '902f29b4323a9b9de3af6d28e72dd581e76d9397': 'c4e12483f0a13e6851459295a4ae735eb4e4b5c4', # noqa | ||||
'171dc35522bfd17dda4e90a542a0377fb2fc707a': 'fd24a76c87a3207428e06612b49860fc78e9f6dc', # noqa | '171dc35522bfd17dda4e90a542a0377fb2fc707a': 'fd24a76c87a3207428e06612b49860fc78e9f6dc', # noqa | ||||
'027e8769f4786597436ab94a91f85527d04a6cbb': '2d9ca72c6afec6284fb01e459588cbb007017c8c', # noqa | '027e8769f4786597436ab94a91f85527d04a6cbb': '2d9ca72c6afec6284fb01e459588cbb007017c8c', # noqa | ||||
'4474d96018877742d9697d5c76666c9693353bfc': 'ab111577e0ab39e4a157c476072af48f2641d93f', # noqa | '4474d96018877742d9697d5c76666c9693353bfc': 'ab111577e0ab39e4a157c476072af48f2641d93f', # noqa | ||||
'97ad21eab92961e2a22ca0285f09c6d1e9a7ffbc': 'ab111577e0ab39e4a157c476072af48f2641d93f', # noqa | '97ad21eab92961e2a22ca0285f09c6d1e9a7ffbc': 'ab111577e0ab39e4a157c476072af48f2641d93f', # noqa | ||||
'd04ea8afcee6205cc8384c091bfc578931c169fd': 'b0a648b02e55a4dce356ac35187a058f89694ec7', # noqa | 'd04ea8afcee6205cc8384c091bfc578931c169fd': 'b0a648b02e55a4dce356ac35187a058f89694ec7', # noqa | ||||
'ded78810401fd354ffe894aa4a1e5c7d30a645d1': 'b0a648b02e55a4dce356ac35187a058f89694ec7', # noqa | 'ded78810401fd354ffe894aa4a1e5c7d30a645d1': 'b0a648b02e55a4dce356ac35187a058f89694ec7', # noqa | ||||
'4ee95e39358712f53c4fc720da3fafee9249ed19': 'c3c98df624733fef4e592bef983f93e2ed02b179', # noqa | '4ee95e39358712f53c4fc720da3fafee9249ed19': 'c3c98df624733fef4e592bef983f93e2ed02b179', # noqa | ||||
last_revision : 'c3c98df624733fef4e592bef983f93e2ed02b179', # noqa | 'ffa901b69ca0f46a2261f42948838d19709cb9f8': 'c3c98df624733fef4e592bef983f93e2ed02b179', # noqa | ||||
'0148ae3eaa520b73a50802c59f3f416b7a36cf8c': '844d4646d6c2b4f3a3b2b22ab0ee38c7df07bab2', # noqa | |||||
Not Done Inline ActionsThat's was what i referred to orally. The test's setup was group of 3. The error was detected in the last iteration (6th). Now, we no longer group the revision, we read them 1 by 1. So we have 2 more revisions here (2 more green lines) ardumont: That's was what i referred to orally.
Before that diff, we grouped the svn revisions into… | |||||
Not Done Inline ActionsSorry for the repetition here... Must have been tired (T.T) ardumont: Sorry for the repetition here... Must have been tired (T.T) | |||||
last_revision: '0de6e75d2b79ec90d00a3a7611aa3861b2e4aa5e', # noqa | |||||
} | } | ||||
# The last revision being the one used later to start back from | # The last revision being the one used later to start back from | ||||
self.assertEquals(hashutil.hash_to_hex(actual_raised_revision['id']), | |||||
last_revision) | |||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'partial') | |||||
class SvnLoaderITest12(BaseSvnLoaderTest): | |||||
"""Edge cases: | |||||
- first create a file and commit it. | |||||
Remove it, then add folder holding the same name, commit. | |||||
- do the same scenario with symbolic link (instead of file) | |||||
class SWHSvnLoaderLinkFileAndFolderWithSameNameITTest(BaseTestSvnLoader): | """ | ||||
def setUp(self): | def setUp(self): | ||||
# edge cases: | |||||
# - first create a file and commit it. | |||||
# Remove it, then add folder holding the same name, commit. | |||||
# - do the same scenario with symbolic link (instead of file) | |||||
super().setUp( | super().setUp( | ||||
archive_name='pkg-gourmet-with-edge-case-links-and-files.tgz') | archive_name='pkg-gourmet-with-edge-case-links-and-files.tgz') | ||||
self.loader = SvnLoaderNoStorage() | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | |||||
self.origin_visit = { | |||||
'origin': self.origin['id'], | |||||
'visit': 1, | |||||
} | |||||
self.loader = SWHSvnLoaderNoStorage() | |||||
# override revision-block size | |||||
self.loader.config['revision_packet_size'] = 3 | |||||
self.loader.prepare( | |||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""File/Link destroyed prior to folder with same name creation should be ok | """File/Link removed prior to folder with same name creation is ok | ||||
""" | """ | ||||
previous_unfinished_revision = None | previous_unfinished_revision = None | ||||
# when | # when | ||||
self.loader.process_repository( | self.loader.load( | ||||
self.origin_visit, | svn_url=self.svn_mirror_url, | ||||
last_known_swh_revision=previous_unfinished_revision) | destination_path=self.destination_path, | ||||
swh_revision=previous_unfinished_revision) | |||||
# then repositories holds 14 revisions, but the last commit | # then repositories holds 14 revisions, but the last commit | ||||
self.assertEquals(len(self.loader.all_revisions), 19) | self.assertEquals(len(self.loader.all_revisions), 19) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
last_revision = '3f43af2578fccf18b0d4198e48563da7929dc608' | last_revision = '3f43af2578fccf18b0d4198e48563da7929dc608' | ||||
expected_revisions = { | expected_revisions = { | ||||
# revision hash | directory hash | # revision hash | directory hash | ||||
Show All 14 Lines | def load(self): | ||||
'f2e01111329f84580dc3febb1fd45515692c5886': 'e2baec7b6a5543758e9c73695bc847db0a4f7941', # noqa | 'f2e01111329f84580dc3febb1fd45515692c5886': 'e2baec7b6a5543758e9c73695bc847db0a4f7941', # noqa | ||||
'1a0f70c34e211f073e1be3435ecf6f0dd7700267': 'e7536e721fa806c19971b749c091c144b2f2b88e', # noqa | '1a0f70c34e211f073e1be3435ecf6f0dd7700267': 'e7536e721fa806c19971b749c091c144b2f2b88e', # noqa | ||||
'0c612a23d293cc3100496a54ae4ad13d750efe4c': '2123d12749294bbfb54e73f9d73fac658aabb266', # noqa | '0c612a23d293cc3100496a54ae4ad13d750efe4c': '2123d12749294bbfb54e73f9d73fac658aabb266', # noqa | ||||
'69a53d972e2f863acbbbda546d9da96287af6a88': '13896cb96ec004140ce5be8852fee8c29830d9c7', # noqa | '69a53d972e2f863acbbbda546d9da96287af6a88': '13896cb96ec004140ce5be8852fee8c29830d9c7', # noqa | ||||
last_revision: '6b1e0243768ff9ac060064b2eeade77e764ffc82', # noqa | last_revision: '6b1e0243768ff9ac060064b2eeade77e764ffc82', # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') | |||||
class SWHSvnLoaderWrongLinkCasesITTest(BaseTestSvnLoader): | class SvnLoaderITTest13(BaseSvnLoaderTest): | ||||
"""Edge cases: | |||||
- wrong symbolic link | |||||
- wrong symbolic link with empty space names | |||||
""" | |||||
def setUp(self): | def setUp(self): | ||||
# edge cases: | |||||
# - wrong symbolic link | |||||
# - wrong symbolic link with empty space names | |||||
super().setUp( | super().setUp( | ||||
archive_name='pkg-gourmet-with-wrong-link-cases.tgz') | archive_name='pkg-gourmet-with-wrong-link-cases.tgz') | ||||
self.loader = SvnLoaderNoStorage() | |||||
self.origin = {'id': 2, 'type': 'svn', 'url': 'file:///dev/null'} | |||||
self.origin_visit = { | |||||
'origin': self.origin['id'], | |||||
'visit': 1, | |||||
} | |||||
self.loader = SWHSvnLoaderNoStorage() | |||||
# override revision-block size | |||||
self.loader.config['revision_packet_size'] = 3 | |||||
self.loader.prepare( | |||||
self.svn_mirror_url, self.destination_path, self.origin) | |||||
@istest | @istest | ||||
def process_repository(self): | def load(self): | ||||
"""Wrong link or empty space-named link should be ok | """Wrong link or empty space-named link should be ok | ||||
""" | """ | ||||
previous_unfinished_revision = None | |||||
# when | # when | ||||
self.loader.process_repository( | self.loader.load( | ||||
self.origin_visit, | svn_url=self.svn_mirror_url, | ||||
last_known_swh_revision=previous_unfinished_revision) | destination_path=self.destination_path) | ||||
# then repositories holds 14 revisions, but the last commit | # then repositories holds 14 revisions, but the last commit | ||||
self.assertEquals(len(self.loader.all_revisions), 21) | self.assertEquals(len(self.loader.all_revisions), 21) | ||||
self.assertEquals(len(self.loader.all_releases), 0) | self.assertEquals(len(self.loader.all_releases), 0) | ||||
last_revision = 'cf30d3bb9d5967d0a2bbeacc405f10a5dd9b138a' | last_revision = 'cf30d3bb9d5967d0a2bbeacc405f10a5dd9b138a' | ||||
expected_revisions = { | expected_revisions = { | ||||
Show All 17 Lines | def load(self): | ||||
'0c612a23d293cc3100496a54ae4ad13d750efe4c': '2123d12749294bbfb54e73f9d73fac658aabb266', # noqa | '0c612a23d293cc3100496a54ae4ad13d750efe4c': '2123d12749294bbfb54e73f9d73fac658aabb266', # noqa | ||||
'69a53d972e2f863acbbbda546d9da96287af6a88': '13896cb96ec004140ce5be8852fee8c29830d9c7', # noqa | '69a53d972e2f863acbbbda546d9da96287af6a88': '13896cb96ec004140ce5be8852fee8c29830d9c7', # noqa | ||||
'3f43af2578fccf18b0d4198e48563da7929dc608': '6b1e0243768ff9ac060064b2eeade77e764ffc82', # noqa | '3f43af2578fccf18b0d4198e48563da7929dc608': '6b1e0243768ff9ac060064b2eeade77e764ffc82', # noqa | ||||
'4ab5fc264732cd474d2e695c5ac66e4933bdad74': '9a1f5e3961db89422250ce6c1441476f40d65205', # noqa | '4ab5fc264732cd474d2e695c5ac66e4933bdad74': '9a1f5e3961db89422250ce6c1441476f40d65205', # noqa | ||||
last_revision: 'd853d9628f6f0008d324fed27dadad00ce48bc62', # noqa | last_revision: 'd853d9628f6f0008d324fed27dadad00ce48bc62', # noqa | ||||
} | } | ||||
self.assertRevisionsOk(expected_revisions) | self.assertRevisionsOk(expected_revisions) | ||||
self.assertEquals(len(self.loader.all_snapshots), 1) | |||||
# FIXME: Check the snapshot's state | |||||
self.assertEqual(self.loader.load_status(), {'status': 'eventful'}) | |||||
self.assertEqual(self.loader.visit_status(), 'full') |
All this green is needed because now we test the full loading of the loader (and not some internal hidden implementation detail, the old and now deleted process_repository method).