Page MenuHomeSoftware Heritage

test_init: Decrease assertion checks
ClosedPublic

Authored by ardumont on Jul 17 2020, 2:34 PM.

Details

Summary

To allow the debian build to pass [1]

Within the debian chroot (unstable), the current assertion fails because it's
only an AssertionError without any associated message (contrary to tox/pytest in the venv).

Might be related to the pytest version which is too old within the chroot
(4.6.11 vs 5.4.3, no idea really). When trying to use within the venv the
same version I had other unrelated problems which prevented me to check further.

Running with python3.8 (using nix and another virtualenv), I do not reproduce
either (<- everything is fine).

[1] https://jenkins.softwareheritage.org/view/Debian%20packages/job/debian/job/packages/job/DLDBASE/job/gbp-buildpackage/158/console

(Finally able to) reproduce within the chroot (+ modifying the swh_storage fixture to be in-memory storage, so i'm not side-tracked by other issues):

With packaged version:

(sid-amd64-sbuild)root@yavin4:/build/swh-loader-core-cCFgYS/swh-loader-core-0.5.9# python3 -m pytest swh/loader/tests/test_init.py -k test_check_snapshot_failure
============================================================================================================= test session starts =============================================================================================================
platform linux -- Python 3.8.4, pytest-4.6.11, py-1.8.1, pluggy-0.13.0
rootdir: /build/swh-loader-core-cCFgYS/swh-loader-core-0.5.9, inifile: pytest.ini
plugins: requests-mock-1.7.0, swh.core-0.1.2, celery-4.4.2, postgresql-2.2.0, mock-1.10.4, hypothesis-5.16.0
collected 11 items / 10 deselected / 1 selected

swh/loader/tests/test_init.py F                                                                                                                                                                                                         [100%]

================================================================================================================== FAILURES ===================================================================================================================
________________________________________________________________________________________________________ test_check_snapshot_failures _________________________________________________________________________________________________________

swh_storage = <swh.storage.in_memory.InMemoryStorage object at 0x7fed693d0760>

    def test_check_snapshot_failures(swh_storage):
        """Failure scenarios:

        0. snapshot parameter is not a snapshot
        1. snapshot id is correct but branches mismatched
        2. snapshot id is not correct, it's not found in the storage
        3. snapshot reference an alias which does not exist
        4. snapshot is found in storage, targeted revision does not exist
        5. snapshot is found in storage, targeted revision exists but the directory the
           revision targets does not exist
        6. snapshot is found in storage, target revision exists, targeted directory by the
           revision exist. Content targeted by the directory does not exist.
        7. snapshot is found in storage, targeted release does not exist

        """
        snap_id_hex = "2498dbf535f882bc7f9a18fb16c9ad27fda7bab7"
        snapshot = Snapshot(
            id=hash_to_bytes(snap_id_hex),
            branches={
                b"master": SnapshotBranch(
                    target=hash_to_bytes(hash_hex), target_type=TargetType.REVISION,
                ),
            },
        )

        s = swh_storage.snapshot_add([snapshot])
        assert s == {
            "snapshot:add": 1,
        }

        unexpected_snapshot = Snapshot(
            branches={
                b"tip": SnapshotBranch(  # wrong branch
                    target=hash_to_bytes(hash_hex), target_type=TargetType.RELEASE
                )
            },
        )

        # 0. not a Snapshot object, raise!
        with pytest.raises(AssertionError, match="variable 'snapshot' must be a snapshot"):
            check_snapshot(ORIGIN_VISIT, swh_storage)

        # 1. snapshot id is correct but branches mismatched
>       check_snapshot(attr.evolve(unexpected_snapshot, id=snapshot.id), swh_storage)

swh/loader/tests/test_init.py:404:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

snapshot = Snapshot(branches=<swh.model.collections.ImmutableDict object at 0x7fed69492ee0>, id=b"$\x98\xdb\xf55\xf8\x82\xbc\x7f\x9a\x18\xfb\x16\xc9\xad'\xfd\xa7\xba\xb7")
storage = <swh.storage.in_memory.InMemoryStorage object at 0x7fed693d0760>, allowed_empty = []

    def check_snapshot(
        snapshot: Snapshot,
        storage: StorageInterface,
        allowed_empty: Iterable[Tuple[TargetType, bytes]] = [],
    ):
        """Check that:
        - snapshot exists in the storage and match
        - each object reference up to the revision/release targets exists

        Args:
            snapshot: full snapshot to check for existence and consistency
            storage: storage to lookup information into
            allowed_empty: Iterable of branch we allow to be empty (some edge case loaders
              allows this case to happen, nixguix for example allows the branch evaluation"
              to target the nixpkgs git commit reference, which may not yet be resolvable at
              loading time)

        Returns:
            the snapshot stored in the storage for further test assertion if any is
            needed.

        """
        if not isinstance(snapshot, Snapshot):
            raise AssertionError(f"variable 'snapshot' must be a snapshot: {snapshot!r}")

        snapshot_dict = storage.snapshot_get(snapshot.id)
        if snapshot_dict is None:
            raise AssertionError(f"Snapshot {snapshot.id.hex()} is not found")

        snapshot_dict.pop("next_branch")
        actual_snaphot = Snapshot.from_dict(snapshot_dict)
        assert isinstance(actual_snaphot, Snapshot)

>       assert snapshot == actual_snaphot
E       AssertionError

swh/loader/tests/__init__.py:149: AssertionError
=================================================================================================== 1 failed, 10 deselected in 0.08 seconds ===================================================================================================

Fixing as this diff does:

(sid-amd64-sbuild)root@yavin4:/build/swh-loader-core-cCFgYS/swh-loader-core-0.5.9# emacs swh/loader/tests/test_init.py
(sid-amd64-sbuild)root@yavin4:/build/swh-loader-core-cCFgYS/swh-loader-core-0.5.9# python3 -m pytest swh/loader/tests/test_init.py -k test_check_snapshot_failure
============================================================================================================= test session starts =============================================================================================================
platform linux -- Python 3.8.4, pytest-4.6.11, py-1.8.1, pluggy-0.13.0
rootdir: /build/swh-loader-core-cCFgYS/swh-loader-core-0.5.9, inifile: pytest.ini
plugins: requests-mock-1.7.0, swh.core-0.1.2, celery-4.4.2, postgresql-2.2.0, mock-1.10.4, hypothesis-5.16.0
collected 11 items / 10 deselected / 1 selected

swh/loader/tests/test_init.py .                                                                                                                                                                                                         [100%]

=================================================================================================== 1 passed, 10 deselected in 0.05 seconds ===================================================================================================
Test Plan

tox

Diff Detail

Repository
rDLDBASE Generic VCS/Package Loader
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

Build is green

Patch application report for D3552 (id=12524)

Rebasing onto ccfeb3525d...

Current branch diff-target is up to date.
Changes applied before test
commit 3442689ecb8f420b7a9c1e6e8c1ea85783989681
Author: Antoine R. Dumont (@ardumont) <ardumont@softwareheritage.org>
Date:   Fri Jul 17 14:28:10 2020 +0200

    test_init: Decrease assertion checks
    
    So the debian build passes [1]
    
    [1] https://jenkins.softwareheritage.org/view/Debian%20packages/job/debian/job/packages/job/DLDBASE/job/gbp-buildpackage/158/console

See https://jenkins.softwareheritage.org/job/DLDBASE/job/tests-on-diff/181/ for more details.

douardda added a subscriber: douardda.

a bit sad that the real reason there are different results in debian, but well, does not worth the time either, so ok

This revision is now accepted and ready to land.Jul 17 2020, 3:00 PM
This revision was automatically updated to reflect the committed changes.

a bit sad that the real reason there are different results in debian, but well, does not worth the time either, so ok

yeah... As a good news, it finally worked! New loader-core built!

It's been, i don't know how many attempts i did since yesterday... to try and unbreak that build...

Now it's time to unbreak the other dvcs loader builds ;)