Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 659042 Details for
Bug 741046
app-portage/gemato-16.0 fails tests
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
build.log
build.log (text/plain), 273.05 KB, created by
Agostino Sarubbo
on 2020-09-08 06:50:18 UTC
(
hide
)
Description:
build.log
Filename:
MIME Type:
Creator:
Agostino Sarubbo
Created:
2020-09-08 06:50:18 UTC
Size:
273.05 KB
patch
obsolete
> * Package: app-portage/gemato-16.0 > * Repository: gentoo > * Maintainer: mgorny@gentoo.org > * Upstream: https://github.com/mgorny/gemato/issues/ > * USE: abi_x86_64 amd64 elibc_glibc gpg kernel_linux python_targets_pypy3 python_targets_python3_6 python_targets_python3_7 python_targets_python3_8 python_targets_python3_9 test userland_GNU > * FEATURES: network-sandbox preserve-libs sandbox test userpriv usersandbox > > >@@@@@ PLEASE PAY ATTENTION HERE!!! @@@@@ >This information may help you to understand if this is a duplicate or if this bug exists after you pushed a fix; >This ebuild was merged at the following commit: >https://github.com/gentoo/gentoo/commit/3b56374fd8f551dc7234b3b91495b4df2ed6daf7 (Mon Sep 7 06:49:01 UTC 2020) >@@@@@ END @@@@@ > > > >emerge --info: >Portage 3.0.5 (python 3.7.9-final-0, default/linux/amd64/17.1, gcc-10.2.0, glibc-2.32-r1, 5.4.0-1021-aws x86_64) >================================================================= >System uname: Linux-5.4.0-1021-aws-x86_64-Intel-R-_Xeon-R-_Platinum_8175M_CPU_@_2.50GHz-with-gentoo-2.7 >KiB Mem: 64359960 total, 34551216 free >KiB Swap: 0 total, 0 free >sh bash 5.0_p18 >ld GNU ld (Gentoo 2.34 p6) 2.34.0 >app-shells/bash: 5.0_p18::gentoo >dev-lang/perl: 5.30.3-r1::gentoo >dev-lang/python: 2.7.18-r1::gentoo, 3.6.12::gentoo, 3.7.9::gentoo, 3.8.5::gentoo, 3.9.0_rc1::gentoo >sys-apps/baselayout: 2.7::gentoo >sys-apps/openrc: 0.42.1::gentoo >sys-apps/sandbox: 2.20::gentoo >sys-devel/autoconf: 2.13-r1::gentoo, 2.69-r5::gentoo >sys-devel/automake: 1.16.2::gentoo >sys-devel/binutils: 2.34-r2::gentoo >sys-devel/gcc: 10.2.0-r1::gentoo >sys-devel/gcc-config: 2.3.2::gentoo >sys-devel/libtool: 2.4.6-r6::gentoo >sys-devel/make: 4.3::gentoo >sys-kernel/linux-headers: 5.8::gentoo (virtual/os-headers) >sys-libs/glibc: 2.32-r1::gentoo >Repositories: > >gentoo > location: /usr/portage > sync-type: rsync > sync-uri: rsync://rsync.gentoo.org/gentoo-portage > priority: -1000 > sync-rsync-verify-max-age: 24 > sync-rsync-verify-metamanifest: yes > sync-rsync-extra-opts: > sync-rsync-verify-jobs: 1 > >ACCEPT_KEYWORDS="amd64 ~amd64" >ACCEPT_LICENSE="* BSD-2" >CBUILD="x86_64-pc-linux-gnu" >CFLAGS="-O2 -pipe -march=native -frecord-gcc-switches" >CHOST="x86_64-pc-linux-gnu" >CONFIG_PROTECT="/etc /usr/share/gnupg/qualified.txt" >CONFIG_PROTECT_MASK="/etc/ca-certificates.conf /etc/env.d /etc/gconf /etc/gentoo-release /etc/revdep-rebuild /etc/sandbox.d /etc/terminfo" >CXXFLAGS="-O2 -pipe -march=native -frecord-gcc-switches" >DISTDIR="/var/tmp/portage/app-portage/gemato-16.0/distdir" >EMERGE_DEFAULT_OPTS="--with-bdeps=y -1 -k -b" >ENV_UNSET="CARGO_HOME DBUS_SESSION_BUS_ADDRESS DISPLAY GOBIN GOPATH PERL5LIB PERL5OPT PERLPREFIX PERL_CORE PERL_MB_OPT PERL_MM_OPT XAUTHORITY XDG_CACHE_HOME XDG_CONFIG_HOME XDG_DATA_HOME XDG_RUNTIME_DIR" >FCFLAGS="-O2 -pipe -march=native -frecord-gcc-switches" >FEATURES="assume-digests binpkg-docompress binpkg-dostrip binpkg-logs buildpkg collision-protect config-protect-if-modified distlocks ebuild-locks fixlafiles ipc-sandbox merge-sync multilib-strict network-sandbox news parallel-fetch pid-sandbox preserve-libs protect-owned qa-unresolved-soname-deps sandbox sfperms sign split-log strict test unknown-features-warn unmerge-logs unmerge-orphans userfetch userpriv usersandbox usersync xattr" >FFLAGS="-O2 -pipe -march=native -frecord-gcc-switches" >GENTOO_MIRRORS="http://distfiles.gentoo.org" >LANG="C.UTF8" >LDFLAGS="-Wl,-O1 -Wl,--as-needed -Wl,--defsym=__gentoo_check_ldflags__=0" >MAKEOPTS="-j16 V=1" >PKGDIR="/root/.packages" >PORTAGE_CONFIGROOT="/" >PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --omit-dir-times --compress --force --whole-file --delete --stats --human-readable --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages --exclude=/.git" >PORTAGE_TMPDIR="/var/tmp" >USE="acl amd64 berkdb bzip2 cli crypt dri elogind fortran gdbm gpg iconv ipv6 jumbo-build libglvnd libtirpc multilib native-symlinks ncurses nls nptl openmp pam pcre readline seccomp split-usr ssl tcpd test unicode xattr zlib" ABI_X86="64" ELIBC="glibc" KERNEL="linux" PYTHON_TARGETS="pypy3 python3_6 python3_7 python3_8 python3_9" USERLAND="GNU" >Unset: CC, CPPFLAGS, CTARGET, CXX, INSTALL_MASK, LC_ALL, LINGUAS, PORTAGE_BINHOST, PORTAGE_BUNZIP2_COMMAND, PORTAGE_COMPRESS, PORTAGE_COMPRESS_FLAGS, PORTAGE_RSYNC_EXTRA_OPTS > > > >>>> Unpacking source... >>>> Unpacking gemato-16.0.tar.gz to /var/tmp/portage/app-portage/gemato-16.0/work >>>> Source unpacked in /var/tmp/portage/app-portage/gemato-16.0/work >>>> Preparing source in /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0 ... >>>> Source prepared. >>>> Configuring source in /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0 ... >>>> Source configured. >>>> Compiling source in /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0 ... > * pypy3: running distutils-r1_run_phase distutils-r1_python_compile >pypy3 setup.py build -j 16 >running build >running build_py >creating /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/verify.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/exceptions.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/recursiveloader.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/compression.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/openpgp.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/find_top_level.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/manifest.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/hash.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/profile.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/__init__.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/util.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >copying gemato/cli.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-pypy3/lib/gemato >warning: build_py: byte-compiling is disabled, skipping. > > * python3_6: running distutils-r1_run_phase distutils-r1_python_compile >python3.6 setup.py build -j 16 >running build >running build_py >creating /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/verify.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/exceptions.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/recursiveloader.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/compression.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/openpgp.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/find_top_level.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/manifest.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/hash.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/profile.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/__init__.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/util.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >copying gemato/cli.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_6/lib/gemato >warning: build_py: byte-compiling is disabled, skipping. > > * python3_7: running distutils-r1_run_phase distutils-r1_python_compile >python3.7 setup.py build -j 16 >running build >running build_py >creating /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/verify.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/exceptions.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/recursiveloader.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/compression.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/openpgp.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/find_top_level.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/manifest.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/hash.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/profile.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/__init__.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/util.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >copying gemato/cli.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_7/lib/gemato >warning: build_py: byte-compiling is disabled, skipping. > > * python3_8: running distutils-r1_run_phase distutils-r1_python_compile >python3.8 setup.py build -j 16 >running build >running build_py >creating /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/verify.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/exceptions.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/recursiveloader.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/compression.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/openpgp.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/find_top_level.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/manifest.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/hash.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/profile.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/__init__.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/util.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >copying gemato/cli.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_8/lib/gemato >warning: build_py: byte-compiling is disabled, skipping. > > * python3_9: running distutils-r1_run_phase distutils-r1_python_compile >python3.9 setup.py build -j 16 >running build >running build_py >creating /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/verify.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/exceptions.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/recursiveloader.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/compression.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/openpgp.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/find_top_level.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/manifest.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/hash.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/profile.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/__init__.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/util.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >copying gemato/cli.py -> /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0-python3_9/lib/gemato >warning: build_py: byte-compiling is disabled, skipping. > >>>> Source compiled. >>>> Test phase: app-portage/gemato-16.0 > * pypy3: running distutils-r1_run_phase python_test >============================= test session starts ============================== >platform linux -- Python 3.6.9[pypy-7.3.1-final], pytest-6.0.1, py-1.9.0, pluggy-0.13.1 -- /usr/bin/pypy3 >cachedir: .pytest_cache >rootdir: /var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0, configfile: tox.ini >collecting ... collected 1109 items > >tests/test_compression.py::test_decompress[baseline-gz] PASSED [ 0%] >tests/test_compression.py::test_decompress[baseline-bz2] PASSED [ 0%] >tests/test_compression.py::test_decompress[baseline-lzma] PASSED [ 0%] >tests/test_compression.py::test_decompress[baseline-xz] PASSED [ 0%] >tests/test_compression.py::test_decompress[empty-gz] PASSED [ 0%] >tests/test_compression.py::test_decompress[empty-bz2] PASSED [ 0%] >tests/test_compression.py::test_decompress[empty-lzma] PASSED [ 0%] >tests/test_compression.py::test_decompress[empty-xz] PASSED [ 0%] >tests/test_compression.py::test_decompress[split-gz] PASSED [ 0%] >tests/test_compression.py::test_decompress[split-bz2] PASSED [ 0%] >tests/test_compression.py::test_decompress[split-lzma] PASSED [ 0%] >tests/test_compression.py::test_decompress[split-xz] PASSED [ 1%] >tests/test_compression.py::test_round_trip[gz] PASSED [ 1%] >tests/test_compression.py::test_round_trip[bz2] PASSED [ 1%] >tests/test_compression.py::test_round_trip[lzma] PASSED [ 1%] >tests/test_compression.py::test_round_trip[xz] PASSED [ 1%] >tests/test_compression.py::test_open_potentially_compressed_path[gz-baseline] PASSED [ 1%] >tests/test_compression.py::test_open_potentially_compressed_path[gz-empty] PASSED [ 1%] >tests/test_compression.py::test_open_potentially_compressed_path[gz-split] PASSED [ 1%] >tests/test_compression.py::test_open_potentially_compressed_path[bz2-baseline] PASSED [ 1%] >tests/test_compression.py::test_open_potentially_compressed_path[bz2-empty] PASSED [ 1%] >tests/test_compression.py::test_open_potentially_compressed_path[bz2-split] PASSED [ 1%] >tests/test_compression.py::test_open_potentially_compressed_path[lzma-baseline] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path[lzma-empty] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path[lzma-split] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path[xz-baseline] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path[xz-empty] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path[xz-split] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path_write[gz] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path_write[bz2] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path_write[lzma] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path_write[xz] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path_with_encoding[gz] PASSED [ 2%] >tests/test_compression.py::test_open_potentially_compressed_path_with_encoding[bz2] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_with_encoding[lzma] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_with_encoding[xz] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_write_with_unicode[gz-None-TEST_STRING] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_write_with_unicode[gz-utf_16_be-UTF16_TEST_STRING] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_write_with_unicode[bz2-None-TEST_STRING] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_write_with_unicode[bz2-utf_16_be-UTF16_TEST_STRING] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_write_with_unicode[lzma-None-TEST_STRING] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_write_with_unicode[lzma-utf_16_be-UTF16_TEST_STRING] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_write_with_unicode[xz-None-TEST_STRING] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_write_with_unicode[xz-utf_16_be-UTF16_TEST_STRING] PASSED [ 3%] >tests/test_compression.py::test_open_potentially_compressed_path_with_encoding_line_api[gz] PASSED [ 4%] >tests/test_compression.py::test_open_potentially_compressed_path_with_encoding_line_api[bz2] PASSED [ 4%] >tests/test_compression.py::test_open_potentially_compressed_path_with_encoding_line_api[lzma] PASSED [ 4%] >tests/test_compression.py::test_open_potentially_compressed_path_with_encoding_line_api[xz] PASSED [ 4%] >tests/test_compression.py::test_open_potentially_compressed_path_fileno_passthrough[gz] PASSED [ 4%] >tests/test_compression.py::test_open_potentially_compressed_path_fileno_passthrough[bz2] PASSED [ 4%] >tests/test_compression.py::test_open_potentially_compressed_path_fileno_passthrough[lzma] PASSED [ 4%] >tests/test_compression.py::test_open_potentially_compressed_path_fileno_passthrough[xz] PASSED [ 4%] >tests/test_compression.py::test_get_potential_compressed_names PASSED [ 4%] >tests/test_compression.py::test_get_compressed_suffix_from_filename[gz] PASSED [ 4%] >tests/test_compression.py::test_get_compressed_suffix_from_filename[bz2] PASSED [ 4%] >tests/test_compression.py::test_get_compressed_suffix_from_filename[lzma] PASSED [ 5%] >tests/test_compression.py::test_get_compressed_suffix_from_filename[xz] PASSED [ 5%] >tests/test_find_top_level.py::test_find_top_level_manifest[.-Manifest] PASSED [ 5%] >tests/test_find_top_level.py::test_find_top_level_manifest[empty-subdir-Manifest] PASSED [ 5%] >tests/test_find_top_level.py::test_find_top_level_manifest[manifest-subdir-Manifest] PASSED [ 5%] >tests/test_find_top_level.py::test_find_top_level_manifest[deep/manifest-subdir-Manifest] PASSED [ 5%] >tests/test_find_top_level.py::test_find_top_level_manifest[ignored-dir-ignored-dir/Manifest] PASSED [ 5%] >tests/test_find_top_level.py::test_find_top_level_manifest[ignored-dir/subdir-ignored-dir/Manifest] PASSED [ 5%] >tests/test_find_top_level.py::test_find_top_level_manifest[ignored-dir-not-Manifest] PASSED [ 5%] >tests/test_find_top_level.py::test_find_top_level_manifest[ignored-empty-dir-None] PASSED [ 5%] >tests/test_find_top_level.py::test_unreadable_manifest PASSED [ 5%] >tests/test_find_top_level.py::test_empty_tree PASSED [ 6%] >tests/test_find_top_level.py::test_root_directory PASSED [ 6%] >tests/test_find_top_level.py::test_cross_device PASSED [ 6%] >tests/test_find_top_level.py::test_find_compressed_top_level_manifest[.-False-None] PASSED [ 6%] >tests/test_find_top_level.py::test_find_compressed_top_level_manifest[.-True-Manifest.gz] PASSED [ 6%] >tests/test_find_top_level.py::test_find_compressed_top_level_manifest[empty-subdir-True-Manifest.gz] PASSED [ 6%] >tests/test_find_top_level.py::test_find_compressed_top_level_manifest[manifest-subdir-True-Manifest.gz] PASSED [ 6%] >tests/test_find_top_level.py::test_find_compressed_top_level_manifest[deep/manifest-subdir-True-Manifest.gz] PASSED [ 6%] >tests/test_find_top_level.py::test_find_compressed_top_level_manifest[ignored-dir-True-ignored-dir/Manifest.gz] PASSED [ 6%] >tests/test_find_top_level.py::test_find_compressed_top_level_manifest[ignored-dir/subdir-True-ignored-dir/Manifest.gz] PASSED [ 6%] >tests/test_find_top_level.py::test_find_compressed_top_level_manifest[ignored-dir-not-True-Manifest.gz] PASSED [ 6%] >tests/test_find_top_level.py::test_find_compressed_top_level_manifest[ignored-empty-dir-True-None] PASSED [ 7%] >tests/test_hash.py::test_get_invalid[_invalid_name_] PASSED [ 7%] >tests/test_hash.py::test_get_invalid[blake2zzzz] PASSED [ 7%] >tests/test_hash.py::test_get_invalid[sha3_987] PASSED [ 7%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-md5-True-test_hashes0] PASSED [ 7%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-sha1-True-test_hashes1] PASSED [ 7%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-sha224-True-test_hashes2] PASSED [ 7%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-sha256-True-test_hashes3] PASSED [ 7%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-sha384-True-test_hashes4] PASSED [ 7%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-sha512-True-test_hashes5] PASSED [ 7%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-md4-False-test_hashes6] PASSED [ 7%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-ripemd160-False-test_hashes7] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-blake2b-False-test_hashes8] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-blake2s-False-test_hashes9] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-sha3_224-False-test_hashes10] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-sha3_256-False-test_hashes11] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-sha3_384-False-test_hashes12] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-sha3_512-False-test_hashes13] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-whirlpool-False-test_hashes14] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[TEST_STRING-__size__-True-test_hashes15] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-md5-True-test_hashes0] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-sha1-True-test_hashes1] PASSED [ 8%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-sha224-True-test_hashes2] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-sha256-True-test_hashes3] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-sha384-True-test_hashes4] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-sha512-True-test_hashes5] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-md4-False-test_hashes6] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-ripemd160-False-test_hashes7] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-blake2b-False-test_hashes8] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-blake2s-False-test_hashes9] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-sha3_224-False-test_hashes10] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-sha3_256-False-test_hashes11] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-sha3_384-False-test_hashes12] PASSED [ 9%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-sha3_512-False-test_hashes13] PASSED [ 10%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-whirlpool-False-test_hashes14] PASSED [ 10%] >tests/test_hash.py::test_hash_bytes[EMPTY_STRING-__size__-True-test_hashes15] PASSED [ 10%] >tests/test_hash.py::test_hash_file[TEST_STRING] PASSED [ 10%] >tests/test_hash.py::test_hash_file[EMPTY_STRING] PASSED [ 10%] >tests/test_hash.py::test_hash_path[TEST_STRING] PASSED [ 10%] >tests/test_hash.py::test_hash_path[EMPTY_STRING] PASSED [ 10%] >tests/test_manifest.py::test_load[TEST_MANIFEST] PASSED [ 10%] >tests/test_manifest.py::test_load[TEST_DEPRECATED_MANIFEST] PASSED [ 10%] >tests/test_manifest.py::test_load[EMPTY_MANIFEST] PASSED [ 10%] >tests/test_manifest.py::test_load_via_ctor[TEST_MANIFEST] PASSED [ 10%] >tests/test_manifest.py::test_load_via_ctor[TEST_DEPRECATED_MANIFEST] PASSED [ 11%] >tests/test_manifest.py::test_load_via_ctor[EMPTY_MANIFEST] PASSED [ 11%] >tests/test_manifest.py::test_load_and_dump[TEST_MANIFEST] PASSED [ 11%] >tests/test_manifest.py::test_load_and_dump[TEST_DEPRECATED_MANIFEST] PASSED [ 11%] >tests/test_manifest.py::test_load_and_dump[EMPTY_MANIFEST] PASSED [ 11%] >tests/test_manifest.py::test_find_timestamp[TEST_MANIFEST-expected0] PASSED [ 11%] >tests/test_manifest.py::test_find_timestamp[TEST_DEPRECATED_MANIFEST-None] PASSED [ 11%] >tests/test_manifest.py::test_find_timestamp[EMPTY_MANIFEST-None] PASSED [ 11%] >tests/test_manifest.py::test_find_path_entry[2017-10-22T18:06:41Z-None] PASSED [ 11%] >tests/test_manifest.py::test_find_path_entry[eclass/Manifest-eclass/Manifest] PASSED [ 11%] >tests/test_manifest.py::test_find_path_entry[eclass-None] PASSED [ 11%] >tests/test_manifest.py::test_find_path_entry[local-local] PASSED [ 11%] >tests/test_manifest.py::test_find_path_entry[local/foo-local] PASSED [ 12%] >tests/test_manifest.py::test_find_path_entry[locale-None] PASSED [ 12%] >tests/test_manifest.py::test_find_path_entry[myebuild-0.ebuild-myebuild-0.ebuild] PASSED [ 12%] >tests/test_manifest.py::test_find_path_entry[metadata.xml-metadata.xml] PASSED [ 12%] >tests/test_manifest.py::test_find_path_entry[mydistfile.tar.gz-None] PASSED [ 12%] >tests/test_manifest.py::test_find_path_entry_aux[test.patch-None] PASSED [ 12%] >tests/test_manifest.py::test_find_path_entry_aux[files/test.patch-test.patch] PASSED [ 12%] >tests/test_manifest.py::test_find_dist_entry[myebuild-0.ebuild-None] PASSED [ 12%] >tests/test_manifest.py::test_find_dist_entry[mydistfile.tar.gz-mydistfile.tar.gz] PASSED [ 12%] >tests/test_manifest.py::test_find_manifests_for_path[foo-expected0] PASSED [ 12%] >tests/test_manifest.py::test_find_manifests_for_path[eclass-expected1] PASSED [ 12%] >tests/test_manifest.py::test_find_manifests_for_path[eclass/foo.eclass-expected2] PASSED [ 13%] >tests/test_manifest.py::test_multiple_load PASSED [ 13%] >tests/test_manifest.py::test_sort PASSED [ 13%] >tests/test_manifest.py::test_entry_from_list[ManifestEntryTIMESTAMP-as_list0-vals0] PASSED [ 13%] >tests/test_manifest.py::test_entry_from_list[ManifestEntryMANIFEST-as_list1-vals1] PASSED [ 13%] >tests/test_manifest.py::test_entry_from_list[ManifestEntryIGNORE-as_list2-vals2] PASSED [ 13%] >tests/test_manifest.py::test_entry_from_list[ManifestEntryDATA-as_list3-vals3] PASSED [ 13%] >tests/test_manifest.py::test_entry_from_list[ManifestEntryIGNORE-as_list4-vals4] PASSED [ 13%] >tests/test_manifest.py::test_entry_from_list[ManifestEntryMISC-as_list5-vals5] PASSED [ 13%] >tests/test_manifest.py::test_entry_from_list[ManifestEntryDIST-as_list6-vals6] PASSED [ 13%] >tests/test_manifest.py::test_entry_from_list[ManifestEntryEBUILD-as_list7-vals7] PASSED [ 13%] >tests/test_manifest.py::test_entry_from_list[ManifestEntryAUX-as_list8-vals8] PASSED [ 14%] >tests/test_manifest.py::test_entry_to_list[ManifestEntryTIMESTAMP-as_list0-vals0] PASSED [ 14%] >tests/test_manifest.py::test_entry_to_list[ManifestEntryMANIFEST-as_list1-vals1] PASSED [ 14%] >tests/test_manifest.py::test_entry_to_list[ManifestEntryIGNORE-as_list2-vals2] PASSED [ 14%] >tests/test_manifest.py::test_entry_to_list[ManifestEntryDATA-as_list3-vals3] PASSED [ 14%] >tests/test_manifest.py::test_entry_to_list[ManifestEntryIGNORE-as_list4-vals4] PASSED [ 14%] >tests/test_manifest.py::test_entry_to_list[ManifestEntryMISC-as_list5-vals5] PASSED [ 14%] >tests/test_manifest.py::test_entry_to_list[ManifestEntryDIST-as_list6-vals6] PASSED [ 14%] >tests/test_manifest.py::test_entry_to_list[ManifestEntryEBUILD-as_list7-vals7] PASSED [ 14%] >tests/test_manifest.py::test_entry_to_list[ManifestEntryAUX-as_list8-vals8] PASSED [ 14%] >tests/test_manifest.py::test_new_manifest_entry[ManifestEntryTIMESTAMP-as_list0-vals0] PASSED [ 14%] >tests/test_manifest.py::test_new_manifest_entry[ManifestEntryMANIFEST-as_list1-vals1] PASSED [ 15%] >tests/test_manifest.py::test_new_manifest_entry[ManifestEntryIGNORE-as_list2-vals2] PASSED [ 15%] >tests/test_manifest.py::test_new_manifest_entry[ManifestEntryDATA-as_list3-vals3] PASSED [ 15%] >tests/test_manifest.py::test_new_manifest_entry[ManifestEntryIGNORE-as_list4-vals4] PASSED [ 15%] >tests/test_manifest.py::test_new_manifest_entry[ManifestEntryMISC-as_list5-vals5] PASSED [ 15%] >tests/test_manifest.py::test_new_manifest_entry[ManifestEntryDIST-as_list6-vals6] PASSED [ 15%] >tests/test_manifest.py::test_new_manifest_entry[ManifestEntryEBUILD-as_list7-vals7] PASSED [ 15%] >tests/test_manifest.py::test_new_manifest_entry[ManifestEntryAUX-as_list8-vals8] PASSED [ 15%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryTIMESTAMP-as_list0] PASSED [ 15%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryTIMESTAMP-as_list1] PASSED [ 15%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryTIMESTAMP-as_list2] PASSED [ 15%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryTIMESTAMP-as_list3] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryTIMESTAMP-as_list4] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryTIMESTAMP-as_list5] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMANIFEST-as_list6] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMANIFEST-as_list7] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryIGNORE-as_list8] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryIGNORE-as_list9] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDATA-as_list10] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDATA-as_list11] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMISC-as_list12] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMISC-as_list13] PASSED [ 16%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list14] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list15] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list16] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryEBUILD-as_list17] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryEBUILD-as_list18] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryAUX-as_list19] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryAUX-as_list20] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMANIFEST-as_list21] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMANIFEST-as_list22] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMANIFEST-as_list23] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDATA-as_list24] PASSED [ 17%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDATA-as_list25] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDATA-as_list26] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMISC-as_list27] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMISC-as_list28] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMISC-as_list29] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list30] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list31] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list32] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryEBUILD-as_list33] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryEBUILD-as_list34] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryEBUILD-as_list35] PASSED [ 18%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryAUX-as_list36] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryAUX-as_list37] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryAUX-as_list38] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMANIFEST-as_list39] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMANIFEST-as_list40] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDATA-as_list41] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDATA-as_list42] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMISC-as_list43] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMISC-as_list44] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list45] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list46] PASSED [ 19%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryEBUILD-as_list47] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryEBUILD-as_list48] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryAUX-as_list49] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryAUX-as_list50] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMANIFEST-as_list51] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMANIFEST-as_list52] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryIGNORE-as_list53] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryIGNORE-as_list54] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDATA-as_list55] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDATA-as_list56] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMISC-as_list57] PASSED [ 20%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryMISC-as_list58] PASSED [ 21%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list59] PASSED [ 21%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryDIST-as_list60] PASSED [ 21%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryEBUILD-as_list61] PASSED [ 21%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryEBUILD-as_list62] PASSED [ 21%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryAUX-as_list63] PASSED [ 21%] >tests/test_manifest.py::test_manifest_entry_invalid[ManifestEntryAUX-as_list64] PASSED [ 21%] >tests/test_manifest.py::test_manifest_hashes_to_hashlib[MD5 SHA1-md5 sha1] PASSED [ 21%] >tests/test_manifest.py::test_manifest_hashes_to_hashlib[RMD160-ripemd160] PASSED [ 21%] >tests/test_manifest.py::test_manifest_hashes_to_hashlib[SHA3_256 SHA256-sha3_256 sha256] PASSED [ 21%] >tests/test_manifest.py::test_path_encode[tes t-tes\\x20t] PASSED [ 21%] >tests/test_manifest.py::test_path_encode[tes\tt-tes\\x09t] PASSED [ 22%] >tests/test_manifest.py::test_path_encode[tes\xa0t-tes\\u00A0t] PASSED [ 22%] >tests/test_manifest.py::test_path_encode[tes\u2000t-tes\\u2000t] PASSED [ 22%] >tests/test_manifest.py::test_path_encode[tes\x00t-tes\\x00t] PASSED [ 22%] >tests/test_manifest.py::test_path_encode[tes\x07t-tes\\x07t] PASSED [ 22%] >tests/test_manifest.py::test_path_encode[tes\x7ft-tes\\x7Ft] PASSED [ 22%] >tests/test_manifest.py::test_path_encode[tes\x80t-tes\\u0080t] PASSED [ 22%] >tests/test_manifest.py::test_path_encode[tes\\t-tes\\x5Ct] PASSED [ 22%] >tests/test_manifest.py::test_path_decode[tes t-tes\\x20t] PASSED [ 22%] >tests/test_manifest.py::test_path_decode[tes\tt-tes\\x09t] PASSED [ 22%] >tests/test_manifest.py::test_path_decode[tes\xa0t-tes\\u00A0t] PASSED [ 22%] >tests/test_manifest.py::test_path_decode[tes\u2000t-tes\\u2000t] PASSED [ 22%] >tests/test_manifest.py::test_path_decode[tes\x00t-tes\\x00t] PASSED [ 23%] >tests/test_manifest.py::test_path_decode[tes\x07t-tes\\x07t] PASSED [ 23%] >tests/test_manifest.py::test_path_decode[tes\x7ft-tes\\x7Ft] PASSED [ 23%] >tests/test_manifest.py::test_path_decode[tes\x80t-tes\\u0080t] PASSED [ 23%] >tests/test_manifest.py::test_path_decode[tes\\t-tes\\x5Ct] PASSED [ 23%] >tests/test_manifest.py::test_path_decode[tes t-tes\\u0020t] PASSED [ 23%] >tests/test_manifest.py::test_path_decode[tes t-tes\\U00000020t] PASSED [ 23%] >tests/test_manifest.py::test_path_decode[tes\xa0t-tes\\u00a0t] PASSED [ 23%] >tests/test_manifest.py::test_path_decode[tes\x7ft-tes\\x7ft] PASSED [ 23%] >tests/test_manifest.py::test_path_decode[tes\\t-tes\\x5ct] PASSED [ 23%] >tests/test_manifest.py::test_path_decode_invalid[tes\\t] PASSED [ 23%] >tests/test_manifest.py::test_path_decode_invalid[tes\\\\t] PASSED [ 24%] >tests/test_manifest.py::test_path_decode_invalid[tes\\] PASSED [ 24%] >tests/test_manifest.py::test_path_decode_invalid[tes\\xt] PASSED [ 24%] >tests/test_manifest.py::test_path_decode_invalid[tes\\x5t] PASSED [ 24%] >tests/test_manifest.py::test_path_decode_invalid[tes\\ut] PASSED [ 24%] >tests/test_manifest.py::test_path_decode_invalid[tes\\u345t] PASSED [ 24%] >tests/test_manifest.py::test_path_decode_invalid[tes\\Ut] PASSED [ 24%] >tests/test_manifest.py::test_path_decode_invalid[tes\\U0000345t] PASSED [ 24%] >tests/test_openpgp.py::test_noverify_goodish_manifest_load[SIGNED_MANIFEST] PASSED [ 24%] >tests/test_openpgp.py::test_noverify_goodish_manifest_load[DASH_ESCAPED_SIGNED_MANIFEST] PASSED [ 24%] >tests/test_openpgp.py::test_noverify_goodish_manifest_load[SUBKEY_SIGNED_MANIFEST] PASSED [ 24%] >tests/test_openpgp.py::test_noverify_goodish_manifest_load[MODIFIED_SIGNED_MANIFEST] PASSED [ 25%] >tests/test_openpgp.py::test_noverify_goodish_manifest_load[EXPIRED_SIGNED_MANIFEST] PASSED [ 25%] >tests/test_openpgp.py::test_noverify_bad_manifest_load[SIGNED_MANIFEST_JUNK_BEFORE-ManifestUnsignedData] PASSED [ 25%] >tests/test_openpgp.py::test_noverify_bad_manifest_load[SIGNED_MANIFEST_JUNK_AFTER-ManifestUnsignedData] PASSED [ 25%] >tests/test_openpgp.py::test_noverify_bad_manifest_load[SIGNED_MANIFEST_CUT_BEFORE_DATA-ManifestSyntaxError] PASSED [ 25%] >tests/test_openpgp.py::test_noverify_bad_manifest_load[SIGNED_MANIFEST_CUT_BEFORE_SIGNATURE-ManifestSyntaxError] PASSED [ 25%] >tests/test_openpgp.py::test_noverify_bad_manifest_load[SIGNED_MANIFEST_CUT_BEFORE_END-ManifestSyntaxError] PASSED [ 25%] >tests/test_openpgp.py::test_noverify_recursive_manifest_loader[False] PASSED [ 25%] >tests/test_openpgp.py::test_noverify_recursive_manifest_loader[True] PASSED [ 25%] >tests/test_openpgp.py::test_noverify_load_cli PASSED [ 25%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 25%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-None] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-DASH_ESCAPED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_KEY_SUBKEY-None] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-SIGNED_MANIFEST-PRIVATE_KEY-None] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-MODIFIED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-EXPIRED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-SIGNED_MANIFEST-None-OpenPGPVerificationFailure] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-OpenPGPExpiredKeyFailure] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[IsolatedGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-None] PASSED [ 26%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-DASH_ESCAPED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 27%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_KEY_SUBKEY-None] PASSED [ 27%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-SIGNED_MANIFEST-PRIVATE_KEY-None] PASSED [ 27%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-MODIFIED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 27%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-EXPIRED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 27%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-SIGNED_MANIFEST-None-OpenPGPVerificationFailure] PASSED [ 27%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-OpenPGPExpiredKeyFailure] PASSED [ 27%] >tests/test_openpgp.py::test_verify_manifest[MockedSystemGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure] PASSED [ 27%] >tests/test_openpgp.py::test_verify_untrusted_key PASSED [ 27%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 27%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-None] PASSED [ 27%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-DASH_ESCAPED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_KEY_SUBKEY-None] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-SIGNED_MANIFEST-PRIVATE_KEY-None] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-MODIFIED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-EXPIRED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-SIGNED_MANIFEST-None-OpenPGPVerificationFailure] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-OpenPGPExpiredKeyFailure] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[IsolatedGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-None] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-DASH_ESCAPED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 28%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_KEY_SUBKEY-None] PASSED [ 29%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-SIGNED_MANIFEST-PRIVATE_KEY-None] PASSED [ 29%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-MODIFIED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 29%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-EXPIRED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 29%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-SIGNED_MANIFEST-None-OpenPGPVerificationFailure] PASSED [ 29%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-OpenPGPExpiredKeyFailure] PASSED [ 29%] >tests/test_openpgp.py::test_manifest_load[MockedSystemGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure] PASSED [ 29%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-Manifest] PASSED [ 29%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-Manifest.gz] PASSED [ 29%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-None-Manifest] PASSED [ 29%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-None-Manifest.gz] PASSED [ 29%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-DASH_ESCAPED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-Manifest] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-DASH_ESCAPED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-Manifest.gz] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_KEY_SUBKEY-None-Manifest] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_KEY_SUBKEY-None-Manifest.gz] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-PRIVATE_KEY-None-Manifest] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-PRIVATE_KEY-None-Manifest.gz] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-MODIFIED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure-Manifest] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-MODIFIED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure-Manifest.gz] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-EXPIRED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure-Manifest] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-EXPIRED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure-Manifest.gz] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-None-OpenPGPVerificationFailure-Manifest] PASSED [ 30%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-None-OpenPGPVerificationFailure-Manifest.gz] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-OpenPGPExpiredKeyFailure-Manifest] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-OpenPGPExpiredKeyFailure-Manifest.gz] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure-Manifest] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[IsolatedGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure-Manifest.gz] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-Manifest] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-Manifest.gz] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-None-Manifest] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-None-Manifest.gz] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-DASH_ESCAPED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-Manifest] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-DASH_ESCAPED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-Manifest.gz] PASSED [ 31%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_KEY_SUBKEY-None-Manifest] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_KEY_SUBKEY-None-Manifest.gz] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-PRIVATE_KEY-None-Manifest] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-PRIVATE_KEY-None-Manifest.gz] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-MODIFIED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure-Manifest] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-MODIFIED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure-Manifest.gz] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-EXPIRED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure-Manifest] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-EXPIRED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure-Manifest.gz] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-None-OpenPGPVerificationFailure-Manifest] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-None-OpenPGPVerificationFailure-Manifest.gz] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-OpenPGPExpiredKeyFailure-Manifest] PASSED [ 32%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-OpenPGPExpiredKeyFailure-Manifest.gz] PASSED [ 33%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure-Manifest] PASSED [ 33%] >tests/test_openpgp.py::test_recursive_manifest_loader[MockedSystemGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure-Manifest.gz] PASSED [ 33%] >tests/test_openpgp.py::test_cli[SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 33%] >tests/test_openpgp.py::test_cli[SIGNED_MANIFEST-VALID_KEY_NOEMAIL-None] PASSED [ 33%] >tests/test_openpgp.py::test_cli[DASH_ESCAPED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-None] PASSED [ 33%] >tests/test_openpgp.py::test_cli[SUBKEY_SIGNED_MANIFEST-VALID_KEY_SUBKEY-None] PASSED [ 33%] >tests/test_openpgp.py::test_cli[SIGNED_MANIFEST-PRIVATE_KEY-None] PASSED [ 33%] >tests/test_openpgp.py::test_cli[MODIFIED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 33%] >tests/test_openpgp.py::test_cli[EXPIRED_SIGNED_MANIFEST-VALID_PUBLIC_KEY-OpenPGPVerificationFailure] PASSED [ 33%] >tests/test_openpgp.py::test_cli[SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-OpenPGPExpiredKeyFailure] PASSED [ 33%] >tests/test_openpgp.py::test_cli[SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure] PASSED [ 33%] >tests/test_openpgp.py::test_env_import_key[IsolatedGPGEnvironment-VALID_PUBLIC_KEY-True] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[IsolatedGPGEnvironment-VALID_KEY_NOEMAIL-True] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[IsolatedGPGEnvironment-MALFORMED_PUBLIC_KEY-False] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[IsolatedGPGEnvironment-EMPTY_DATA-False] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[IsolatedGPGEnvironment-FORGED_PUBLIC_KEY-False] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[IsolatedGPGEnvironment-UNSIGNED_PUBLIC_KEY-False] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[MockedSystemGPGEnvironment-VALID_PUBLIC_KEY-True] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[MockedSystemGPGEnvironment-VALID_KEY_NOEMAIL-True] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[MockedSystemGPGEnvironment-MALFORMED_PUBLIC_KEY-False] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[MockedSystemGPGEnvironment-EMPTY_DATA-False] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[MockedSystemGPGEnvironment-FORGED_PUBLIC_KEY-False] PASSED [ 34%] >tests/test_openpgp.py::test_env_import_key[MockedSystemGPGEnvironment-UNSIGNED_PUBLIC_KEY-False] PASSED [ 35%] >tests/test_openpgp.py::test_env_double_close PASSED [ 35%] >tests/test_openpgp.py::test_env_home_after_close PASSED [ 35%] >tests/test_openpgp.py::test_sign_data[IsolatedGPGEnvironment-None] PASSED [ 35%] >tests/test_openpgp.py::test_sign_data[IsolatedGPGEnvironment-0x136880E72A7B1384] PASSED [ 35%] >tests/test_openpgp.py::test_sign_data[MockedSystemGPGEnvironment-None] PASSED [ 35%] >tests/test_openpgp.py::test_sign_data[MockedSystemGPGEnvironment-0x136880E72A7B1384] PASSED [ 35%] >tests/test_openpgp.py::test_dump_signed_manifest[IsolatedGPGEnvironment-None-None] PASSED [ 35%] >tests/test_openpgp.py::test_dump_signed_manifest[IsolatedGPGEnvironment-None-0x136880E72A7B1384] PASSED [ 35%] >tests/test_openpgp.py::test_dump_signed_manifest[IsolatedGPGEnvironment-False-None] PASSED [ 35%] >tests/test_openpgp.py::test_dump_signed_manifest[IsolatedGPGEnvironment-False-0x136880E72A7B1384] PASSED [ 35%] >tests/test_openpgp.py::test_dump_signed_manifest[IsolatedGPGEnvironment-True-None] PASSED [ 36%] >tests/test_openpgp.py::test_dump_signed_manifest[IsolatedGPGEnvironment-True-0x136880E72A7B1384] PASSED [ 36%] >tests/test_openpgp.py::test_dump_signed_manifest[MockedSystemGPGEnvironment-None-None] PASSED [ 36%] >tests/test_openpgp.py::test_dump_signed_manifest[MockedSystemGPGEnvironment-None-0x136880E72A7B1384] PASSED [ 36%] >tests/test_openpgp.py::test_dump_signed_manifest[MockedSystemGPGEnvironment-False-None] PASSED [ 36%] >tests/test_openpgp.py::test_dump_signed_manifest[MockedSystemGPGEnvironment-False-0x136880E72A7B1384] PASSED [ 36%] >tests/test_openpgp.py::test_dump_signed_manifest[MockedSystemGPGEnvironment-True-None] PASSED [ 36%] >tests/test_openpgp.py::test_dump_signed_manifest[MockedSystemGPGEnvironment-True-0x136880E72A7B1384] PASSED [ 36%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_manifest[IsolatedGPGEnvironment-None-Manifest] PASSED [ 36%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_manifest[IsolatedGPGEnvironment-None-Manifest.gz] PASSED [ 36%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_manifest[IsolatedGPGEnvironment-True-Manifest] PASSED [ 36%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_manifest[IsolatedGPGEnvironment-True-Manifest.gz] PASSED [ 37%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_manifest[MockedSystemGPGEnvironment-None-Manifest] PASSED [ 37%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_manifest[MockedSystemGPGEnvironment-None-Manifest.gz] PASSED [ 37%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_manifest[MockedSystemGPGEnvironment-True-Manifest] PASSED [ 37%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_manifest[MockedSystemGPGEnvironment-True-Manifest.gz] PASSED [ 37%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_submanifest[IsolatedGPGEnvironment] PASSED [ 37%] >tests/test_openpgp.py::test_recursive_manifest_loader_save_submanifest[MockedSystemGPGEnvironment] PASSED [ 37%] >tests/test_openpgp.py::test_list_keys[IsolatedGPGEnvironment-VALID_PUBLIC_KEY-expected0] PASSED [ 37%] >tests/test_openpgp.py::test_list_keys[IsolatedGPGEnvironment-OTHER_VALID_PUBLIC_KEY-expected1] PASSED [ 37%] >tests/test_openpgp.py::test_list_keys[IsolatedGPGEnvironment-VALID_KEY_SUBKEY-expected2] PASSED [ 37%] >tests/test_openpgp.py::test_list_keys[IsolatedGPGEnvironment-VALID_KEY_NOEMAIL-expected3] PASSED [ 37%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-VALID_PUBLIC_KEY-None] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-VALID_KEY_SUBKEY-None] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-None-OpenPGPKeyRefreshError] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-VALID_PUBLIC_KEY-OpenPGPRevokedKeyFailure] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-UNEXPIRE_PUBLIC_KEY-None] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-OLD_UNEXPIRE_PUBLIC_KEY-OpenPGPExpiredKeyFailure] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-OTHER_VALID_PUBLIC_KEY-4B8349B90C56EE7F054D52871822F5424EB6DA81-VALID_PUBLIC_KEY-OpenPGPKeyRefreshError] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-OTHER_VALID_PUBLIC_KEY-4B8349B90C56EE7F054D52871822F5424EB6DA81-COMBINED_PUBLIC_KEYS-OpenPGPRuntimeError] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-FORGED_UNEXPIRE_KEY-OpenPGPExpiredKeyFailure] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-FORGED_SUBKEY-OpenPGPVerificationFailure] PASSED [ 38%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-UNSIGNED_SUBKEY-OpenPGPVerificationFailure] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_hkp[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-81E12C16BD8DCD60BE180845136880E72A7B1384-VALID_PUBLIC_KEY-None] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-VALID_PUBLIC_KEY-None-True] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-REVOKED_PUBLIC_KEY-OpenPGPRevokedKeyFailure-True] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-VALID_KEY_SUBKEY-None-True] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_PUBLIC_KEY-None-None-OpenPGPKeyRefreshError-True] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-REVOKED_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-VALID_PUBLIC_KEY-OpenPGPRevokedKeyFailure-True] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-UNEXPIRE_PUBLIC_KEY-None-True] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-OLD_UNEXPIRE_PUBLIC_KEY-OpenPGPExpiredKeyFailure-True] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-OTHER_VALID_PUBLIC_KEY-4B8349B90C56EE7F054D52871822F5424EB6DA81-VALID_PUBLIC_KEY-OpenPGPKeyRefreshError-True] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-OTHER_VALID_PUBLIC_KEY-4B8349B90C56EE7F054D52871822F5424EB6DA81-COMBINED_PUBLIC_KEYS-OpenPGPRuntimeError-True] PASSED [ 39%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-EXPIRED_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-FORGED_UNEXPIRE_KEY-OpenPGPExpiredKeyFailure-True] PASSED [ 40%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-FORGED_SUBKEY-OpenPGPVerificationFailure-True] PASSED [ 40%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SUBKEY_SIGNED_MANIFEST-VALID_PUBLIC_KEY-81E12C16BD8DCD60BE180845136880E72A7B1384-UNSIGNED_SUBKEY-OpenPGPVerificationFailure-True] PASSED [ 40%] >tests/test_openpgp.py::test_refresh_wkd[IsolatedGPGEnvironment-SIGNED_MANIFEST-VALID_KEY_NOEMAIL-81E12C16BD8DCD60BE180845136880E72A7B1384-VALID_PUBLIC_KEY-OpenPGPKeyRefreshError-False] PASSED [ 40%] >tests/test_openpgp.py::test_refresh_wkd_fallback_to_hkp[IsolatedGPGEnvironment] PASSED [ 40%] >tests/test_openpgp.py::test_get_wkd_url[gemato@example.com-https://example.com/.well-known/openpgpkey/hu/5x66h616iaskmnadrm86ndo6xnxbxjxb?l=gemato] PASSED [ 40%] >tests/test_openpgp.py::test_get_wkd_url[Joe.Doe@Example.ORG-https://example.org/.well-known/openpgpkey/hu/iy9q119eutrkn8s1mk4r39qejnbu3n5q?l=Joe.Doe] PASSED [ 40%] >tests/test_openpgp.py::test_cli_gpg_wrap[true-0-None] PASSED [ 40%] >tests/test_openpgp.py::test_cli_gpg_wrap[false-1-None] PASSED [ 40%] >tests/test_openpgp.py::test_cli_gpg_wrap[gpg --verify {tmp_path}/Manifest-0-None] PASSED [ 40%] >tests/test_openpgp.py::test_cli_gpg_wrap[gpg --verify {tmp_path}/Manifest.subkey-2-None] PASSED [ 40%] >tests/test_openpgp.py::test_cli_gpg_wrap[sh -c "kill $$"--15-Child process terminated due to signal: 15] PASSED [ 41%] >tests/test_openpgp.py::test_cli_gpg_wrap[sh -c "kill -USR1 $$"--10-Child process terminated due to signal: 10] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-header.txt-DATA] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-skel.ebuild-DATA] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-skel.metadata.xml-DATA] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-dev-foo/metadata.xml-DATA] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-dev-foo/bar/bar-1.ebuild-DATA] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-dev-foo/bar/metadata.xml-DATA] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-dev-foo/bar/files/test.patch-DATA] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-eclass/foo.eclass-DATA] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-eclass/tests/foo.sh-DATA] PASSED [ 41%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-licenses/foo-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/layout.conf-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/projects.xml-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/pkg_desc_index-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/dtd/foo.dtd-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/glsa/glsa-202001-01.xml-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/install-qa-check.d/50foo-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/md5-cache/dev-foo/bar-1-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/news/2020-01-01-foo/2020-01-01-foo.en.txt-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/news/2020-01-01-foo/2020-01-01-foo.en.txt.asc-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-metadata/xml-schema/foo.xsd-DATA] PASSED [ 42%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/arch.desc-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/categories-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/eapi-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/info_pkgs-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/info_vars-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/license_groups-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/package.mask-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/profiles.desc-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/repo_name-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/thirdpartymirrors-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/use.desc-DATA] PASSED [ 43%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/use.local.desc-DATA] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/arch/foo/eapi-DATA] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/arch/foo/parent-DATA] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/desc/foo.desc-DATA] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[EbuildRepositoryProfile-profiles/updates/1Q-2020-DATA] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-header.txt-DATA] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-skel.ebuild-DATA] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-skel.metadata.xml-DATA] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-dev-foo/metadata.xml-DATA] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-dev-foo/bar/bar-1.ebuild-EBUILD] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-dev-foo/bar/metadata.xml-MISC] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-dev-foo/bar/files/test.patch-AUX] PASSED [ 44%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-eclass/foo.eclass-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-eclass/tests/foo.sh-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-licenses/foo-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/layout.conf-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/projects.xml-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/pkg_desc_index-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/dtd/foo.dtd-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/glsa/glsa-202001-01.xml-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/install-qa-check.d/50foo-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/md5-cache/dev-foo/bar-1-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/news/2020-01-01-foo/2020-01-01-foo.en.txt-DATA] PASSED [ 45%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/news/2020-01-01-foo/2020-01-01-foo.en.txt.asc-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-metadata/xml-schema/foo.xsd-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/arch.desc-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/categories-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/eapi-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/info_pkgs-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/info_vars-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/license_groups-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/package.mask-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/profiles.desc-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/repo_name-DATA] PASSED [ 46%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/thirdpartymirrors-DATA] PASSED [ 47%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/use.desc-DATA] PASSED [ 47%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/use.local.desc-DATA] PASSED [ 47%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/arch/foo/eapi-DATA] PASSED [ 47%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/arch/foo/parent-DATA] PASSED [ 47%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/desc/foo.desc-DATA] PASSED [ 47%] >tests/test_profile.py::test_get_entry_type_for_path[BackwardsCompatEbuildRepositoryProfile-profiles/updates/1Q-2020-DATA] PASSED [ 47%] >tests/test_profile.py::test_update_entries_for_directory[EbuildRepositoryProfile] PASSED [ 47%] >tests/test_profile.py::test_update_entries_for_directory[BackwardsCompatEbuildRepositoryProfile] PASSED [ 47%] >tests/test_profile.py::test_cli_update[EbuildRepositoryProfile] PASSED [ 47%] >tests/test_profile.py::test_cli_update[BackwardsCompatEbuildRepositoryProfile] PASSED [ 47%] >tests/test_profile.py::test_set_loader_options[EbuildRepositoryProfile] PASSED [ 48%] >tests/test_profile.py::test_set_loader_options[BackwardsCompatEbuildRepositoryProfile] PASSED [ 48%] >tests/test_profile.py::test_regression_top_level_ignore_in_all_manifests[EbuildRepositoryProfile] PASSED [ 48%] >tests/test_profile.py::test_regression_top_level_ignore_in_all_manifests[BackwardsCompatEbuildRepositoryProfile] PASSED [ 48%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateEntryLayout-None-False-expected0] PASSED [ 48%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateEbuildEntryLayout-None-False-expected1] PASSED [ 48%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateAuxEntryLayout-None-False-expected2] PASSED [ 48%] >tests/test_recursiveloader.py::test_load_manifests[DisjointHashSetEntryLayout-None-False-expected3] PASSED [ 48%] >tests/test_recursiveloader.py::test_load_manifests[IncompatibleTypeLayout-None-False-expected4] PASSED [ 48%] >tests/test_recursiveloader.py::test_load_manifests[MismatchedSizeLayout-None-False-expected5] PASSED [ 48%] >tests/test_recursiveloader.py::test_load_manifests[MismatchedChecksumLayout-None-False-expected6] PASSED [ 48%] >tests/test_recursiveloader.py::test_load_manifests[IgnoreEntryLayout-None-False-expected7] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[MiscEntryLayout-None-False-expected8] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[CrossDeviceLayout-None-False-expected9] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[CrossDeviceEmptyLayout-None-False-expected10] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[CrossDeviceIgnoreLayout-None-False-expected11] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[DotFileLayout-None-False-expected12] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[DirForFileLayout-None-False-expected13] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[UnreadableDirLayout-None-False-expected14] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[MultipleStrayFilesLayout-None-False-expected15] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[StrayManifestLayout-None-False-expected16] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[StrayCompressedManifestLayout-None-False-expected17] PASSED [ 49%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidManifestLayout-None-False-expected18] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidCompressedManifestLayout-None-False-expected19] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidCompressedManifestBz2Layout-None-False-expected20] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidCompressedManifestLzmaLayout-None-False-expected21] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidCompressedManifestXzLayout-None-False-expected22] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[FilenameWhitespaceLayout-None-False-expected23] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[FilenameBackslashLayout-None-False-expected24] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[NonexistingDirectoryLayout-None-False-expected25] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[SymlinkLoopLayout-None-False-expected26] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[SymlinkLoopIgnoreLayout-None-False-expected27] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[MismatchedFileLayout-None-False-expected28] PASSED [ 50%] >tests/test_recursiveloader.py::test_load_manifests[SubTimestampLayout-None-False-expected29] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateManifestEntryLayout-None-False-expected30] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateManifestAsDataEntryLayout-None-False-expected31] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateEntryInSubManifestLayout-None-False-expected32] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[BasicTestLayout-None-False-expected33] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[MultiManifestLayout-None-False-expected34] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[MultiTopManifestLayout-None-False-expected35] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[CompressedSubManifestLayout-None-False-expected36] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[NestedManifestLayout-None-False-expected37] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[AddToMultiManifestLayout-None-False-expected38] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[SubManifestMismatchLayout-None-False-expected39] PASSED [ 51%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateEntryLayout--True-expected40] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateEbuildEntryLayout--True-expected41] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateAuxEntryLayout--True-expected42] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[DisjointHashSetEntryLayout--True-expected43] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[IncompatibleTypeLayout--True-expected44] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[MismatchedSizeLayout--True-expected45] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[MismatchedChecksumLayout--True-expected46] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[IgnoreEntryLayout--True-expected47] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[MiscEntryLayout--True-expected48] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[CrossDeviceLayout--True-expected49] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[CrossDeviceEmptyLayout--True-expected50] PASSED [ 52%] >tests/test_recursiveloader.py::test_load_manifests[CrossDeviceIgnoreLayout--True-expected51] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[DotFileLayout--True-expected52] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[DirForFileLayout--True-expected53] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[UnreadableDirLayout--True-expected54] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[MultipleStrayFilesLayout--True-expected55] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[StrayManifestLayout--True-expected56] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[StrayCompressedManifestLayout--True-expected57] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidManifestLayout--True-expected58] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidCompressedManifestLayout--True-expected59] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidCompressedManifestBz2Layout--True-expected60] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidCompressedManifestLzmaLayout--True-expected61] PASSED [ 53%] >tests/test_recursiveloader.py::test_load_manifests[StrayInvalidCompressedManifestXzLayout--True-expected62] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[FilenameWhitespaceLayout--True-expected63] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[FilenameBackslashLayout--True-expected64] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[NonexistingDirectoryLayout--True-expected65] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[SymlinkLoopLayout--True-expected66] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[SymlinkLoopIgnoreLayout--True-expected67] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[MismatchedFileLayout--True-expected68] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[SubTimestampLayout--False-expected69] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[SubTimestampLayout--True-expected70] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[SubTimestampLayout-sub-False-expected71] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateManifestEntryLayout--False-expected72] PASSED [ 54%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateManifestEntryLayout--True-expected73] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateManifestEntryLayout-sub-False-expected74] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateManifestAsDataEntryLayout--False-expected75] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateManifestAsDataEntryLayout--True-expected76] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateManifestAsDataEntryLayout-sub-False-expected77] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateEntryInSubManifestLayout--False-expected78] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateEntryInSubManifestLayout--True-expected79] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[DuplicateEntryInSubManifestLayout-sub-False-expected80] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[BasicTestLayout-sub/test-False-expected81] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[BasicTestLayout-sub/deeper/test-False-expected82] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[BasicTestLayout--True-expected83] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[BasicTestLayout-sub-True-expected84] PASSED [ 55%] >tests/test_recursiveloader.py::test_load_manifests[BasicTestLayout-sub/test-True-expected85] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[MultiManifestLayout-sub-False-expected86] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[MultiManifestLayout--True-expected87] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[MultiTopManifestLayout--False-expected88] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[MultiTopManifestLayout-sub-False-expected89] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[MultiTopManifestLayout--True-expected90] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[CompressedTopManifestLayout-None-False-expected91] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[CompressedSubManifestLayout-sub-False-expected92] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[CompressedSubManifestLayout--True-expected93] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[CompressedManifestSortLayout-None-False-expected94] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[CompressedManifestSortLayout-a-False-expected95] PASSED [ 56%] >tests/test_recursiveloader.py::test_load_manifests[CompressedManifestSortLayout--True-expected96] PASSED [ 57%] >tests/test_recursiveloader.py::test_load_manifests[NestedManifestLayout--True-expected97] PASSED [ 57%] >tests/test_recursiveloader.py::test_load_manifests[AddToMultiManifestLayout-a-False-expected98] PASSED [ 57%] >tests/test_recursiveloader.py::test_load_manifests[AddToMultiManifestLayout--True-expected99] PASSED [ 57%] >tests/test_recursiveloader.py::test_load_manifests_raise[SubManifestMismatchLayout-a-False-diff0] PASSED [ 57%] >tests/test_recursiveloader.py::test_load_manifests_raise[SubManifestMismatchLayout--True-diff1] PASSED [ 57%] >tests/test_recursiveloader.py::test__iter_manifests_for_path[BasicTestLayout-sub/deeper-False-expected0] PASSED [ 57%] >tests/test_recursiveloader.py::test__iter_manifests_for_path[BasicTestLayout-other-True-expected1] PASSED [ 57%] >tests/test_recursiveloader.py::test__iter_manifests_for_path[BasicTestLayout-sub-True-expected2] PASSED [ 57%] >tests/test_recursiveloader.py::test__iter_manifests_for_path[CompressedManifestSortLayout--True-expected3] PASSED [ 57%] >tests/test_recursiveloader.py::test_find_timestamp[BasicTestLayout-None-expected0] PASSED [ 57%] >tests/test_recursiveloader.py::test_find_timestamp[SubTimestampLayout-None-None] PASSED [ 58%] >tests/test_recursiveloader.py::test_find_timestamp[SubTimestampLayout-sub-None] PASSED [ 58%] >tests/test_recursiveloader.py::test_find_timestamp[MultiTopManifestLayout-None-expected3] PASSED [ 58%] >tests/test_recursiveloader.py::test_set_timestamp[BasicTestLayout] PASSED [ 58%] >tests/test_recursiveloader.py::test_set_timestamp[DuplicateEntryLayout] PASSED [ 58%] >tests/test_recursiveloader.py::test_find_path_entry[FilenameWhitespaceLayout- foo bar -expected0] PASSED [ 58%] >tests/test_recursiveloader.py::test_find_path_entry[FilenameBackslashLayout-foo\\bar-expected1] PASSED [ 58%] >tests/test_recursiveloader.py::test_find_path_entry[BasicTestLayout-test-None] PASSED [ 58%] >tests/test_recursiveloader.py::test_find_path_entry[BasicTestLayout-sub/test-None] PASSED [ 58%] >tests/test_recursiveloader.py::test_find_path_entry[BasicTestLayout-sub/deeper/test-expected4] PASSED [ 58%] >tests/test_recursiveloader.py::test_find_path_entry[DuplicateEntryLayout-test-expected5] PASSED [ 58%] >tests/test_recursiveloader.py::test_find_path_entry[DuplicateEntryInSubManifestLayout-sub/test-expected6] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[DuplicateEbuildEntryLayout-test.ebuild-expected7] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[DuplicateAuxEntryLayout-files/test.patch-expected8] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[DisjointHashSetEntryLayout-test-expected9] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[IncompatibleTypeLayout-metadata.xml-expected10] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[MismatchedSizeLayout-test-expected11] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[MismatchedChecksumLayout-test-expected12] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[IgnoreEntryLayout-foo-expected13] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[IgnoreEntryLayout-bar-expected14] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[IgnoreEntryLayout-bar/baz-expected15] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[CompressedTopManifestLayout-test-expected16] PASSED [ 59%] >tests/test_recursiveloader.py::test_find_path_entry[CompressedSubManifestLayout-sub/test-expected17] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[topdistfile-1.txt--topdistfile-1.txt] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[subdistfile-1.txt--None] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[topdistfile-1.txt-file-topdistfile-1.txt] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[subdistfile-1.txt-file-None] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[topdistfile-1.txt-sub-topdistfile-1.txt] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[subdistfile-1.txt-sub-subdistfile-1.txt] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[topdistfile-1.txt-sub/-topdistfile-1.txt] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[subdistfile-1.txt-sub/-subdistfile-1.txt] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[topdistfile-1.txt-sub/file-topdistfile-1.txt] PASSED [ 60%] >tests/test_recursiveloader.py::test_find_dist_entry[subdistfile-1.txt-sub/file-subdistfile-1.txt] PASSED [ 60%] >tests/test_recursiveloader.py::test_verify_path[BasicTestLayout-sub/Manifest-True-diff0] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[BasicTestLayout-sub/deeper/test-True-diff1] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[BasicTestLayout-sub/deeper/nonexist-True-diff2] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[BasicTestLayout-sub/stray-False-diff3] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[MultiManifestLayout-sub/foo-False-diff4] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[DuplicateEntryLayout-test-True-diff5] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[DuplicateManifestAsDataEntryLayout-sub/Manifest-True-diff6] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[DuplicateEntryInSubManifestLayout-sub/test-True-diff7] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[DuplicateEbuildEntryLayout-test.ebuild-True-diff8] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[DuplicateAuxEntryLayout-files/test.patch-True-diff9] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[DisjointHashSetEntryLayout-test-False-diff10] PASSED [ 61%] >tests/test_recursiveloader.py::test_verify_path[DirForFileLayout-test-False-diff11] PASSED [ 62%] >tests/test_recursiveloader.py::test_verify_path[CompressedTopManifestLayout-test-True-diff12] PASSED [ 62%] >tests/test_recursiveloader.py::test_verify_path[CompressedSubManifestLayout-sub/test-True-diff13] PASSED [ 62%] >tests/test_recursiveloader.py::test_verify_path[MismatchedFileLayout-test-False-diff14] PASSED [ 62%] >tests/test_recursiveloader.py::test_assert_path_verifies[BasicTestLayout-sub/Manifest-True-diff0] PASSED [ 62%] >tests/test_recursiveloader.py::test_assert_path_verifies[BasicTestLayout-sub/deeper/test-True-diff1] PASSED [ 62%] >tests/test_recursiveloader.py::test_assert_path_verifies[BasicTestLayout-sub/deeper/nonexist-True-diff2] PASSED [ 62%] >tests/test_recursiveloader.py::test_assert_path_verifies[BasicTestLayout-sub/stray-False-diff3] PASSED [ 62%] >tests/test_recursiveloader.py::test_assert_path_verifies[MultiManifestLayout-sub/foo-False-diff4] PASSED [ 62%] >tests/test_recursiveloader.py::test_assert_path_verifies[DuplicateEntryLayout-test-True-diff5] PASSED [ 62%] >tests/test_recursiveloader.py::test_assert_path_verifies[DuplicateManifestAsDataEntryLayout-sub/Manifest-True-diff6] PASSED [ 62%] >tests/test_recursiveloader.py::test_assert_path_verifies[DuplicateEntryInSubManifestLayout-sub/test-True-diff7] PASSED [ 63%] >tests/test_recursiveloader.py::test_assert_path_verifies[DuplicateEbuildEntryLayout-test.ebuild-True-diff8] PASSED [ 63%] >tests/test_recursiveloader.py::test_assert_path_verifies[DuplicateAuxEntryLayout-files/test.patch-True-diff9] PASSED [ 63%] >tests/test_recursiveloader.py::test_assert_path_verifies[DisjointHashSetEntryLayout-test-False-diff10] PASSED [ 63%] >tests/test_recursiveloader.py::test_assert_path_verifies[DirForFileLayout-test-False-diff11] PASSED [ 63%] >tests/test_recursiveloader.py::test_assert_path_verifies[CompressedTopManifestLayout-test-True-diff12] PASSED [ 63%] >tests/test_recursiveloader.py::test_assert_path_verifies[CompressedSubManifestLayout-sub/test-True-diff13] PASSED [ 63%] >tests/test_recursiveloader.py::test_assert_path_verifies[MismatchedFileLayout-test-False-diff14] PASSED [ 63%] >tests/test_recursiveloader.py::test_get_file_entry_dict[BasicTestLayout--None-expected0] PASSED [ 63%] >tests/test_recursiveloader.py::test_get_file_entry_dict[BasicTestLayout--MANIFEST-expected1] PASSED [ 63%] >tests/test_recursiveloader.py::test_get_file_entry_dict[BasicTestLayout--DIST-expected2] PASSED [ 63%] >tests/test_recursiveloader.py::test_get_file_entry_dict[BasicTestLayout-sub-None-expected3] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[BasicTestLayout-sub-MANIFEST-expected4] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[BasicTestLayout-non-existing-None-expected5] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[DuplicateEntryLayout--None-expected6] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[DuplicateEntryInSubManifestLayout--None-expected7] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[DuplicateManifestAsDataEntryLayout--None-expected8] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[DuplicateEbuildEntryLayout--None-expected9] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[DuplicateEbuildEntryLayout--DATA-expected10] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[DuplicateAuxEntryLayout--None-expected11] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[DuplicateAuxEntryLayout--DATA-expected12] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[DisjointHashSetEntryLayout--None-expected13] PASSED [ 64%] >tests/test_recursiveloader.py::test_get_file_entry_dict[IncompatibleTypeLayout--DATA-expected14] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_file_entry_dict[IncompatibleTypeLayout--MISC-expected15] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_file_entry_dict_incompatible[IncompatibleTypeLayout--None-diff0] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_file_entry_dict_incompatible[MismatchedSizeLayout--None-diff1] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_file_entry_dict_incompatible[MismatchedChecksumLayout--None-diff2] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_deduplicated_file_entry_dict_for_update[BasicTestLayout--expected0] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_deduplicated_file_entry_dict_for_update[BasicTestLayout-sub-expected1] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_deduplicated_file_entry_dict_for_update[BasicTestLayout-non-existing-expected2] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_deduplicated_file_entry_dict_for_update[DuplicateEntryLayout--expected3] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_deduplicated_file_entry_dict_for_update[DuplicateEntryInSubManifestLayout--expected4] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_deduplicated_file_entry_dict_for_update[DisjointHashSetEntryLayout--expected5] PASSED [ 65%] >tests/test_recursiveloader.py::test_get_deduplicated_file_entry_dict_for_update[MismatchedSizeLayout--expected6] PASSED [ 66%] >tests/test_recursiveloader.py::test_get_deduplicated_file_entry_dict_for_update[MismatchedChecksumLayout--expected7] PASSED [ 66%] >tests/test_recursiveloader.py::test_get_deduplicated_file_entry_dict_incompatible[IncompatibleTypeLayout--diff0] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[BasicTestLayout-other-None-True-None-diff0] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[BasicTestLayout-sub-None-ManifestMismatch-sub/stray-diff1] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[DuplicateEntryLayout--None-True-None-diff2] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[DuplicateManifestEntryLayout--None-True-None-diff3] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[DuplicateManifestAsDataEntryLayout--None-True-None-diff4] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[DuplicateEbuildEntryLayout--None-True-None-diff5] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[DuplicateAuxEntryLayout--None-True-None-diff6] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[DisjointHashSetEntryLayout--None-ManifestMismatch-test-diff7] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[IgnoreEntryLayout--None-True-None-diff8] PASSED [ 66%] >tests/test_recursiveloader.py::test_assert_directory_verifies[MiscEntryLayout--None-ManifestMismatch-metadata.xml-diff9] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CrossDeviceIgnoreLayout--None-True-None-diff10] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[DotFileLayout--None-True-None-diff11] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[DirForFileLayout--None-ManifestMismatch-test-diff12] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CompressedSubManifestLayout--None-True-None-diff13] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[FilenameWhitespaceLayout--None-True-None-diff14] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[FilenameBackslashLayout--None-True-None-diff15] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[NonexistingDirectoryLayout--None-ManifestMismatch-sub/test-diff16] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[MismatchedFileLayout--None-ManifestMismatch-test-diff17] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[BasicTestLayout-sub-<lambda>-True-None-diff18] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[BasicTestLayout-sub-<lambda>-False-None-diff19] PASSED [ 67%] >tests/test_recursiveloader.py::test_assert_directory_verifies[IncompatibleTypeLayout--None-ManifestIncompatibleEntry-None-diff20] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[MismatchedSizeLayout--None-ManifestIncompatibleEntry-None-diff21] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[MismatchedChecksumLayout--None-ManifestIncompatibleEntry-None-diff22] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[MiscEntryLayout--<lambda>-True-None-diff23] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CrossDeviceLayout--None-ManifestCrossDevice-None-diff24] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CrossDeviceLayout--<lambda>-ManifestCrossDevice-None-diff25] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CrossDeviceLayout-sub-None-ManifestCrossDevice-None-diff26] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CrossDeviceEmptyLayout--None-ManifestCrossDevice-None-diff27] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CrossDeviceEmptyLayout--<lambda>-ManifestCrossDevice-None-diff28] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CrossDeviceEmptyLayout-sub-None-ManifestCrossDevice-None-diff29] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CrossDeviceIgnoreLayout-sub-None-ManifestCrossDevice-None-diff30] PASSED [ 68%] >tests/test_recursiveloader.py::test_assert_directory_verifies[UnreadableDirLayout--None-PermissionError-None-diff31] PASSED [ 69%] >tests/test_recursiveloader.py::test_assert_directory_verifies[UnreadableDirLayout--<lambda>-PermissionError-None-diff32] PASSED [ 69%] >tests/test_recursiveloader.py::test_assert_directory_verifies[CompressedTopManifestLayout--None-True-None-diff33] PASSED [ 69%] >tests/test_recursiveloader.py::test_assert_directory_verifies[NonexistingDirectoryLayout--<lambda>-False-None-diff34] PASSED [ 69%] >tests/test_recursiveloader.py::test_assert_directory_verifies[SymlinkLoopLayout--None-ManifestSymlinkLoop-None-diff35] PASSED [ 69%] >tests/test_recursiveloader.py::test_assert_directory_verifies[SymlinkLoopLayout--<lambda>-ManifestSymlinkLoop-None-diff36] PASSED [ 69%] >tests/test_recursiveloader.py::test_assert_directory_verifies[SymlinkLoopIgnoreLayout--None-True-None-diff37] PASSED [ 69%] >tests/test_recursiveloader.py::test_cli_verify[BasicTestLayout-other--None] PASSED [ 69%] >tests/test_recursiveloader.py::test_cli_verify[BasicTestLayout-sub--Manifest mismatch for sub/stray\n __exists__: expected: False, have: True] PASSED [ 69%] >tests/test_recursiveloader.py::test_cli_verify[DuplicateEntryLayout---None] PASSED [ 69%] >tests/test_recursiveloader.py::test_cli_verify[DuplicateManifestEntryLayout---None] PASSED [ 69%] >tests/test_recursiveloader.py::test_cli_verify[DuplicateManifestAsDataEntryLayout---None] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[DuplicateEbuildEntryLayout---None] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[DuplicateAuxEntryLayout---None] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[DisjointHashSetEntryLayout---Manifest mismatch for test\n MD5: expected: 9e107d9d372bb6826bd81d3542a419d6, have: d41d8cd98f00b204e9800998ecf8427e\n SHA1: expected: 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12, have: da39a3ee5e6b4b0d3255bfef95601890afd80709] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[IgnoreEntryLayout---None] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[MiscEntryLayout---Manifest mismatch for metadata.xml\n __exists__: expected: True, have: False] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[CrossDeviceIgnoreLayout---None] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[DotFileLayout---None] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[DirForFileLayout---Manifest mismatch for test\n __type__: expected: regular file, have: directory] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[CompressedSubManifestLayout---None] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[FilenameWhitespaceLayout---None] PASSED [ 70%] >tests/test_recursiveloader.py::test_cli_verify[FilenameBackslashLayout---None] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[NonexistingDirectoryLayout---Manifest mismatch for sub/test\n __exists__: expected: True, have: False] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[MismatchedFileLayout---Manifest mismatch for test\n MD5: expected: 5f8db599de986fab7a21625b7916589c, have: 6f8db599de986fab7a21625b7916589c] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[BasicTestLayout-sub---keep-going-Manifest mismatch for sub/stray] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[BasicTestLayout-other---require-signed-manifest-is not OpenPGP signed] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[IncompatibleTypeLayout---Incompatible Manifest entries for metadata.xml\n __type__: e1: DATA, e2: MISC] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[MismatchedSizeLayout---Incompatible Manifest entries for test\n __size__: e1: 0, e2: 32] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[MismatchedChecksumLayout---Incompatible Manifest entries for test\n MD5: e1: d41d8cd98f00b204e9800998ecf8427e, e2: 9e107d9d372bb6826bd81d3542a419d6] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[CrossDeviceLayout--- crosses filesystem boundaries, it must be IGNORE-d explicitly] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[CrossDeviceEmptyLayout--- crosses filesystem boundaries, it must be IGNORE-d explicitly] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[SymlinkLoopLayout--- is a symlink to one of its parent directories, it must be IGNORE-d explicitly] PASSED [ 71%] >tests/test_recursiveloader.py::test_cli_verify[SymlinkLoopIgnoreLayout---None] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifest[BasicTestLayout-Manifest] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifest[BasicTestLayout-sub/Manifest] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifest[BasicTestLayout-sub/deeper/Manifest] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifest[BasicTestLayout-other/Manifest] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifest[CompressedTopManifestLayout-Manifest.gz] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifests_unmodified[BasicTestLayout-False-False-MANIFESTS] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifests_unmodified[BasicTestLayout-True-False-MANIFESTS_REWRITTEN] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifests_unmodified[BasicTestLayout-True-True-MANIFESTS_SORTED] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifests_unmodified[FilenameWhitespaceLayout-True-False-MANIFESTS_REWRITTEN] PASSED [ 72%] >tests/test_recursiveloader.py::test_save_manifests_unmodified[FilenameBackslashLayout-True-False-MANIFESTS_REWRITTEN] PASSED [ 72%] >tests/test_recursiveloader.py::test_update_entry_for_path_types[DATA-27b043ae4e184ad25aec6e793f3a23f4] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_for_path_types[MANIFEST-3db86d6c89178496902a012ae562f4f4] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_for_path_types[MISC-74f04c5178fc1d27bb83871bff88caf1] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_for_path_types[EBUILD-993f2e85ab23b5fe902b089584ca829e] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_for_path_types[AUX-None] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_for_path_types[DIST-None] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_for_path_types[IGNORE-None] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_for_path_no_hash_specified PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[BasicTestLayout-ctor0-update_entry_for_path-sub/stray-None-None-manifest_update0] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[BasicTestLayout-ctor1-update_entry_for_path-sub/stray-call1-None-manifest_update1] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[BasicTestLayout-None-update_entry_for_path-sub/stray-call2-None-manifest_update2] PASSED [ 73%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[BasicTestLayout-ctor3-update_entries_for_directory--None-None-manifest_update3] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[BasicTestLayout-ctor4-update_entries_for_directory--None-save4-manifest_update4] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[BasicTestLayout-ctor5-update_entries_for_directory--call5-None-manifest_update5] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MultiManifestLayout-ctor6-update_entry_for_path-sub/foo-None-None-manifest_update6] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MultiManifestLayout-None-update_entry_for_path-sub/foo-call7-None-manifest_update7] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MultiManifestLayout-None-update_entry_for_path-sub/foo-call8-save8-manifest_update8] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MultiManifestLayout-ctor9-update_entry_for_path-sub/foo-None-None-manifest_update9] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MultiManifestLayout-ctor10-update_entry_for_path-sub/foo-call10-None-manifest_update10] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[DuplicateAuxEntryLayout-None-update_entry_for_path-files/test.patch-None-None-manifest_update11] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[DuplicateAuxEntryLayout-ctor12-update_entries_for_directory--None-None-manifest_update12] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[DisjointHashSetEntryLayout-None-update_entry_for_path-test-None-None-manifest_update13] PASSED [ 74%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[DisjointHashSetEntryLayout-ctor14-update_entries_for_directory--None-None-manifest_update14] PASSED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MiscEntryLayout-ctor15-update_entry_for_path-metadata.xml-None-None-manifest_update15] PASSED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MiscEntryLayout-ctor16-update_entries_for_directory--None-None-manifest_update16] PASSED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[CrossDeviceIgnoreLayout-ctor17-update_entries_for_directory--None-None-manifest_update17] PASSED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[DotFileLayout-ctor18-update_entries_for_directory--None-None-manifest_update18] PASSED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[CompressedSubManifestLayout-ctor19-update_entries_for_directory--None-None-manifest_update19] PASSED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[CompressedManifestSortLayout-ctor20-update_entries_for_directory--None-None-manifest_update20] PASSED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MultipleStrayFilesLayout-ctor21-update_entries_for_directory--None-None-manifest_update21] FAILED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayManifestLayout-ctor22-update_entries_for_directory--None-None-manifest_update22] PASSED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayCompressedManifestLayout-ctor23-update_entries_for_directory--None-None-manifest_update23] PASSED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidManifestLayout-ctor24-update_entries_for_directory--None-None-manifest_update24] FAILED [ 75%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidCompressedManifestLayout-ctor25-update_entries_for_directory--None-None-manifest_update25] FAILED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidCompressedManifestBz2Layout-ctor26-update_entries_for_directory--None-None-manifest_update26] FAILED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidCompressedManifestLzmaLayout-ctor27-update_entries_for_directory--None-None-manifest_update27] FAILED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidCompressedManifestXzLayout-ctor28-update_entries_for_directory--None-None-manifest_update28] FAILED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[FilenameWhitespaceLayout-ctor29-update_entries_for_directory--None-None-manifest_update29] PASSED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[FilenameBackslashLayout-ctor30-update_entries_for_directory--None-None-manifest_update30] PASSED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[NestedManifestLayout-ctor31-update_entries_for_directory--None-None-manifest_update31] PASSED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[AddToMultiManifestLayout-ctor32-update_entries_for_directory--None-None-manifest_update32] FAILED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[SubManifestMismatchLayout-ctor33-update_entries_for_directory--None-None-manifest_update33] PASSED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[NonexistingDirectoryLayout-ctor34-update_entry_for_path-sub/test-None-None-manifest_update34] PASSED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[NonexistingDirectoryLayout-ctor35-update_entries_for_directory--None-None-manifest_update35] PASSED [ 76%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[SymlinkLoopIgnoreLayout-ctor36-update_entries_for_directory--None-None-manifest_update36] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MismatchedFileLayout-ctor37-update_entry_for_path-test-None-None-manifest_update37] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entry_hash_specs[MismatchedFileLayout-ctor38-update_entries_for_directory--None-None-manifest_update38] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entry_raise[BasicTestLayout-nonexist-ManifestInvalidPath-reason0] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entry_raise[DuplicateAuxEntryLayout-test.patch-ManifestInvalidPath-reason1] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entry_raise[PotentialAuxEntryLayout-test.patch-ManifestInvalidPath-reason2] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entry_raise[CrossDeviceLayout-sub/version-ManifestCrossDevice-None] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entry_raise[DirForFileLayout-test-ManifestInvalidPath-reason4] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entries_for_directory_raise[BasicTestLayout-nonexist-FileNotFoundError] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entries_for_directory_raise[CrossDeviceLayout--ManifestCrossDevice] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entries_for_directory_raise[CrossDeviceEmptyLayout--ManifestCrossDevice] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entries_for_directory_raise[DirForFileLayout--ManifestInvalidPath] PASSED [ 77%] >tests/test_recursiveloader.py::test_update_entries_for_directory_raise[UnreadableDirLayout--PermissionError] PASSED [ 78%] >tests/test_recursiveloader.py::test_update_entries_for_directory_raise[SymlinkLoopLayout--ManifestSymlinkLoop] PASSED [ 78%] >tests/test_recursiveloader.py::test_update_entry_new_aux PASSED [ 78%] >tests/test_recursiveloader.py::test_update_entry_and_discard PASSED [ 78%] >tests/test_recursiveloader.py::test_cli_update[BasicTestLayout--update0-TIMESTAMP 2017-01-01T01:01:01Z] PASSED [ 78%] >tests/test_recursiveloader.py::test_cli_update[DuplicateEntryLayout--update1-TIMESTAMP] PASSED [ 78%] >tests/test_recursiveloader.py::test_cli_update[MiscEntryLayout--update2-TIMESTAMP] PASSED [ 78%] >tests/test_recursiveloader.py::test_cli_update[CrossDeviceIgnoreLayout--update3-None] PASSED [ 78%] >tests/test_recursiveloader.py::test_cli_update[DotFileLayout--update4-None] PASSED [ 78%] >tests/test_recursiveloader.py::test_cli_update[StrayManifestLayout--update5-TIMESTAMP] PASSED [ 78%] >tests/test_recursiveloader.py::test_cli_update[StrayCompressedManifestLayout--update6-TIMESTAMP] PASSED [ 78%] >tests/test_recursiveloader.py::test_cli_update[StrayInvalidManifestLayout--update7-TIMESTAMP] FAILED [ 79%] >tests/test_recursiveloader.py::test_cli_update[StrayInvalidCompressedManifestLayout--update8-TIMESTAMP] FAILED [ 79%] >tests/test_recursiveloader.py::test_cli_update[FilenameWhitespaceLayout--update9-TIMESTAMP] PASSED [ 79%] >tests/test_recursiveloader.py::test_cli_update[SymlinkLoopIgnoreLayout--update10-None] PASSED [ 79%] >tests/test_recursiveloader.py::test_cli_update[MismatchedFileFutureTimestampLayout--update11-TIMESTAMP] PASSED [ 79%] >tests/test_recursiveloader.py::test_cli_update[MismatchedFileFutureTimestampLayout---incremental-update12-TIMESTAMP] PASSED [ 79%] >tests/test_recursiveloader.py::test_cli_update_fail[CrossDeviceLayout- crosses filesystem boundaries, it must be IGNORE-d explicitly] PASSED [ 79%] >tests/test_recursiveloader.py::test_cli_update_fail[CrossDeviceEmptyLayout- crosses filesystem boundaries, it must be IGNORE-d explicitly] PASSED [ 79%] >tests/test_recursiveloader.py::test_cli_update_fail[DirForFileLayout- to Manifest: __type__ must not be directory] PASSED [ 79%] >tests/test_recursiveloader.py::test_cli_update_fail[SymlinkLoopLayout- is a symlink to one of its parent directories, it must be IGNORE-d explicitly] PASSED [ 79%] >tests/test_recursiveloader.py::test_compress_manifests[BasicTestLayout-0-gz-expected_compressed0] PASSED [ 79%] >tests/test_recursiveloader.py::test_compress_manifests[BasicTestLayout-64-gz-expected_compressed1] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[BasicTestLayout-0-bz2-expected_compressed2] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[BasicTestLayout-64-bz2-expected_compressed3] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[BasicTestLayout-0-lzma-expected_compressed4] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[BasicTestLayout-64-lzma-expected_compressed5] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[BasicTestLayout-0-xz-expected_compressed6] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[BasicTestLayout-64-xz-expected_compressed7] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[CompressedSubManifestLayout-0-gz-expected_compressed8] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[CompressedSubManifestLayout-4096-gz-expected_compressed9] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[CompressedTopManifestLayout-0-gz-expected_compressed10] PASSED [ 80%] >tests/test_recursiveloader.py::test_compress_manifests[CompressedTopManifestLayout-4096-gz-expected_compressed11] PASSED [ 80%] >tests/test_recursiveloader.py::test_cli_compress[BasicTestLayout-0-gz-expected_compressed0] PASSED [ 81%] >tests/test_recursiveloader.py::test_cli_compress[BasicTestLayout-64-gz-expected_compressed1] PASSED [ 81%] >tests/test_recursiveloader.py::test_cli_compress[BasicTestLayout-0-bz2-expected_compressed2] PASSED [ 81%] >tests/test_recursiveloader.py::test_cli_compress[BasicTestLayout-64-bz2-expected_compressed3] PASSED [ 81%] >tests/test_recursiveloader.py::test_cli_compress[BasicTestLayout-0-lzma-expected_compressed4] PASSED [ 81%] >tests/test_recursiveloader.py::test_cli_compress[BasicTestLayout-64-lzma-expected_compressed5] PASSED [ 81%] >tests/test_recursiveloader.py::test_cli_compress[BasicTestLayout-0-xz-expected_compressed6] PASSED [ 81%] >tests/test_recursiveloader.py::test_cli_compress[BasicTestLayout-64-xz-expected_compressed7] PASSED [ 81%] >tests/test_recursiveloader.py::test_cli_compress[CompressedSubManifestLayout-0-gz-expected_compressed8] PASSED [ 81%] >tests/test_recursiveloader.py::test_cli_compress[CompressedSubManifestLayout-4096-gz-expected_compressed9] PASSED [ 81%] >tests/test_recursiveloader.py::test_write_deduplicated_manifest[DuplicateEntryLayout-DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n] PASSED [ 81%] >tests/test_recursiveloader.py::test_write_deduplicated_manifest[DuplicateManifestEntryLayout-MANIFEST sub/Manifest 50 MD5 0f7cd9ed779a4844f98d28315dd9176a\n] PASSED [ 82%] >tests/test_recursiveloader.py::test_write_deduplicated_manifest[DuplicateManifestAsDataEntryLayout-MANIFEST sub/Manifest 50 MD5 0f7cd9ed779a4844f98d28315dd9176a\n] PASSED [ 82%] >tests/test_recursiveloader.py::test_write_deduplicated_manifest[DuplicateEbuildEntryLayout-DATA test.ebuild 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n] PASSED [ 82%] >tests/test_recursiveloader.py::test_write_deduplicated_manifest[DuplicateAuxEntryLayout-DATA files/test.patch 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n] PASSED [ 82%] >tests/test_recursiveloader.py::test_write_deduplicated_manifest[DisjointHashSetEntryLayout-DATA test 0 MD5 9e107d9d372bb6826bd81d3542a419d6 SHA1 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12\n] PASSED [ 82%] >tests/test_recursiveloader.py::test_write_deduplicated_manifest[MismatchedSizeLayout-DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n] PASSED [ 82%] >tests/test_recursiveloader.py::test_write_deduplicated_manifest[MismatchedChecksumLayout-DATA test 0 MD5 9e107d9d372bb6826bd81d3542a419d6\n] PASSED [ 82%] >tests/test_recursiveloader.py::test_write_deduplicated_manifest[CompressedTopManifestLayout-\nDATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n] PASSED [ 82%] >tests/test_recursiveloader.py::test_new_manifest_without_create[Manifest] PASSED [ 82%] >tests/test_recursiveloader.py::test_new_manifest_without_create[Manifest.gz] PASSED [ 82%] >tests/test_recursiveloader.py::test_new_manifest_create_no_save[Manifest] PASSED [ 82%] >tests/test_recursiveloader.py::test_new_manifest_create_no_save[Manifest.gz] PASSED [ 83%] >tests/test_recursiveloader.py::test_new_manifest_create_save[Manifest] PASSED [ 83%] >tests/test_recursiveloader.py::test_new_manifest_create_save[Manifest.gz] PASSED [ 83%] >tests/test_recursiveloader.py::test_new_manifest_create_update[Manifest-None-Manifest] PASSED [ 83%] >tests/test_recursiveloader.py::test_new_manifest_create_update[Manifest-0-Manifest] PASSED [ 83%] >tests/test_recursiveloader.py::test_new_manifest_create_update[Manifest.gz-None-Manifest.gz] PASSED [ 83%] >tests/test_recursiveloader.py::test_new_manifest_create_update[Manifest.gz-0-Manifest.gz] PASSED [ 83%] >tests/test_recursiveloader.py::test_new_manifest_create_update[Manifest.gz-4096-Manifest] PASSED [ 83%] >tests/test_recursiveloader.py::test_new_manifest_cli[] PASSED [ 83%] >tests/test_recursiveloader.py::test_new_manifest_cli[--compress-watermark=0] PASSED [ 83%] >tests/test_recursiveloader.py::test_load_unregistered_manifests[NestedManifestLayout-expected0-expected_with_entry0] PASSED [ 83%] >tests/test_recursiveloader.py::test_load_unregistered_manifests[AddToMultiManifestLayout-expected1-expected_with_entry1] PASSED [ 84%] >tests/test_recursiveloader.py::test_regenerate_update_manifest PASSED [ 84%] >tests/test_recursiveloader.py::test_create_manifest PASSED [ 84%] >tests/test_recursiveloader.py::test_verify_mtime_old PASSED [ 84%] >tests/test_recursiveloader.py::test_verify_mtime_new PASSED [ 84%] >tests/test_recursiveloader.py::test_update_mtime[0-manifest_update0] PASSED [ 84%] >tests/test_recursiveloader.py::test_update_mtime[FILE_STAT-manifest_update1] PASSED [ 84%] >tests/test_util.py::test_path_starts_with[--True] PASSED [ 84%] >tests/test_util.py::test_path_starts_with[foo--True] PASSED [ 84%] >tests/test_util.py::test_path_starts_with[foo/--True] PASSED [ 84%] >tests/test_util.py::test_path_starts_with[foo/bar--True] PASSED [ 84%] >tests/test_util.py::test_path_starts_with[bar--True] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[bar/--True] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[bar/bar--True] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[foo-foo-True] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[foo/-foo-True] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[foo/bar-foo-True] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[bar-foo-False] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[fooo-foo-False] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[foo.-foo-False] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[foo-foo/-True] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[foo/-foo/-True] PASSED [ 85%] >tests/test_util.py::test_path_starts_with[foo/bar-foo/bar/-True] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[--False] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[foo--True] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[foo/--True] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[foo/bar--True] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[bar--True] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[bar/--True] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[bar/bar--True] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[foo-foo-False] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[foo/-foo-False] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[foo/bar-foo-True] PASSED [ 86%] >tests/test_util.py::test_path_inside_dir[bar-foo-False] PASSED [ 87%] >tests/test_util.py::test_path_inside_dir[fooo-foo-False] PASSED [ 87%] >tests/test_util.py::test_path_inside_dir[foo.-foo-False] PASSED [ 87%] >tests/test_util.py::test_path_inside_dir[foo-foo/-False] PASSED [ 87%] >tests/test_util.py::test_path_inside_dir[foo/-foo/-False] PASSED [ 87%] >tests/test_util.py::test_path_inside_dir[foo/bar-foo/bar/-False] PASSED [ 87%] >tests/test_verify.py::test_get_file_metadata[non-existing-expected0] PASSED [ 87%] >tests/test_verify.py::test_get_file_metadata[symlink-broken-expected1] PASSED [ 87%] >tests/test_verify.py::test_get_file_metadata[directory-expected2] PASSED [ 87%] >tests/test_verify.py::test_get_file_metadata[symlink-to-directory-expected3] PASSED [ 87%] >tests/test_verify.py::test_get_file_metadata[/dev/null-expected4] PASSED [ 87%] >tests/test_verify.py::test_get_file_metadata[named-pipe-expected5] PASSED [ 88%] >tests/test_verify.py::test_get_file_metadata[unix-socket-expected6] PASSED [ 88%] >tests/test_verify.py::test_get_file_metadata[empty-file-expected7] PASSED [ 88%] >tests/test_verify.py::test_get_file_metadata[/proc/version-expected8] PASSED [ 88%] >tests/test_verify.py::test_get_file_metadata[regular-file-expected9] PASSED [ 88%] >tests/test_verify.py::test_get_file_metadata[symlink-to-file-expected10] PASSED [ 88%] >tests/test_verify.py::test_verify_path[directory-IGNORE-args0-None-True-diff0] PASSED [ 88%] >tests/test_verify.py::test_verify_path[symlink-to-directory-IGNORE-args1-None-True-diff1] PASSED [ 88%] >tests/test_verify.py::test_verify_path[/dev/null-IGNORE-args2-None-True-diff2] PASSED [ 88%] >tests/test_verify.py::test_verify_path[named-pipe-IGNORE-args3-None-True-diff3] PASSED [ 88%] >tests/test_verify.py::test_verify_path[unix-socket-IGNORE-args4-None-True-diff4] PASSED [ 88%] >tests/test_verify.py::test_verify_path[empty-file-IGNORE-args5-None-True-diff5] PASSED [ 88%] >tests/test_verify.py::test_verify_path[/proc/version-IGNORE-args6-None-True-diff6] PASSED [ 89%] >tests/test_verify.py::test_verify_path[regular-file-IGNORE-args7-None-True-diff7] PASSED [ 89%] >tests/test_verify.py::test_verify_path[symlink-to-file-IGNORE-args8-None-True-diff8] PASSED [ 89%] >tests/test_verify.py::test_verify_path[non-existing-IGNORE-args9-None-True-diff9] PASSED [ 89%] >tests/test_verify.py::test_verify_path[symlink-broken-IGNORE-args10-None-True-diff10] PASSED [ 89%] >tests/test_verify.py::test_verify_path[unreadable-file-IGNORE-args11-None-True-diff11] PASSED [ 89%] >tests/test_verify.py::test_verify_path[non-existing-None-args12-None-True-diff12] PASSED [ 89%] >tests/test_verify.py::test_verify_path[symlink-broken-None-args13-None-True-diff13] PASSED [ 89%] >tests/test_verify.py::test_verify_path[directory-None-args14-None-False-diff14] PASSED [ 89%] >tests/test_verify.py::test_verify_path[symlink-to-directory-None-args15-None-False-diff15] PASSED [ 89%] >tests/test_verify.py::test_verify_path[/dev/null-None-args16-None-False-diff16] PASSED [ 89%] >tests/test_verify.py::test_verify_path[named-pipe-None-args17-None-False-diff17] PASSED [ 90%] >tests/test_verify.py::test_verify_path[unix-socket-None-args18-None-False-diff18] PASSED [ 90%] >tests/test_verify.py::test_verify_path[empty-file-None-args19-None-False-diff19] PASSED [ 90%] >tests/test_verify.py::test_verify_path[/proc/version-None-args20-None-False-diff20] PASSED [ 90%] >tests/test_verify.py::test_verify_path[regular-file-None-args21-None-False-diff21] PASSED [ 90%] >tests/test_verify.py::test_verify_path[symlink-to-file-None-args22-None-False-diff22] PASSED [ 90%] >tests/test_verify.py::test_verify_path[non-existing-DATA-args23-None-False-diff23] PASSED [ 90%] >tests/test_verify.py::test_verify_path[directory-DATA-args24-None-False-diff24] PASSED [ 90%] >tests/test_verify.py::test_verify_path[symlink-to-directory-DATA-args25-None-False-diff25] PASSED [ 90%] >tests/test_verify.py::test_verify_path[/dev/null-DATA-args26-None-False-diff26] PASSED [ 90%] >tests/test_verify.py::test_verify_path[named-pipe-DATA-args27-None-False-diff27] PASSED [ 90%] >tests/test_verify.py::test_verify_path[unix-socket-DATA-args28-None-False-diff28] PASSED [ 91%] >tests/test_verify.py::test_verify_path[empty-file-DATA-args29-None-True-diff29] PASSED [ 91%] >tests/test_verify.py::test_verify_path[empty-file-DATA-args30-None-True-diff30] PASSED [ 91%] >tests/test_verify.py::test_verify_path[empty-file-DATA-args31-None-False-diff31] PASSED [ 91%] >tests/test_verify.py::test_verify_path[empty-file-DATA-args32-None-False-diff32] PASSED [ 91%] >tests/test_verify.py::test_verify_path[empty-file-DATA-args33-None-False-diff33] PASSED [ 91%] >tests/test_verify.py::test_verify_path[/proc/version-DATA-args34-None-True-diff34] PASSED [ 91%] >tests/test_verify.py::test_verify_path[/proc/version-DATA-args35-None-True-diff35] PASSED [ 91%] >tests/test_verify.py::test_verify_path[/proc/version-DATA-args36-None-False-diff36] PASSED [ 91%] >tests/test_verify.py::test_verify_path[/proc/version-DATA-args37-None-False-diff37] PASSED [ 91%] >tests/test_verify.py::test_verify_path[/proc/version-DATA-args38-None-False-diff38] PASSED [ 91%] >tests/test_verify.py::test_verify_path[regular-file-DATA-args39-None-True-diff39] PASSED [ 92%] >tests/test_verify.py::test_verify_path[regular-file-DATA-args40-None-True-diff40] PASSED [ 92%] >tests/test_verify.py::test_verify_path[regular-file-DATA-args41-None-False-diff41] PASSED [ 92%] >tests/test_verify.py::test_verify_path[regular-file-DATA-args42-None-False-diff42] PASSED [ 92%] >tests/test_verify.py::test_verify_path[regular-file-DATA-args43-None-False-diff43] PASSED [ 92%] >tests/test_verify.py::test_verify_path[symlink-to-file-DATA-args44-None-True-diff44] PASSED [ 92%] >tests/test_verify.py::test_verify_path[symlink-to-file-DATA-args45-None-True-diff45] PASSED [ 92%] >tests/test_verify.py::test_verify_path[symlink-to-file-DATA-args46-None-False-diff46] PASSED [ 92%] >tests/test_verify.py::test_verify_path[symlink-to-file-DATA-args47-None-False-diff47] PASSED [ 92%] >tests/test_verify.py::test_verify_path[symlink-to-file-DATA-args48-None-False-diff48] PASSED [ 92%] >tests/test_verify.py::test_verify_path[regular-file-DATA-args49-None-False-diff49] PASSED [ 92%] >tests/test_verify.py::test_verify_path[symlink-to-file-DATA-args50-None-False-diff50] PASSED [ 93%] >tests/test_verify.py::test_verify_path[empty-file-DATA-args51-0-False-diff51] PASSED [ 93%] >tests/test_verify.py::test_verify_path[empty-file-DATA-args52-FILE_MTIME-False-diff52] PASSED [ 93%] >tests/test_verify.py::test_verify_path[/proc/version-DATA-args53-0-False-diff53] PASSED [ 93%] >tests/test_verify.py::test_verify_path[/proc/version-DATA-args54-FILE_MTIME-False-diff54] PASSED [ 93%] >tests/test_verify.py::test_verify_path[regular-file-DATA-args55-0-False-diff55] PASSED [ 93%] >tests/test_verify.py::test_verify_path[regular-file-DATA-args56-FILE_MTIME-True-diff56] PASSED [ 93%] >tests/test_verify.py::test_verify_path[regular-file-DATA-args57-FILE_MTIME-False-diff57] PASSED [ 93%] >tests/test_verify.py::test_verify_path[symlink-to-file-DATA-args58-0-False-diff58] PASSED [ 93%] >tests/test_verify.py::test_verify_path[symlink-to-file-DATA-args59-FILE_MTIME-True-diff59] PASSED [ 93%] >tests/test_verify.py::test_verify_path[symlink-to-file-DATA-args60-FILE_MTIME-False-diff60] PASSED [ 93%] >tests/test_verify.py::test_verify_path[empty-file-None-args61-FILE_MTIME-False-diff61] PASSED [ 94%] >tests/test_verify.py::test_verify_path[/proc/version-None-args62-FILE_MTIME-False-diff62] PASSED [ 94%] >tests/test_verify.py::test_verify_path[regular-file-None-args63-FILE_MTIME-False-diff63] PASSED [ 94%] >tests/test_verify.py::test_verify_path[symlink-to-file-None-args64-FILE_MTIME-False-diff64] PASSED [ 94%] >tests/test_verify.py::test_update_fail[non-existing-__exists__-False] PASSED [ 94%] >tests/test_verify.py::test_update_fail[symlink-broken-__exists__-False] PASSED [ 94%] >tests/test_verify.py::test_update_fail[directory-__type__-directory] PASSED [ 94%] >tests/test_verify.py::test_update_fail[symlink-to-directory-__type__-directory] PASSED [ 94%] >tests/test_verify.py::test_update_fail[/dev/null-__type__-character device] PASSED [ 94%] >tests/test_verify.py::test_update_fail[named-pipe-__type__-named pipe] PASSED [ 94%] >tests/test_verify.py::test_update_fail[unix-socket-__type__-UNIX socket] PASSED [ 94%] >tests/test_verify.py::test_cross_filesystem[verify_path] PASSED [ 95%] >tests/test_verify.py::test_cross_filesystem[update_entry_for_path] PASSED [ 95%] >tests/test_verify.py::test_update[empty-file-DATA-args0-None-None-False-new_data0] PASSED [ 95%] >tests/test_verify.py::test_update[empty-file-MISC-args1-None-None-False-new_data1] PASSED [ 95%] >tests/test_verify.py::test_update[empty-file-DATA-args2-None-None-False-new_data2] PASSED [ 95%] >tests/test_verify.py::test_update[empty-file-DATA-args3-new_hashes3-None-True-new_data3] PASSED [ 95%] >tests/test_verify.py::test_update[empty-file-DATA-args4-None-None-True-new_data4] PASSED [ 95%] >tests/test_verify.py::test_update[empty-file-DATA-args5-new_hashes5-None-True-new_data5] PASSED [ 95%] >tests/test_verify.py::test_update[empty-file-DATA-args6-new_hashes6-None-True-new_data6] PASSED [ 95%] >tests/test_verify.py::test_update[/proc/version-DATA-args7-None-None-False-new_data7] PASSED [ 95%] >tests/test_verify.py::test_update[/proc/version-MISC-args8-None-None-False-new_data8] PASSED [ 95%] >tests/test_verify.py::test_update[/proc/version-DATA-args9-None-None-False-new_data9] PASSED [ 96%] >tests/test_verify.py::test_update[/proc/version-DATA-args10-new_hashes10-None-True-new_data10] PASSED [ 96%] >tests/test_verify.py::test_update[/proc/version-DATA-args11-None-None-True-new_data11] PASSED [ 96%] >tests/test_verify.py::test_update[/proc/version-DATA-args12-new_hashes12-None-True-new_data12] PASSED [ 96%] >tests/test_verify.py::test_update[/proc/version-DATA-args13-new_hashes13-None-True-new_data13] PASSED [ 96%] >tests/test_verify.py::test_update[regular-file-DATA-args14-None-None-False-new_data14] PASSED [ 96%] >tests/test_verify.py::test_update[regular-file-MISC-args15-None-None-False-new_data15] PASSED [ 96%] >tests/test_verify.py::test_update[regular-file-DATA-args16-None-None-False-new_data16] PASSED [ 96%] >tests/test_verify.py::test_update[regular-file-DATA-args17-new_hashes17-None-True-new_data17] PASSED [ 96%] >tests/test_verify.py::test_update[regular-file-DATA-args18-None-None-True-new_data18] PASSED [ 96%] >tests/test_verify.py::test_update[regular-file-DATA-args19-new_hashes19-None-True-new_data19] PASSED [ 96%] >tests/test_verify.py::test_update[regular-file-DATA-args20-new_hashes20-None-True-new_data20] PASSED [ 97%] >tests/test_verify.py::test_update[symlink-to-file-DATA-args21-None-None-False-new_data21] PASSED [ 97%] >tests/test_verify.py::test_update[symlink-to-file-MISC-args22-None-None-False-new_data22] PASSED [ 97%] >tests/test_verify.py::test_update[symlink-to-file-DATA-args23-None-None-False-new_data23] PASSED [ 97%] >tests/test_verify.py::test_update[symlink-to-file-DATA-args24-new_hashes24-None-True-new_data24] PASSED [ 97%] >tests/test_verify.py::test_update[symlink-to-file-DATA-args25-None-None-True-new_data25] PASSED [ 97%] >tests/test_verify.py::test_update[symlink-to-file-DATA-args26-new_hashes26-None-True-new_data26] PASSED [ 97%] >tests/test_verify.py::test_update[symlink-to-file-DATA-args27-new_hashes27-None-True-new_data27] PASSED [ 97%] >tests/test_verify.py::test_update[empty-file-DATA-args28-new_hashes28-0-True-new_data28] PASSED [ 97%] >tests/test_verify.py::test_update[empty-file-DATA-args29-new_hashes29-FILE_MTIME-True-new_data29] PASSED [ 97%] >tests/test_verify.py::test_update[/proc/version-DATA-args30-new_hashes30-0-True-new_data30] PASSED [ 97%] >tests/test_verify.py::test_update[/proc/version-DATA-args31-new_hashes31-FILE_MTIME-True-new_data31] PASSED [ 98%] >tests/test_verify.py::test_update[regular-file-DATA-args32-new_hashes32-0-True-new_data32] PASSED [ 98%] >tests/test_verify.py::test_update[regular-file-DATA-args33-new_hashes33-FILE_MTIME-False-new_data33] PASSED [ 98%] >tests/test_verify.py::test_update[regular-file-DATA-args34-new_hashes34-FILE_MTIME-True-new_data34] PASSED [ 98%] >tests/test_verify.py::test_update[symlink-to-file-DATA-args35-new_hashes35-0-True-new_data35] PASSED [ 98%] >tests/test_verify.py::test_update[symlink-to-file-DATA-args36-new_hashes36-FILE_MTIME-False-new_data36] PASSED [ 98%] >tests/test_verify.py::test_update[symlink-to-file-DATA-args37-new_hashes37-FILE_MTIME-True-new_data37] PASSED [ 98%] >tests/test_verify.py::test_update_IGNORE PASSED [ 98%] >tests/test_verify.py::test_update_AUX PASSED [ 98%] >tests/test_verify.py::test_unreadable_file[get_file_metadata-args0] PASSED [ 98%] >tests/test_verify.py::test_unreadable_file[verify_path-args1] PASSED [ 98%] >tests/test_verify.py::test_unreadable_file[update_entry_for_path-args2] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-test-a_args0-DATA-test-b_args0-True-diff0] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-test-1.ebuild-a_args1-EBUILD-test-1.ebuild-b_args1-True-diff1] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-files/test.patch-a_args2-AUX-test.patch-b_args2-True-diff2] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-Manifest-a_args3-MANIFEST-Manifest-b_args3-True-diff3] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-metadata.xml-a_args4-MISC-metadata.xml-b_args4-False-diff4] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-test-a_args5-IGNORE-test-b_args5-False-diff5] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-test-1.tar.gz-a_args6-DIST-test-1.tar.gz-b_args6-False-diff6] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-mismatched-size-a_args7-DATA-mismatched-size-b_args7-False-diff7] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-mismatched-md5-a_args8-DATA-mismatched-md5-b_args8-False-diff8] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-hash-subset-a_args9-DATA-mismatched-md5-b_args9-True-diff9] PASSED [ 99%] >tests/test_verify.py::test_entry_compatibility[DATA-mismatched-hash-sets-a_args10-DATA-mismatched-md5-b_args10-True-diff10] PASSED [100%] > >=================================== FAILURES =================================== >_ test_update_entry_hash_specs[MultipleStrayFilesLayout-ctor21-update_entries_for_directory--None-None-manifest_update21] _ > >layout_factory = <tests.test_recursiveloader.LayoutFactory object at 0x00007fcde0780090> >layout = <class 'tests.test_recursiveloader.MultipleStrayFilesLayout'> >ctor = ['MD5'] >func = <function ManifestRecursiveLoader.update_entries_for_directory at 0x00007fcde05fd560> >path = '', call = None, save = None >manifest_update = {'Manifest': 'DATA sub/file.c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/file.b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/file.a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} > > @pytest.mark.parametrize( > 'layout,ctor,func,path,call,save,manifest_update', > [(BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > None, > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 SHA1 2b89b8bc8db9cec987beeb7f08f574f1766e6b06'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['MD5'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['SHA1'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 MD5 52e5664c2b12561cf296549395c0462a'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > # this rehashes all files > BasicTestLayout.MANIFESTS_SHA1), > (BasicTestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > ['SHA1'], > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > ['SHA1'], > None, > # ctor is used for Manifests that are edited, call is used > # for everything else > # TODO: does this behavior really make sense? > {'Manifest': 'TIMESTAMP 2017-01-01T01:01:01Z\n' > 'MANIFEST sub/Manifest 221 SHA256 ' > '0c4f14d1e07eb2762ca9afec0d64d8a9' > 'd65e3d99b5700fd2779f3b2641d2807a\n' > 'MANIFEST other/Manifest 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'DIST topdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > 'sub/Manifest': 'MANIFEST deeper/Manifest 58 SHA256 ' > '87d10bbc90d9d7838141dd2d50a58760' > '20a182dd950ef551b7f689bc178d6e6c\n' > 'DIST subdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n' > 'DATA stray 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > 'sub/deeper/Manifest': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255' > 'bfef95601890afd80709\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['SHA1'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 MD5 094185d851bf9a700889e37a46700420'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > ['SHA1'], > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (DuplicateAuxEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'files/test.patch', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DuplicateAuxEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DisjointHashSetEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (DisjointHashSetEntryLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 0 SHA256 ' > 'e3b0c44298fc1c149afbf4c8996fb924' > '27ae41e4649b934ca495991b7852b855\n', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'metadata.xml', > None, > None, > {'Manifest': '', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (CrossDeviceIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (DotFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (CompressedSubManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'sub/Manifest.gz': 'DATA test 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > }), > (CompressedManifestSortLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest.gz': > 'MANIFEST a/Manifest 50 MD5 8ee2fce40e6e6cc2b5de5c91d416e9f3\n', > 'a/Manifest': > 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (MultipleStrayFilesLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': ''.join(f'DATA sub/file.{x} 0 MD5 ' > f'd41d8cd98f00b204e9800998ecf8427e\n' > for x in 'cba'), > }), > (StrayManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST sub/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n', > 'sub/Manifest': > StrayManifestLayout.MANIFESTS['sub/Manifest'].lstrip() > }), > (StrayCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'MANIFEST sub/Manifest.gz 75 MD5 ' > 'e6378b64d3577c73c979fdb423937d94\n', > 'sub/Manifest.gz': > StrayCompressedManifestLayout.MANIFESTS['sub/Manifest.gz'].lstrip() > }), > (StrayInvalidManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestBz2Layout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLzmaLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestXzLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (FilenameWhitespaceLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (FilenameBackslashLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (NestedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 220 MD5 e85fbbce600362ab3378ebd7a2bc06db\n' > 'MANIFEST b/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/Manifest': > 'MANIFEST x/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'MANIFEST z/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'DATA y/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/x/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/z/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'b/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (AddToMultiManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n' > 'MANIFEST a/Manifest.b 47 MD5 1b1504046a2023ed75a2a89aed7c52f4\n' > 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'MANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n', > 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (SubManifestMismatchLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 50 MD5 0f7cd9ed779a4844f98d28315dd9176a\n', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/test', > None, > None, > {'Manifest': '', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (SymlinkLoopIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > ]) > def test_update_entry_hash_specs(layout_factory, layout, ctor, func, path, > call, save, manifest_update): > tmp_path = layout_factory.create(layout) > m = ManifestRecursiveLoader(tmp_path / layout.TOP_MANIFEST, > hashes=ctor, > allow_xdev=False) > func(m, path, hashes=call) > m.save_manifests(hashes=save) > > output = {} > for relpath in layout.MANIFESTS: > with open_potentially_compressed_path(tmp_path / relpath, > 'r') as f: > output[relpath] = f.read() > expected = dict(layout.MANIFESTS) > expected.update(manifest_update) >> assert output == expected >E AssertionError: assert {'Manifest': 'DATA sub/file.a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'DATA sub/file.b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'DATA sub/file.c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} == {'Manifest': 'DATA sub/file.c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'DATA sub/file.b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'DATA sub/file.a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Differing items: >E {'Manifest': 'DATA sub/file.a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/file.b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/file.c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} != {'Manifest': 'DATA sub/file.c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/file.b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/file.a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Full diff: >E { >E - 'Manifest': 'DATA sub/file.c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' >E ? ^ >E + 'Manifest': 'DATA sub/file.a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' >E ? ^ >E 'DATA sub/file.b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' >E - 'DATA sub/file.a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E ? ^ >E + 'DATA sub/file.c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E ? ^ >E } > >tests/test_recursiveloader.py:1927: AssertionError >_ test_update_entry_hash_specs[StrayInvalidManifestLayout-ctor24-update_entries_for_directory--None-None-manifest_update24] _ > >layout_factory = <tests.test_recursiveloader.LayoutFactory object at 0x00007fcde00f0aa0> >layout = <class 'tests.test_recursiveloader.StrayInvalidManifestLayout'> >ctor = ['MD5'] >func = <function ManifestRecursiveLoader.update_entries_for_directory at 0x00007fcde05fd560> >path = '', call = None, save = None >manifest_update = {'Manifest': 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} > > @pytest.mark.parametrize( > 'layout,ctor,func,path,call,save,manifest_update', > [(BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > None, > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 SHA1 2b89b8bc8db9cec987beeb7f08f574f1766e6b06'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['MD5'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['SHA1'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 MD5 52e5664c2b12561cf296549395c0462a'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > # this rehashes all files > BasicTestLayout.MANIFESTS_SHA1), > (BasicTestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > ['SHA1'], > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > ['SHA1'], > None, > # ctor is used for Manifests that are edited, call is used > # for everything else > # TODO: does this behavior really make sense? > {'Manifest': 'TIMESTAMP 2017-01-01T01:01:01Z\n' > 'MANIFEST sub/Manifest 221 SHA256 ' > '0c4f14d1e07eb2762ca9afec0d64d8a9' > 'd65e3d99b5700fd2779f3b2641d2807a\n' > 'MANIFEST other/Manifest 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'DIST topdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > 'sub/Manifest': 'MANIFEST deeper/Manifest 58 SHA256 ' > '87d10bbc90d9d7838141dd2d50a58760' > '20a182dd950ef551b7f689bc178d6e6c\n' > 'DIST subdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n' > 'DATA stray 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > 'sub/deeper/Manifest': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255' > 'bfef95601890afd80709\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['SHA1'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 MD5 094185d851bf9a700889e37a46700420'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > ['SHA1'], > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (DuplicateAuxEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'files/test.patch', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DuplicateAuxEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DisjointHashSetEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (DisjointHashSetEntryLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 0 SHA256 ' > 'e3b0c44298fc1c149afbf4c8996fb924' > '27ae41e4649b934ca495991b7852b855\n', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'metadata.xml', > None, > None, > {'Manifest': '', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (CrossDeviceIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (DotFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (CompressedSubManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'sub/Manifest.gz': 'DATA test 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > }), > (CompressedManifestSortLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest.gz': > 'MANIFEST a/Manifest 50 MD5 8ee2fce40e6e6cc2b5de5c91d416e9f3\n', > 'a/Manifest': > 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (MultipleStrayFilesLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': ''.join(f'DATA sub/file.{x} 0 MD5 ' > f'd41d8cd98f00b204e9800998ecf8427e\n' > for x in 'cba'), > }), > (StrayManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST sub/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n', > 'sub/Manifest': > StrayManifestLayout.MANIFESTS['sub/Manifest'].lstrip() > }), > (StrayCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'MANIFEST sub/Manifest.gz 75 MD5 ' > 'e6378b64d3577c73c979fdb423937d94\n', > 'sub/Manifest.gz': > StrayCompressedManifestLayout.MANIFESTS['sub/Manifest.gz'].lstrip() > }), > (StrayInvalidManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestBz2Layout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLzmaLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestXzLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (FilenameWhitespaceLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (FilenameBackslashLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (NestedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 220 MD5 e85fbbce600362ab3378ebd7a2bc06db\n' > 'MANIFEST b/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/Manifest': > 'MANIFEST x/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'MANIFEST z/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'DATA y/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/x/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/z/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'b/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (AddToMultiManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n' > 'MANIFEST a/Manifest.b 47 MD5 1b1504046a2023ed75a2a89aed7c52f4\n' > 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'MANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n', > 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (SubManifestMismatchLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 50 MD5 0f7cd9ed779a4844f98d28315dd9176a\n', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/test', > None, > None, > {'Manifest': '', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (SymlinkLoopIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > ]) > def test_update_entry_hash_specs(layout_factory, layout, ctor, func, path, > call, save, manifest_update): > tmp_path = layout_factory.create(layout) > m = ManifestRecursiveLoader(tmp_path / layout.TOP_MANIFEST, > hashes=ctor, > allow_xdev=False) > func(m, path, hashes=call) > m.save_manifests(hashes=save) > > output = {} > for relpath in layout.MANIFESTS: > with open_potentially_compressed_path(tmp_path / relpath, > 'r') as f: > output[relpath] = f.read() > expected = dict(layout.MANIFESTS) > expected.update(manifest_update) >> assert output == expected >E AssertionError: assert {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n',\n 'sub/Manifest': '\nI AM SOOO INVALID\n'} == {'Manifest': 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n'\n 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n',\n 'sub/Manifest': '\nI AM SOOO INVALID\n'} >E Common items: >E {'sub/Manifest': '\nI AM SOOO INVALID\n'} >E Differing items: >E {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n'} != {'Manifest': 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Full diff: >E { >E + 'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' >E - 'Manifest': 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n' >E ? ^^^^^^^^^^^ >E + 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n', >E ? ^^^^^^^^^^^ + >E - 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E 'sub/Manifest': '\nI AM SOOO INVALID\n', >E } > >tests/test_recursiveloader.py:1927: AssertionError >_ test_update_entry_hash_specs[StrayInvalidCompressedManifestLayout-ctor25-update_entries_for_directory--None-None-manifest_update25] _ > >layout_factory = <tests.test_recursiveloader.LayoutFactory object at 0x00007fcde3eaa838> >layout = <class 'tests.test_recursiveloader.StrayInvalidCompressedManifestLayout'> >ctor = ['MD5'] >func = <function ManifestRecursiveLoader.update_entries_for_directory at 0x00007fcde05fd560> >path = '', call = None, save = None >manifest_update = {'Manifest': 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} > > @pytest.mark.parametrize( > 'layout,ctor,func,path,call,save,manifest_update', > [(BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > None, > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 SHA1 2b89b8bc8db9cec987beeb7f08f574f1766e6b06'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['MD5'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['SHA1'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 MD5 52e5664c2b12561cf296549395c0462a'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > # this rehashes all files > BasicTestLayout.MANIFESTS_SHA1), > (BasicTestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > ['SHA1'], > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > ['SHA1'], > None, > # ctor is used for Manifests that are edited, call is used > # for everything else > # TODO: does this behavior really make sense? > {'Manifest': 'TIMESTAMP 2017-01-01T01:01:01Z\n' > 'MANIFEST sub/Manifest 221 SHA256 ' > '0c4f14d1e07eb2762ca9afec0d64d8a9' > 'd65e3d99b5700fd2779f3b2641d2807a\n' > 'MANIFEST other/Manifest 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'DIST topdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > 'sub/Manifest': 'MANIFEST deeper/Manifest 58 SHA256 ' > '87d10bbc90d9d7838141dd2d50a58760' > '20a182dd950ef551b7f689bc178d6e6c\n' > 'DIST subdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n' > 'DATA stray 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > 'sub/deeper/Manifest': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255' > 'bfef95601890afd80709\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['SHA1'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 MD5 094185d851bf9a700889e37a46700420'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > ['SHA1'], > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (DuplicateAuxEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'files/test.patch', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DuplicateAuxEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DisjointHashSetEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (DisjointHashSetEntryLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 0 SHA256 ' > 'e3b0c44298fc1c149afbf4c8996fb924' > '27ae41e4649b934ca495991b7852b855\n', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'metadata.xml', > None, > None, > {'Manifest': '', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (CrossDeviceIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (DotFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (CompressedSubManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'sub/Manifest.gz': 'DATA test 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > }), > (CompressedManifestSortLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest.gz': > 'MANIFEST a/Manifest 50 MD5 8ee2fce40e6e6cc2b5de5c91d416e9f3\n', > 'a/Manifest': > 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (MultipleStrayFilesLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': ''.join(f'DATA sub/file.{x} 0 MD5 ' > f'd41d8cd98f00b204e9800998ecf8427e\n' > for x in 'cba'), > }), > (StrayManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST sub/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n', > 'sub/Manifest': > StrayManifestLayout.MANIFESTS['sub/Manifest'].lstrip() > }), > (StrayCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'MANIFEST sub/Manifest.gz 75 MD5 ' > 'e6378b64d3577c73c979fdb423937d94\n', > 'sub/Manifest.gz': > StrayCompressedManifestLayout.MANIFESTS['sub/Manifest.gz'].lstrip() > }), > (StrayInvalidManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestBz2Layout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLzmaLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestXzLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (FilenameWhitespaceLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (FilenameBackslashLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (NestedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 220 MD5 e85fbbce600362ab3378ebd7a2bc06db\n' > 'MANIFEST b/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/Manifest': > 'MANIFEST x/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'MANIFEST z/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'DATA y/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/x/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/z/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'b/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (AddToMultiManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n' > 'MANIFEST a/Manifest.b 47 MD5 1b1504046a2023ed75a2a89aed7c52f4\n' > 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'MANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n', > 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (SubManifestMismatchLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 50 MD5 0f7cd9ed779a4844f98d28315dd9176a\n', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/test', > None, > None, > {'Manifest': '', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (SymlinkLoopIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > ]) > def test_update_entry_hash_specs(layout_factory, layout, ctor, func, path, > call, save, manifest_update): > tmp_path = layout_factory.create(layout) > m = ManifestRecursiveLoader(tmp_path / layout.TOP_MANIFEST, > hashes=ctor, > allow_xdev=False) > func(m, path, hashes=call) > m.save_manifests(hashes=save) > > output = {} > for relpath in layout.MANIFESTS: > with open_potentially_compressed_path(tmp_path / relpath, > 'r') as f: > output[relpath] = f.read() > expected = dict(layout.MANIFESTS) > expected.update(manifest_update) >> assert output == expected >E AssertionError: assert {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'} == {'Manifest': 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'\n 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Differing items: >E {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'} != {'Manifest': 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Full diff: >E { >E + 'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' >E - 'Manifest': 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' >E ? ^^^^^^^^^^^ >E + 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n', >E ? ^^^^^^^^^^^ + >E - 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E } > >tests/test_recursiveloader.py:1927: AssertionError >_ test_update_entry_hash_specs[StrayInvalidCompressedManifestBz2Layout-ctor26-update_entries_for_directory--None-None-manifest_update26] _ > >layout_factory = <tests.test_recursiveloader.LayoutFactory object at 0x00007fcde35f47c8> >layout = <class 'tests.test_recursiveloader.StrayInvalidCompressedManifestBz2Layout'> >ctor = ['MD5'] >func = <function ManifestRecursiveLoader.update_entries_for_directory at 0x00007fcde05fd560> >path = '', call = None, save = None >manifest_update = {'Manifest': 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} > > @pytest.mark.parametrize( > 'layout,ctor,func,path,call,save,manifest_update', > [(BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > None, > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 SHA1 2b89b8bc8db9cec987beeb7f08f574f1766e6b06'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['MD5'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['SHA1'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 MD5 52e5664c2b12561cf296549395c0462a'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > # this rehashes all files > BasicTestLayout.MANIFESTS_SHA1), > (BasicTestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > ['SHA1'], > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > ['SHA1'], > None, > # ctor is used for Manifests that are edited, call is used > # for everything else > # TODO: does this behavior really make sense? > {'Manifest': 'TIMESTAMP 2017-01-01T01:01:01Z\n' > 'MANIFEST sub/Manifest 221 SHA256 ' > '0c4f14d1e07eb2762ca9afec0d64d8a9' > 'd65e3d99b5700fd2779f3b2641d2807a\n' > 'MANIFEST other/Manifest 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'DIST topdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > 'sub/Manifest': 'MANIFEST deeper/Manifest 58 SHA256 ' > '87d10bbc90d9d7838141dd2d50a58760' > '20a182dd950ef551b7f689bc178d6e6c\n' > 'DIST subdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n' > 'DATA stray 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > 'sub/deeper/Manifest': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255' > 'bfef95601890afd80709\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['SHA1'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 MD5 094185d851bf9a700889e37a46700420'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > ['SHA1'], > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (DuplicateAuxEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'files/test.patch', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DuplicateAuxEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DisjointHashSetEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (DisjointHashSetEntryLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 0 SHA256 ' > 'e3b0c44298fc1c149afbf4c8996fb924' > '27ae41e4649b934ca495991b7852b855\n', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'metadata.xml', > None, > None, > {'Manifest': '', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (CrossDeviceIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (DotFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (CompressedSubManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'sub/Manifest.gz': 'DATA test 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > }), > (CompressedManifestSortLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest.gz': > 'MANIFEST a/Manifest 50 MD5 8ee2fce40e6e6cc2b5de5c91d416e9f3\n', > 'a/Manifest': > 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (MultipleStrayFilesLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': ''.join(f'DATA sub/file.{x} 0 MD5 ' > f'd41d8cd98f00b204e9800998ecf8427e\n' > for x in 'cba'), > }), > (StrayManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST sub/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n', > 'sub/Manifest': > StrayManifestLayout.MANIFESTS['sub/Manifest'].lstrip() > }), > (StrayCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'MANIFEST sub/Manifest.gz 75 MD5 ' > 'e6378b64d3577c73c979fdb423937d94\n', > 'sub/Manifest.gz': > StrayCompressedManifestLayout.MANIFESTS['sub/Manifest.gz'].lstrip() > }), > (StrayInvalidManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestBz2Layout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLzmaLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestXzLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (FilenameWhitespaceLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (FilenameBackslashLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (NestedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 220 MD5 e85fbbce600362ab3378ebd7a2bc06db\n' > 'MANIFEST b/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/Manifest': > 'MANIFEST x/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'MANIFEST z/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'DATA y/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/x/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/z/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'b/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (AddToMultiManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n' > 'MANIFEST a/Manifest.b 47 MD5 1b1504046a2023ed75a2a89aed7c52f4\n' > 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'MANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n', > 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (SubManifestMismatchLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 50 MD5 0f7cd9ed779a4844f98d28315dd9176a\n', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/test', > None, > None, > {'Manifest': '', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (SymlinkLoopIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > ]) > def test_update_entry_hash_specs(layout_factory, layout, ctor, func, path, > call, save, manifest_update): > tmp_path = layout_factory.create(layout) > m = ManifestRecursiveLoader(tmp_path / layout.TOP_MANIFEST, > hashes=ctor, > allow_xdev=False) > func(m, path, hashes=call) > m.save_manifests(hashes=save) > > output = {} > for relpath in layout.MANIFESTS: > with open_potentially_compressed_path(tmp_path / relpath, > 'r') as f: > output[relpath] = f.read() > expected = dict(layout.MANIFESTS) > expected.update(manifest_update) >> assert output == expected >E AssertionError: assert {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'} == {'Manifest': 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'\n 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Differing items: >E {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'} != {'Manifest': 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Full diff: >E { >E + 'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' >E - 'Manifest': 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' >E ? ^^^^^^^^^^^ >E + 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n', >E ? ^^^^^^^^^^^ + >E - 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E } > >tests/test_recursiveloader.py:1927: AssertionError >_ test_update_entry_hash_specs[StrayInvalidCompressedManifestLzmaLayout-ctor27-update_entries_for_directory--None-None-manifest_update27] _ > >layout_factory = <tests.test_recursiveloader.LayoutFactory object at 0x00007fcde453bbb0> >layout = <class 'tests.test_recursiveloader.StrayInvalidCompressedManifestLzmaLayout'> >ctor = ['MD5'] >func = <function ManifestRecursiveLoader.update_entries_for_directory at 0x00007fcde05fd560> >path = '', call = None, save = None >manifest_update = {'Manifest': 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} > > @pytest.mark.parametrize( > 'layout,ctor,func,path,call,save,manifest_update', > [(BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > None, > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 SHA1 2b89b8bc8db9cec987beeb7f08f574f1766e6b06'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['MD5'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['SHA1'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 MD5 52e5664c2b12561cf296549395c0462a'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > # this rehashes all files > BasicTestLayout.MANIFESTS_SHA1), > (BasicTestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > ['SHA1'], > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > ['SHA1'], > None, > # ctor is used for Manifests that are edited, call is used > # for everything else > # TODO: does this behavior really make sense? > {'Manifest': 'TIMESTAMP 2017-01-01T01:01:01Z\n' > 'MANIFEST sub/Manifest 221 SHA256 ' > '0c4f14d1e07eb2762ca9afec0d64d8a9' > 'd65e3d99b5700fd2779f3b2641d2807a\n' > 'MANIFEST other/Manifest 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'DIST topdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > 'sub/Manifest': 'MANIFEST deeper/Manifest 58 SHA256 ' > '87d10bbc90d9d7838141dd2d50a58760' > '20a182dd950ef551b7f689bc178d6e6c\n' > 'DIST subdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n' > 'DATA stray 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > 'sub/deeper/Manifest': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255' > 'bfef95601890afd80709\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['SHA1'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 MD5 094185d851bf9a700889e37a46700420'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > ['SHA1'], > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (DuplicateAuxEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'files/test.patch', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DuplicateAuxEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DisjointHashSetEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (DisjointHashSetEntryLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 0 SHA256 ' > 'e3b0c44298fc1c149afbf4c8996fb924' > '27ae41e4649b934ca495991b7852b855\n', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'metadata.xml', > None, > None, > {'Manifest': '', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (CrossDeviceIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (DotFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (CompressedSubManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'sub/Manifest.gz': 'DATA test 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > }), > (CompressedManifestSortLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest.gz': > 'MANIFEST a/Manifest 50 MD5 8ee2fce40e6e6cc2b5de5c91d416e9f3\n', > 'a/Manifest': > 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (MultipleStrayFilesLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': ''.join(f'DATA sub/file.{x} 0 MD5 ' > f'd41d8cd98f00b204e9800998ecf8427e\n' > for x in 'cba'), > }), > (StrayManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST sub/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n', > 'sub/Manifest': > StrayManifestLayout.MANIFESTS['sub/Manifest'].lstrip() > }), > (StrayCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'MANIFEST sub/Manifest.gz 75 MD5 ' > 'e6378b64d3577c73c979fdb423937d94\n', > 'sub/Manifest.gz': > StrayCompressedManifestLayout.MANIFESTS['sub/Manifest.gz'].lstrip() > }), > (StrayInvalidManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestBz2Layout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLzmaLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestXzLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (FilenameWhitespaceLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (FilenameBackslashLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (NestedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 220 MD5 e85fbbce600362ab3378ebd7a2bc06db\n' > 'MANIFEST b/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/Manifest': > 'MANIFEST x/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'MANIFEST z/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'DATA y/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/x/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/z/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'b/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (AddToMultiManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n' > 'MANIFEST a/Manifest.b 47 MD5 1b1504046a2023ed75a2a89aed7c52f4\n' > 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'MANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n', > 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (SubManifestMismatchLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 50 MD5 0f7cd9ed779a4844f98d28315dd9176a\n', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/test', > None, > None, > {'Manifest': '', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (SymlinkLoopIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > ]) > def test_update_entry_hash_specs(layout_factory, layout, ctor, func, path, > call, save, manifest_update): > tmp_path = layout_factory.create(layout) > m = ManifestRecursiveLoader(tmp_path / layout.TOP_MANIFEST, > hashes=ctor, > allow_xdev=False) > func(m, path, hashes=call) > m.save_manifests(hashes=save) > > output = {} > for relpath in layout.MANIFESTS: > with open_potentially_compressed_path(tmp_path / relpath, > 'r') as f: > output[relpath] = f.read() > expected = dict(layout.MANIFESTS) > expected.update(manifest_update) >> assert output == expected >E AssertionError: assert {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'} == {'Manifest': 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'\n 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Differing items: >E {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'} != {'Manifest': 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Full diff: >E { >E + 'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' >E - 'Manifest': 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' >E ? ^^^^^^^^^^^ >E + 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n', >E ? ^^^^^^^^^^^ + >E - 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E } > >tests/test_recursiveloader.py:1927: AssertionError >_ test_update_entry_hash_specs[StrayInvalidCompressedManifestXzLayout-ctor28-update_entries_for_directory--None-None-manifest_update28] _ > >layout_factory = <tests.test_recursiveloader.LayoutFactory object at 0x00007fcde45d57c0> >layout = <class 'tests.test_recursiveloader.StrayInvalidCompressedManifestXzLayout'> >ctor = ['MD5'] >func = <function ManifestRecursiveLoader.update_entries_for_directory at 0x00007fcde05fd560> >path = '', call = None, save = None >manifest_update = {'Manifest': 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} > > @pytest.mark.parametrize( > 'layout,ctor,func,path,call,save,manifest_update', > [(BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > None, > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 SHA1 2b89b8bc8db9cec987beeb7f08f574f1766e6b06'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['MD5'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['SHA1'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 MD5 52e5664c2b12561cf296549395c0462a'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > # this rehashes all files > BasicTestLayout.MANIFESTS_SHA1), > (BasicTestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > ['SHA1'], > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > ['SHA1'], > None, > # ctor is used for Manifests that are edited, call is used > # for everything else > # TODO: does this behavior really make sense? > {'Manifest': 'TIMESTAMP 2017-01-01T01:01:01Z\n' > 'MANIFEST sub/Manifest 221 SHA256 ' > '0c4f14d1e07eb2762ca9afec0d64d8a9' > 'd65e3d99b5700fd2779f3b2641d2807a\n' > 'MANIFEST other/Manifest 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'DIST topdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > 'sub/Manifest': 'MANIFEST deeper/Manifest 58 SHA256 ' > '87d10bbc90d9d7838141dd2d50a58760' > '20a182dd950ef551b7f689bc178d6e6c\n' > 'DIST subdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n' > 'DATA stray 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > 'sub/deeper/Manifest': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255' > 'bfef95601890afd80709\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['SHA1'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 MD5 094185d851bf9a700889e37a46700420'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > ['SHA1'], > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (DuplicateAuxEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'files/test.patch', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DuplicateAuxEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DisjointHashSetEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (DisjointHashSetEntryLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 0 SHA256 ' > 'e3b0c44298fc1c149afbf4c8996fb924' > '27ae41e4649b934ca495991b7852b855\n', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'metadata.xml', > None, > None, > {'Manifest': '', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (CrossDeviceIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (DotFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (CompressedSubManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'sub/Manifest.gz': 'DATA test 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > }), > (CompressedManifestSortLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest.gz': > 'MANIFEST a/Manifest 50 MD5 8ee2fce40e6e6cc2b5de5c91d416e9f3\n', > 'a/Manifest': > 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (MultipleStrayFilesLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': ''.join(f'DATA sub/file.{x} 0 MD5 ' > f'd41d8cd98f00b204e9800998ecf8427e\n' > for x in 'cba'), > }), > (StrayManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST sub/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n', > 'sub/Manifest': > StrayManifestLayout.MANIFESTS['sub/Manifest'].lstrip() > }), > (StrayCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'MANIFEST sub/Manifest.gz 75 MD5 ' > 'e6378b64d3577c73c979fdb423937d94\n', > 'sub/Manifest.gz': > StrayCompressedManifestLayout.MANIFESTS['sub/Manifest.gz'].lstrip() > }), > (StrayInvalidManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestBz2Layout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLzmaLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestXzLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (FilenameWhitespaceLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (FilenameBackslashLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (NestedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 220 MD5 e85fbbce600362ab3378ebd7a2bc06db\n' > 'MANIFEST b/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/Manifest': > 'MANIFEST x/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'MANIFEST z/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'DATA y/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/x/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/z/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'b/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (AddToMultiManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n' > 'MANIFEST a/Manifest.b 47 MD5 1b1504046a2023ed75a2a89aed7c52f4\n' > 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'MANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n', > 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (SubManifestMismatchLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 50 MD5 0f7cd9ed779a4844f98d28315dd9176a\n', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/test', > None, > None, > {'Manifest': '', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (SymlinkLoopIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > ]) > def test_update_entry_hash_specs(layout_factory, layout, ctor, func, path, > call, save, manifest_update): > tmp_path = layout_factory.create(layout) > m = ManifestRecursiveLoader(tmp_path / layout.TOP_MANIFEST, > hashes=ctor, > allow_xdev=False) > func(m, path, hashes=call) > m.save_manifests(hashes=save) > > output = {} > for relpath in layout.MANIFESTS: > with open_potentially_compressed_path(tmp_path / relpath, > 'r') as f: > output[relpath] = f.read() > expected = dict(layout.MANIFESTS) > expected.update(manifest_update) >> assert output == expected >E AssertionError: assert {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'} == {'Manifest': 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'\n 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Differing items: >E {'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nDATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n'} != {'Manifest': 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\nDATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Full diff: >E { >E + 'Manifest': 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' >E - 'Manifest': 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' >E ? ^^^^^^^^^^^ >E + 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n', >E ? ^^^^^^^^^^^ + >E - 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E } > >tests/test_recursiveloader.py:1927: AssertionError >_ test_update_entry_hash_specs[AddToMultiManifestLayout-ctor32-update_entries_for_directory--None-None-manifest_update32] _ > >layout_factory = <tests.test_recursiveloader.LayoutFactory object at 0x00007fcde33042f8> >layout = <class 'tests.test_recursiveloader.AddToMultiManifestLayout'> >ctor = ['MD5'] >func = <function ManifestRecursiveLoader.update_entries_for_directory at 0x00007fcde05fd560> >path = '', call = None, save = None >manifest_update = {'Manifest': 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\nMANIFEST a/Manifest.b 47 MD5 1b1504046a20...a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n', 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} > > @pytest.mark.parametrize( > 'layout,ctor,func,path,call,save,manifest_update', > [(BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > None, > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 SHA1 2b89b8bc8db9cec987beeb7f08f574f1766e6b06'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['MD5'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/stray', > ['SHA1'], > None, > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '186 MD5 52e5664c2b12561cf296549395c0462a'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + > 'DATA stray 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }), > (BasicTestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > # this rehashes all files > BasicTestLayout.MANIFESTS_SHA1), > (BasicTestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > ['SHA1'], > {'Manifest': BasicTestLayout.MANIFESTS['Manifest'].lstrip() > .replace('128 MD5 30fd28b98a23031c72793908dd35c530', > '177 SHA1 d6ecf169c7c4e951d5c633c8e0debe5df1a8c0aa'), > 'sub/Manifest': BasicTestLayout.MANIFESTS['sub/Manifest'] > .lstrip() + 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (BasicTestLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > ['SHA1'], > None, > # ctor is used for Manifests that are edited, call is used > # for everything else > # TODO: does this behavior really make sense? > {'Manifest': 'TIMESTAMP 2017-01-01T01:01:01Z\n' > 'MANIFEST sub/Manifest 221 SHA256 ' > '0c4f14d1e07eb2762ca9afec0d64d8a9' > 'd65e3d99b5700fd2779f3b2641d2807a\n' > 'MANIFEST other/Manifest 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'DIST topdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > 'sub/Manifest': 'MANIFEST deeper/Manifest 58 SHA256 ' > '87d10bbc90d9d7838141dd2d50a58760' > '20a182dd950ef551b7f689bc178d6e6c\n' > 'DIST subdistfile-1.txt 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n' > 'DATA stray 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > 'sub/deeper/Manifest': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255' > 'bfef95601890afd80709\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['SHA1'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 MD5 094185d851bf9a700889e37a46700420'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > ['SHA1'], > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > None, > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '58 SHA1 dc62bbde3db6e82aea65c3643ae0d6be50aa8a53'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'SHA1 deed2a88e73dccaa30a9e6e296f62be238be4ade\n', > }), > (MultiManifestLayout, > ['SHA1'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/foo', > ['MD5'], > None, > {'Manifest': MultiManifestLayout.MANIFESTS['Manifest'].lstrip() > .replace('50 MD5 33fd9df6d410a93ff859d75e088bde7e', > '49 SHA1 08a3eac069b8b442513016d60a3da7288c4ea821'), > 'sub/Manifest.a': 'DATA foo 16 ' > 'MD5 abeac07d3c28c1bef9e730002c753ed4\n', > }), > (DuplicateAuxEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'files/test.patch', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DuplicateAuxEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': DuplicateAuxEntryLayout.MANIFESTS['Manifest'] > .splitlines()[1] + '\n', > }), > (DisjointHashSetEntryLayout, > None, > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (DisjointHashSetEntryLayout, > ['SHA256'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 0 SHA256 ' > 'e3b0c44298fc1c149afbf4c8996fb924' > '27ae41e4649b934ca495991b7852b855\n', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'metadata.xml', > None, > None, > {'Manifest': '', > }), > (MiscEntryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (CrossDeviceIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (DotFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (CompressedSubManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'sub/Manifest.gz': 'DATA test 0 MD5 ' > 'd41d8cd98f00b204e9800998ecf8427e\n', > }), > (CompressedManifestSortLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest.gz': > 'MANIFEST a/Manifest 50 MD5 8ee2fce40e6e6cc2b5de5c91d416e9f3\n', > 'a/Manifest': > 'DATA stray 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (MultipleStrayFilesLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': ''.join(f'DATA sub/file.{x} 0 MD5 ' > f'd41d8cd98f00b204e9800998ecf8427e\n' > for x in 'cba'), > }), > (StrayManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST sub/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n', > 'sub/Manifest': > StrayManifestLayout.MANIFESTS['sub/Manifest'].lstrip() > }), > (StrayCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'MANIFEST sub/Manifest.gz 75 MD5 ' > 'e6378b64d3577c73c979fdb423937d94\n', > 'sub/Manifest.gz': > StrayCompressedManifestLayout.MANIFESTS['sub/Manifest.gz'].lstrip() > }), > (StrayInvalidManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest 19 MD5 1c0817af3a5def5d5c90b139988727a7\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.gz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestBz2Layout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.bz2 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestLzmaLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.lzma 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (StrayInvalidCompressedManifestXzLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'DATA sub/Manifest.xz 18 MD5 f937f0ff743477e4f70ef2b79672c9bc\n' > 'DATA sub/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (FilenameWhitespaceLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (FilenameBackslashLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (NestedManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 220 MD5 e85fbbce600362ab3378ebd7a2bc06db\n' > 'MANIFEST b/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/Manifest': > 'MANIFEST x/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'MANIFEST z/Manifest 49 MD5 b86a7748346d54c6455886306f017e6c\n' > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'DATA y/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/x/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'a/z/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > 'b/Manifest': > 'DATA test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (AddToMultiManifestLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n' > 'MANIFEST a/Manifest.b 47 MD5 1b1504046a2023ed75a2a89aed7c52f4\n' > 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' > 'MANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n', > 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', > }), > (SubManifestMismatchLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': > 'MANIFEST a/Manifest 50 MD5 0f7cd9ed779a4844f98d28315dd9176a\n', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'sub/test', > None, > None, > {'Manifest': '', > }), > (NonexistingDirectoryLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': '', > }), > (SymlinkLoopIgnoreLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {}), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entry_for_path, > 'test', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > (MismatchedFileLayout, > ['MD5'], > ManifestRecursiveLoader.update_entries_for_directory, > '', > None, > None, > {'Manifest': 'DATA test 11 MD5 6f8db599de986fab7a21625b7916589c\n', > }), > ]) > def test_update_entry_hash_specs(layout_factory, layout, ctor, func, path, > call, save, manifest_update): > tmp_path = layout_factory.create(layout) > m = ManifestRecursiveLoader(tmp_path / layout.TOP_MANIFEST, > hashes=ctor, > allow_xdev=False) > func(m, path, hashes=call) > m.save_manifests(hashes=save) > > output = {} > for relpath in layout.MANIFESTS: > with open_potentially_compressed_path(tmp_path / relpath, > 'r') as f: > output[relpath] = f.read() > expected = dict(layout.MANIFESTS) > expected.update(manifest_update) >> assert output == expected >E AssertionError: assert {'Manifest': 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n'\n 'MANIFEST a/Manifest.b 46 MD5 93f00cb02b04ad2520414af7983ebae7\n'\n 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'MANIFEST a/Manifest 47 MD5 6798e5dfb6b1aa104fd74d5e334e914d\n',\n 'a/Manifest': '\nDATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n',\n 'a/Manifest.a': '\nDATA a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n',\n 'a/Manifest.b': 'DATA b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} == {'Manifest': 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n'\n 'MANIFEST a/Manifest.b 47 MD5 1b1504046a2023ed75a2a89aed7c52f4\n'\n 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'\n 'MANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n',\n 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n',\n 'a/Manifest.a': '\nDATA a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n',\n 'a/Manifest.b': '\nDATA b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Common items: >E {'a/Manifest.a': '\nDATA a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Differing items: >E {'Manifest': 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\nMANIFEST a/Manifest.b 46 MD5 93f00cb02b04...e7\nDATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nMANIFEST a/Manifest 47 MD5 6798e5dfb6b1aa104fd74d5e334e914d\n'} != {'Manifest': 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\nMANIFEST a/Manifest.b 47 MD5 1b1504046a20...f4\nDATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\nMANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n'} >E {'a/Manifest': '\nDATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} != {'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E {'a/Manifest.b': 'DATA b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} != {'a/Manifest.b': '\nDATA b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n'} >E Full diff: >E { >E 'Manifest': 'MANIFEST a/Manifest.a 47 MD5 89b9c1e9e5a063ee60b91b632c84c7c8\n' >E - 'MANIFEST a/Manifest.b 47 MD5 1b1504046a2023ed75a2a89aed7c52f4\n' >E + 'MANIFEST a/Manifest.b 46 MD5 93f00cb02b04ad2520414af7983ebae7\n' >E 'DATA b/test 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n' >E - 'MANIFEST a/Manifest 46 MD5 dae3736ed4a6d6a3a74aa0af1b063bdf\n', >E + 'MANIFEST a/Manifest 47 MD5 6798e5dfb6b1aa104fd74d5e334e914d\n', >E - 'a/Manifest': 'DATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E + 'a/Manifest': '\nDATA c 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E ? ++ >E 'a/Manifest.a': '\nDATA a 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E - 'a/Manifest.b': '\nDATA b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E ? -- >E + 'a/Manifest.b': 'DATA b 0 MD5 d41d8cd98f00b204e9800998ecf8427e\n', >E } > >tests/test_recursiveloader.py:1927: AssertionError >________ test_cli_update[StrayInvalidManifestLayout--update7-TIMESTAMP] ________ > >layout_factory = <tests.test_recursiveloader.LayoutFactory object at 0x00007fcde43af6a8> >layout = <class 'tests.test_recursiveloader.StrayInvalidManifestLayout'> >args = '' >update = {'Manifest': 'DATA sub/Manifest 19 SHA1 0edaf6696720e166e43e5eedbde23818a8a4939c\nDATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\nTIMESTAMP\n'} >replace_timestamp = 'TIMESTAMP' > > @pytest.mark.parametrize( > 'layout,args,update,replace_timestamp', > [(BasicTestLayout, > '', > BasicTestLayout.MANIFESTS_SHA1, > 'TIMESTAMP 2017-01-01T01:01:01Z'), > (DuplicateEntryLayout, > '', > {'Manifest': > DuplicateEntryLayout.MANIFESTS['Manifest'].splitlines()[1] + > '\nTIMESTAMP\n' > }, > 'TIMESTAMP'), > (MiscEntryLayout, > '', > {'Manifest': 'TIMESTAMP\n'}, > 'TIMESTAMP'), > (CrossDeviceIgnoreLayout, > '', > {}, > None), > (DotFileLayout, > '', > {}, > None), > (StrayManifestLayout, > '', > {'Manifest': 'MANIFEST sub/Manifest 58 SHA1 ' > '4b40f4102dd71fb2083ce9a8d8af6d7e49c281c4\n' > 'TIMESTAMP\n', > 'sub/Manifest': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }, > 'TIMESTAMP'), > (StrayCompressedManifestLayout, > '', > {'Manifest': 'MANIFEST sub/Manifest.gz 84 SHA1 ' > 'aa62bd16d440d2a118a381df4f9b9c413d993e75\n' > 'TIMESTAMP\n', > 'sub/Manifest.gz': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }, > 'TIMESTAMP'), > (StrayInvalidManifestLayout, > '', > {'Manifest': 'DATA sub/Manifest 19 SHA1 ' > '0edaf6696720e166e43e5eedbde23818a8a4939c\n' > 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'TIMESTAMP\n', > }, > 'TIMESTAMP'), > (StrayInvalidCompressedManifestLayout, > '', > {'Manifest': > 'DATA sub/Manifest.gz 18 SHA1 ' > '6af661c09147db2a2b51ae7c3cf2834d88884596\n' > 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'TIMESTAMP\n', > }, > 'TIMESTAMP'), > (FilenameWhitespaceLayout, > '', > {'Manifest': > 'DATA \\x20\\x20foo\\x20bar\\x20\\x20 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'TIMESTAMP\n', > }, > 'TIMESTAMP'), > (SymlinkLoopIgnoreLayout, > '', > {}, > None), > (MismatchedFileFutureTimestampLayout, > '', > {'Manifest': 'TIMESTAMP\n' > 'DATA test 11 SHA1 661295c9cbf9d6b2f6428414504a8deed3020641\n' > }, > 'TIMESTAMP'), > (MismatchedFileFutureTimestampLayout, > '--incremental', > {}, > 'TIMESTAMP'), > ]) > def test_cli_update(layout_factory, layout, args, update, > replace_timestamp): > tmp_path = layout_factory.create(layout) > assert gemato.cli.main(['gemato', 'update', '-x', '--hashes=SHA1', > '--timestamp'] + args.split() + > [str(tmp_path)]) == 0 > > if replace_timestamp is not None: > m = gemato.manifest.ManifestFile() > with open(tmp_path / layout.TOP_MANIFEST, 'r') as f: > m.load(f) > ts = m.find_timestamp() > assert ts is not None > assert ts.ts != datetime.datetime(2017, 1, 1, 1, 1, 1) > > output = {} > for relpath in layout.MANIFESTS: > with open_potentially_compressed_path(tmp_path / relpath, > 'r') as f: > output[relpath] = f.read() > expected = dict(layout.MANIFESTS) > expected.update(update) > if replace_timestamp is not None: > expected['Manifest'] = expected['Manifest'].replace( > replace_timestamp, ' '.join(ts.to_list())) >> assert output == expected >E AssertionError: assert {'Manifest': 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n'\n 'DATA sub/Manifest 19 SHA1 '\n '0edaf6696720e166e43e5eedbde23818a8a4939c\n'\n 'TIMESTAMP 2020-09-07T18:37:34Z\n',\n 'sub/Manifest': '\nI AM SOOO INVALID\n'} == {'Manifest': 'DATA sub/Manifest 19 SHA1 '\n '0edaf6696720e166e43e5eedbde23818a8a4939c\n'\n 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n'\n 'TIMESTAMP 2020-09-07T18:37:34Z\n',\n 'sub/Manifest': '\nI AM SOOO INVALID\n'} >E Common items: >E {'sub/Manifest': '\nI AM SOOO INVALID\n'} >E Differing items: >E {'Manifest': 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\nDATA sub/Manifest 19 SHA1 0edaf6696720e166e43e5eedbde23818a8a4939c\nTIMESTAMP 2020-09-07T18:37:34Z\n'} != {'Manifest': 'DATA sub/Manifest 19 SHA1 0edaf6696720e166e43e5eedbde23818a8a4939c\nDATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\nTIMESTAMP 2020-09-07T18:37:34Z\n'} >E Full diff: >E { >E - 'Manifest': 'DATA sub/Manifest 19 SHA1 ' >E + 'Manifest': 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n' >E + 'DATA sub/Manifest 19 SHA1 ' >E '0edaf6696720e166e43e5eedbde23818a8a4939c\n' >E - 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n' >E 'TIMESTAMP 2020-09-07T18:37:34Z\n', >E 'sub/Manifest': '\nI AM SOOO INVALID\n', >E } > >tests/test_recursiveloader.py:2117: AssertionError >___ test_cli_update[StrayInvalidCompressedManifestLayout--update8-TIMESTAMP] ___ > >layout_factory = <tests.test_recursiveloader.LayoutFactory object at 0x00007fcde1a5fd70> >layout = <class 'tests.test_recursiveloader.StrayInvalidCompressedManifestLayout'> >args = '' >update = {'Manifest': 'DATA sub/Manifest.gz 18 SHA1 6af661c09147db2a2b51ae7c3cf2834d88884596\nDATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\nTIMESTAMP\n'} >replace_timestamp = 'TIMESTAMP' > > @pytest.mark.parametrize( > 'layout,args,update,replace_timestamp', > [(BasicTestLayout, > '', > BasicTestLayout.MANIFESTS_SHA1, > 'TIMESTAMP 2017-01-01T01:01:01Z'), > (DuplicateEntryLayout, > '', > {'Manifest': > DuplicateEntryLayout.MANIFESTS['Manifest'].splitlines()[1] + > '\nTIMESTAMP\n' > }, > 'TIMESTAMP'), > (MiscEntryLayout, > '', > {'Manifest': 'TIMESTAMP\n'}, > 'TIMESTAMP'), > (CrossDeviceIgnoreLayout, > '', > {}, > None), > (DotFileLayout, > '', > {}, > None), > (StrayManifestLayout, > '', > {'Manifest': 'MANIFEST sub/Manifest 58 SHA1 ' > '4b40f4102dd71fb2083ce9a8d8af6d7e49c281c4\n' > 'TIMESTAMP\n', > 'sub/Manifest': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }, > 'TIMESTAMP'), > (StrayCompressedManifestLayout, > '', > {'Manifest': 'MANIFEST sub/Manifest.gz 84 SHA1 ' > 'aa62bd16d440d2a118a381df4f9b9c413d993e75\n' > 'TIMESTAMP\n', > 'sub/Manifest.gz': 'DATA test 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n', > }, > 'TIMESTAMP'), > (StrayInvalidManifestLayout, > '', > {'Manifest': 'DATA sub/Manifest 19 SHA1 ' > '0edaf6696720e166e43e5eedbde23818a8a4939c\n' > 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'TIMESTAMP\n', > }, > 'TIMESTAMP'), > (StrayInvalidCompressedManifestLayout, > '', > {'Manifest': > 'DATA sub/Manifest.gz 18 SHA1 ' > '6af661c09147db2a2b51ae7c3cf2834d88884596\n' > 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'TIMESTAMP\n', > }, > 'TIMESTAMP'), > (FilenameWhitespaceLayout, > '', > {'Manifest': > 'DATA \\x20\\x20foo\\x20bar\\x20\\x20 0 SHA1 ' > 'da39a3ee5e6b4b0d3255bfef95601890afd80709\n' > 'TIMESTAMP\n', > }, > 'TIMESTAMP'), > (SymlinkLoopIgnoreLayout, > '', > {}, > None), > (MismatchedFileFutureTimestampLayout, > '', > {'Manifest': 'TIMESTAMP\n' > 'DATA test 11 SHA1 661295c9cbf9d6b2f6428414504a8deed3020641\n' > }, > 'TIMESTAMP'), > (MismatchedFileFutureTimestampLayout, > '--incremental', > {}, > 'TIMESTAMP'), > ]) > def test_cli_update(layout_factory, layout, args, update, > replace_timestamp): > tmp_path = layout_factory.create(layout) > assert gemato.cli.main(['gemato', 'update', '-x', '--hashes=SHA1', > '--timestamp'] + args.split() + > [str(tmp_path)]) == 0 > > if replace_timestamp is not None: > m = gemato.manifest.ManifestFile() > with open(tmp_path / layout.TOP_MANIFEST, 'r') as f: > m.load(f) > ts = m.find_timestamp() > assert ts is not None > assert ts.ts != datetime.datetime(2017, 1, 1, 1, 1, 1) > > output = {} > for relpath in layout.MANIFESTS: > with open_potentially_compressed_path(tmp_path / relpath, > 'r') as f: > output[relpath] = f.read() > expected = dict(layout.MANIFESTS) > expected.update(update) > if replace_timestamp is not None: > expected['Manifest'] = expected['Manifest'].replace( > replace_timestamp, ' '.join(ts.to_list())) >> assert output == expected >E AssertionError: assert {'Manifest': 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n'\n 'DATA sub/Manifest.gz 18 SHA1 '\n '6af661c09147db2a2b51ae7c3cf2834d88884596\n'\n 'TIMESTAMP 2020-09-07T18:37:34Z\n'} == {'Manifest': 'DATA sub/Manifest.gz 18 SHA1 '\n '6af661c09147db2a2b51ae7c3cf2834d88884596\n'\n 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n'\n 'TIMESTAMP 2020-09-07T18:37:34Z\n'} >E Differing items: >E {'Manifest': 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\nDATA sub/Manifest.gz 18 SHA1 6af661c09147db2a2b51ae7c3cf2834d88884596\nTIMESTAMP 2020-09-07T18:37:34Z\n'} != {'Manifest': 'DATA sub/Manifest.gz 18 SHA1 6af661c09147db2a2b51ae7c3cf2834d88884596\nDATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\nTIMESTAMP 2020-09-07T18:37:34Z\n'} >E Full diff: >E { >E + 'Manifest': 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n' >E - 'Manifest': 'DATA sub/Manifest.gz 18 SHA1 ' >E ? ^^^^^^^^^^^ >E + 'DATA sub/Manifest.gz 18 SHA1 ' >E ? ^^^^^^^^^^^ >E '6af661c09147db2a2b51ae7c3cf2834d88884596\n' >E - 'DATA sub/test 0 SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709\n' >E 'TIMESTAMP 2020-09-07T18:37:34Z\n', >E } > >tests/test_recursiveloader.py:2117: AssertionError >=========================== short test summary info ============================ >FAILED tests/test_recursiveloader.py::test_update_entry_hash_specs[MultipleStrayFilesLayout-ctor21-update_entries_for_directory--None-None-manifest_update21] >FAILED tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidManifestLayout-ctor24-update_entries_for_directory--None-None-manifest_update24] >FAILED tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidCompressedManifestLayout-ctor25-update_entries_for_directory--None-None-manifest_update25] >FAILED tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidCompressedManifestBz2Layout-ctor26-update_entries_for_directory--None-None-manifest_update26] >FAILED tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidCompressedManifestLzmaLayout-ctor27-update_entries_for_directory--None-None-manifest_update27] >FAILED tests/test_recursiveloader.py::test_update_entry_hash_specs[StrayInvalidCompressedManifestXzLayout-ctor28-update_entries_for_directory--None-None-manifest_update28] >FAILED tests/test_recursiveloader.py::test_update_entry_hash_specs[AddToMultiManifestLayout-ctor32-update_entries_for_directory--None-None-manifest_update32] >FAILED tests/test_recursiveloader.py::test_cli_update[StrayInvalidManifestLayout--update7-TIMESTAMP] >FAILED tests/test_recursiveloader.py::test_cli_update[StrayInvalidCompressedManifestLayout--update8-TIMESTAMP] >======================= 9 failed, 1100 passed in 20.84s ======================== > * ERROR: app-portage/gemato-16.0::gentoo failed (test phase): > * Tests fail with pypy3 > * > * Call stack: > * ebuild.sh, line 125: Called src_test > * environment, line 3020: Called distutils-r1_src_test > * environment, line 1303: Called _distutils-r1_run_foreach_impl 'python_test' > * environment, line 483: Called python_foreach_impl 'distutils-r1_run_phase' 'python_test' > * environment, line 2622: Called multibuild_foreach_variant '_python_multibuild_wrapper' 'distutils-r1_run_phase' 'python_test' > * environment, line 2086: Called _multibuild_run '_python_multibuild_wrapper' 'distutils-r1_run_phase' 'python_test' > * environment, line 2084: Called _python_multibuild_wrapper 'distutils-r1_run_phase' 'python_test' > * environment, line 876: Called distutils-r1_run_phase 'python_test' > * environment, line 1240: Called python_test > * environment, line 2980: Called die > * The specific snippet of code: > * pytest -vv || die "Tests fail with ${EPYTHON}" > * > * If you need support, post the output of `emerge --info '=app-portage/gemato-16.0::gentoo'`, > * the complete build log and the output of `emerge -pqv '=app-portage/gemato-16.0::gentoo'`. > * The complete build log is located at '/var/log/emerge-log/build/app-portage/gemato-16.0:20200907-183709.log'. > * For convenience, a symlink to the build log is located at '/var/tmp/portage/app-portage/gemato-16.0/temp/build.log'. > * The ebuild environment file is located at '/var/tmp/portage/app-portage/gemato-16.0/temp/environment'. > * Working directory: '/var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0' > * S: '/var/tmp/portage/app-portage/gemato-16.0/work/gemato-16.0'
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 741046
: 659042