Warning: Permanently added '3.95.21.242' (ED25519) to the list of known hosts. You can reproduce this build on your computer by running: sudo dnf install copr-rpmbuild /usr/bin/copr-rpmbuild --verbose --drop-resultdir --task-url https://copr.fedorainfracloud.org/backend/get-build-task/11176149-fedora-rawhide-x86_64 --chroot fedora-rawhide-x86_64 Version: 1.10 PID: 12161 Logging PID: 12163 Task: {'allow_user_ssh': False, 'appstream': False, 'background': True, 'bootstrap': 'off', 'build_id': 11176149, 'buildroot_pkgs': [], 'chroot': 'fedora-rawhide-x86_64', 'enable_net': False, 'fedora_review': False, 'git_hash': 'fb1fdab51de5aaf536c0c374348908c1f041b463', 'git_repo': 'https://copr-dist-git.fedorainfracloud.org/git/@python/python3.15/btrfs-backup-ng', 'isolation': 'default', 'memory_reqs': 2048, 'package_name': 'btrfs-backup-ng', 'package_version': '0.9.16-1', 'project_dirname': 'python3.15', 'project_name': 'python3.15', 'project_owner': '@python', 'repo_priority': 9, 'repos': [{'baseurl': 'https://download.copr.fedorainfracloud.org/results/@python/python3.15/fedora-rawhide-x86_64/', 'id': 'copr_base', 'name': 'Copr repository', 'priority': 9, 'repo_gpgcheck': False}, {'baseurl': 'http://kojipkgs.fedoraproject.org/repos/rawhide/latest/$basearch/', 'id': 'http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch', 'name': 'Additional repo http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch'}], 'sandbox': '@python/python3.15--https://src.fedoraproject.org/user/mberry', 'source_json': {}, 'source_type': None, 'ssh_public_keys': None, 'storage': 0, 'submitter': 'https://src.fedoraproject.org/user/mberry', 'tags': [], 'task_id': '11176149-fedora-rawhide-x86_64', 'timeout': 18000, 'uses_devel_repo': False, 'with_opts': [], 'without_opts': []} Running: git clone https://copr-dist-git.fedorainfracloud.org/git/@python/python3.15/btrfs-backup-ng /var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng --depth 500 --no-single-branch --recursive cmd: ['git', 'clone', 'https://copr-dist-git.fedorainfracloud.org/git/@python/python3.15/btrfs-backup-ng', '/var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng', '--depth', '500', '--no-single-branch', '--recursive'] cwd: . rc: 0 stdout: stderr: Cloning into '/var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng'... Running: git checkout fb1fdab51de5aaf536c0c374348908c1f041b463 -- cmd: ['git', 'checkout', 'fb1fdab51de5aaf536c0c374348908c1f041b463', '--'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng rc: 0 stdout: stderr: Note: switching to 'fb1fdab51de5aaf536c0c374348908c1f041b463'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at fb1fdab automatic import of btrfs-backup-ng Running: dist-git-client sources cmd: ['dist-git-client', 'sources'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng rc: 0 stdout: stderr: INFO: Reading stdout from command: git rev-parse --abbrev-ref HEAD INFO: Reading stdout from command: git rev-parse HEAD INFO: Reading sources specification file: sources INFO: Downloading btrfs_backup_ng-0.9.16.tar.gz INFO: Reading stdout from command: curl --help all INFO: Calling: curl -H Pragma: -H 'Accept-Encoding: identity' -o btrfs_backup_ng-0.9.16.tar.gz --location --connect-timeout 60 --retry 3 --retry-delay 10 --remote-time --show-error --fail --retry-all-errors https://copr-dist-git.fedorainfracloud.org/repo/pkgs/@python/python3.15/btrfs-backup-ng/btrfs_backup_ng-0.9.16.tar.gz/md5/c62df327eee9afee35e0911a93e1fdea/btrfs_backup_ng-0.9.16.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1.67M 100 1.67M 0 0 97.32M 0 0 INFO: Reading stdout from command: md5sum btrfs_backup_ng-0.9.16.tar.gz tail: /var/lib/copr-rpmbuild/main.log: file truncated Running (timeout=18000): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng/btrfs-backup-ng.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1792490956.514947 -r /var/lib/copr-rpmbuild/results/configs/child.cfg INFO: mock.py version 6.9 starting (python version = 3.14.5, NVR = mock-6.9-1.fc44), args: /usr/libexec/mock/mock --spec /var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng/btrfs-backup-ng.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1792490956.514947 -r /var/lib/copr-rpmbuild/results/configs/child.cfg Start: init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish: init plugins INFO: Signal handler active Start: run INFO: Start(/var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng/btrfs-backup-ng.spec) Config(fedora-rawhide-x86_64) Start: clean chroot Finish: clean chroot Mock Version: 6.9 INFO: Mock Version: 6.9 Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1792490956.514947/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Package manager dnf5 detected and used (fallback) INFO: Buildroot is handled by package management from host and used with --installroot: rpm-6.0.2-1.fc44.x86_64 rpm-sequoia-1.10.2-2.fc44.x86_64 python3-dnf-4.24.0-3.fc44.noarch python3-dnf-plugins-core-4.10.1-9.fc44.noarch dnf5-5.4.6.0-1.fc44.x86_64 dnf5-plugins-5.4.6.0-1.fc44.x86_64 Start: installing minimal buildroot with dnf5 Updating and loading repositories: fedora 100% | 59.4 MiB/s | 38.9 MiB | 00m01s Copr repository 100% | 20.7 MiB/s | 13.0 MiB | 00m01s Additional repo http_kojipkgs_fedorapr 100% | 21.0 MiB/s | 14.6 MiB | 00m01s Repositories loaded. Package Arch Version Repository Size Installing group/module packages: bash x86_64 0:5.3.20-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 8.5 MiB bzip2 x86_64 0:1.0.8-24.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 95.0 KiB coreutils x86_64 0:9.12-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 6.3 MiB cpio x86_64 0:2.15-10.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.1 MiB diffutils x86_64 0:3.12-6.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 MiB fedora-release-common noarch 0:46-0.1 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 4.6 KiB findutils x86_64 1:4.11.0-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 MiB gawk x86_64 0:5.4.1-1.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.2 MiB glibc-minimal-langpack x86_64 0:2.44.9000-5.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 0.0 B grep x86_64 0:3.12-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 MiB gzip x86_64 0:1.15-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 445.2 KiB info x86_64 0:7.3-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 372.4 KiB patch x86_64 0:2.8-6.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 226.6 KiB redhat-rpm-config noarch 0:345-5.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 184.3 KiB rpm-build x86_64 0:6.1.0-1.fc46 copr_base 312.1 KiB sed x86_64 0:4.10-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 866.5 KiB shadow-utils x86_64 2:4.20.0-2.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.9 MiB tar x86_64 2:1.35-9.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.0 MiB unzip x86_64 0:6.0-71.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 441.8 KiB util-linux x86_64 0:2.42.4-2.fc46 copr_base 3.7 MiB which x86_64 0:2.25-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 83.6 KiB xz x86_64 1:5.8.4-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.4 MiB Installing dependencies: R-srpm-macros noarch 0:1.3.7-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.5 KiB add-determinism x86_64 0:0.7.3-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.2 MiB alternatives x86_64 0:1.33-6.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 62.1 KiB ansible-srpm-macros noarch 0:1-22.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 35.7 KiB audit-libs x86_64 0:4.2.1-2.fc46 copr_base 390.5 KiB binutils x86_64 0:2.47.50-19.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 24.5 MiB build-reproducibility-srpm-macros noarch 0:0.7.3-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.2 KiB bzip2-libs x86_64 0:1.0.8-24.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 80.5 KiB ca-certificates noarch 0:2026.2.90_v9.0.317-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.6 MiB cmake-srpm-macros noarch 0:4.3.0-4.fc45 copr_base 524.0 B coreutils-common x86_64 0:9.12-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 11.5 MiB crypto-policies noarch 0:20260713-2.gitc42da77.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 134.3 KiB curl x86_64 0:8.23.0-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 486.1 KiB cyrus-sasl-lib x86_64 0:2.1.28-37.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.3 MiB debugedit x86_64 0:5.3-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 220.8 KiB dwz x86_64 0:0.17-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 291.1 KiB ed x86_64 0:1.22.6-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 150.9 KiB efi-srpm-macros noarch 0:6-9.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 40.3 KiB elfutils x86_64 0:0.196-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.2 MiB elfutils-debuginfod-client x86_64 0:0.196-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 79.9 KiB elfutils-libelf x86_64 0:0.196-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.4 MiB elfutils-libs x86_64 0:0.196-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 719.6 KiB erlang-srpm-macros noarch 0:0.4.0-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.0 KiB fedora-gpg-keys noarch 0:46-0.3 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 130.3 KiB fedora-release noarch 0:46-0.1 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 0.0 B fedora-release-identity-basic noarch 0:46-0.1 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 664.0 B fedora-repos noarch 0:46-0.3 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 4.9 KiB fedora-repos-rawhide noarch 0:46-0.3 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.2 KiB file x86_64 0:5.48-3.fc46 copr_base 101.9 KiB file-libs x86_64 0:5.48-3.fc46 copr_base 12.3 MiB filesystem x86_64 0:3.18-59.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 112.0 B filesystem-srpm-macros noarch 0:3.18-59.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 38.2 KiB fips-provider x86_64 0:1.5.3-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 4.8 MiB fonts-srpm-macros noarch 1:5.0.0-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 55.8 KiB forge-srpm-macros noarch 0:0.4.0-5.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 38.9 KiB fpc-srpm-macros noarch 0:1.3-17.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 144.0 B gap-srpm-macros noarch 0:2-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.1 KiB gdb-minimal x86_64 0:17.2-6.fc46 copr_base 14.2 MiB gdbm-libs x86_64 1:1.26-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 134.2 KiB ghc-srpm-macros noarch 0:1.10-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 792.0 B glibc x86_64 0:2.44.9000-5.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 7.2 MiB glibc-common x86_64 0:2.44.9000-5.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 MiB glibc-gconv-extra x86_64 0:2.44.9000-5.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 7.7 MiB gmp x86_64 1:6.3.0-6.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 815.2 KiB gnat-srpm-macros noarch 0:7-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 KiB gnome-srpm-macros noarch 0:1.0-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.5 KiB gnulib-l10n noarch 0:20241231-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 655.0 KiB gnupg2 x86_64 0:2.4.9-18.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 6.5 MiB gnupg2-dirmngr x86_64 0:2.4.9-18.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 630.1 KiB gnupg2-gpg-agent x86_64 0:2.4.9-18.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 678.8 KiB gnupg2-gpgconf x86_64 0:2.4.9-18.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 253.8 KiB gnupg2-keyboxd x86_64 0:2.4.9-18.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 201.3 KiB gnupg2-verify x86_64 0:2.4.9-18.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 356.3 KiB gnutls x86_64 0:3.8.13-5.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.8 MiB go-srpm-macros noarch 0:3.8.0-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 61.9 KiB gpgverify noarch 0:2.2-5.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 8.7 KiB ima-evm-utils-libs x86_64 0:1.6.2-12.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 56.6 KiB jansson x86_64 0:2.14-5.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 89.0 KiB java-srpm-macros noarch 0:1-9.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 870.0 B json-c x86_64 0:0.18-9.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 82.7 KiB kernel-srpm-macros noarch 0:1.0-30.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 KiB keyutils-libs x86_64 0:1.6.3-8.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 54.2 KiB krb5-libs x86_64 0:1.22.2-9.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.4 MiB libacl x86_64 0:2.4.0-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 43.9 KiB libarchive x86_64 0:3.8.9-2.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 MiB libassuan x86_64 0:2.5.7-6.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 163.9 KiB libattr x86_64 0:2.6.0-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 24.3 KiB libblkid x86_64 0:2.42.4-2.fc46 copr_base 282.3 KiB libbrotli x86_64 0:1.2.0-6.fc46 copr_base 865.0 KiB libcap x86_64 0:2.78-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 208.2 KiB libcap-ng x86_64 0:0.9.6-1.fc46 copr_base 68.8 KiB libcbor x86_64 0:0.14.0-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 83.5 KiB libcom_err x86_64 0:1.47.4-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 63.0 KiB libcurl x86_64 0:8.23.0-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.1 MiB libeconf x86_64 0:0.7.9-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 64.8 KiB libevent x86_64 0:2.1.13-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 980.7 KiB libfdisk x86_64 0:2.42.4-2.fc46 copr_base 392.3 KiB libffi x86_64 0:3.8.0-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 95.5 KiB libfido2 x86_64 0:1.17.0-6.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 256.5 KiB libfsverity x86_64 0:1.7-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 24.4 KiB libgcc x86_64 0:16.2.1-2.fc46.1 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 270.7 KiB libgcrypt x86_64 0:1.12.4-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.7 MiB libgomp x86_64 0:16.2.1-2.fc46.1 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 577.5 KiB libgpg-error x86_64 0:1.61-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 953.9 KiB libidn2 x86_64 0:2.3.8-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 556.4 KiB libksba x86_64 0:1.8.1-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 431.9 KiB liblastlog2 x86_64 0:2.42.4-2.fc46 copr_base 37.6 KiB libmount x86_64 0:2.42.4-2.fc46 copr_base 408.9 KiB libnghttp2 x86_64 0:1.69.0-6.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 166.1 KiB libnghttp3 x86_64 0:1.18.0-1.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 163.4 KiB libpfm x86_64 0:4.14.1-2.fc46 copr_base 2.4 MiB libpkgconf x86_64 0:2.5.1-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 90.1 KiB libpsl x86_64 0:0.23.3-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 80.4 KiB libselinux x86_64 0:3.11-5.fc46 copr_base 205.2 KiB libselinux-utils x86_64 0:3.11-5.fc46 copr_base 306.0 KiB libsemanage x86_64 0:3.11-4.fc46 copr_base 320.6 KiB libsepol x86_64 0:3.11-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 866.1 KiB libsmartcols x86_64 0:2.42.4-2.fc46 copr_base 188.5 KiB libssh x86_64 0:0.12.2-1.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 725.7 KiB libssh-config noarch 0:0.12.2-1.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 277.0 B libstdc++ x86_64 0:16.2.1-2.fc46.1 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.1 MiB libtasn1 x86_64 0:4.21.0-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 176.6 KiB libtool-ltdl x86_64 0:2.6.2-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 70.0 KiB libunistring x86_64 0:1.1-12.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.7 MiB libusb1 x86_64 0:1.0.30-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 180.1 KiB libuuid x86_64 0:2.42.4-2.fc46 copr_base 37.2 KiB libverto x86_64 0:0.3.2-13.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 25.3 KiB libxcrypt x86_64 0:4.5.2-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 293.2 KiB libxml2 x86_64 0:2.15.4-1.fc46 copr_base 1.7 MiB libzstd x86_64 0:1.5.7-6.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 956.1 KiB linkdupes x86_64 0:0.7.3-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 782.1 KiB lua-libs x86_64 0:5.5.1-2.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 298.0 KiB lua-srpm-macros noarch 0:1-18.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.3 KiB lz4-libs x86_64 0:1.10.0-5.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 165.3 KiB meson-srpm-macros noarch 0:1.12.1-2.fc46 copr_base 1.7 KiB mpfr x86_64 0:4.2.2-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 849.2 KiB ncurses-base noarch 0:6.6-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 329.7 KiB ncurses-libs x86_64 0:6.6-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 969.1 KiB nettle x86_64 0:4.0-5.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 801.9 KiB ngtcp2 x86_64 0:1.22.1-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 334.3 KiB ngtcp2-crypto-ossl x86_64 0:1.22.1-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 51.6 KiB npth x86_64 0:1.8-5.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 49.5 KiB ocaml-srpm-macros noarch 0:11-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 KiB openblas-srpm-macros noarch 0:2-23.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 124.0 B openldap x86_64 0:2.6.15-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 683.4 KiB openssl-libs x86_64 1:4.0.3-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 6.7 MiB p11-kit x86_64 0:0.26.5-1.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.6 MiB p11-kit-trust x86_64 0:0.26.5-1.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 478.4 KiB package-notes-srpm-macros noarch 0:0.20-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 KiB pam-libs x86_64 0:1.7.2-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 134.5 KiB pcre2 x86_64 0:10.47-1.fc45.2 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 718.5 KiB pcre2-syntax noarch 0:10.47-1.fc45.2 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 281.9 KiB perl-srpm-macros noarch 0:1-65.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 861.0 B pkgconf x86_64 0:2.5.1-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 92.7 KiB pkgconf-m4 noarch 0:2.5.1-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 14.3 KiB pkgconf-pkg-config x86_64 0:2.5.1-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 989.0 B policycoreutils x86_64 0:3.11-2.fc46 copr_base 892.9 KiB popt x86_64 0:1.19-11.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 136.7 KiB publicsuffix-list-dafsa noarch 0:20260624-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 71.3 KiB pyproject-srpm-macros noarch 0:1.24.0-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 3.4 KiB python-srpm-macros noarch 0:3.15-8.fc44 copr_base 51.6 KiB qt5-srpm-macros noarch 0:5.15.18-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 500.0 B qt6-srpm-macros noarch 0:6.11.2-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 472.0 B readline x86_64 0:8.3-7.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 515.6 KiB redhat-systemd-presets noarch 0:102-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.0 KiB redhat-systemd-presets-common noarch 0:102-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 16.9 KiB rpm x86_64 0:6.1.0-1.fc46 copr_base 3.1 MiB rpm-build-libs x86_64 0:6.1.0-1.fc46 copr_base 288.3 KiB rpm-libs x86_64 0:6.1.0-1.fc46 copr_base 1.1 MiB rpm-plugin-selinux x86_64 0:6.1.0-1.fc46 copr_base 11.9 KiB rpm-sequoia x86_64 0:1.10.3-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.4 MiB rpm-sign-libs x86_64 0:6.1.0-1.fc46 copr_base 39.6 KiB rust-srpm-macros noarch 0:28.5-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 5.5 KiB selinux-policy noarch 0:45.21-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 32.1 KiB selinux-policy-targeted noarch 0:45.21-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 19.0 MiB setup noarch 0:2.15.1-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 725.6 KiB sqlite-libs x86_64 0:3.53.4-1.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.6 MiB systemd-libs x86_64 0:262.1-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 2.8 MiB systemd-standalone-sysusers x86_64 0:262.1-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 981.2 KiB tpm2-tss x86_64 0:4.2.0-1.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.7 MiB tree-sitter-srpm-macros noarch 0:0.4.6-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 8.6 KiB util-linux-core x86_64 0:2.42.4-2.fc46 copr_base 1.5 MiB xxhash-libs x86_64 0:0.8.4-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 94.0 KiB xz-libs x86_64 1:5.8.4-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 221.7 KiB zig-srpm-macros noarch 0:1-9.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.3 KiB zip x86_64 0:3.0-46.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 694.1 KiB zlib-ng-compat x86_64 0:2.3.3-6.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 165.6 KiB zstd x86_64 0:1.5.7-6.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 502.6 KiB Installing groups: Buildsystem building group Transaction Summary: Installing: 190 packages Total size of inbound packages is 71 MiB. Need to download 71 MiB. After this operation, 231 MiB extra will be used (install 231 MiB, remove 0 B). [ 1/190] bzip2-0:1.0.8-24.fc45.x86_64 100% | 395.9 KiB/s | 52.3 KiB | 00m00s [ 2/190] cpio-0:2.15-10.fc45.x86_64 100% | 4.7 MiB/s | 286.0 KiB | 00m00s [ 3/190] coreutils-0:9.12-1.fc46.x86_6 100% | 6.2 MiB/s | 1.3 MiB | 00m00s [ 4/190] bash-0:5.3.20-1.fc46.x86_64 100% | 8.5 MiB/s | 1.9 MiB | 00m00s [ 5/190] diffutils-0:3.12-6.fc45.x86_6 100% | 9.0 MiB/s | 388.4 KiB | 00m00s [ 6/190] fedora-release-common-0:46-0. 100% | 650.4 KiB/s | 18.2 KiB | 00m00s [ 7/190] findutils-1:4.11.0-2.fc45.x86 100% | 16.6 MiB/s | 561.7 KiB | 00m00s [ 8/190] glibc-minimal-langpack-0:2.44 100% | 4.1 MiB/s | 139.0 KiB | 00m00s [ 9/190] gawk-0:5.4.1-1.fc45.x86_64 100% | 30.7 MiB/s | 1.2 MiB | 00m00s [ 10/190] grep-0:3.12-4.fc45.x86_64 100% | 7.5 MiB/s | 291.0 KiB | 00m00s [ 11/190] gzip-0:1.15-1.fc46.x86_64 100% | 4.6 MiB/s | 187.2 KiB | 00m00s [ 12/190] info-0:7.3-3.fc45.x86_64 100% | 4.4 MiB/s | 191.2 KiB | 00m00s [ 13/190] rpm-build-0:6.1.0-1.fc46.x86_ 100% | 16.2 MiB/s | 149.4 KiB | 00m00s [ 14/190] patch-0:2.8-6.fc46.x86_64 100% | 2.6 MiB/s | 114.4 KiB | 00m00s [ 15/190] redhat-rpm-config-0:345-5.fc4 100% | 2.0 MiB/s | 71.8 KiB | 00m00s [ 16/190] sed-0:4.10-2.fc45.x86_64 100% | 8.8 MiB/s | 314.0 KiB | 00m00s [ 17/190] shadow-utils-2:4.20.0-2.fc46. 100% | 29.5 MiB/s | 1.4 MiB | 00m00s [ 18/190] tar-2:1.35-9.fc45.x86_64 100% | 21.0 MiB/s | 858.8 KiB | 00m00s [ 19/190] util-linux-0:2.42.4-2.fc46.x8 100% | 202.8 MiB/s | 1.2 MiB | 00m00s [ 20/190] unzip-0:6.0-71.fc45.x86_64 100% | 5.4 MiB/s | 199.6 KiB | 00m00s [ 21/190] which-0:2.25-2.fc45.x86_64 100% | 1.4 MiB/s | 42.2 KiB | 00m00s [ 22/190] xz-1:5.8.4-1.fc46.x86_64 100% | 18.3 MiB/s | 636.7 KiB | 00m00s [ 23/190] xz-libs-1:5.8.4-1.fc46.x86_64 100% | 3.3 MiB/s | 116.5 KiB | 00m00s [ 24/190] glibc-0:2.44.9000-5.fc46.x86_ 100% | 39.4 MiB/s | 2.5 MiB | 00m00s [ 25/190] bzip2-libs-0:1.0.8-24.fc45.x8 100% | 1.2 MiB/s | 43.5 KiB | 00m00s [ 26/190] libselinux-0:3.11-5.fc46.x86_ 100% | 50.7 MiB/s | 103.9 KiB | 00m00s [ 27/190] audit-libs-0:4.2.1-2.fc46.x86 100% | 69.9 MiB/s | 143.2 KiB | 00m00s [ 28/190] libacl-0:2.4.0-2.fc45.x86_64 100% | 808.6 KiB/s | 27.5 KiB | 00m00s [ 29/190] libsemanage-0:3.11-4.fc46.x86 100% | 63.7 MiB/s | 130.4 KiB | 00m00s [ 30/190] libeconf-0:0.7.9-4.fc45.x86_6 100% | 1.0 MiB/s | 35.9 KiB | 00m00s [ 31/190] libxcrypt-0:4.5.2-4.fc45.x86_ 100% | 3.2 MiB/s | 130.9 KiB | 00m00s [ 32/190] filesystem-0:3.18-59.fc45.x86 100% | 25.6 MiB/s | 1.8 MiB | 00m00s [ 33/190] pam-libs-0:1.7.2-4.fc45.x86_6 100% | 1.5 MiB/s | 58.4 KiB | 00m00s [ 34/190] setup-0:2.15.1-2.fc45.noarch 100% | 3.9 MiB/s | 151.5 KiB | 00m00s [ 35/190] R-srpm-macros-0:1.3.7-3.fc45. 100% | 285.9 KiB/s | 11.1 KiB | 00m00s [ 36/190] ansible-srpm-macros-0:1-22.fc 100% | 583.6 KiB/s | 19.8 KiB | 00m00s [ 37/190] cmake-srpm-macros-0:4.3.0-4.f 100% | 5.0 MiB/s | 10.2 KiB | 00m00s [ 38/190] build-reproducibility-srpm-ma 100% | 328.3 KiB/s | 10.8 KiB | 00m00s [ 39/190] glibc-gconv-extra-0:2.44.9000 100% | 21.2 MiB/s | 1.7 MiB | 00m00s [ 40/190] dwz-0:0.17-3.fc45.x86_64 100% | 3.8 MiB/s | 139.2 KiB | 00m00s [ 41/190] efi-srpm-macros-0:6-9.fc45.no 100% | 630.7 KiB/s | 21.4 KiB | 00m00s [ 42/190] file-0:5.48-3.fc46.x86_64 100% | 24.7 MiB/s | 50.6 KiB | 00m00s [ 43/190] erlang-srpm-macros-0:0.4.0-1. 100% | 277.2 KiB/s | 10.0 KiB | 00m00s [ 44/190] fonts-srpm-macros-1:5.0.0-4.f 100% | 969.8 KiB/s | 27.2 KiB | 00m00s [ 45/190] filesystem-srpm-macros-0:3.18 100% | 851.9 KiB/s | 26.4 KiB | 00m00s [ 46/190] forge-srpm-macros-0:0.4.0-5.f 100% | 758.8 KiB/s | 19.7 KiB | 00m00s [ 47/190] gap-srpm-macros-0:2-3.fc45.no 100% | 332.4 KiB/s | 9.3 KiB | 00m00s [ 48/190] ghc-srpm-macros-0:1.10-2.fc45 100% | 314.6 KiB/s | 8.5 KiB | 00m00s [ 49/190] fpc-srpm-macros-0:1.3-17.fc45 100% | 267.7 KiB/s | 7.8 KiB | 00m00s [ 50/190] gnat-srpm-macros-0:7-3.fc45.n 100% | 329.6 KiB/s | 8.6 KiB | 00m00s [ 51/190] gnome-srpm-macros-0:1.0-2.fc4 100% | 327.0 KiB/s | 8.8 KiB | 00m00s [ 52/190] go-srpm-macros-0:3.8.0-3.fc45 100% | 993.1 KiB/s | 27.8 KiB | 00m00s [ 53/190] java-srpm-macros-0:1-9.fc45.n 100% | 295.9 KiB/s | 8.3 KiB | 00m00s [ 54/190] kernel-srpm-macros-0:1.0-30.f 100% | 296.1 KiB/s | 8.3 KiB | 00m00s [ 55/190] lua-srpm-macros-0:1-18.fc45.n 100% | 310.1 KiB/s | 8.7 KiB | 00m00s [ 56/190] meson-srpm-macros-0:1.12.1-2. 100% | 5.8 MiB/s | 11.8 KiB | 00m00s [ 57/190] ocaml-srpm-macros-0:11-4.fc45 100% | 279.7 KiB/s | 9.0 KiB | 00m00s [ 58/190] package-notes-srpm-macros-0:0 100% | 338.6 KiB/s | 10.5 KiB | 00m00s [ 59/190] openblas-srpm-macros-0:2-23.f 100% | 209.7 KiB/s | 7.5 KiB | 00m00s [ 60/190] python-srpm-macros-0:3.15-8.f 100% | 11.8 MiB/s | 24.2 KiB | 00m00s [ 61/190] perl-srpm-macros-0:1-65.fc45. 100% | 232.0 KiB/s | 8.4 KiB | 00m00s [ 62/190] pyproject-srpm-macros-0:1.24. 100% | 426.7 KiB/s | 15.4 KiB | 00m00s [ 63/190] qt5-srpm-macros-0:5.15.18-3.f 100% | 260.1 KiB/s | 8.1 KiB | 00m00s [ 64/190] rpm-0:6.1.0-1.fc46.x86_64 100% | 131.8 MiB/s | 540.0 KiB | 00m00s [ 65/190] qt6-srpm-macros-0:6.11.2-1.fc 100% | 245.4 KiB/s | 9.1 KiB | 00m00s [ 66/190] tree-sitter-srpm-macros-0:0.4 100% | 378.4 KiB/s | 14.0 KiB | 00m00s [ 67/190] rust-srpm-macros-0:28.5-2.fc4 100% | 264.4 KiB/s | 11.4 KiB | 00m00s [ 68/190] zig-srpm-macros-0:1-9.fc45.no 100% | 220.3 KiB/s | 8.8 KiB | 00m00s [ 69/190] zip-0:3.0-46.fc45.x86_64 100% | 6.2 MiB/s | 264.6 KiB | 00m00s [ 70/190] ed-0:1.22.6-1.fc46.x86_64 100% | 2.1 MiB/s | 85.6 KiB | 00m00s [ 71/190] libattr-0:2.6.0-2.fc45.x86_64 100% | 488.0 KiB/s | 18.1 KiB | 00m00s [ 72/190] ncurses-libs-0:6.6-3.fc45.x86 100% | 9.3 MiB/s | 343.7 KiB | 00m00s [ 73/190] pcre2-0:10.47-1.fc45.2.x86_64 100% | 7.3 MiB/s | 276.7 KiB | 00m00s [ 74/190] glibc-common-0:2.44.9000-5.fc 100% | 12.6 MiB/s | 427.2 KiB | 00m00s [ 75/190] libgcc-0:16.2.1-2.fc46.1.x86_ 100% | 4.2 MiB/s | 136.6 KiB | 00m00s [ 76/190] gmp-1:6.3.0-6.fc45.x86_64 100% | 9.8 MiB/s | 321.8 KiB | 00m00s [ 77/190] mpfr-0:4.2.2-4.fc45.x86_64 100% | 10.9 MiB/s | 357.4 KiB | 00m00s [ 78/190] fedora-repos-0:46-0.3.noarch 100% | 354.0 KiB/s | 9.6 KiB | 00m00s [ 79/190] readline-0:8.3-7.fc46.x86_64 100% | 7.0 MiB/s | 228.7 KiB | 00m00s [ 80/190] redhat-systemd-presets-0:102- 100% | 328.6 KiB/s | 8.5 KiB | 00m00s [ 81/190] elfutils-libelf-0:0.196-1.fc4 100% | 7.8 MiB/s | 238.4 KiB | 00m00s [ 82/190] coreutils-common-0:9.12-1.fc4 100% | 47.9 MiB/s | 2.2 MiB | 00m00s [ 83/190] systemd-libs-0:262.1-1.fc46.x 100% | 21.9 MiB/s | 963.7 KiB | 00m00s [ 84/190] openssl-libs-1:4.0.3-1.fc46.x 100% | 35.5 MiB/s | 2.3 MiB | 00m00s [ 85/190] linkdupes-0:0.7.3-3.fc45.x86_ 100% | 11.0 MiB/s | 339.2 KiB | 00m00s [ 86/190] add-determinism-0:0.7.3-3.fc4 100% | 21.2 MiB/s | 845.7 KiB | 00m00s [ 87/190] libblkid-0:2.42.4-2.fc46.x86_ 100% | 43.6 MiB/s | 133.9 KiB | 00m00s [ 88/190] libcap-ng-0:0.9.6-1.fc46.x86_ 100% | 16.9 MiB/s | 34.7 KiB | 00m00s [ 89/190] libfdisk-0:2.42.4-2.fc46.x86_ 100% | 82.8 MiB/s | 169.5 KiB | 00m00s [ 90/190] liblastlog2-0:2.42.4-2.fc46.x 100% | 12.1 MiB/s | 24.9 KiB | 00m00s [ 91/190] libmount-0:2.42.4-2.fc46.x86_ 100% | 87.8 MiB/s | 179.7 KiB | 00m00s [ 92/190] libsmartcols-0:2.42.4-2.fc46. 100% | 86.6 MiB/s | 88.7 KiB | 00m00s [ 93/190] libuuid-0:2.42.4-2.fc46.x86_6 100% | 27.0 MiB/s | 27.6 KiB | 00m00s [ 94/190] util-linux-core-0:2.42.4-2.fc 100% | 184.5 MiB/s | 566.9 KiB | 00m00s [ 95/190] zlib-ng-compat-0:2.3.3-6.fc45 100% | 2.7 MiB/s | 90.4 KiB | 00m00s [ 96/190] libcap-0:2.78-2.fc45.x86_64 100% | 547.1 KiB/s | 88.6 KiB | 00m00s [ 97/190] debugedit-0:5.3-3.fc45.x86_64 100% | 2.0 MiB/s | 87.9 KiB | 00m00s [ 98/190] elfutils-0:0.196-1.fc46.x86_6 100% | 16.6 MiB/s | 664.6 KiB | 00m00s [ 99/190] libarchive-0:3.8.9-2.fc46.x86 100% | 12.1 MiB/s | 446.0 KiB | 00m00s [100/190] binutils-0:2.47.50-19.fc46.x8 100% | 49.9 MiB/s | 5.2 MiB | 00m00s [101/190] libstdc++-0:16.2.1-2.fc46.1.x 100% | 20.8 MiB/s | 1.0 MiB | 00m00s [102/190] rpm-build-libs-0:6.1.0-1.fc46 100% | 65.8 MiB/s | 134.7 KiB | 00m00s [103/190] rpm-libs-0:6.1.0-1.fc46.x86_6 100% | 155.1 MiB/s | 476.5 KiB | 00m00s [104/190] pkgconf-pkg-config-0:2.5.1-2. 100% | 221.3 KiB/s | 9.5 KiB | 00m00s [105/190] popt-0:1.19-11.fc45.x86_64 100% | 1.2 MiB/s | 60.0 KiB | 00m00s [106/190] zstd-0:1.5.7-6.fc45.x86_64 100% | 3.9 MiB/s | 191.7 KiB | 00m00s [107/190] curl-0:8.23.0-1.fc46.x86_64 100% | 5.1 MiB/s | 245.2 KiB | 00m00s [108/190] file-libs-0:5.48-3.fc46.x86_6 100% | 216.0 MiB/s | 884.6 KiB | 00m00s [109/190] libsepol-0:3.11-2.fc45.x86_64 100% | 6.9 MiB/s | 365.2 KiB | 00m00s [110/190] libzstd-0:1.5.7-6.fc45.x86_64 100% | 7.9 MiB/s | 363.9 KiB | 00m00s [111/190] sqlite-libs-0:3.53.4-1.fc45.x 100% | 15.6 MiB/s | 812.1 KiB | 00m00s [112/190] redhat-systemd-presets-common 100% | 330.7 KiB/s | 13.2 KiB | 00m00s [113/190] pkgconf-0:2.5.1-2.fc45.x86_64 100% | 1.4 MiB/s | 49.0 KiB | 00m00s [114/190] pkgconf-m4-0:2.5.1-2.fc45.noa 100% | 394.5 KiB/s | 13.8 KiB | 00m00s [115/190] libpkgconf-0:2.5.1-2.fc45.x86 100% | 1.2 MiB/s | 42.6 KiB | 00m00s [116/190] pcre2-syntax-0:10.47-1.fc45.2 100% | 4.9 MiB/s | 165.1 KiB | 00m00s [117/190] ca-certificates-0:2026.2.90_v 100% | 22.4 MiB/s | 964.7 KiB | 00m00s [118/190] crypto-policies-0:20260713-2. 100% | 1.9 MiB/s | 73.9 KiB | 00m00s [119/190] libxml2-0:2.15.4-1.fc46.x86_6 100% | 132.2 MiB/s | 676.6 KiB | 00m00s [120/190] ncurses-base-0:6.6-3.fc45.noa 100% | 1.4 MiB/s | 63.5 KiB | 00m00s [121/190] fips-provider-0:1.5.3-1.fc46. 100% | 24.5 MiB/s | 1.6 MiB | 00m00s [122/190] lz4-libs-0:1.10.0-5.fc45.x86_ 100% | 1.7 MiB/s | 80.4 KiB | 00m00s [123/190] fedora-gpg-keys-0:46-0.3.noar 100% | 2.4 MiB/s | 132.1 KiB | 00m00s [124/190] elfutils-debuginfod-client-0: 100% | 856.7 KiB/s | 47.1 KiB | 00m00s [125/190] fedora-repos-rawhide-0:46-0.3 100% | 138.8 KiB/s | 9.0 KiB | 00m00s [126/190] libpfm-0:4.14.1-2.fc46.x86_64 100% | 135.7 MiB/s | 277.9 KiB | 00m00s [127/190] elfutils-libs-0:0.196-1.fc46. 100% | 4.8 MiB/s | 284.9 KiB | 00m00s [128/190] json-c-0:0.18-9.fc45.x86_64 100% | 765.3 KiB/s | 46.7 KiB | 00m00s [129/190] gnulib-l10n-0:20241231-4.fc45 100% | 2.3 MiB/s | 143.2 KiB | 00m00s [130/190] libffi-0:3.8.0-1.fc46.x86_64 100% | 786.3 KiB/s | 46.4 KiB | 00m00s [131/190] p11-kit-0:0.26.5-1.fc45.x86_6 100% | 9.4 MiB/s | 546.2 KiB | 00m00s [132/190] p11-kit-trust-0:0.26.5-1.fc45 100% | 2.5 MiB/s | 146.3 KiB | 00m00s [133/190] alternatives-0:1.33-6.fc45.x8 100% | 788.9 KiB/s | 39.4 KiB | 00m00s [134/190] lua-libs-0:5.5.1-2.fc46.x86_6 100% | 2.9 MiB/s | 144.4 KiB | 00m00s [135/190] jansson-0:2.14-5.fc45.x86_64 100% | 902.5 KiB/s | 46.9 KiB | 00m00s [136/190] rpm-sign-libs-0:6.1.0-1.fc46. 100% | 26.2 MiB/s | 26.9 KiB | 00m00s [137/190] rpm-sequoia-0:1.10.3-1.fc46.x 100% | 18.8 MiB/s | 942.6 KiB | 00m00s [138/190] libtasn1-0:4.21.0-2.fc45.x86_ 100% | 1.9 MiB/s | 75.9 KiB | 00m00s [139/190] libgomp-0:16.2.1-2.fc46.1.x86 100% | 7.9 MiB/s | 397.6 KiB | 00m00s [140/190] gnupg2-0:2.4.9-18.fc45.x86_64 100% | 30.9 MiB/s | 1.6 MiB | 00m00s [141/190] ima-evm-utils-libs-0:1.6.2-12 100% | 604.8 KiB/s | 30.2 KiB | 00m00s [142/190] libfsverity-0:1.7-4.fc45.x86_ 100% | 310.8 KiB/s | 19.0 KiB | 00m00s [143/190] gpgverify-0:2.2-5.fc45.noarch 100% | 217.5 KiB/s | 11.3 KiB | 00m00s [144/190] tpm2-tss-0:4.2.0-1.fc45.x86_6 100% | 7.5 MiB/s | 451.0 KiB | 00m00s [145/190] gnupg2-verify-0:2.4.9-18.fc45 100% | 3.3 MiB/s | 176.1 KiB | 00m00s [146/190] libassuan-0:2.5.7-6.fc45.x86_ 100% | 1.4 MiB/s | 68.5 KiB | 00m00s [147/190] libgpg-error-0:1.61-2.fc45.x8 100% | 5.1 MiB/s | 247.7 KiB | 00m00s [148/190] libgcrypt-0:1.12.4-1.fc46.x86 100% | 10.3 MiB/s | 631.2 KiB | 00m00s [149/190] npth-0:1.8-5.fc45.x86_64 100% | 620.8 KiB/s | 25.5 KiB | 00m00s [150/190] gnupg2-dirmngr-0:2.4.9-18.fc4 100% | 7.9 MiB/s | 281.6 KiB | 00m00s [151/190] gnupg2-gpg-agent-0:2.4.9-18.f 100% | 6.9 MiB/s | 281.3 KiB | 00m00s [152/190] gnupg2-gpgconf-0:2.4.9-18.fc4 100% | 3.0 MiB/s | 116.5 KiB | 00m00s [153/190] gnupg2-keyboxd-0:2.4.9-18.fc4 100% | 2.1 MiB/s | 96.6 KiB | 00m00s [154/190] libusb1-0:1.0.30-2.fc45.x86_6 100% | 1.8 MiB/s | 83.8 KiB | 00m00s [155/190] libksba-0:1.8.1-1.fc46.x86_64 100% | 4.0 MiB/s | 172.6 KiB | 00m00s [156/190] gnutls-0:3.8.13-5.fc46.x86_64 100% | 26.2 MiB/s | 1.4 MiB | 00m00s [157/190] openldap-0:2.6.15-1.fc46.x86_ 100% | 5.7 MiB/s | 273.0 KiB | 00m00s [158/190] cyrus-sasl-lib-0:2.1.28-37.fc 100% | 16.0 MiB/s | 817.8 KiB | 00m00s [159/190] libtool-ltdl-0:2.6.2-1.fc46.x 100% | 993.5 KiB/s | 36.8 KiB | 00m00s [160/190] libevent-0:2.1.13-1.fc46.x86_ 100% | 7.4 MiB/s | 289.4 KiB | 00m00s [161/190] libidn2-0:2.3.8-4.fc45.x86_64 100% | 4.7 MiB/s | 169.2 KiB | 00m00s [162/190] libunistring-0:1.1-12.fc45.x8 100% | 14.4 MiB/s | 545.8 KiB | 00m00s [163/190] nettle-0:4.0-5.fc45.x86_64 100% | 11.3 MiB/s | 429.7 KiB | 00m00s [164/190] gdbm-libs-1:1.26-1.fc46.x86_6 100% | 1.8 MiB/s | 60.1 KiB | 00m00s [165/190] fedora-release-0:46-0.1.noarc 100% | 424.7 KiB/s | 11.9 KiB | 00m00s [166/190] fedora-release-identity-basic 100% | 436.5 KiB/s | 12.7 KiB | 00m00s [167/190] libcurl-0:8.23.0-1.fc46.x86_6 100% | 14.3 MiB/s | 497.5 KiB | 00m00s [168/190] gdb-minimal-0:17.2-6.fc46.x86 100% | 263.2 MiB/s | 4.7 MiB | 00m00s [169/190] systemd-standalone-sysusers-0 100% | 11.2 MiB/s | 434.1 KiB | 00m00s [170/190] policycoreutils-0:3.11-2.fc46 100% | 115.6 MiB/s | 236.7 KiB | 00m00s [171/190] xxhash-libs-0:0.8.4-1.fc46.x8 100% | 1.1 MiB/s | 41.3 KiB | 00m00s [172/190] rpm-plugin-selinux-0:6.1.0-1. 100% | 8.7 MiB/s | 17.7 KiB | 00m00s [173/190] selinux-policy-targeted-0:45. 100% | 88.2 MiB/s | 6.6 MiB | 00m00s [174/190] libbrotli-0:1.2.0-6.fc46.x86_ 100% | 169.6 MiB/s | 347.3 KiB | 00m00s [175/190] selinux-policy-0:45.21-1.fc46 100% | 1.2 MiB/s | 42.0 KiB | 00m00s [176/190] krb5-libs-0:1.22.2-9.fc45.x86 100% | 17.7 MiB/s | 799.0 KiB | 00m00s [177/190] libnghttp2-0:1.69.0-6.fc46.x8 100% | 2.4 MiB/s | 77.2 KiB | 00m00s [178/190] libnghttp3-0:1.18.0-1.fc45.x8 100% | 2.4 MiB/s | 75.1 KiB | 00m00s [179/190] libpsl-0:0.23.3-1.fc46.x86_64 100% | 2.2 MiB/s | 67.7 KiB | 00m00s [180/190] libssh-0:0.12.2-1.fc45.x86_64 100% | 8.8 MiB/s | 295.9 KiB | 00m00s [181/190] ngtcp2-0:1.22.1-3.fc45.x86_64 100% | 4.5 MiB/s | 157.7 KiB | 00m00s [182/190] ngtcp2-crypto-ossl-0:1.22.1-3 100% | 897.6 KiB/s | 27.8 KiB | 00m00s [183/190] keyutils-libs-0:1.6.3-8.fc45. 100% | 1.0 MiB/s | 31.5 KiB | 00m00s [184/190] libcom_err-0:1.47.4-2.fc45.x8 100% | 950.2 KiB/s | 26.6 KiB | 00m00s [185/190] libselinux-utils-0:3.11-5.fc4 100% | 55.8 MiB/s | 114.3 KiB | 00m00s [186/190] libverto-0:0.3.2-13.fc45.x86_ 100% | 699.1 KiB/s | 21.0 KiB | 00m00s [187/190] libfido2-0:1.17.0-6.fc46.x86_ 100% | 3.5 MiB/s | 107.0 KiB | 00m00s [188/190] libssh-config-0:0.12.2-1.fc45 100% | 298.0 KiB/s | 8.9 KiB | 00m00s [189/190] publicsuffix-list-dafsa-0:202 100% | 2.2 MiB/s | 61.1 KiB | 00m00s [190/190] libcbor-0:0.14.0-3.fc45.x86_6 100% | 1.2 MiB/s | 36.8 KiB | 00m00s -------------------------------------------------------------------------------- [190/190] Total 100% | 28.8 MiB/s | 70.8 MiB | 00m02s Running transaction [ 1/192] Verify package files 100% | 509.0 B/s | 190.0 B | 00m00s >>> Running %pretrans scriptlet: filesystem-0:3.18-59.fc45.x86_64 >>> Finished %pretrans scriptlet: filesystem-0:3.18-59.fc45.x86_64 >>> [RPM] /var/lib/mock/fedora-rawhide-x86_64-1792490956.514947/root/var/cache/dnf/copr_base-b76b6b6713922040/packages/rpm-build-6.1.0-1.fc46.x86_64.rpm: Header OpenPGP V4 RSA/SHA256 signature, key ID 67020b3cda6479eb: NOKEY [ 2/192] Prepare transaction 100% | 3.5 KiB/s | 190.0 B | 00m00s [ 3/192] Installing libgcc-0:16.2.1-2. 100% | 266.0 MiB/s | 272.4 KiB | 00m00s [ 4/192] Installing redhat-systemd-pre 100% | 0.0 B/s | 1.5 KiB | 00m00s [ 5/192] Installing redhat-systemd-pre 100% | 0.0 B/s | 18.1 KiB | 00m00s [ 6/192] Installing publicsuffix-list- 100% | 0.0 B/s | 72.0 KiB | 00m00s [ 7/192] Installing libssh-config-0:0. 100% | 0.0 B/s | 816.0 B | 00m00s [ 8/192] Installing fedora-release-ide 100% | 0.0 B/s | 920.0 B | 00m00s [ 9/192] Installing fedora-repos-rawhi 100% | 0.0 B/s | 2.5 KiB | 00m00s [ 10/192] Installing fedora-gpg-keys-0: 100% | 59.2 MiB/s | 181.7 KiB | 00m00s [ 11/192] Installing fedora-repos-0:46- 100% | 0.0 B/s | 5.9 KiB | 00m00s [ 12/192] Installing fedora-release-com 100% | 0.0 B/s | 8.0 KiB | 00m00s [ 13/192] Installing fedora-release-0:4 100% | 8.6 KiB/s | 124.0 B | 00m00s >>> Running sysusers scriptlet: setup-0:2.15.1-2.fc45.noarch >>> Finished sysusers scriptlet: setup-0:2.15.1-2.fc45.noarch >>> Scriptlet output: >>> Creating group 'adm' with GID 4. >>> Creating group 'audio' with GID 63. >>> Creating group 'cdrom' with GID 11. >>> Creating group 'clock' with GID 103. >>> Creating group 'dialout' with GID 18. >>> Creating group 'disk' with GID 6. >>> Creating group 'floppy' with GID 19. >>> Creating group 'ftp' with GID 50. >>> Creating group 'games' with GID 20. >>> Creating group 'input' with GID 104. >>> Creating group 'kmem' with GID 9. >>> Creating group 'kvm' with GID 36. >>> Creating group 'lock' with GID 54. >>> Creating group 'lp' with GID 7. >>> Creating group 'mail' with GID 12. >>> Creating group 'man' with GID 15. >>> Creating group 'mem' with GID 8. >>> Creating group 'nobody' with GID 65534. >>> Creating group 'render' with GID 105. >>> Creating group 'root' with GID 0. >>> Creating group 'sgx' with GID 106. >>> Creating group 'sys' with GID 3. >>> Creating group 'tape' with GID 33. >>> Creating group 'tty' with GID 5. >>> Creating group 'users' with GID 100. >>> Creating group 'utmp' with GID 22. >>> Creating group 'video' with GID 39. >>> Creating group 'wheel' with GID 10. >>> Creating user 'adm' (adm) with UID 3 and GID 4. >>> Creating group 'bin' with GID 1. >>> Creating user 'bin' (bin) with UID 1 and GID 1. >>> Creating group 'daemon' with GID 2. >>> Creating user 'daemon' (daemon) with UID 2 and GID 2. >>> Creating user 'ftp' (FTP User) with UID 14 and GID 50. >>> Creating user 'games' (games) with UID 12 and GID 100. >>> Creating user 'halt' (halt) with UID 7 and GID 0. >>> Creating user 'lp' (lp) with UID 4 and GID 7. >>> Creating user 'mail' (mail) with UID 8 and GID 12. >>> Creating user 'nobody' (Kernel Overflow User) with UID 65534 and GID 65534. >>> Creating user 'operator' (operator) with UID 11 and GID 0. >>> Creating user 'root' (Super User) with UID 0 and GID 0. >>> Creating user 'shutdown' (shutdown) with UID 6 and GID 0. >>> Creating user 'sync' (sync) with UID 5 and GID 0. >>> [ 14/192] Installing setup-0:2.15.1-2.f 100% | 44.6 MiB/s | 731.3 KiB | 00m00s >>> [RPM] /etc/hosts created as /etc/hosts.rpmnew [ 15/192] Installing filesystem-0:3.18- 100% | 2.9 MiB/s | 253.6 KiB | 00m00s >>> [RPM] failed to open /usr/lib/group for id/name lookup: No such file or directory [ 16/192] Installing gnulib-l10n-0:2024 100% | 215.5 MiB/s | 661.9 KiB | 00m00s [ 17/192] Installing coreutils-common-0 100% | 444.7 MiB/s | 11.6 MiB | 00m00s [ 18/192] Installing ncurses-base-0:6.6 100% | 115.7 MiB/s | 355.3 KiB | 00m00s [ 19/192] Installing bash-0:5.3.20-1.fc 100% | 264.8 MiB/s | 8.5 MiB | 00m00s [ 20/192] Installing glibc-common-0:2.4 100% | 54.5 MiB/s | 1.0 MiB | 00m00s [ 21/192] Installing glibc-gconv-extra- 100% | 338.6 MiB/s | 7.8 MiB | 00m00s [ 22/192] Installing glibc-0:2.44.9000- 100% | 188.9 MiB/s | 7.2 MiB | 00m00s [ 23/192] Installing ncurses-libs-0:6.6 100% | 317.4 MiB/s | 974.9 KiB | 00m00s [ 24/192] Installing glibc-minimal-lang 100% | 0.0 B/s | 124.0 B | 00m00s [ 25/192] Installing zlib-ng-compat-0:2 100% | 162.5 MiB/s | 166.4 KiB | 00m00s [ 26/192] Installing bzip2-libs-0:1.0.8 100% | 0.0 B/s | 81.6 KiB | 00m00s [ 27/192] Installing libgpg-error-0:1.6 100% | 55.1 MiB/s | 959.7 KiB | 00m00s [ 28/192] Installing readline-0:8.3-7.f 100% | 252.8 MiB/s | 517.7 KiB | 00m00s [ 29/192] Installing libstdc++-0:16.2.1 100% | 440.9 MiB/s | 3.1 MiB | 00m00s [ 30/192] Installing libzstd-0:1.5.7-6. 100% | 467.5 MiB/s | 957.4 KiB | 00m00s [ 31/192] Installing elfutils-libelf-0: 100% | 481.0 MiB/s | 1.4 MiB | 00m00s [ 32/192] Installing libassuan-0:2.5.7- 100% | 161.8 MiB/s | 165.7 KiB | 00m00s [ 33/192] Installing libgcrypt-0:1.12.4 100% | 416.6 MiB/s | 1.7 MiB | 00m00s [ 34/192] Installing libacl-0:2.4.0-2.f 100% | 0.0 B/s | 44.7 KiB | 00m00s [ 35/192] Installing gmp-1:6.3.0-6.fc45 100% | 399.1 MiB/s | 817.4 KiB | 00m00s [ 36/192] Installing systemd-libs-0:262 100% | 395.7 MiB/s | 2.8 MiB | 00m00s [ 37/192] Installing libuuid-0:2.42.4-2 100% | 0.0 B/s | 38.2 KiB | 00m00s [ 38/192] Installing xz-libs-1:5.8.4-1. 100% | 217.6 MiB/s | 222.8 KiB | 00m00s [ 39/192] Installing popt-0:1.19-11.fc4 100% | 70.0 MiB/s | 143.3 KiB | 00m00s [ 40/192] Installing sqlite-libs-0:3.53 100% | 404.7 MiB/s | 1.6 MiB | 00m00s [ 41/192] Installing npth-0:1.8-5.fc45. 100% | 0.0 B/s | 50.6 KiB | 00m00s [ 42/192] Installing elfutils-libs-0:0. 100% | 352.2 MiB/s | 721.3 KiB | 00m00s [ 43/192] Installing libblkid-0:2.42.4- 100% | 276.6 MiB/s | 283.3 KiB | 00m00s [ 44/192] Installing libsepol-0:3.11-2. 100% | 423.4 MiB/s | 867.1 KiB | 00m00s [ 45/192] Installing gnupg2-gpgconf-0:2 100% | 15.6 MiB/s | 255.9 KiB | 00m00s [ 46/192] Installing libxcrypt-0:4.5.2- 100% | 289.0 MiB/s | 295.9 KiB | 00m00s [ 47/192] Installing json-c-0:0.18-9.fc 100% | 0.0 B/s | 83.9 KiB | 00m00s [ 48/192] Installing libtasn1-0:4.21.0- 100% | 174.3 MiB/s | 178.5 KiB | 00m00s [ 49/192] Installing libunistring-0:1.1 100% | 433.6 MiB/s | 1.7 MiB | 00m00s [ 50/192] Installing libidn2-0:2.3.8-4. 100% | 49.9 MiB/s | 562.6 KiB | 00m00s [ 51/192] Installing crypto-policies-0: 100% | 38.9 MiB/s | 159.5 KiB | 00m00s [ 52/192] Installing gnupg2-verify-0:2. 100% | 20.5 MiB/s | 357.7 KiB | 00m00s [ 53/192] Installing mpfr-0:4.2.2-4.fc4 100% | 277.0 MiB/s | 850.9 KiB | 00m00s [ 54/192] Installing gawk-0:5.4.1-1.fc4 100% | 111.4 MiB/s | 2.2 MiB | 00m00s [ 55/192] Installing dwz-0:0.17-3.fc45. 100% | 19.0 MiB/s | 292.5 KiB | 00m00s [ 56/192] Installing libksba-0:1.8.1-1. 100% | 424.2 MiB/s | 434.4 KiB | 00m00s [ 57/192] Installing unzip-0:6.0-71.fc4 100% | 27.2 MiB/s | 445.3 KiB | 00m00s [ 58/192] Installing file-libs-0:5.48-3 100% | 726.1 MiB/s | 12.3 MiB | 00m00s [ 59/192] Installing file-0:5.48-3.fc46 100% | 6.7 MiB/s | 103.4 KiB | 00m00s [ 60/192] Installing diffutils-0:3.12-6 100% | 82.4 MiB/s | 1.6 MiB | 00m00s [ 61/192] Installing libeconf-0:0.7.9-4 100% | 0.0 B/s | 66.4 KiB | 00m00s [ 62/192] Installing libattr-0:2.6.0-2. 100% | 0.0 B/s | 25.2 KiB | 00m00s [ 63/192] Installing libcap-ng-0:0.9.6- 100% | 0.0 B/s | 70.6 KiB | 00m00s [ 64/192] Installing audit-libs-0:4.2.1 100% | 383.9 MiB/s | 393.1 KiB | 00m00s [ 65/192] Installing pam-libs-0:1.7.2-4 100% | 133.7 MiB/s | 136.9 KiB | 00m00s [ 66/192] Installing libcap-0:2.78-2.fc 100% | 13.9 MiB/s | 213.3 KiB | 00m00s [ 67/192] Installing libsmartcols-0:2.4 100% | 185.2 MiB/s | 189.6 KiB | 00m00s [ 68/192] Installing libffi-0:3.8.0-1.f 100% | 94.6 MiB/s | 96.9 KiB | 00m00s [ 69/192] Installing p11-kit-0:0.26.5-1 100% | 119.8 MiB/s | 2.6 MiB | 00m00s [ 70/192] Installing alternatives-0:1.3 100% | 4.1 MiB/s | 63.6 KiB | 00m00s [ 71/192] Installing p11-kit-trust-0:0. 100% | 18.8 MiB/s | 480.1 KiB | 00m00s [ 72/192] Installing lua-libs-0:5.5.1-2 100% | 292.4 MiB/s | 299.4 KiB | 00m00s [ 73/192] Installing ngtcp2-0:1.22.1-3. 100% | 327.9 MiB/s | 335.8 KiB | 00m00s [ 74/192] Installing liblastlog2-0:2.42 100% | 6.5 MiB/s | 39.8 KiB | 00m00s [ 75/192] Installing zip-0:3.0-46.fc45. 100% | 40.1 MiB/s | 698.0 KiB | 00m00s [ 76/192] Installing gnupg2-keyboxd-0:2 100% | 28.3 MiB/s | 202.5 KiB | 00m00s [ 77/192] Installing libpsl-0:0.23.3-1. 100% | 79.6 MiB/s | 81.5 KiB | 00m00s [ 78/192] Installing libfdisk-0:2.42.4- 100% | 384.0 MiB/s | 393.2 KiB | 00m00s [ 79/192] Installing fips-provider-0:1. 100% | 439.0 MiB/s | 4.8 MiB | 00m00s [ 80/192] Installing libusb1-0:1.0.30-2 100% | 177.5 MiB/s | 181.8 KiB | 00m00s [ 81/192] Installing nettle-0:4.0-5.fc4 100% | 393.1 MiB/s | 805.0 KiB | 00m00s [ 82/192] Installing gnutls-0:3.8.13-5. 100% | 426.4 MiB/s | 3.8 MiB | 00m00s [ 83/192] Installing zstd-0:1.5.7-6.fc4 100% | 29.1 MiB/s | 506.1 KiB | 00m00s [ 84/192] Installing libxml2-0:2.15.4-1 100% | 87.1 MiB/s | 1.7 MiB | 00m00s [ 85/192] Installing bzip2-0:1.0.8-24.f 100% | 6.5 MiB/s | 99.5 KiB | 00m00s [ 86/192] Installing add-determinism-0: 100% | 107.9 MiB/s | 2.2 MiB | 00m00s [ 87/192] Installing cpio-0:2.15-10.fc4 100% | 61.3 MiB/s | 1.1 MiB | 00m00s [ 88/192] Installing ed-0:1.22.6-1.fc46 100% | 10.0 MiB/s | 153.2 KiB | 00m00s [ 89/192] Installing patch-0:2.8-6.fc46 100% | 14.9 MiB/s | 228.1 KiB | 00m00s [ 90/192] Installing libpkgconf-0:2.5.1 100% | 89.1 MiB/s | 91.3 KiB | 00m00s [ 91/192] Installing pkgconf-0:2.5.1-2. 100% | 6.2 MiB/s | 95.2 KiB | 00m00s [ 92/192] Installing lz4-libs-0:1.10.0- 100% | 162.5 MiB/s | 166.4 KiB | 00m00s [ 93/192] Installing libpfm-0:4.14.1-2. 100% | 593.1 MiB/s | 2.4 MiB | 00m00s [ 94/192] Installing jansson-0:2.14-5.f 100% | 88.2 MiB/s | 90.3 KiB | 00m00s [ 95/192] Installing libgomp-0:16.2.1-2 100% | 565.4 MiB/s | 578.9 KiB | 00m00s [ 96/192] Installing libtool-ltdl-0:2.6 100% | 0.0 B/s | 71.1 KiB | 00m00s [ 97/192] Installing gdbm-libs-1:1.26-1 100% | 132.7 MiB/s | 135.9 KiB | 00m00s [ 98/192] Installing cyrus-sasl-lib-0:2 100% | 116.9 MiB/s | 2.3 MiB | 00m00s [ 99/192] Installing systemd-standalone 100% | 56.4 MiB/s | 981.8 KiB | 00m00s [100/192] Installing xxhash-libs-0:0.8. 100% | 93.1 MiB/s | 95.4 KiB | 00m00s [101/192] Installing libbrotli-0:1.2.0- 100% | 282.3 MiB/s | 867.3 KiB | 00m00s [102/192] Installing libnghttp2-0:1.69. 100% | 163.3 MiB/s | 167.3 KiB | 00m00s [103/192] Installing libnghttp3-0:1.18. 100% | 161.0 MiB/s | 164.8 KiB | 00m00s [104/192] Installing keyutils-libs-0:1. 100% | 0.0 B/s | 55.6 KiB | 00m00s [105/192] Installing libcom_err-0:1.47. 100% | 0.0 B/s | 64.1 KiB | 00m00s [106/192] Installing libverto-0:0.3.2-1 100% | 0.0 B/s | 27.1 KiB | 00m00s [107/192] Installing libcbor-0:0.14.0-3 100% | 0.0 B/s | 84.9 KiB | 00m00s [108/192] Installing filesystem-srpm-ma 100% | 0.0 B/s | 38.9 KiB | 00m00s [109/192] Installing pcre2-syntax-0:10. 100% | 277.7 MiB/s | 284.3 KiB | 00m00s [110/192] Installing pcre2-0:10.47-1.fc 100% | 351.5 MiB/s | 720.0 KiB | 00m00s [111/192] Installing libselinux-0:3.11- 100% | 201.6 MiB/s | 206.4 KiB | 00m00s [112/192] Installing grep-0:3.12-4.fc45 100% | 55.7 MiB/s | 1.0 MiB | 00m00s [113/192] Installing sed-0:4.10-2.fc45. 100% | 47.5 MiB/s | 874.9 KiB | 00m00s [114/192] Installing findutils-1:4.11.0 100% | 97.9 MiB/s | 2.0 MiB | 00m00s [115/192] Installing xz-1:5.8.4-1.fc46. 100% | 71.3 MiB/s | 1.4 MiB | 00m00s [116/192] Installing libsemanage-0:3.11 100% | 314.8 MiB/s | 322.4 KiB | 00m00s [117/192] Installing libmount-0:2.42.4- 100% | 200.2 MiB/s | 410.0 KiB | 00m00s [118/192] Installing util-linux-core-0: 100% | 75.6 MiB/s | 1.5 MiB | 00m00s [119/192] Installing openssl-libs-1:4.0 100% | 394.0 MiB/s | 6.7 MiB | 00m00s [120/192] Installing coreutils-0:9.12-1 100% | 171.7 MiB/s | 6.4 MiB | 00m00s [121/192] Installing ca-certificates-0: 100% | 2.4 MiB/s | 2.5 MiB | 00m01s [122/192] Installing libarchive-0:3.8.9 100% | 327.4 MiB/s | 1.0 MiB | 00m00s [123/192] Installing krb5-libs-0:1.22.2 100% | 119.4 MiB/s | 2.4 MiB | 00m00s >>> Running sysusers scriptlet: tpm2-tss-0:4.2.0-1.fc45.x86_64 >>> Finished sysusers scriptlet: tpm2-tss-0:4.2.0-1.fc45.x86_64 >>> Scriptlet output: >>> Creating group 'tss' with GID 59. >>> Creating user 'tss' (Account used for TPM access) with UID 59 and GID 59. >>> [124/192] Installing tpm2-tss-0:4.2.0-1 100% | 277.9 MiB/s | 1.7 MiB | 00m00s [125/192] Installing ima-evm-utils-libs 100% | 56.5 MiB/s | 57.9 KiB | 00m00s [126/192] Installing gnupg2-gpg-agent-0 100% | 25.6 MiB/s | 682.8 KiB | 00m00s [127/192] Installing gzip-0:1.15-1.fc46 100% | 23.2 MiB/s | 450.7 KiB | 00m00s [128/192] Installing util-linux-0:2.42. 100% | 96.3 MiB/s | 3.8 MiB | 00m00s [129/192] Installing rpm-sequoia-0:1.10 100% | 349.6 MiB/s | 2.4 MiB | 00m00s [130/192] Installing rpm-libs-0:6.1.0-1 100% | 366.4 MiB/s | 1.1 MiB | 00m00s [131/192] Installing libfsverity-0:1.7- 100% | 0.0 B/s | 25.4 KiB | 00m00s [132/192] Installing libevent-0:2.1.13- 100% | 320.5 MiB/s | 984.5 KiB | 00m00s [133/192] Installing openldap-0:2.6.15- 100% | 335.6 MiB/s | 687.2 KiB | 00m00s [134/192] Installing gnupg2-dirmngr-0:2 100% | 25.7 MiB/s | 632.8 KiB | 00m00s [135/192] Installing gnupg2-0:2.4.9-18. 100% | 209.7 MiB/s | 6.5 MiB | 00m00s [136/192] Installing rpm-sign-libs-0:6. 100% | 39.5 MiB/s | 40.5 KiB | 00m00s [137/192] Installing rpm-build-libs-0:6 100% | 282.4 MiB/s | 289.2 KiB | 00m00s [138/192] Installing gpgverify-0:2.2-5. 100% | 0.0 B/s | 9.4 KiB | 00m00s [139/192] Installing ngtcp2-crypto-ossl 100% | 0.0 B/s | 52.5 KiB | 00m00s [140/192] Installing libfido2-0:1.17.0- 100% | 252.0 MiB/s | 258.1 KiB | 00m00s [141/192] Installing libssh-0:0.12.2-1. 100% | 355.4 MiB/s | 727.8 KiB | 00m00s [142/192] Installing libcurl-0:8.23.0-1 100% | 361.9 MiB/s | 1.1 MiB | 00m00s [143/192] Installing elfutils-debuginfo 100% | 5.0 MiB/s | 82.2 KiB | 00m00s [144/192] Installing binutils-0:2.47.50 100% | 310.4 MiB/s | 24.5 MiB | 00m00s [145/192] Installing elfutils-0:0.196-1 100% | 132.4 MiB/s | 3.2 MiB | 00m00s [146/192] Installing gdb-minimal-0:17.2 100% | 277.7 MiB/s | 14.2 MiB | 00m00s [147/192] Installing debugedit-0:5.3-3. 100% | 13.7 MiB/s | 224.1 KiB | 00m00s [148/192] Installing curl-0:8.23.0-1.fc 100% | 18.4 MiB/s | 488.7 KiB | 00m00s [149/192] Installing rpm-0:6.1.0-1.fc46 100% | 71.5 MiB/s | 2.5 MiB | 00m00s [150/192] Installing cmake-srpm-macros- 100% | 0.0 B/s | 804.0 B | 00m00s [151/192] Installing efi-srpm-macros-0: 100% | 0.0 B/s | 41.3 KiB | 00m00s [152/192] Installing java-srpm-macros-0 100% | 0.0 B/s | 1.1 KiB | 00m00s [153/192] Installing lua-srpm-macros-0: 100% | 0.0 B/s | 1.9 KiB | 00m00s [154/192] Installing tree-sitter-srpm-m 100% | 0.0 B/s | 9.6 KiB | 00m00s [155/192] Installing zig-srpm-macros-0: 100% | 0.0 B/s | 1.9 KiB | 00m00s [156/192] Installing tar-2:1.35-9.fc45. 100% | 135.2 MiB/s | 3.0 MiB | 00m00s [157/192] Installing linkdupes-0:0.7.3- 100% | 45.0 MiB/s | 783.5 KiB | 00m00s [158/192] Installing libselinux-utils-0 100% | 18.4 MiB/s | 320.4 KiB | 00m00s [159/192] Installing policycoreutils-0: 100% | 32.1 MiB/s | 921.3 KiB | 00m00s [160/192] Installing selinux-policy-0:4 100% | 1.6 MiB/s | 34.5 KiB | 00m00s [161/192] Installing selinux-policy-tar 100% | 219.6 MiB/s | 15.2 MiB | 00m00s [162/192] Installing build-reproducibil 100% | 0.0 B/s | 1.5 KiB | 00m00s [163/192] Installing pkgconf-m4-0:2.5.1 100% | 0.0 B/s | 14.7 KiB | 00m00s [164/192] Installing pkgconf-pkg-config 100% | 110.8 KiB/s | 1.8 KiB | 00m00s [165/192] Installing rust-srpm-macros-0 100% | 0.0 B/s | 6.4 KiB | 00m00s [166/192] Installing qt6-srpm-macros-0: 100% | 0.0 B/s | 748.0 B | 00m00s [167/192] Installing qt5-srpm-macros-0: 100% | 189.5 KiB/s | 776.0 B | 00m00s [168/192] Installing perl-srpm-macros-0 100% | 0.0 B/s | 1.1 KiB | 00m00s [169/192] Installing package-notes-srpm 100% | 0.0 B/s | 2.1 KiB | 00m00s [170/192] Installing openblas-srpm-macr 100% | 0.0 B/s | 404.0 B | 00m00s [171/192] Installing ocaml-srpm-macros- 100% | 0.0 B/s | 2.1 KiB | 00m00s [172/192] Installing meson-srpm-macros- 100% | 0.0 B/s | 1.9 KiB | 00m00s [173/192] Installing kernel-srpm-macros 100% | 0.0 B/s | 2.3 KiB | 00m00s [174/192] Installing gnome-srpm-macros- 100% | 0.0 B/s | 4.1 KiB | 00m00s [175/192] Installing gnat-srpm-macros-0 100% | 0.0 B/s | 1.3 KiB | 00m00s [176/192] Installing ghc-srpm-macros-0: 100% | 0.0 B/s | 1.0 KiB | 00m00s [177/192] Installing gap-srpm-macros-0: 100% | 0.0 B/s | 2.7 KiB | 00m00s [178/192] Installing fpc-srpm-macros-0: 100% | 0.0 B/s | 420.0 B | 00m00s [179/192] Installing ansible-srpm-macro 100% | 0.0 B/s | 36.2 KiB | 00m00s [180/192] Installing redhat-rpm-config- 100% | 186.0 MiB/s | 190.5 KiB | 00m00s [181/192] Installing forge-srpm-macros- 100% | 0.0 B/s | 40.3 KiB | 00m00s [182/192] Installing rpm-build-0:6.1.0- 100% | 18.5 MiB/s | 322.1 KiB | 00m00s [183/192] Installing erlang-srpm-macros 100% | 0.0 B/s | 2.6 KiB | 00m00s [184/192] Installing pyproject-srpm-mac 100% | 0.0 B/s | 4.0 KiB | 00m00s [185/192] Installing fonts-srpm-macros- 100% | 0.0 B/s | 57.0 KiB | 00m00s [186/192] Installing go-srpm-macros-0:3 100% | 0.0 B/s | 63.0 KiB | 00m00s [187/192] Installing R-srpm-macros-0:1. 100% | 0.0 B/s | 4.4 KiB | 00m00s [188/192] Installing python-srpm-macros 100% | 0.0 B/s | 52.9 KiB | 00m00s [189/192] Installing rpm-plugin-selinux 100% | 0.0 B/s | 12.9 KiB | 00m00s [190/192] Installing which-0:2.25-2.fc4 100% | 5.2 MiB/s | 85.8 KiB | 00m00s [191/192] Installing shadow-utils-2:4.2 100% | 131.5 MiB/s | 3.9 MiB | 00m00s [192/192] Installing info-0:7.3-3.fc45. 100% | 57.6 KiB/s | 372.8 KiB | 00m06s Warning: skipped OpenPGP checks for 190 packages from repositories: copr_base, http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch Complete! Finish: installing minimal buildroot with dnf5 Start: creating root cache Finish: creating root cache Finish: chroot init INFO: Installed packages: INFO: R-srpm-macros-1.3.7-3.fc45.noarch add-determinism-0.7.3-3.fc45.x86_64 alternatives-1.33-6.fc45.x86_64 ansible-srpm-macros-1-22.fc45.noarch audit-libs-4.2.1-2.fc46.x86_64 bash-5.3.20-1.fc46.x86_64 binutils-2.47.50-19.fc46.x86_64 build-reproducibility-srpm-macros-0.7.3-3.fc45.noarch bzip2-1.0.8-24.fc45.x86_64 bzip2-libs-1.0.8-24.fc45.x86_64 ca-certificates-2026.2.90_v9.0.317-1.fc46.noarch cmake-srpm-macros-4.3.0-4.fc45.noarch coreutils-9.12-1.fc46.x86_64 coreutils-common-9.12-1.fc46.x86_64 cpio-2.15-10.fc45.x86_64 crypto-policies-20260713-2.gitc42da77.fc45.noarch curl-8.23.0-1.fc46.x86_64 cyrus-sasl-lib-2.1.28-37.fc45.x86_64 debugedit-5.3-3.fc45.x86_64 diffutils-3.12-6.fc45.x86_64 dwz-0.17-3.fc45.x86_64 ed-1.22.6-1.fc46.x86_64 efi-srpm-macros-6-9.fc45.noarch elfutils-0.196-1.fc46.x86_64 elfutils-debuginfod-client-0.196-1.fc46.x86_64 elfutils-libelf-0.196-1.fc46.x86_64 elfutils-libs-0.196-1.fc46.x86_64 erlang-srpm-macros-0.4.0-1.fc46.noarch fedora-gpg-keys-46-0.3.noarch fedora-release-46-0.1.noarch fedora-release-common-46-0.1.noarch fedora-release-identity-basic-46-0.1.noarch fedora-repos-46-0.3.noarch fedora-repos-rawhide-46-0.3.noarch file-5.48-3.fc46.x86_64 file-libs-5.48-3.fc46.x86_64 filesystem-3.18-59.fc45.x86_64 filesystem-srpm-macros-3.18-59.fc45.noarch findutils-4.11.0-2.fc45.x86_64 fips-provider-1.5.3-1.fc46.x86_64 fonts-srpm-macros-5.0.0-4.fc45.noarch forge-srpm-macros-0.4.0-5.fc45.noarch fpc-srpm-macros-1.3-17.fc45.noarch gap-srpm-macros-2-3.fc45.noarch gawk-5.4.1-1.fc45.x86_64 gdb-minimal-17.2-6.fc46.x86_64 gdbm-libs-1.26-1.fc46.x86_64 ghc-srpm-macros-1.10-2.fc45.noarch glibc-2.44.9000-5.fc46.x86_64 glibc-common-2.44.9000-5.fc46.x86_64 glibc-gconv-extra-2.44.9000-5.fc46.x86_64 glibc-minimal-langpack-2.44.9000-5.fc46.x86_64 gmp-6.3.0-6.fc45.x86_64 gnat-srpm-macros-7-3.fc45.noarch gnome-srpm-macros-1.0-2.fc45.noarch gnulib-l10n-20241231-4.fc45.noarch gnupg2-2.4.9-18.fc45.x86_64 gnupg2-dirmngr-2.4.9-18.fc45.x86_64 gnupg2-gpg-agent-2.4.9-18.fc45.x86_64 gnupg2-gpgconf-2.4.9-18.fc45.x86_64 gnupg2-keyboxd-2.4.9-18.fc45.x86_64 gnupg2-verify-2.4.9-18.fc45.x86_64 gnutls-3.8.13-5.fc46.x86_64 go-srpm-macros-3.8.0-3.fc45.noarch gpgverify-2.2-5.fc45.noarch grep-3.12-4.fc45.x86_64 gzip-1.15-1.fc46.x86_64 ima-evm-utils-libs-1.6.2-12.fc45.x86_64 info-7.3-3.fc45.x86_64 jansson-2.14-5.fc45.x86_64 java-srpm-macros-1-9.fc45.noarch json-c-0.18-9.fc45.x86_64 kernel-srpm-macros-1.0-30.fc45.noarch keyutils-libs-1.6.3-8.fc45.x86_64 krb5-libs-1.22.2-9.fc45.x86_64 libacl-2.4.0-2.fc45.x86_64 libarchive-3.8.9-2.fc46.x86_64 libassuan-2.5.7-6.fc45.x86_64 libattr-2.6.0-2.fc45.x86_64 libblkid-2.42.4-2.fc46.x86_64 libbrotli-1.2.0-6.fc46.x86_64 libcap-2.78-2.fc45.x86_64 libcap-ng-0.9.6-1.fc46.x86_64 libcbor-0.14.0-3.fc45.x86_64 libcom_err-1.47.4-2.fc45.x86_64 libcurl-8.23.0-1.fc46.x86_64 libeconf-0.7.9-4.fc45.x86_64 libevent-2.1.13-1.fc46.x86_64 libfdisk-2.42.4-2.fc46.x86_64 libffi-3.8.0-1.fc46.x86_64 libfido2-1.17.0-6.fc46.x86_64 libfsverity-1.7-4.fc45.x86_64 libgcc-16.2.1-2.fc46.1.x86_64 libgcrypt-1.12.4-1.fc46.x86_64 libgomp-16.2.1-2.fc46.1.x86_64 libgpg-error-1.61-2.fc45.x86_64 libidn2-2.3.8-4.fc45.x86_64 libksba-1.8.1-1.fc46.x86_64 liblastlog2-2.42.4-2.fc46.x86_64 libmount-2.42.4-2.fc46.x86_64 libnghttp2-1.69.0-6.fc46.x86_64 libnghttp3-1.18.0-1.fc45.x86_64 libpfm-4.14.1-2.fc46.x86_64 libpkgconf-2.5.1-2.fc45.x86_64 libpsl-0.23.3-1.fc46.x86_64 libselinux-3.11-5.fc46.x86_64 libselinux-utils-3.11-5.fc46.x86_64 libsemanage-3.11-4.fc46.x86_64 libsepol-3.11-2.fc45.x86_64 libsmartcols-2.42.4-2.fc46.x86_64 libssh-0.12.2-1.fc45.x86_64 libssh-config-0.12.2-1.fc45.noarch libstdc++-16.2.1-2.fc46.1.x86_64 libtasn1-4.21.0-2.fc45.x86_64 libtool-ltdl-2.6.2-1.fc46.x86_64 libunistring-1.1-12.fc45.x86_64 libusb1-1.0.30-2.fc45.x86_64 libuuid-2.42.4-2.fc46.x86_64 libverto-0.3.2-13.fc45.x86_64 libxcrypt-4.5.2-4.fc45.x86_64 libxml2-2.15.4-1.fc46.x86_64 libzstd-1.5.7-6.fc45.x86_64 linkdupes-0.7.3-3.fc45.x86_64 lua-libs-5.5.1-2.fc46.x86_64 lua-srpm-macros-1-18.fc45.noarch lz4-libs-1.10.0-5.fc45.x86_64 meson-srpm-macros-1.12.1-2.fc46.noarch mpfr-4.2.2-4.fc45.x86_64 ncurses-base-6.6-3.fc45.noarch ncurses-libs-6.6-3.fc45.x86_64 nettle-4.0-5.fc45.x86_64 ngtcp2-1.22.1-3.fc45.x86_64 ngtcp2-crypto-ossl-1.22.1-3.fc45.x86_64 npth-1.8-5.fc45.x86_64 ocaml-srpm-macros-11-4.fc45.noarch openblas-srpm-macros-2-23.fc46.noarch openldap-2.6.15-1.fc46.x86_64 openssl-libs-4.0.3-1.fc46.x86_64 p11-kit-0.26.5-1.fc45.x86_64 p11-kit-trust-0.26.5-1.fc45.x86_64 package-notes-srpm-macros-0.20-2.fc45.noarch pam-libs-1.7.2-4.fc45.x86_64 patch-2.8-6.fc46.x86_64 pcre2-10.47-1.fc45.2.x86_64 pcre2-syntax-10.47-1.fc45.2.noarch perl-srpm-macros-1-65.fc45.noarch pkgconf-2.5.1-2.fc45.x86_64 pkgconf-m4-2.5.1-2.fc45.noarch pkgconf-pkg-config-2.5.1-2.fc45.x86_64 policycoreutils-3.11-2.fc46.x86_64 popt-1.19-11.fc45.x86_64 publicsuffix-list-dafsa-20260624-2.fc45.noarch pyproject-srpm-macros-1.24.0-1.fc46.noarch python-srpm-macros-3.15-8.fc44.noarch qt5-srpm-macros-5.15.18-3.fc45.noarch qt6-srpm-macros-6.11.2-1.fc46.noarch readline-8.3-7.fc46.x86_64 redhat-rpm-config-345-5.fc46.noarch redhat-systemd-presets-102-3.fc45.noarch redhat-systemd-presets-common-102-3.fc45.noarch rpm-6.1.0-1.fc46.x86_64 rpm-build-6.1.0-1.fc46.x86_64 rpm-build-libs-6.1.0-1.fc46.x86_64 rpm-libs-6.1.0-1.fc46.x86_64 rpm-plugin-selinux-6.1.0-1.fc46.x86_64 rpm-sequoia-1.10.3-1.fc46.x86_64 rpm-sign-libs-6.1.0-1.fc46.x86_64 rust-srpm-macros-28.5-2.fc45.noarch sed-4.10-2.fc45.x86_64 selinux-policy-45.21-1.fc46.noarch selinux-policy-targeted-45.21-1.fc46.noarch setup-2.15.1-2.fc45.noarch shadow-utils-4.20.0-2.fc46.x86_64 sqlite-libs-3.53.4-1.fc45.x86_64 systemd-libs-262.1-1.fc46.x86_64 systemd-standalone-sysusers-262.1-1.fc46.x86_64 tar-1.35-9.fc45.x86_64 tpm2-tss-4.2.0-1.fc45.x86_64 tree-sitter-srpm-macros-0.4.6-2.fc45.noarch unzip-6.0-71.fc45.x86_64 util-linux-2.42.4-2.fc46.x86_64 util-linux-core-2.42.4-2.fc46.x86_64 which-2.25-2.fc45.x86_64 xxhash-libs-0.8.4-1.fc46.x86_64 xz-5.8.4-1.fc46.x86_64 xz-libs-5.8.4-1.fc46.x86_64 zig-srpm-macros-1-9.fc45.noarch zip-3.0-46.fc45.x86_64 zlib-ng-compat-2.3.3-6.fc45.x86_64 zstd-1.5.7-6.fc45.x86_64 Start: buildsrpm Start: rpmbuild -bs Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1792454400 Wrote: /builddir/build/SRPMS/btrfs-backup-ng-0.9.16-1.fc46.src.rpm Finish: rpmbuild -bs INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-x86_64-1792490956.514947/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names Finish: buildsrpm INFO: Done(/var/lib/copr-rpmbuild/workspace/workdir-hlwshmb8/btrfs-backup-ng/btrfs-backup-ng.spec) Config(child) 0 minutes 24 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_success=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot INFO: Start(/var/lib/copr-rpmbuild/results/btrfs-backup-ng-0.9.16-1.fc46.src.rpm) Config(fedora-rawhide-x86_64) Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1792490956.514947/root. INFO: calling preinit hooks INFO: enabled root cache Start: unpacking root cache Finish: unpacking root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Buildroot is handled by package management from host and used with --installroot: rpm-6.0.2-1.fc44.x86_64 rpm-sequoia-1.10.2-2.fc44.x86_64 python3-dnf-4.24.0-3.fc44.noarch python3-dnf-plugins-core-4.10.1-9.fc44.noarch dnf5-5.4.6.0-1.fc44.x86_64 dnf5-plugins-5.4.6.0-1.fc44.x86_64 Finish: chroot init Start: build phase for btrfs-backup-ng-0.9.16-1.fc46.src.rpm Start: build setup for btrfs-backup-ng-0.9.16-1.fc46.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1792454400 Wrote: /builddir/build/SRPMS/btrfs-backup-ng-0.9.16-1.fc46.src.rpm Updating and loading repositories: Additional repo http_kojipkgs_fedorapr 100% | 31.2 KiB/s | 3.9 KiB | 00m00s fedora 100% | 103.2 KiB/s | 24.2 KiB | 00m00s Copr repository 100% | 12.4 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "bzip2-1.0.8-24.fc45.x86_64" is already installed. Package "gzip-1.15-1.fc46.x86_64" is already installed. Package "xz-1:5.8.4-1.fc46.x86_64" is already installed. Package "zstd-1.5.7-6.fc45.x86_64" is already installed. Package Arch Version Repository Size Installing: btrfs-progs x86_64 0:7.1-3.fc46 copr_base 6.5 MiB dash x86_64 0:0.5.13.2-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 175.9 KiB fish x86_64 0:4.6.0-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 21.2 MiB lz4 x86_64 0:1.10.0-5.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 263.8 KiB lzop x86_64 0:1.04-19.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 98.5 KiB openssl x86_64 1:4.0.3-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.9 MiB pbzip2 x86_64 0:1.1.13-17.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 100.3 KiB pigz x86_64 0:2.8-11.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 177.4 KiB procps-ng x86_64 0:4.0.7-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.1 MiB python3-devel x86_64 0:3.15.0-2.fc46 copr_base 2.5 MiB python3-pytest noarch 0:9.1.1-1.fc46 copr_base 24.3 MiB python3-pytest-asyncio noarch 0:1.4.0-4.fc46 copr_base 171.5 KiB zsh x86_64 0:5.9.2-4.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 8.3 MiB Installing dependencies: e2fsprogs-libs x86_64 0:1.47.4-2.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 555.1 KiB expat x86_64 0:2.8.3-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 338.4 KiB lzo x86_64 0:2.10-17.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 178.8 KiB mpdecimal x86_64 0:4.0.1-4.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 221.2 KiB ncurses-term noarch 0:6.6-3.fc45 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.8 MiB pcre2-utf32 x86_64 0:10.47-1.fc45.2 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 619.1 KiB pyproject-rpm-macros noarch 0:1.24.0-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 169.0 KiB python-pip-wheel noarch 0:26.2.1-3.fc46 copr_base 1.3 MiB python-rpm-macros noarch 0:3.15-8.fc44 copr_base 27.6 KiB python3 x86_64 0:3.15.0-2.fc46 copr_base 28.7 KiB python3-iniconfig noarch 0:2.3.0-5.fc46 copr_base 49.6 KiB python3-libs x86_64 0:3.15.0-2.fc46 copr_base 48.3 MiB python3-packaging noarch 0:26.3-5.fc46 copr_base 1.3 MiB python3-pluggy noarch 0:1.7.0-1.fc46 copr_base 246.1 KiB python3-pygments noarch 0:2.20.0-5.fc46 copr_base 11.3 MiB python3-rpm-generators noarch 0:14-20.fc45 copr_base 83.7 KiB python3-rpm-macros noarch 0:3.15-8.fc44 copr_base 6.5 KiB tzdata noarch 0:2026e-1.fc46 http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch 1.3 MiB Transaction Summary: Installing: 31 packages Total size of inbound packages is 30 MiB. Need to download 30 MiB. After this operation, 134 MiB extra will be used (install 134 MiB, remove 0 B). [ 1/31] btrfs-progs-0:7.1-3.fc46.x86_64 100% | 44.8 MiB/s | 1.3 MiB | 00m00s [ 2/31] dash-0:0.5.13.2-2.fc45.x86_64 100% | 845.2 KiB/s | 104.0 KiB | 00m00s [ 3/31] lz4-0:1.10.0-5.fc45.x86_64 100% | 973.0 KiB/s | 126.5 KiB | 00m00s [ 4/31] lzop-0:1.04-19.fc45.x86_64 100% | 1.6 MiB/s | 56.4 KiB | 00m00s [ 5/31] fish-0:4.6.0-2.fc45.x86_64 100% | 20.2 MiB/s | 4.1 MiB | 00m00s [ 6/31] pbzip2-0:1.1.13-17.fc45.x86_64 100% | 1.2 MiB/s | 53.2 KiB | 00m00s [ 7/31] pigz-0:2.8-11.fc45.x86_64 100% | 2.7 MiB/s | 100.7 KiB | 00m00s [ 8/31] python3-devel-0:3.15.0-2.fc46.x 100% | 105.6 MiB/s | 432.6 KiB | 00m00s [ 9/31] python3-pytest-0:9.1.1-1.fc46.n 100% | 262.1 MiB/s | 2.4 MiB | 00m00s [10/31] openssl-1:4.0.3-1.fc46.x86_64 100% | 12.0 MiB/s | 1.3 MiB | 00m00s [11/31] python3-pytest-asyncio-0:1.4.0- 100% | 2.7 MiB/s | 46.6 KiB | 00m00s [12/31] python3-0:3.15.0-2.fc46.x86_64 100% | 26.9 MiB/s | 27.5 KiB | 00m00s [13/31] procps-ng-0:4.0.7-1.fc46.x86_64 100% | 4.7 MiB/s | 394.3 KiB | 00m00s [14/31] python3-iniconfig-0:2.3.0-5.fc4 100% | 12.6 MiB/s | 25.7 KiB | 00m00s [15/31] python3-packaging-0:26.3-5.fc46 100% | 91.2 MiB/s | 280.3 KiB | 00m00s [16/31] python3-pluggy-0:1.7.0-1.fc46.n 100% | 21.8 MiB/s | 67.1 KiB | 00m00s [17/31] python3-libs-0:3.15.0-2.fc46.x8 100% | 329.5 MiB/s | 10.9 MiB | 00m00s [18/31] python3-pygments-0:2.20.0-5.fc4 100% | 155.7 MiB/s | 2.5 MiB | 00m00s [19/31] zsh-0:5.9.2-4.fc46.x86_64 100% | 43.9 MiB/s | 3.2 MiB | 00m00s [20/31] expat-0:2.8.3-1.fc46.x86_64 100% | 3.6 MiB/s | 132.0 KiB | 00m00s [21/31] python-pip-wheel-0:26.2.1-3.fc4 100% | 170.4 MiB/s | 1.2 MiB | 00m00s [22/31] mpdecimal-0:4.0.1-4.fc45.x86_64 100% | 2.7 MiB/s | 98.5 KiB | 00m00s [23/31] tzdata-0:2026e-1.fc46.noarch 100% | 12.0 MiB/s | 429.1 KiB | 00m00s [24/31] lzo-0:2.10-17.fc45.x86_64 100% | 2.2 MiB/s | 70.6 KiB | 00m00s [25/31] e2fsprogs-libs-0:1.47.4-2.fc45. 100% | 6.3 MiB/s | 239.0 KiB | 00m00s [26/31] python-rpm-macros-0:3.15-8.fc44 100% | 9.8 MiB/s | 20.1 KiB | 00m00s [27/31] python3-rpm-macros-0:3.15-8.fc4 100% | 6.2 MiB/s | 12.6 KiB | 00m00s [28/31] pcre2-utf32-0:10.47-1.fc45.2.x8 100% | 6.7 MiB/s | 240.9 KiB | 00m00s [29/31] python3-rpm-generators-0:14-20. 100% | 9.4 MiB/s | 29.0 KiB | 00m00s [30/31] ncurses-term-0:6.6-3.fc45.noarc 100% | 12.7 MiB/s | 560.7 KiB | 00m00s [31/31] pyproject-rpm-macros-0:1.24.0-1 100% | 1.8 MiB/s | 58.0 KiB | 00m00s -------------------------------------------------------------------------------- [31/31] Total 100% | 71.3 MiB/s | 30.3 MiB | 00m00s Running transaction [ 1/33] Verify package files 100% | 191.0 B/s | 31.0 B | 00m00s [ 2/33] Prepare transaction 100% | 462.0 B/s | 31.0 B | 00m00s [ 3/33] Installing python-rpm-macros-0: 100% | 0.0 B/s | 28.5 KiB | 00m00s [ 4/33] Installing python3-rpm-macros-0 100% | 0.0 B/s | 6.8 KiB | 00m00s [ 5/33] Installing lzo-0:2.10-17.fc45.x 100% | 176.2 MiB/s | 180.4 KiB | 00m00s [ 6/33] Installing pyproject-rpm-macros 100% | 167.4 MiB/s | 171.5 KiB | 00m00s [ 7/33] Installing pcre2-utf32-0:10.47- 100% | 121.1 MiB/s | 620.0 KiB | 00m00s [ 8/33] Installing ncurses-term-0:6.6-3 100% | 61.9 MiB/s | 2.2 MiB | 00m00s [ 9/33] Installing e2fsprogs-libs-0:1.4 100% | 135.9 MiB/s | 556.8 KiB | 00m00s [10/33] Installing tzdata-0:2026e-1.fc4 100% | 61.0 MiB/s | 1.5 MiB | 00m00s [11/33] Installing python-pip-wheel-0:2 100% | 634.1 MiB/s | 1.3 MiB | 00m00s [12/33] Installing mpdecimal-0:4.0.1-4. 100% | 217.5 MiB/s | 222.7 KiB | 00m00s [13/33] Installing expat-0:2.8.3-1.fc46 100% | 16.6 MiB/s | 340.5 KiB | 00m00s [14/33] Installing python3-libs-0:3.15. 100% | 374.5 MiB/s | 48.7 MiB | 00m00s [15/33] Installing python3-0:3.15.0-2.f 100% | 1.9 MiB/s | 30.4 KiB | 00m00s [16/33] Installing python3-packaging-0: 100% | 323.5 MiB/s | 1.3 MiB | 00m00s [17/33] Installing python3-rpm-generato 100% | 0.0 B/s | 85.0 KiB | 00m00s [18/33] Installing python3-iniconfig-0: 100% | 52.7 MiB/s | 54.0 KiB | 00m00s [19/33] Installing python3-pluggy-0:1.7 100% | 83.1 MiB/s | 255.2 KiB | 00m00s [20/33] Installing python3-pygments-0:2 100% | 221.8 MiB/s | 11.5 MiB | 00m00s [21/33] Installing python3-pytest-0:9.1 100% | 394.2 MiB/s | 24.4 MiB | 00m00s [22/33] Installing python3-pytest-async 100% | 170.9 MiB/s | 175.0 KiB | 00m00s [23/33] Installing python3-devel-0:3.15 100% | 96.3 MiB/s | 2.5 MiB | 00m00s [24/33] Installing fish-0:4.6.0-2.fc45. 100% | 261.6 MiB/s | 21.5 MiB | 00m00s [25/33] Installing btrfs-progs-0:7.1-3. 100% | 232.0 MiB/s | 6.5 MiB | 00m00s [26/33] Installing lzop-0:1.04-19.fc45. 100% | 5.8 MiB/s | 100.2 KiB | 00m00s [27/33] Installing zsh-0:5.9.2-4.fc46.x 100% | 139.1 MiB/s | 8.5 MiB | 00m00s [28/33] Installing procps-ng-0:4.0.7-1. 100% | 58.0 MiB/s | 1.1 MiB | 00m00s [29/33] Installing pigz-0:2.8-11.fc45.x 100% | 10.9 MiB/s | 179.2 KiB | 00m00s [30/33] Installing pbzip2-0:1.1.13-17.f 100% | 6.2 MiB/s | 102.2 KiB | 00m00s [31/33] Installing openssl-1:4.0.3-1.fc 100% | 83.8 MiB/s | 2.0 MiB | 00m00s [32/33] Installing lz4-0:1.10.0-5.fc45. 100% | 17.3 MiB/s | 265.9 KiB | 00m00s [33/33] Installing dash-0:0.5.13.2-2.fc 100% | 2.6 MiB/s | 177.1 KiB | 00m00s Warning: skipped OpenPGP checks for 31 packages from repositories: copr_base, http_kojipkgs_fedoraproject_org_repos_rawhide_latest_basearch Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1792454400 Wrote: /builddir/build/SRPMS/btrfs-backup-ng-0.9.16-1.fc46.src.rpm Updating and loading repositories: Additional repo http_kojipkgs_fedorapr 100% | 51.6 KiB/s | 3.9 KiB | 00m00s fedora 100% | 163.8 KiB/s | 24.2 KiB | 00m00s Copr repository 100% | 20.5 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Nothing to do. Package "btrfs-progs-7.1-3.fc46.x86_64" is already installed. Package "bzip2-1.0.8-24.fc45.x86_64" is already installed. Package "dash-0.5.13.2-2.fc45.x86_64" is already installed. Package "fish-4.6.0-2.fc45.x86_64" is already installed. Package "gzip-1.15-1.fc46.x86_64" is already installed. Package "lz4-1.10.0-5.fc45.x86_64" is already installed. Package "lzop-1.04-19.fc45.x86_64" is already installed. Package "openssl-1:4.0.3-1.fc46.x86_64" is already installed. Package "pbzip2-1.1.13-17.fc45.x86_64" is already installed. Package "pigz-2.8-11.fc45.x86_64" is already installed. Package "procps-ng-4.0.7-1.fc46.x86_64" is already installed. Package "python3-devel-3.15.0-2.fc46.x86_64" is already installed. Package "python3-pytest-9.1.1-1.fc46.noarch" is already installed. Package "python3-pytest-asyncio-1.4.0-4.fc46.noarch" is already installed. Package "xz-1:5.8.4-1.fc46.x86_64" is already installed. Package "zsh-5.9.2-4.fc46.x86_64" is already installed. Package "zstd-1.5.7-6.fc45.x86_64" is already installed. Finish: build setup for btrfs-backup-ng-0.9.16-1.fc46.src.rpm Start: rpmbuild btrfs-backup-ng-0.9.16-1.fc46.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1792454400 Executing(mkbuilddir): /bin/sh -e /var/tmp/rpm-tmp.Jt9mpw Creating(rpmbuild.env): /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/rpmbuild.env RPM_SOURCE_DIR="/builddir/build/SOURCES" RPM_BUILD_DIR="/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build" RPM_OPT_FLAGS="-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wno-complain-wrong-lang -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer" RPM_LD_FLAGS="-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes " RPM_ARCH="x86_64" RPM_OS="linux" RPM_BUILD_NCPUS="4" RPM_SPECPARTS_DIR="/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/SPECPARTS" export RPM_SOURCE_DIR RPM_BUILD_DIR RPM_OPT_FLAGS RPM_ARCH RPM_OS RPM_BUILD_NCPUS RPM_SPECPARTS_DIR RPM_LD_FLAGS RPM_DOC_DIR="/usr/share/doc" export RPM_DOC_DIR RPM_PACKAGE_NAME="btrfs-backup-ng" RPM_PACKAGE_VERSION="0.9.16" RPM_PACKAGE_RELEASE="1.fc46" export RPM_PACKAGE_NAME RPM_PACKAGE_VERSION RPM_PACKAGE_RELEASE LANG=C.UTF-8 export LANG unset CDPATH DISPLAY ||: unset DEBUGINFOD_URLS ||: unset RPM_CONFIG_DIR ||: RPM_BUILD_ROOT="/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT" export RPM_BUILD_ROOT PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:/usr/lib64/pkgconfig:/usr/share/pkgconfig" export PKG_CONFIG_PATH CONFIG_SITE=${CONFIG_SITE:-NONE} export CONFIG_SITE Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.BujZ8N + umask 022 + cd /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + cd /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + rm -rf btrfs_backup_ng-0.9.16 + /usr/bin/rpmuncompress -x /builddir/build/SOURCES/btrfs_backup_ng-0.9.16.tar.gz + STATUS=0 + '[' 0 -ne 0 ']' + cd btrfs_backup_ng-0.9.16 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + RPM_EC=0 ++ jobs -p + exit 0 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.ruWekP + umask 022 + cd /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + cd btrfs_backup_ng-0.9.16 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + RPM_TOXENV=py315 + FEDORA=46 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/pyproject-wheeldir --output /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-buildrequires --dep-overrides-file /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-dep-overrides Handling setuptools>=77.0 from build-system.requires Requirement not satisfied: setuptools>=77.0 Exiting dependency generation pass: build backend + cat /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-buildrequires + rm -rfv '*.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/btrfs-backup-ng-0.9.16-1.fc46.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: Additional repo http_kojipkgs_fedorapr 100% | 56.9 KiB/s | 3.9 KiB | 00m00s fedora 100% | 140.9 KiB/s | 24.2 KiB | 00m00s Copr repository 100% | 22.6 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "btrfs-progs-7.1-3.fc46.x86_64" is already installed. Package "bzip2-1.0.8-24.fc45.x86_64" is already installed. Package "dash-0.5.13.2-2.fc45.x86_64" is already installed. Package "fish-4.6.0-2.fc45.x86_64" is already installed. Package "gzip-1.15-1.fc46.x86_64" is already installed. Package "lz4-1.10.0-5.fc45.x86_64" is already installed. Package "lzop-1.04-19.fc45.x86_64" is already installed. Package "openssl-1:4.0.3-1.fc46.x86_64" is already installed. Package "pbzip2-1.1.13-17.fc45.x86_64" is already installed. Package "pigz-2.8-11.fc45.x86_64" is already installed. Package "procps-ng-4.0.7-1.fc46.x86_64" is already installed. Package "pyproject-rpm-macros-1.24.0-1.fc46.noarch" is already installed. Package "python3-devel-3.15.0-2.fc46.x86_64" is already installed. Package "python3-pytest-9.1.1-1.fc46.noarch" is already installed. Package "python3-pytest-asyncio-1.4.0-4.fc46.noarch" is already installed. Package "python3-packaging-26.3-5.fc46.noarch" is already installed. Package "xz-1:5.8.4-1.fc46.x86_64" is already installed. Package "zsh-5.9.2-4.fc46.x86_64" is already installed. Package "zstd-1.5.7-6.fc45.x86_64" is already installed. Package Arch Version Repository Size Installing: python3-pip noarch 0:26.2.1-3.fc46 copr_base 12.3 MiB python3-setuptools noarch 0:84.0.0-3.fc46 copr_base 7.4 MiB Transaction Summary: Installing: 2 packages Total size of inbound packages is 4 MiB. Need to download 4 MiB. After this operation, 20 MiB extra will be used (install 20 MiB, remove 0 B). [1/2] python3-setuptools-0:84.0.0-3.fc4 100% | 131.9 MiB/s | 1.6 MiB | 00m00s [2/2] python3-pip-0:26.2.1-3.fc46.noarc 100% | 112.0 MiB/s | 2.6 MiB | 00m00s -------------------------------------------------------------------------------- [2/2] Total 100% | 180.8 MiB/s | 4.2 MiB | 00m00s Running transaction [1/4] Verify package files 100% | 86.0 B/s | 2.0 B | 00m00s [2/4] Prepare transaction 100% | 90.0 B/s | 2.0 B | 00m00s [3/4] Installing python3-setuptools-0:8 100% | 236.4 MiB/s | 7.6 MiB | 00m00s [4/4] Installing python3-pip-0:26.2.1-3 100% | 167.2 MiB/s | 12.5 MiB | 00m00s Warning: skipped OpenPGP checks for 2 packages from repository: copr_base Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1792454400 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.Ca3i5M + umask 022 + cd /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + cd btrfs_backup_ng-0.9.16 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + RPM_TOXENV=py315 + FEDORA=46 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/pyproject-wheeldir --output /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-buildrequires --dep-overrides-file /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-dep-overrides Handling setuptools>=77.0 from build-system.requires Requirement satisfied: setuptools>=77.0 (installed: setuptools 84.0.0) running egg_info writing src/btrfs_backup_ng.egg-info/PKG-INFO writing dependency_links to src/btrfs_backup_ng.egg-info/dependency_links.txt writing entry points to src/btrfs_backup_ng.egg-info/entry_points.txt writing requirements to src/btrfs_backup_ng.egg-info/requires.txt writing top-level names to src/btrfs_backup_ng.egg-info/top_level.txt reading manifest file 'src/btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file 'src/btrfs_backup_ng.egg-info/SOURCES.txt' running dist_info creating btrfs_backup_ng.egg-info writing btrfs_backup_ng.egg-info/PKG-INFO writing dependency_links to btrfs_backup_ng.egg-info/dependency_links.txt writing entry points to btrfs_backup_ng.egg-info/entry_points.txt writing requirements to btrfs_backup_ng.egg-info/requires.txt writing top-level names to btrfs_backup_ng.egg-info/top_level.txt writing manifest file 'btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest file 'btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file 'btrfs_backup_ng.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs_backup_ng-0.9.16/btrfs_backup_ng-0.9.16.dist-info' Handling filelock from hook generated metadata: Requires-Dist (btrfs-backup-ng) Requirement not satisfied: filelock Handling rich from hook generated metadata: Requires-Dist (btrfs-backup-ng) Requirement not satisfied: rich Handling pytest>=7.0; extra == "test" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest>=7.0; extra == "test" Handling pytest-cov>=4.0; extra == "test" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-cov>=4.0; extra == "test" Handling pytest-asyncio>=0.23.0; extra == "test" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-asyncio>=0.23.0; extra == "test" Handling pytest>=7.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest>=7.0; extra == "dev" Handling pytest-cov>=4.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-cov>=4.0; extra == "dev" Handling pytest-asyncio>=0.23.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-asyncio>=0.23.0; extra == "dev" Handling ruff<0.16.0,>=0.15.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: ruff<0.16.0,>=0.15.0; extra == "dev" Handling mypy>=1.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: mypy>=1.0; extra == "dev" + cat /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-buildrequires + rm -rfv btrfs_backup_ng-0.9.16.dist-info/ removed 'btrfs_backup_ng-0.9.16.dist-info/licenses/LICENSE' removed directory 'btrfs_backup_ng-0.9.16.dist-info/licenses' removed 'btrfs_backup_ng-0.9.16.dist-info/METADATA' removed 'btrfs_backup_ng-0.9.16.dist-info/entry_points.txt' removed 'btrfs_backup_ng-0.9.16.dist-info/top_level.txt' removed directory 'btrfs_backup_ng-0.9.16.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/btrfs-backup-ng-0.9.16-1.fc46.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: Additional repo http_kojipkgs_fedorapr 100% | 44.5 KiB/s | 3.9 KiB | 00m00s fedora 100% | 124.3 KiB/s | 24.2 KiB | 00m00s Copr repository 100% | 17.7 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "btrfs-progs-7.1-3.fc46.x86_64" is already installed. Package "bzip2-1.0.8-24.fc45.x86_64" is already installed. Package "dash-0.5.13.2-2.fc45.x86_64" is already installed. Package "fish-4.6.0-2.fc45.x86_64" is already installed. Package "gzip-1.15-1.fc46.x86_64" is already installed. Package "lz4-1.10.0-5.fc45.x86_64" is already installed. Package "lzop-1.04-19.fc45.x86_64" is already installed. Package "openssl-1:4.0.3-1.fc46.x86_64" is already installed. Package "pbzip2-1.1.13-17.fc45.x86_64" is already installed. Package "pigz-2.8-11.fc45.x86_64" is already installed. Package "procps-ng-4.0.7-1.fc46.x86_64" is already installed. Package "pyproject-rpm-macros-1.24.0-1.fc46.noarch" is already installed. Package "python3-devel-3.15.0-2.fc46.x86_64" is already installed. Package "python3-pytest-9.1.1-1.fc46.noarch" is already installed. Package "python3-pytest-asyncio-1.4.0-4.fc46.noarch" is already installed. Package "python3-packaging-26.3-5.fc46.noarch" is already installed. Package "python3-pip-26.2.1-3.fc46.noarch" is already installed. Package "python3-setuptools-84.0.0-3.fc46.noarch" is already installed. Package "xz-1:5.8.4-1.fc46.x86_64" is already installed. Package "zsh-5.9.2-4.fc46.x86_64" is already installed. Package "zstd-1.5.7-6.fc45.x86_64" is already installed. Package Arch Version Repository Size Installing: python3-filelock noarch 0:3.20.3-4.fc46 copr_base 101.6 KiB python3-rich noarch 0:15.0.0-5.fc46 copr_base 3.5 MiB Installing dependencies: python3-markdown-it-py noarch 0:4.2.0-2.fc46 copr_base 577.0 KiB python3-mdurl noarch 0:0.1.2-16.fc46 copr_base 44.3 KiB Transaction Summary: Installing: 4 packages Total size of inbound packages is 864 KiB. Need to download 864 KiB. After this operation, 4 MiB extra will be used (install 4 MiB, remove 0 B). [1/4] python3-rich-0:15.0.0-5.fc46.noar 100% | 54.9 MiB/s | 618.8 KiB | 00m00s [2/4] python3-markdown-it-py-0:4.2.0-2. 100% | 13.5 MiB/s | 179.3 KiB | 00m00s [3/4] python3-mdurl-0:0.1.2-16.fc46.noa 100% | 13.0 MiB/s | 26.6 KiB | 00m00s [4/4] python3-filelock-0:3.20.3-4.fc46. 100% | 1.2 MiB/s | 39.7 KiB | 00m00s -------------------------------------------------------------------------------- [4/4] Total 100% | 25.6 MiB/s | 864.4 KiB | 00m00s Running transaction [1/6] Verify package files 100% | 800.0 B/s | 4.0 B | 00m00s [2/6] Prepare transaction 100% | 400.0 B/s | 4.0 B | 00m00s [3/6] Installing python3-mdurl-0:0.1.2- 100% | 48.5 MiB/s | 49.7 KiB | 00m00s [4/6] Installing python3-markdown-it-py 100% | 28.9 MiB/s | 621.1 KiB | 00m00s [5/6] Installing python3-rich-0:15.0.0- 100% | 320.4 MiB/s | 3.5 MiB | 00m00s [6/6] Installing python3-filelock-0:3.2 100% | 8.8 MiB/s | 108.4 KiB | 00m00s Warning: skipped OpenPGP checks for 4 packages from repository: copr_base Complete! Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1792454400 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.imKASh + umask 022 + cd /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + cd btrfs_backup_ng-0.9.16 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + RPM_TOXENV=py315 + FEDORA=46 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/pyproject-wheeldir --output /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-buildrequires --dep-overrides-file /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-dep-overrides Handling setuptools>=77.0 from build-system.requires Requirement satisfied: setuptools>=77.0 (installed: setuptools 84.0.0) running egg_info writing src/btrfs_backup_ng.egg-info/PKG-INFO writing dependency_links to src/btrfs_backup_ng.egg-info/dependency_links.txt writing entry points to src/btrfs_backup_ng.egg-info/entry_points.txt writing requirements to src/btrfs_backup_ng.egg-info/requires.txt writing top-level names to src/btrfs_backup_ng.egg-info/top_level.txt reading manifest file 'src/btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file 'src/btrfs_backup_ng.egg-info/SOURCES.txt' running dist_info writing btrfs_backup_ng.egg-info/PKG-INFO writing dependency_links to btrfs_backup_ng.egg-info/dependency_links.txt writing entry points to btrfs_backup_ng.egg-info/entry_points.txt writing requirements to btrfs_backup_ng.egg-info/requires.txt writing top-level names to btrfs_backup_ng.egg-info/top_level.txt reading manifest file 'btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file 'btrfs_backup_ng.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs_backup_ng-0.9.16/btrfs_backup_ng-0.9.16.dist-info' Handling filelock from hook generated metadata: Requires-Dist (btrfs-backup-ng) Requirement satisfied: filelock (installed: filelock 3.20.3) Handling rich from hook generated metadata: Requires-Dist (btrfs-backup-ng) Requirement satisfied: rich (installed: rich 15.0.0) Handling pytest>=7.0; extra == "test" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest>=7.0; extra == "test" Handling pytest-cov>=4.0; extra == "test" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-cov>=4.0; extra == "test" Handling pytest-asyncio>=0.23.0; extra == "test" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-asyncio>=0.23.0; extra == "test" Handling pytest>=7.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest>=7.0; extra == "dev" Handling pytest-cov>=4.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-cov>=4.0; extra == "dev" Handling pytest-asyncio>=0.23.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-asyncio>=0.23.0; extra == "dev" Handling ruff<0.16.0,>=0.15.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: ruff<0.16.0,>=0.15.0; extra == "dev" Handling mypy>=1.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: mypy>=1.0; extra == "dev" + cat /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-buildrequires + rm -rfv btrfs_backup_ng-0.9.16.dist-info/ removed 'btrfs_backup_ng-0.9.16.dist-info/licenses/LICENSE' removed directory 'btrfs_backup_ng-0.9.16.dist-info/licenses' removed 'btrfs_backup_ng-0.9.16.dist-info/METADATA' removed 'btrfs_backup_ng-0.9.16.dist-info/top_level.txt' removed 'btrfs_backup_ng-0.9.16.dist-info/entry_points.txt' removed directory 'btrfs_backup_ng-0.9.16.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/btrfs-backup-ng-0.9.16-1.fc46.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: Additional repo http_kojipkgs_fedorapr 100% | 39.9 KiB/s | 3.9 KiB | 00m00s fedora 100% | 133.2 KiB/s | 24.2 KiB | 00m00s Copr repository 100% | 15.9 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Nothing to do. Package "btrfs-progs-7.1-3.fc46.x86_64" is already installed. Package "bzip2-1.0.8-24.fc45.x86_64" is already installed. Package "dash-0.5.13.2-2.fc45.x86_64" is already installed. Package "fish-4.6.0-2.fc45.x86_64" is already installed. Package "gzip-1.15-1.fc46.x86_64" is already installed. Package "lz4-1.10.0-5.fc45.x86_64" is already installed. Package "lzop-1.04-19.fc45.x86_64" is already installed. Package "openssl-1:4.0.3-1.fc46.x86_64" is already installed. Package "pbzip2-1.1.13-17.fc45.x86_64" is already installed. Package "pigz-2.8-11.fc45.x86_64" is already installed. Package "procps-ng-4.0.7-1.fc46.x86_64" is already installed. Package "pyproject-rpm-macros-1.24.0-1.fc46.noarch" is already installed. Package "python3-devel-3.15.0-2.fc46.x86_64" is already installed. Package "python3-pytest-9.1.1-1.fc46.noarch" is already installed. Package "python3-pytest-asyncio-1.4.0-4.fc46.noarch" is already installed. Package "python3-filelock-3.20.3-4.fc46.noarch" is already installed. Package "python3-packaging-26.3-5.fc46.noarch" is already installed. Package "python3-pip-26.2.1-3.fc46.noarch" is already installed. Package "python3-rich-15.0.0-5.fc46.noarch" is already installed. Package "python3-setuptools-84.0.0-3.fc46.noarch" is already installed. Package "xz-1:5.8.4-1.fc46.x86_64" is already installed. Package "zsh-5.9.2-4.fc46.x86_64" is already installed. Package "zstd-1.5.7-6.fc45.x86_64" is already installed. Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1792454400 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.jgOCJQ + umask 022 + cd /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + cd btrfs_backup_ng-0.9.16 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + RPM_TOXENV=py315 + FEDORA=46 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/pyproject-wheeldir --output /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-buildrequires --dep-overrides-file /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-dep-overrides Handling setuptools>=77.0 from build-system.requires Requirement satisfied: setuptools>=77.0 (installed: setuptools 84.0.0) running egg_info writing src/btrfs_backup_ng.egg-info/PKG-INFO writing dependency_links to src/btrfs_backup_ng.egg-info/dependency_links.txt writing entry points to src/btrfs_backup_ng.egg-info/entry_points.txt writing requirements to src/btrfs_backup_ng.egg-info/requires.txt writing top-level names to src/btrfs_backup_ng.egg-info/top_level.txt reading manifest file 'src/btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file 'src/btrfs_backup_ng.egg-info/SOURCES.txt' running dist_info writing btrfs_backup_ng.egg-info/PKG-INFO writing dependency_links to btrfs_backup_ng.egg-info/dependency_links.txt writing entry points to btrfs_backup_ng.egg-info/entry_points.txt writing requirements to btrfs_backup_ng.egg-info/requires.txt writing top-level names to btrfs_backup_ng.egg-info/top_level.txt reading manifest file 'btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file 'btrfs_backup_ng.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs_backup_ng-0.9.16/btrfs_backup_ng-0.9.16.dist-info' Handling filelock from hook generated metadata: Requires-Dist (btrfs-backup-ng) Requirement satisfied: filelock (installed: filelock 3.20.3) Handling rich from hook generated metadata: Requires-Dist (btrfs-backup-ng) Requirement satisfied: rich (installed: rich 15.0.0) Handling pytest>=7.0; extra == "test" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest>=7.0; extra == "test" Handling pytest-cov>=4.0; extra == "test" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-cov>=4.0; extra == "test" Handling pytest-asyncio>=0.23.0; extra == "test" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-asyncio>=0.23.0; extra == "test" Handling pytest>=7.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest>=7.0; extra == "dev" Handling pytest-cov>=4.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-cov>=4.0; extra == "dev" Handling pytest-asyncio>=0.23.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: pytest-asyncio>=0.23.0; extra == "dev" Handling ruff<0.16.0,>=0.15.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: ruff<0.16.0,>=0.15.0; extra == "dev" Handling mypy>=1.0; extra == "dev" from hook generated metadata: Requires-Dist (btrfs-backup-ng) Ignoring alien requirement: mypy>=1.0; extra == "dev" + cat /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-buildrequires + rm -rfv btrfs_backup_ng-0.9.16.dist-info/ removed 'btrfs_backup_ng-0.9.16.dist-info/licenses/LICENSE' removed directory 'btrfs_backup_ng-0.9.16.dist-info/licenses' removed 'btrfs_backup_ng-0.9.16.dist-info/METADATA' removed 'btrfs_backup_ng-0.9.16.dist-info/entry_points.txt' removed 'btrfs_backup_ng-0.9.16.dist-info/top_level.txt' removed directory 'btrfs_backup_ng-0.9.16.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.HwDTbU + umask 022 + cd /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd btrfs_backup_ng-0.9.16 + mkdir -p /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_wheel.py /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/pyproject-wheeldir Processing ./. Preparing metadata (pyproject.toml): started Running command Preparing metadata (pyproject.toml) running dist_info creating /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng.egg-info writing /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng.egg-info/PKG-INFO writing dependency_links to /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng.egg-info/dependency_links.txt writing entry points to /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng.egg-info/entry_points.txt writing requirements to /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng.egg-info/requires.txt writing top-level names to /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng.egg-info/top_level.txt writing manifest file '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest file '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng.egg-info/SOURCES.txt' creating '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-modern-metadata-fla0izon/btrfs_backup_ng-0.9.16.dist-info' Preparing metadata (pyproject.toml): finished with status 'done' Building wheels for collected packages: btrfs-backup-ng Building wheel for btrfs-backup-ng (pyproject.toml): started Running command Building wheel for btrfs-backup-ng (pyproject.toml) running bdist_wheel running build running build_py creating build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/transaction.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/systemd_utils.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/retention.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/notifications.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/lifecycle.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/btrbk_import.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/_legacy_main.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/__util__.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/__main__.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/__logger__.py -> build/lib/btrfs_backup_ng copying src/btrfs_backup_ng/__init__.py -> build/lib/btrfs_backup_ng creating build/lib/btrfs_backup_ng/sshutil copying src/btrfs_backup_ng/sshutil/master.py -> build/lib/btrfs_backup_ng/sshutil copying src/btrfs_backup_ng/sshutil/lock.py -> build/lib/btrfs_backup_ng/sshutil copying src/btrfs_backup_ng/sshutil/diagnose.py -> build/lib/btrfs_backup_ng/sshutil creating build/lib/btrfs_backup_ng/snapper copying src/btrfs_backup_ng/snapper/snapshot.py -> build/lib/btrfs_backup_ng/snapper copying src/btrfs_backup_ng/snapper/scanner.py -> build/lib/btrfs_backup_ng/snapper copying src/btrfs_backup_ng/snapper/metadata.py -> build/lib/btrfs_backup_ng/snapper copying src/btrfs_backup_ng/snapper/__init__.py -> build/lib/btrfs_backup_ng/snapper creating build/lib/btrfs_backup_ng/endpoint copying src/btrfs_backup_ng/endpoint/ssh.py -> build/lib/btrfs_backup_ng/endpoint copying src/btrfs_backup_ng/endpoint/shell.py -> build/lib/btrfs_backup_ng/endpoint copying src/btrfs_backup_ng/endpoint/raw_metadata.py -> build/lib/btrfs_backup_ng/endpoint copying src/btrfs_backup_ng/endpoint/raw.py -> build/lib/btrfs_backup_ng/endpoint copying src/btrfs_backup_ng/endpoint/local.py -> build/lib/btrfs_backup_ng/endpoint copying src/btrfs_backup_ng/endpoint/common.py -> build/lib/btrfs_backup_ng/endpoint copying src/btrfs_backup_ng/endpoint/__init__.py -> build/lib/btrfs_backup_ng/endpoint creating build/lib/btrfs_backup_ng/detection copying src/btrfs_backup_ng/detection/scanner.py -> build/lib/btrfs_backup_ng/detection copying src/btrfs_backup_ng/detection/models.py -> build/lib/btrfs_backup_ng/detection copying src/btrfs_backup_ng/detection/classifier.py -> build/lib/btrfs_backup_ng/detection copying src/btrfs_backup_ng/detection/__init__.py -> build/lib/btrfs_backup_ng/detection creating build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/verify.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/transfer.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/target.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/state.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/space.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/retry.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/restore.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/progress.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/planning.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/operations.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/layout.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/execution.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/estimate.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/errors.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/doctor.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/compression.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/chunked_transfer.py -> build/lib/btrfs_backup_ng/core copying src/btrfs_backup_ng/core/__init__.py -> build/lib/btrfs_backup_ng/core creating build/lib/btrfs_backup_ng/config copying src/btrfs_backup_ng/config/schema.py -> build/lib/btrfs_backup_ng/config copying src/btrfs_backup_ng/config/loader.py -> build/lib/btrfs_backup_ng/config copying src/btrfs_backup_ng/config/__init__.py -> build/lib/btrfs_backup_ng/config creating build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/wizard_utils.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/verify.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/transfers_cmd.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/transfer.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/status.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/snapshot.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/snapper_cmd.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/run.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/restore.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/raw_cmd.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/prune.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/manpages.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/list_cmd.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/install.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/estimate.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/doctor.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/dispatcher.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/config_cmd.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/completions.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/completion_gen.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/common.py -> build/lib/btrfs_backup_ng/cli copying src/btrfs_backup_ng/cli/__init__.py -> build/lib/btrfs_backup_ng/cli running egg_info writing src/btrfs_backup_ng.egg-info/PKG-INFO writing dependency_links to src/btrfs_backup_ng.egg-info/dependency_links.txt writing entry points to src/btrfs_backup_ng.egg-info/entry_points.txt writing requirements to src/btrfs_backup_ng.egg-info/requires.txt writing top-level names to src/btrfs_backup_ng.egg-info/top_level.txt reading manifest file 'src/btrfs_backup_ng.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file 'src/btrfs_backup_ng.egg-info/SOURCES.txt' installing to build/bdist.linux-x86_64/wheel running install running install_lib creating build/bdist.linux-x86_64/wheel creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/__init__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/common.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/completion_gen.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/completions.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/config_cmd.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/dispatcher.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/doctor.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/estimate.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/install.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/list_cmd.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/manpages.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/prune.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/raw_cmd.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/restore.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/run.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/snapper_cmd.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/snapshot.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/status.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/transfer.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/transfers_cmd.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/verify.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli copying build/lib/btrfs_backup_ng/cli/wizard_utils.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/cli creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng/config copying build/lib/btrfs_backup_ng/config/__init__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/config copying build/lib/btrfs_backup_ng/config/loader.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/config copying build/lib/btrfs_backup_ng/config/schema.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/config creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/__init__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/chunked_transfer.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/compression.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/doctor.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/errors.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/estimate.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/execution.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/layout.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/operations.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/planning.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/progress.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/restore.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/retry.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/space.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/state.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/target.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/transfer.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core copying build/lib/btrfs_backup_ng/core/verify.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/core creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng/detection copying build/lib/btrfs_backup_ng/detection/__init__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/detection copying build/lib/btrfs_backup_ng/detection/classifier.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/detection copying build/lib/btrfs_backup_ng/detection/models.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/detection copying build/lib/btrfs_backup_ng/detection/scanner.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/detection creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng/endpoint copying build/lib/btrfs_backup_ng/endpoint/__init__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/endpoint copying build/lib/btrfs_backup_ng/endpoint/common.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/endpoint copying build/lib/btrfs_backup_ng/endpoint/local.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/endpoint copying build/lib/btrfs_backup_ng/endpoint/raw.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/endpoint copying build/lib/btrfs_backup_ng/endpoint/raw_metadata.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/endpoint copying build/lib/btrfs_backup_ng/endpoint/shell.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/endpoint copying build/lib/btrfs_backup_ng/endpoint/ssh.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/endpoint creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng/snapper copying build/lib/btrfs_backup_ng/snapper/__init__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/snapper copying build/lib/btrfs_backup_ng/snapper/metadata.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/snapper copying build/lib/btrfs_backup_ng/snapper/scanner.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/snapper copying build/lib/btrfs_backup_ng/snapper/snapshot.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/snapper creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng/sshutil copying build/lib/btrfs_backup_ng/sshutil/diagnose.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/sshutil copying build/lib/btrfs_backup_ng/sshutil/lock.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/sshutil copying build/lib/btrfs_backup_ng/sshutil/master.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng/sshutil copying build/lib/btrfs_backup_ng/__init__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/__logger__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/__main__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/__util__.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/_legacy_main.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/btrbk_import.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/lifecycle.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/notifications.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/retention.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/systemd_utils.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng copying build/lib/btrfs_backup_ng/transaction.py -> build/bdist.linux-x86_64/wheel/./btrfs_backup_ng running install_data creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-config.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-doctor.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-estimate.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-install.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-list.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-prune.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-raw.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-restore.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-run.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-snapper.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-snapshot.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-status.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-transfer.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng-verify.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 copying man/man1/btrfs-backup-ng.1 -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/man/man1 creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/btrfs-backup-ng/completions copying completions/btrfs-backup-ng.bash -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/btrfs-backup-ng/completions copying completions/btrfs-backup-ng.zsh -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/btrfs-backup-ng/completions copying completions/btrfs-backup-ng.fish -> build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.data/data/share/btrfs-backup-ng/completions running install_egg_info Copying src/btrfs_backup_ng.egg-info to build/bdist.linux-x86_64/wheel/./btrfs_backup_ng-0.9.16-py3.15.egg-info running install_scripts creating build/bdist.linux-x86_64/wheel/btrfs_backup_ng-0.9.16.dist-info/WHEEL creating '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-ephem-wheel-cache-nh_m4tmb/wheels/ac/2d/77/dade25207ef41b857d7dc279b57cea4c6e7074c03c066f197e/tmpy8belssc/.tmp-w94teze4/btrfs_backup_ng-0.9.16-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it adding 'btrfs_backup_ng/__init__.py' adding 'btrfs_backup_ng/__logger__.py' adding 'btrfs_backup_ng/__main__.py' adding 'btrfs_backup_ng/__util__.py' adding 'btrfs_backup_ng/_legacy_main.py' adding 'btrfs_backup_ng/btrbk_import.py' adding 'btrfs_backup_ng/lifecycle.py' adding 'btrfs_backup_ng/notifications.py' adding 'btrfs_backup_ng/retention.py' adding 'btrfs_backup_ng/systemd_utils.py' adding 'btrfs_backup_ng/transaction.py' adding 'btrfs_backup_ng/cli/__init__.py' adding 'btrfs_backup_ng/cli/common.py' adding 'btrfs_backup_ng/cli/completion_gen.py' adding 'btrfs_backup_ng/cli/completions.py' adding 'btrfs_backup_ng/cli/config_cmd.py' adding 'btrfs_backup_ng/cli/dispatcher.py' adding 'btrfs_backup_ng/cli/doctor.py' adding 'btrfs_backup_ng/cli/estimate.py' adding 'btrfs_backup_ng/cli/install.py' adding 'btrfs_backup_ng/cli/list_cmd.py' adding 'btrfs_backup_ng/cli/manpages.py' adding 'btrfs_backup_ng/cli/prune.py' adding 'btrfs_backup_ng/cli/raw_cmd.py' adding 'btrfs_backup_ng/cli/restore.py' adding 'btrfs_backup_ng/cli/run.py' adding 'btrfs_backup_ng/cli/snapper_cmd.py' adding 'btrfs_backup_ng/cli/snapshot.py' adding 'btrfs_backup_ng/cli/status.py' adding 'btrfs_backup_ng/cli/transfer.py' adding 'btrfs_backup_ng/cli/transfers_cmd.py' adding 'btrfs_backup_ng/cli/verify.py' adding 'btrfs_backup_ng/cli/wizard_utils.py' adding 'btrfs_backup_ng/config/__init__.py' adding 'btrfs_backup_ng/config/loader.py' adding 'btrfs_backup_ng/config/schema.py' adding 'btrfs_backup_ng/core/__init__.py' adding 'btrfs_backup_ng/core/chunked_transfer.py' adding 'btrfs_backup_ng/core/compression.py' adding 'btrfs_backup_ng/core/doctor.py' adding 'btrfs_backup_ng/core/errors.py' adding 'btrfs_backup_ng/core/estimate.py' adding 'btrfs_backup_ng/core/execution.py' adding 'btrfs_backup_ng/core/layout.py' adding 'btrfs_backup_ng/core/operations.py' adding 'btrfs_backup_ng/core/planning.py' adding 'btrfs_backup_ng/core/progress.py' adding 'btrfs_backup_ng/core/restore.py' adding 'btrfs_backup_ng/core/retry.py' adding 'btrfs_backup_ng/core/space.py' adding 'btrfs_backup_ng/core/state.py' adding 'btrfs_backup_ng/core/target.py' adding 'btrfs_backup_ng/core/transfer.py' adding 'btrfs_backup_ng/core/verify.py' adding 'btrfs_backup_ng/detection/__init__.py' adding 'btrfs_backup_ng/detection/classifier.py' adding 'btrfs_backup_ng/detection/models.py' adding 'btrfs_backup_ng/detection/scanner.py' adding 'btrfs_backup_ng/endpoint/__init__.py' adding 'btrfs_backup_ng/endpoint/common.py' adding 'btrfs_backup_ng/endpoint/local.py' adding 'btrfs_backup_ng/endpoint/raw.py' adding 'btrfs_backup_ng/endpoint/raw_metadata.py' adding 'btrfs_backup_ng/endpoint/shell.py' adding 'btrfs_backup_ng/endpoint/ssh.py' adding 'btrfs_backup_ng/snapper/__init__.py' adding 'btrfs_backup_ng/snapper/metadata.py' adding 'btrfs_backup_ng/snapper/scanner.py' adding 'btrfs_backup_ng/snapper/snapshot.py' adding 'btrfs_backup_ng/sshutil/diagnose.py' adding 'btrfs_backup_ng/sshutil/lock.py' adding 'btrfs_backup_ng/sshutil/master.py' adding 'btrfs_backup_ng-0.9.16.data/data/share/btrfs-backup-ng/completions/btrfs-backup-ng.bash' adding 'btrfs_backup_ng-0.9.16.data/data/share/btrfs-backup-ng/completions/btrfs-backup-ng.fish' adding 'btrfs_backup_ng-0.9.16.data/data/share/btrfs-backup-ng/completions/btrfs-backup-ng.zsh' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-config.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-doctor.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-estimate.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-install.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-list.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-prune.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-raw.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-restore.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-run.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-snapper.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-snapshot.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-status.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-transfer.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng-verify.1' adding 'btrfs_backup_ng-0.9.16.data/data/share/man/man1/btrfs-backup-ng.1' adding 'btrfs_backup_ng-0.9.16.dist-info/licenses/LICENSE' adding 'btrfs_backup_ng-0.9.16.dist-info/METADATA' adding 'btrfs_backup_ng-0.9.16.dist-info/WHEEL' adding 'btrfs_backup_ng-0.9.16.dist-info/entry_points.txt' adding 'btrfs_backup_ng-0.9.16.dist-info/top_level.txt' adding 'btrfs_backup_ng-0.9.16.dist-info/RECORD' removing build/bdist.linux-x86_64/wheel Building wheel for btrfs-backup-ng (pyproject.toml): finished with status 'done' Created wheel for btrfs-backup-ng: filename=btrfs_backup_ng-0.9.16-py3-none-any.whl size=740809 sha256=728892c5bb2b94e0134026c5092e50cafbeb74c9b877a0bdaff3689f0f4a4dac Stored in directory: /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir/pip-ephem-wheel-cache-nh_m4tmb/wheels/ac/2d/77/dade25207ef41b857d7dc279b57cea4c6e7074c03c066f197e Successfully built btrfs-backup-ng + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.siMcoq + umask 022 + cd /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + '[' /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT '!=' / ']' + rm -rf /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT ++ dirname /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT + mkdir -p /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + mkdir /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd btrfs_backup_ng-0.9.16 ++ ls /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/pyproject-wheeldir/btrfs_backup_ng-0.9.16-py3-none-any.whl ++ xargs basename --multiple ++ sed -E 's/([^-]+)-([^-]+)-.+\.whl/\1==\2/' + specifier=btrfs_backup_ng==0.9.16 + '[' -z btrfs_backup_ng==0.9.16 ']' + PIP_CONFIG_FILE=/dev/null + TMPDIR=/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir + /usr/bin/python3 -m pip install --root /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT --prefix /usr --no-deps --disable-pip-version-check --progress-bar off --verbose --ignore-installed --no-warn-script-location --no-index --no-cache-dir --find-links /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/pyproject-wheeldir btrfs_backup_ng==0.9.16 Using pip 26.2.1 from /usr/lib/python3.15/site-packages/pip (python 3.15) Looking in links: /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/pyproject-wheeldir Processing /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/pyproject-wheeldir/btrfs_backup_ng-0.9.16-py3-none-any.whl Installing collected packages: btrfs_backup_ng Creating /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/bin changing mode of /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/bin/btrfs-backup-ng to 755 Successfully installed btrfs_backup_ng-0.9.16 + '[' -d /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/bin ']' + '[' -z sP ']' + shebang_flags=-kasP + /usr/bin/python3 -B /usr/lib/rpm/redhat/pathfix.py -pni /usr/bin/python3 -kasP /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/bin/btrfs-backup-ng /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/bin/btrfs-backup-ng: updating + rm -rfv /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/bin/__pycache__ + rm -f /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-ghost-distinfo + site_dirs=() + '[' -d /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages ']' + site_dirs+=("/usr/lib/python3.15/site-packages") + '[' /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib64/python3.15/site-packages '!=' /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages ']' + '[' -d /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib64/python3.15/site-packages ']' + for site_dir in ${site_dirs[@]} + for distinfo in /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT$site_dir/*.dist-info + echo '%ghost %dir /usr/lib/python3.15/site-packages/btrfs_backup_ng-0.9.16.dist-info' +++ basename /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng-0.9.16.dist-info ++ PYTHONPATH=/usr/lib/rpm/redhat ++ /usr/bin/python3 -sBc 'import sys; from pyproject_save_files import canonical_name_from_distinfo; print(canonical_name_from_distinfo(sys.argv[1]))' btrfs_backup_ng-0.9.16.dist-info + _normalized=btrfs-backup-ng + echo '%ghost %dir /usr/lib/python3.15/site-packages/btrfs_backup_ng-0.9.16.dist-info' + sed -i s/pip/rpm/ /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng-0.9.16.dist-info/INSTALLER + PYTHONPATH=/usr/lib/rpm/redhat + /usr/bin/python3 -B /usr/lib/rpm/redhat/pyproject_preprocess_record.py --buildroot /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT --record /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng-0.9.16.dist-info/RECORD --output /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-record + rm -fv /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng-0.9.16.dist-info/RECORD removed '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng-0.9.16.dist-info/RECORD' + rm -fv /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng-0.9.16.dist-info/REQUESTED removed '/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng-0.9.16.dist-info/REQUESTED' + '[' -f /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-dep-overrides ']' ++ wc -l /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-ghost-distinfo ++ cut -f1 '-d ' + lines=1 + '[' 1 -ne 1 ']' + RPM_FILES_ESCAPE=4.19 + /usr/bin/python3 /usr/lib/rpm/redhat/pyproject_save_files.py --output-files /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-files --output-modules /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-modules --buildroot /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT --sitelib /usr/lib/python3.15/site-packages --sitearch /usr/lib64/python3.15/site-packages --python-version 3.15 --pyproject-record /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs-backup-ng-0.9.16-1.fc46.x86_64-pyproject-record --prefix /usr -l btrfs_backup_ng + install -d /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/share/man/man1 + install -m 0644 man/man1/btrfs-backup-ng-config.1 man/man1/btrfs-backup-ng-doctor.1 man/man1/btrfs-backup-ng-estimate.1 man/man1/btrfs-backup-ng-install.1 man/man1/btrfs-backup-ng-list.1 man/man1/btrfs-backup-ng-prune.1 man/man1/btrfs-backup-ng-raw.1 man/man1/btrfs-backup-ng-restore.1 man/man1/btrfs-backup-ng-run.1 man/man1/btrfs-backup-ng-snapper.1 man/man1/btrfs-backup-ng-snapshot.1 man/man1/btrfs-backup-ng-status.1 man/man1/btrfs-backup-ng-transfer.1 man/man1/btrfs-backup-ng-verify.1 man/man1/btrfs-backup-ng.1 /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/share/man/man1 + install -d /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/share/bash-completion/completions + install -d /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/share/zsh/site-functions + install -d /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/share/fish/vendor_completions.d + install -m 0644 completions/btrfs-backup-ng.bash /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/share/bash-completion/completions/btrfs-backup-ng + install -m 0644 completions/btrfs-backup-ng.zsh /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/share/zsh/site-functions/_btrfs-backup-ng + install -m 0644 completions/btrfs-backup-ng.fish /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/share/fish/vendor_completions.d/btrfs-backup-ng.fish + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/redhat/brp-ldconfig + COMPRESS='gzip -9 -n' + COMPRESS_EXT=.gz + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip /usr/bin/strip + /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump + /usr/lib/rpm/redhat/brp-strip-lto /usr/bin/strip + /usr/lib/rpm/check-rpaths + /usr/lib/rpm/redhat/brp-mangle-shebangs + /usr/lib/rpm/brp-remove-la-files + /usr/lib/rpm/redhat/brp-python-rpm-in-distinfo + env /usr/lib/rpm/redhat/brp-python-bytecompile '' 1 0 -j4 Bytecompiling .py files below /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15 using python3.15 + /usr/lib/rpm/redhat/brp-python-hardlink + /usr/bin/add-det --brp -j4 /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/systemd_utils.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/transaction.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/notifications.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/retention.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/lifecycle.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/__util__.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/btrbk_import.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/__main__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/__logger__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/_legacy_main.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/_legacy_main.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/__pycache__/__util__.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/sshutil/__pycache__/master.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/sshutil/__pycache__/master.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/sshutil/__pycache__/diagnose.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/snapper/__pycache__/snapshot.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/snapper/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/snapper/__pycache__/metadata.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/snapper/__pycache__/scanner.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/endpoint/__pycache__/shell.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/endpoint/__pycache__/raw_metadata.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/sshutil/__pycache__/lock.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/endpoint/__pycache__/local.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/endpoint/__pycache__/common.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/endpoint/__pycache__/ssh.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/endpoint/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/detection/__pycache__/classifier.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/detection/__pycache__/models.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/detection/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/detection/__pycache__/scanner.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/endpoint/__pycache__/raw.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/verify.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/operations.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/operations.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/transfer.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/errors.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/transfer.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/target.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/retry.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/doctor.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/state.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/layout.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/restore.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/execution.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/space.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/layout.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/compression.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/progress.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/estimate.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/planning.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/progress.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/config/__pycache__/schema.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/config/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/config/__pycache__/loader.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/core/__pycache__/chunked_transfer.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/snapshot.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/status.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/restore.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/snapper_cmd.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/wizard_utils.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/dispatcher.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/verify.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/transfers_cmd.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/raw_cmd.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/restore.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/transfer.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/run.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/prune.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/common.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/config_cmd.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/manpages.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/list_cmd.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/install.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/completions.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/estimate.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/doctor.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/completion_gen.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/cli/__pycache__/config_cmd.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages/btrfs_backup_ng/endpoint/__pycache__/ssh.cpython-315.pyc: replacing with normalized version Scanned 35 directories and 244 files, processed 97 inodes, 82 modified (20 replaced + 62 rewritten), 0 unsupported format, 0 errors + /usr/bin/linkdupes --brp /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr Scanned 34 directories and 244 files, considered 244 files, read 6 files, linked 3 files, 0 errors sum of sizes of linked files: 97047 bytes Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.FHEyvp + umask 022 + cd /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd btrfs_backup_ng-0.9.16 + export BBNG_TEST_REQUIRE_TOOLS=awk,btrfs,bzip2,dash,fish,gzip,lz4,lzop,openssl,pbzip2,pigz,ps,xz,zsh,zstd + BBNG_TEST_REQUIRE_TOOLS=awk,btrfs,bzip2,dash,fish,gzip,lz4,lzop,openssl,pbzip2,pigz,ps,xz,zsh,zstd + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + PATH=/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin + PYTHONPATH=/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib64/python3.15/site-packages:/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/BUILDROOT/usr/lib/python3.15/site-packages + PYTHONDONTWRITEBYTECODE=1 + PYTEST_ADDOPTS=' --ignore=/builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/.pyproject-builddir' + PYTEST_XDIST_AUTO_NUM_WORKERS=4 + /usr/bin/pytest ============================= test session starts ============================== platform linux -- Python 3.15.0, pytest-9.1.1, pluggy-1.7.0 -- /usr/bin/python3 cachedir: .pytest_cache BBNG_TEST_REQUIRE_TOOLS: awk, btrfs, bzip2, dash, fish, gzip, lz4, lzop, openssl, pbzip2, pigz, ps, xz, zsh, zstd rootdir: /builddir/build/BUILD/btrfs-backup-ng-0.9.16-build/btrfs_backup_ng-0.9.16 configfile: pyproject.toml testpaths: tests plugins: asyncio-1.4.0 asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function collecting ... collected 7461 items / 167 deselected / 7294 selected tests/integration/test_chunked_operations.py::TestSendSnapshotChunkedOption::test_use_chunked_false_returns_none PASSED [ 0%] tests/integration/test_chunked_operations.py::TestSendSnapshotChunkedOption::test_use_chunked_true_creates_manager PASSED [ 0%] tests/integration/test_chunked_operations.py::TestSendSnapshotChunkedOption::test_use_chunked_with_provided_manager PASSED [ 0%] tests/integration/test_chunked_operations.py::TestDoChunkedTransfer::test_creates_manifest_for_new_transfer PASSED [ 0%] tests/integration/test_chunked_operations.py::TestDoChunkedTransfer::test_resume_transfer_continues_from_checkpoint PASSED [ 0%] tests/integration/test_chunked_operations.py::TestDoChunkedTransfer::test_ssh_endpoint_uses_ssh_transfer PASSED [ 0%] tests/integration/test_chunked_operations.py::TestTransferChunksLocal::test_pipes_chunks_to_receive PASSED [ 0%] tests/integration/test_chunked_operations.py::TestTransferChunksSSH::test_uses_receive_chunked_if_available PASSED [ 0%] tests/integration/test_chunked_operations.py::TestTransferChunksSSH::test_falls_back_to_streaming_receive PASSED [ 0%] tests/integration/test_chunked_operations.py::TestChunkedTransferEndToEnd::test_full_chunked_transfer_flow PASSED [ 0%] tests/integration/test_chunked_operations.py::TestChunkedTransferEndToEnd::test_chunked_transfer_with_parent PASSED [ 0%] tests/integration/test_chunked_operations.py::TestChunkedTransferSuccessContract::test_nonzero_send_exit_raises_and_does_not_transfer PASSED [ 0%] tests/integration/test_chunked_operations.py::TestChunkedTransferSuccessContract::test_ssh_fallback_does_not_mark_chunks_before_receive_confirms PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_run_command PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_snapshot_command PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_transfer_command PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_prune_command PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_list_command PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_status_command PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_config_validate PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_config_init PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_config_import PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_install_command PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_install_oncalendar PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_version_flag PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_config_file_option PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIArgumentParsing::test_parse_verbosity_options PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv0-True] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv1-True] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv2-True] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv3-True] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv4-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv5-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv6-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv7-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv8-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv9-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv10-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv11-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv12-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeDetection::test_legacy_mode_detection[argv13-False] PASSED [ 0%] tests/integration/test_cli_e2e.py::TestMainEntryPoint::test_main_legacy_mode PASSED [ 0%] tests/integration/test_cli_e2e.py::TestMainEntryPoint::test_main_subcommand_mode PASSED [ 0%] tests/integration/test_cli_e2e.py::TestMainEntryPoint::test_main_version_flag PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_run_command_execution PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_snapshot_command_execution PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_transfer_command_execution PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_prune_command_execution PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_list_command_execution PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_status_command_execution PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_config_command_execution PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_install_command_execution PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_uninstall_command_execution PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_no_command_returns_error PASSED [ 0%] tests/integration/test_cli_e2e.py::TestSubcommandExecution::test_version_prints_and_exits PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeExecution::test_legacy_mode_calls_legacy_main PASSED [ 0%] tests/integration/test_cli_e2e.py::TestLegacyModeExecution::test_legacy_mode_returns_exit_code PASSED [ 0%] tests/integration/test_cli_e2e.py::TestMigrationNotice::test_notice_creates_marker_file PASSED [ 0%] tests/integration/test_cli_e2e.py::TestMigrationNotice::test_notice_not_shown_twice PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIErrorHandling::test_unknown_command PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIErrorHandling::test_invalid_compression_method PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIErrorHandling::test_invalid_timer_option PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIWithConfig::test_config_validate_with_file PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIIntegrationScenarios::test_full_run_workflow PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIIntegrationScenarios::test_prune_dry_run_workflow PASSED [ 0%] tests/integration/test_cli_e2e.py::TestCLIIntegrationScenarios::test_list_json_output_workflow PASSED [ 0%] tests/integration/test_config_flow.py::TestConfigLoadingFlow::test_load_and_validate_minimal_config PASSED [ 0%] tests/integration/test_config_flow.py::TestConfigLoadingFlow::test_load_full_config_with_all_options PASSED [ 0%] tests/integration/test_config_flow.py::TestConfigLoadingFlow::test_config_warnings_for_issues PASSED [ 0%] tests/integration/test_config_flow.py::TestConfigLoadingFlow::test_get_enabled_volumes PASSED [ 0%] tests/integration/test_config_flow.py::TestConfigLoadingFlow::test_effective_retention_inheritance PASSED [ 0%] tests/integration/test_config_flow.py::TestConfigToOperationPlanning::test_plan_snapshot_operations PASSED [ 0%] tests/integration/test_config_flow.py::TestConfigToOperationPlanning::test_plan_with_ssh_targets PASSED [ 1%] tests/integration/test_config_flow.py::TestConfigErrorHandling::test_missing_volume_path_error PASSED [ 1%] tests/integration/test_config_flow.py::TestConfigErrorHandling::test_missing_target_path_error PASSED [ 1%] tests/integration/test_config_flow.py::TestConfigErrorHandling::test_invalid_compression_method_error PASSED [ 1%] tests/integration/test_config_flow.py::TestConfigErrorHandling::test_invalid_toml_syntax_error PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_endpoint_initialization PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_endpoint_prepare_creates_infrastructure_below_the_destination PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_endpoint_prepare_refuses_a_destination_that_does_not_exist PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_endpoint_get_id PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_receive_accepts_snapshot_name PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_list_snapshots_empty PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_list_snapshots_with_prefix_matching PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_timestamp_format_preserved_through_init PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_timestamp_format_preserved_via_choose_endpoint PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_list_snapshots_finds_custom_format PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_list_snapshots_mixed_legacy_and_custom_format PASSED [ 1%] tests/integration/test_endpoints.py::TestLocalEndpointOperations::test_snapshot_cache_behavior PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointSnapshotOperations::test_snapshot_command_building PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointSendReceiveOperations::test_build_send_command PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointSendReceiveOperations::test_build_send_command_with_parent PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointSendReceiveOperations::test_build_receive_command PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointDeletionOperations::test_build_deletion_commands PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointDeletionOperations::test_build_deletion_commands_with_convert_rw PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointDeletionOperations::test_delete_snapshots_skips_locked PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointLockOperations::test_lock_file_path PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointRemotePathHandling::test_normalize_path_remote_flag PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointRemotePathHandling::test_normalize_path_local_absolute PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointCommandExecution::test_adds_sudo_for_btrfs_commands PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointCommandExecution::test_no_sudo_for_root_user PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointCommandExecution::test_a_refused_sudo_fails_the_command PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointCommandExecution::test_a_refused_sudo_fails_the_remount PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointErrorHandling::test_invalid_source_path PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointErrorHandling::test_prepare_without_btrfs_command PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointErrorHandling::test_prepare_fails_fs_check PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointErrorHandling::test_prepare_auto_mode_warns_but_continues PASSED [ 1%] tests/integration/test_endpoints.py::TestEndpointErrorHandling::test_prepare_skip_mode_no_checks PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionPolicyApplication::test_full_retention_scenario_30_days PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionPolicyApplication::test_retention_with_unparseable_timestamps PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionPolicyApplication::test_retention_preserves_latest_always PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionPolicyApplication::test_retention_all_within_min_period PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionPolicyApplication::test_retention_bucket_selection PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionPolicyApplication::test_retention_weekly_bucket PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionPolicyApplication::test_retention_monthly_bucket PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionWithRealSnapshots::test_retention_with_mock_snapshot_objects PASSED [ 1%] tests/integration/test_retention_flow.py::TestPruneFlowIntegration::test_prune_dry_run_reports_correctly PASSED [ 1%] tests/integration/test_retention_flow.py::TestPruneFlowIntegration::test_prune_executes_deletions PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionConfigIntegration::test_retention_from_toml_config PASSED [ 1%] tests/integration/test_retention_flow.py::TestRetentionConfigIntegration::test_volume_retention_override PASSED [ 1%] tests/integration/test_retention_flow.py::TestTimestampExtraction::test_extract_timestamp_formats[home-20240115-143022-home--expected_date0] PASSED [ 1%] tests/integration/test_retention_flow.py::TestTimestampExtraction::test_extract_timestamp_formats[backup-20240101-000000-backup--expected_date1] PASSED [ 1%] tests/integration/test_retention_flow.py::TestTimestampExtraction::test_extract_timestamp_formats[test-20231231-235959-test--expected_date2] PASSED [ 1%] tests/integration/test_retention_flow.py::TestTimestampExtraction::test_extract_timestamp_formats[20240115-143022--expected_date3] PASSED [ 1%] tests/integration/test_retention_flow.py::TestTimestampExtraction::test_extract_timestamp_returns_none_for_invalid PASSED [ 1%] tests/integration/test_retention_flow.py::TestBucketKeyGeneration::test_hourly_bucket_key PASSED [ 1%] tests/integration/test_retention_flow.py::TestBucketKeyGeneration::test_daily_bucket_key PASSED [ 1%] tests/integration/test_retention_flow.py::TestBucketKeyGeneration::test_weekly_bucket_key PASSED [ 1%] tests/integration/test_retention_flow.py::TestBucketKeyGeneration::test_monthly_bucket_key PASSED [ 1%] tests/integration/test_retention_flow.py::TestBucketKeyGeneration::test_yearly_bucket_key PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration[1d-1] PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration[7d-7] PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration[1w-7] PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration[2w-14] PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration[1M-30] PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration[12M-360] PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration[1y-365] PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration_hours PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration_minutes PASSED [ 1%] tests/integration/test_retention_flow.py::TestDurationParsing::test_parse_duration_invalid PASSED [ 1%] tests/test_a_parent_pin_on_a_missing_snapshot_is_released.py::test_the_next_sync_releases_it_and_does_not_send_the_snapshot PASSED [ 1%] tests/test_a_parent_pin_on_a_missing_snapshot_is_released.py::test_a_pin_on_a_missing_snapshot_is_kept PASSED [ 1%] tests/test_a_parent_pin_on_a_missing_snapshot_is_released.py::test_another_destinations_parent_pin_is_kept PASSED [ 1%] tests/test_abort_errors_carry_their_reason.py::test_no_bare_abort_error_anywhere PASSED [ 1%] tests/test_abort_errors_carry_their_reason.py::TestTheLockStoreIsShared::test_a_local_endpoint_honours_a_remote_restores_pin PASSED [ 1%] tests/test_abort_errors_carry_their_reason.py::TestTheLockStoreIsShared::test_a_store_that_cannot_be_read_says_so_in_the_exception PASSED [ 2%] tests/test_abort_errors_carry_their_reason.py::TestTheLockStoreIsShared::test_an_unreadable_lock_file_names_the_os_error PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestRelativeIsUnchanged::test_the_default_resolves_under_the_source PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestRelativeIsUnchanged::test_a_nested_relative_dir_resolves_under_the_source PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestRelativeIsUnchanged::test_it_does_not_need_to_exist_yet PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestAbsoluteRequiresItsBase::test_an_existing_base_gets_a_per_source_directory PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestAbsoluteRequiresItsBase::test_the_per_source_directory_need_not_exist_yet PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestAbsoluteRequiresItsBase::test_a_missing_base_is_refused PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestAbsoluteRequiresItsBase::test_the_refusal_is_the_shared_diagnosis_plus_the_consequence PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestAbsoluteRequiresItsBase::test_a_missing_base_is_not_created PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestAbsoluteRequiresItsBase::test_a_file_where_the_base_should_be_is_refused PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestEveryCallSiteUsesIt::test_the_cli_resolves_through_the_helper[run-create_snapshot_dir(] PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestEveryCallSiteUsesIt::test_the_cli_resolves_through_the_helper[snapshot-create_snapshot_dir(] PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestEveryCallSiteUsesIt::test_the_cli_resolves_through_the_helper[transfer-resolve_snapshot_dir(] PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestEveryCallSiteUsesIt::test_the_cli_resolves_through_the_helper[prune-resolve_snapshot_dir(] PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestEveryCallSiteUsesIt::test_the_cli_resolves_through_the_helper[list_cmd-resolve_snapshot_dir(] PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestEveryCallSiteUsesIt::test_the_cli_resolves_through_the_helper[status-resolve_snapshot_dir(] PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestEveryCallSiteUsesIt::test_the_cli_resolves_through_the_helper[estimate-resolve_snapshot_dir(] PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestTheSourceIsVerifiedBeforeAnythingIsCreated::test_a_missing_source_is_refused_and_nothing_is_created PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestTheSourceIsVerifiedBeforeAnythingIsCreated::test_a_relative_dir_is_created_under_an_existing_source PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestTheSourceIsVerifiedBeforeAnythingIsCreated::test_a_nested_relative_dir_is_created_component_by_component PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestTheSourceIsVerifiedBeforeAnythingIsCreated::test_an_absolute_base_gets_its_per_source_directory PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestTheSourceIsVerifiedBeforeAnythingIsCreated::test_a_missing_absolute_base_is_refused_even_with_the_source_present PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestTheSourceIsVerifiedBeforeAnythingIsCreated::test_a_relative_dir_that_climbs_out_of_the_source_must_exist PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestTheSourceIsVerifiedBeforeAnythingIsCreated::test_the_writer_returns_what_the_readers_resolve PASSED [ 2%] tests/test_absolute_snapshot_dir.py::TestEstimateReadsWhatTransferReads::test_estimate_counts_the_snapshots_the_listing_sees PASSED [ 2%] tests/test_atomic_commit_wiring.py::test_send_snapshot_commits_on_success PASSED [ 2%] tests/test_atomic_commit_wiring.py::test_send_snapshot_does_not_commit_on_pipeline_failure PASSED [ 2%] tests/test_atomic_commit_wiring.py::test_send_snapshot_commit_failure_is_a_transfer_failure PASSED [ 2%] tests/test_atomic_commit_wiring.py::test_chunked_transfer_commits_on_success PASSED [ 2%] tests/test_atomic_commit_wiring.py::test_log_process_errors_returns_captured_stderr PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_writes_and_reads_back PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_accepts_str PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_mode_0600 PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_leaves_no_temp PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_replaces_stale_temp PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_overwrites_existing PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_symlinked_temp_does_not_clobber_victim PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_fsyncs_file_and_parent_dir PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_no_fsync_when_disabled PASSED [ 2%] tests/test_atomic_persistence.py::test_atomic_write_bytes_failure_preserves_old_and_cleans_temp PASSED [ 2%] tests/test_atomic_persistence.py::test_operation_record_save_atomic_roundtrip PASSED [ 2%] tests/test_atomic_persistence.py::test_operation_record_save_torn_write_preserves_old PASSED [ 2%] tests/test_atomic_persistence.py::test_operation_record_save_best_effort_does_not_raise PASSED [ 2%] tests/test_atomic_persistence.py::test_manifest_save_atomic_roundtrip PASSED [ 2%] tests/test_atomic_persistence.py::test_manifest_save_torn_write_preserves_old PASSED [ 2%] tests/test_atomic_persistence.py::test_unlock_writes_lock_file_atomically PASSED [ 2%] tests/test_atomic_persistence.py::test_unlock_torn_write_preserves_lock_file PASSED [ 2%] tests/test_atomic_persistence.py::test_archive_operation_keeps_source_when_archive_write_fails PASSED [ 2%] tests/test_atomic_persistence.py::test_archive_operation_keeps_source_when_archive_unreadable PASSED [ 2%] tests/test_backup_source_check.py::TestTheSharedAnswer::test_a_missing_source PASSED [ 2%] tests/test_backup_source_check.py::TestTheSharedAnswer::test_a_file_where_a_subvolume_belongs PASSED [ 2%] tests/test_backup_source_check.py::TestTheSharedAnswer::test_a_directory_on_a_filesystem_that_is_not_btrfs PASSED [ 2%] tests/test_backup_source_check.py::TestTheSharedAnswer::test_a_plain_directory_is_never_usable PASSED [ 2%] tests/test_backup_source_check.py::TestTheSharedAnswer::test_an_unreadable_source_is_not_reported_missing PASSED [ 2%] tests/test_backup_source_check.py::TestTheSharedAnswer::test_a_probe_failure_is_raised_to_the_caller PASSED [ 2%] tests/test_backup_source_check.py::TestTheSharedAnswer::test_a_relative_source_is_reported_as_the_path_it_names PASSED [ 2%] tests/test_backup_source_check.py::TestValidateUsesIt::test_an_unreadable_source_exits_2_with_the_reason PASSED [ 2%] tests/test_backup_source_check.py::TestValidateUsesIt::test_a_directory_not_on_btrfs_exits_2 PASSED [ 2%] tests/test_backup_source_check.py::TestValidateUsesIt::test_a_probe_failure_is_no_verdict PASSED [ 2%] tests/test_backup_source_check.py::TestValidateUsesIt::test_a_fault_in_the_check_is_not_a_pass PASSED [ 2%] tests/test_backup_source_check.py::TestDoctorUsesIt::test_each_problem_is_an_error_with_the_shared_message PASSED [ 2%] tests/test_backup_source_check.py::TestDoctorUsesIt::test_no_problem_is_ok PASSED [ 2%] tests/test_backup_source_check.py::TestDoctorUsesIt::test_an_unreadable_source_is_an_error_with_the_reason PASSED [ 2%] tests/test_backup_source_check.py::TestDoctorUsesIt::test_a_probe_failure_is_a_failed_check_not_a_pass PASSED [ 2%] tests/test_backup_source_check.py::TestSnapperSources::test_the_checks_before_the_subvolume_one_still_apply PASSED [ 2%] tests/test_backup_source_check.py::TestSnapperSources::test_an_unreadable_snapper_source PASSED [ 2%] tests/test_backup_source_check.py::TestSnapperSources::test_validate_asks_with_the_volume_source_kind[snapper-True] PASSED [ 2%] tests/test_backup_source_check.py::TestSnapperSources::test_validate_asks_with_the_volume_source_kind[native-False] PASSED [ 2%] tests/test_backup_source_check.py::TestSnapperSources::test_doctor_asks_with_the_volume_source_kind[True] PASSED [ 2%] tests/test_backup_source_check.py::TestSnapperSources::test_doctor_asks_with_the_volume_source_kind[False] PASSED [ 2%] tests/test_backup_source_check.py::TestTheTwoCommandsAgree::test_doctor_reports_exactly_what_validate_prints[missing] PASSED [ 2%] tests/test_backup_source_check.py::TestTheTwoCommandsAgree::test_doctor_reports_exactly_what_validate_prints[file] PASSED [ 2%] tests/test_backup_source_check.py::TestTheTwoCommandsAgree::test_doctor_reports_exactly_what_validate_prints[not-btrfs] PASSED [ 3%] tests/test_backup_source_check.py::TestTheTwoCommandsAgree::test_doctor_reports_exactly_what_validate_prints[plain] PASSED [ 3%] tests/test_backup_volume_check.py::TestTheFilesystemBehindAMount::test_the_longest_mount_point_holds_the_path PASSED [ 3%] tests/test_backup_volume_check.py::TestTheFilesystemBehindAMount::test_members_of_one_btrfs_are_one_filesystem PASSED [ 3%] tests/test_backup_volume_check.py::TestTheFilesystemBehindAMount::test_a_device_the_kernel_does_not_list_falls_back_to_by_uuid PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapshotDir::test_a_relative_one_under_the_source_is_not_checked PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapshotDir::test_a_relative_one_climbing_out_must_exist PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapshotDir::test_an_absolute_one_must_exist PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapshotDir::test_a_file_where_a_directory_belongs PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapshotDir::test_an_unreadable_one_is_not_reported_missing PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapshotDir::test_one_that_is_not_on_btrfs PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapshotDir::test_one_on_another_btrfs_names_both_devices PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapshotDir::test_one_on_the_same_filesystem_passes PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapshotDir::test_another_member_of_the_same_filesystem_passes PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapperConfig::test_a_named_config_that_exists PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapperConfig::test_a_named_config_that_does_not_exist_lists_what_does PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapperConfig::test_auto_with_a_config_holding_the_path PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapperConfig::test_auto_with_no_config_holding_the_path PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapperConfig::test_no_configs_at_all PASSED [ 3%] tests/test_backup_volume_check.py::TestSnapperConfig::test_snapper_not_set_up PASSED [ 3%] tests/test_backup_volume_check.py::TestTheScannerAsksSnapper::test_configs_root_alone_can_read_are_listed PASSED [ 3%] tests/test_backup_volume_check.py::TestTheScannerAsksSnapper::test_a_readable_file_still_supplies_the_other_fields PASSED [ 3%] tests/test_backup_volume_check.py::TestTheScannerAsksSnapper::test_the_files_are_read_when_the_command_fails PASSED [ 3%] tests/test_backup_volume_check.py::TestTheScannerAsksSnapper::test_the_files_are_read_where_snapper_is_absent PASSED [ 3%] tests/test_backup_volume_check.py::TestTheScannerAsksSnapper::test_another_configs_directory_is_read_as_files_alone PASSED [ 3%] tests/test_backup_volume_check.py::TestTheScannerAsksSnapper::test_a_missing_directory_without_snapper_is_still_not_found PASSED [ 3%] tests/test_backup_volume_check.py::TestTheScannerAsksSnapper::test_the_real_snapper_lists_what_it_lists SKIPPED [ 3%] tests/test_backup_volume_check.py::TestTheOneQuestion::test_a_source_problem_ends_it PASSED [ 3%] tests/test_backup_volume_check.py::TestTheOneQuestion::test_a_native_volume_asks_about_its_snapshot_dir PASSED [ 3%] tests/test_backup_volume_check.py::TestTheOneQuestion::test_a_snapper_volume_asks_about_its_config_not_its_snapshot_dir PASSED [ 3%] tests/test_backup_volume_check.py::TestValidateAndDoctor::test_a_snapper_volume_naming_a_missing_config PASSED [ 3%] tests/test_backup_volume_check.py::TestValidateAndDoctor::test_a_snapper_volume_under_no_config PASSED [ 3%] tests/test_backup_volume_check.py::TestValidateAndDoctor::test_a_snapper_volume_that_run_can_find PASSED [ 3%] tests/test_backup_volume_check.py::TestValidateAndDoctor::test_a_native_volume_with_an_absent_snapshot_dir PASSED [ 3%] tests/test_backup_volume_check.py::TestValidateAndDoctor::test_a_native_volume_with_a_snapshot_dir_on_another_filesystem PASSED [ 3%] tests/test_backup_volume_check.py::TestValidateAndDoctor::test_the_global_snapshot_dir_is_the_one_checked PASSED [ 3%] tests/test_backup_volume_check.py::TestValidateAndDoctor::test_doctor_reports_exactly_what_validate_prints PASSED [ 3%] tests/test_backup_volume_check.py::TestValidateAndDoctor::test_doctor_says_ok_when_run_could_proceed PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume[/mnt/plain-/mnt/plain] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume[/mnt/sp ace-/mnt/sp ace] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume[/mnt/two spaces-/mnt/two spaces] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume[/mnt/three sp runs-/mnt/three sp runs] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume[/mnt/tab\tsep-/mnt/tab\tsep] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume["/mnt/quoted path"-/mnt/quoted path] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume['/mnt/single quoted'-/mnt/single quoted] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume[/mnt/trail -/mnt/trail] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume[/mnt/a#b-/mnt/a] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume[/mnt/uni\xe9-/mnt/uni\xe9] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_volume[/mnt/da"ta-/mnt/da"ta] PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_subvolume_keeps_its_spaces PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_target_keeps_its_spaces PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_typed_target_keeps_its_spaces PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestDirectiveValueIsTheRestOfTheLine::test_a_converted_path_round_trips_through_the_loader PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestUnchangedBehaviourForOrdinaryConfigs::test_multi_value_options_still_split PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestUnchangedBehaviourForOrdinaryConfigs::test_ssh_target_url_is_untouched PASSED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print[/mnt/plain-/mnt/plain] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print[/mnt/sp ace-/mnt/sp ace] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print[/mnt/two spaces-/mnt/two spaces] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print[/mnt/three sp runs-/mnt/three sp runs] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print[/mnt/tab\tsep-/mnt/tab\tsep] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print["/mnt/quoted path"-/mnt/quoted path] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print['/mnt/single quoted'-/mnt/single quoted] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print[/mnt/trail -/mnt/trail] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print[/mnt/a#b-/mnt/a] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print[/mnt/uni\xe9-/mnt/uni\xe9] SKIPPED [ 3%] tests/test_btrbk_directive_takes_rest_of_line.py::TestAgainstRealBtrbk::test_matches_btrbk_config_print[/mnt/da"ta-/mnt/da"ta] SKIPPED [ 3%] tests/test_btrbk_import.py::TestBtrbkLexer::test_tokenize_simple_option PASSED [ 3%] tests/test_btrbk_import.py::TestBtrbkLexer::test_tokenize_multi_value_option PASSED [ 3%] tests/test_btrbk_import.py::TestBtrbkLexer::test_tokenize_volume PASSED [ 3%] tests/test_btrbk_import.py::TestBtrbkLexer::test_tokenize_subvolume PASSED [ 3%] tests/test_btrbk_import.py::TestBtrbkLexer::test_tokenize_target PASSED [ 3%] tests/test_btrbk_import.py::TestBtrbkLexer::test_tokenize_ssh_target PASSED [ 3%] tests/test_btrbk_import.py::TestBtrbkLexer::test_tokenize_comment PASSED [ 3%] tests/test_btrbk_import.py::TestBtrbkLexer::test_tokenize_empty_lines PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkLexer::test_tokenize_indented_content PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkParser::test_parse_simple_config PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkParser::test_parse_volume_with_subvolumes PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkParser::test_parse_options_inheritance PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkParser::test_parse_target_options PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_parse_days PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_parse_weeks PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_parse_months PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_parse_combined PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_parse_hours PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_parse_years PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_a_zero_count_disables_the_period PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_a_double_zero_count_keeps_the_current_period PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_parse_all PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_parse_none PASSED [ 4%] tests/test_btrbk_import.py::TestParseBtrbkRetention::test_parse_wildcard PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkLexerMore::test_tokenize_quoted_string PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkLexerMore::test_tokenize_single_quoted_string PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkLexerMore::test_tokenize_escaped_quote PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkLexerMore::test_tokenize_special_chars PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkParserMore::test_parse_missing_path_after_volume PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkParserMore::test_parse_missing_path_after_subvolume PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkParserMore::test_parse_missing_path_after_target PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkParserMore::test_parse_target_at_global_scope_is_kept_not_warned PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkParserMore::test_parse_subvolume_outside_volume PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_full_config PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_warns_about_subvolume_dot PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_warns_about_volume_root PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_converts_ssh_sudo PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_preserves_retention PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_nonexistent_file PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_scp_style_path PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_local_path_unchanged PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_timestamp_format_short PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_timestamp_format_long PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_timestamp_format_long_iso PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_timestamp_format_default PASSED [ 4%] tests/test_btrbk_import.py::TestImportBtrbkConfig::test_import_timestamp_format_unknown PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_min_months_unit_remapped PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_min_hours_days_weeks_years_keep_their_unit PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_min_no_maps_to_zero_age PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_yearly_is_emitted PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_yearly_default_emitted_when_absent PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_subvolume_override_emits_volumes_retention PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_no_override_omits_volumes_retention PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_day_of_week_warns PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_unrecognized_preserve_warns_not_silent_prune PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_warnings_are_deduped PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionFidelity::test_generated_toml_loads_and_is_faithful PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionWarningQuality::test_zero_bucket_value_not_labelled_not_understood PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionWarningQuality::test_unparseable_value_labelled_not_understood PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionWarningQuality::test_reordered_target_preserve_does_not_warn PASSED [ 4%] tests/test_btrbk_import.py::TestBtrbkRetentionWarningQuality::test_archive_preserve_warns PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_the_keyword_set_was_actually_found PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_the_unmapped_table_was_found PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[archive_preserve] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[archive_preserve_min] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[backend] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[backend_remote] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[btrfs_commit_delete] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[gpg_keyring] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[gpg_recipient] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[group] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[incremental] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[lockfile] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[preserve_day_of_week] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[preserve_hour_of_day] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[rate_limit] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[raw_target_compress] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[raw_target_encrypt] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[snapshot_create] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[snapshot_dir] PASSED [ 4%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[snapshot_name] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[snapshot_preserve] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[snapshot_preserve_min] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[ssh_compression] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[ssh_identity] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[ssh_port] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[ssh_user] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[stream_buffer] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[stream_compress] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[stream_compress_level] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[stream_compress_threads] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[target_preserve] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[target_preserve_min] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[timestamp_format] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_recognised_keyword_is_used_or_declared_unmapped[transaction_log] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_unmapped_entry_is_actually_reported[btrfs_commit_delete] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_unmapped_entry_is_actually_reported[group] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_unmapped_entry_is_actually_reported[lockfile] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_unmapped_entry_is_actually_reported[snapshot_create] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_unmapped_entry_is_actually_reported[stream_buffer] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_every_unmapped_entry_is_actually_reported[transaction_log] PASSED [ 5%] tests/test_btrbk_import_coverage.py::test_the_defining_literals_do_not_count_as_usage PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_raw_target_with_compression PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_raw_target_with_gpg_encryption PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_raw_target_with_compression_and_encryption PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_raw_target_ssh_conversion PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_global_raw_target_options PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_openssl_enc_support PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_missing_gpg_recipient_warning PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_mixed_raw_and_normal_targets PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_all_compression_algorithms_round_trip PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_no_raw_options_means_normal_target PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetImport::test_raw_ssh_target_no_sudo_comment PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetParsing::test_parse_raw_target_compress PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetParsing::test_parse_raw_target_encrypt PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetParsing::test_parse_gpg_options PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawTargetParsing::test_option_inheritance PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawImportRoundTrip::test_migrated_gpg_config_loads_with_encryption PASSED [ 5%] tests/test_btrbk_import_raw.py::TestBtrbkRawImportRoundTrip::test_migrated_openssl_config_loads_with_encryption PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_a_star_bucket_survives PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_a_leading_tilde_survives PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_no_leading_character_is_dropped[*d] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_no_leading_character_is_dropped[+tag] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_no_leading_character_is_dropped[%weird] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_no_leading_character_is_dropped[a,b] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_no_leading_character_is_dropped[(x)] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_no_leading_character_is_dropped[~/k] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_no_leading_character_is_dropped[$HOME/k] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_no_leading_character_is_dropped[!x] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_internal_spacing_is_kept_verbatim PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_quotes_are_stripped_as_btrbk_strips_them PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_an_unterminated_quote_does_not_swallow_the_file PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_a_comment_ends_the_value PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheValueIsTheRestOfTheLine::test_a_parser_without_the_source_text_still_reads_options PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_known_values_map_without_a_warning[all-all] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_known_values_map_without_a_warning[latest-0s] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_known_values_map_without_a_warning[no-0s] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_known_values_map_without_a_warning[2d-3d] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_known_values_map_without_a_warning[48h-49h] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_known_values_map_without_a_warning[4w-5w] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_known_values_map_without_a_warning[3m-4M] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_known_values_map_without_a_warning[1y-2y] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_known_values_map_without_a_warning[0d-1d] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_an_unrecognised_value_keeps_everything_and_warns PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_an_absent_minimum_is_all PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestTheMinimum::test_no_is_a_value_not_unset PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_the_engine_keeps_exactly_what_btrbk_kept[nothing set] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_the_engine_keeps_exactly_what_btrbk_kept[snapshot_preserve 2d] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_the_engine_keeps_exactly_what_btrbk_kept[snapshot_preserve_min 3m] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_the_engine_keeps_exactly_what_btrbk_kept[snapshot_preserve *d / snapshot_preserve_min latest] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_the_engine_keeps_exactly_what_btrbk_kept[snapshot_preserve 14d 8w *m / snapshot_preserve_min latest] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_keep_only_the_latest_is_kept_as_more_and_said[snapshot_preserve_min latest] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_keep_only_the_latest_is_kept_as_more_and_said[snapshot_preserve no / snapshot_preserve_min latest] PASSED [ 5%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_a_star_bucket_keeps_every_period PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_a_day_minimum_keeps_what_btrbk_keeps PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestSourceRetentionAgainstBtrbk::test_bucket_counts_keep_what_btrbk_keeps PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetRetentionAgainstBtrbk::test_a_target_with_no_minimum_keeps_everything[nothing set] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetRetentionAgainstBtrbk::test_a_target_with_no_minimum_keeps_everything[target_preserve 2d] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetRetentionAgainstBtrbk::test_delete_everything_is_kept_as_more_and_said[target_preserve_min no] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetRetentionAgainstBtrbk::test_delete_everything_is_kept_as_more_and_said[target_preserve_min no / target_preserve no] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetRetentionAgainstBtrbk::test_delete_everything_is_kept_as_more_and_said[target_preserve_min latest / target_preserve no] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetRetentionAgainstBtrbk::test_a_target_schedule_with_no_minimum_age_is_faithful PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetRetentionAgainstBtrbk::test_a_long_minimum_with_no_schedule_is_all_zero_buckets PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetPolicyPlacement::test_every_target_gets_its_own_retention_block PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetPolicyPlacement::test_subvolume_scope_reaches_its_targets PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetPolicyPlacement::test_the_old_divergence_warnings_are_gone PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTargetPolicyPlacement::test_generated_toml_has_target_retention_under_each_target PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTheNumbersAreExplained::test_a_raised_block_carries_the_btrbk_lines_and_the_rule PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTheNumbersAreExplained::test_a_target_block_names_the_target_directives PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTheNumbersAreExplained::test_the_note_is_said_once_for_many_blocks PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTheNumbersAreExplained::test_nothing_raised_means_no_note[nothing set] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTheNumbersAreExplained::test_nothing_raised_means_no_note[snapshot_preserve *d] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTheNumbersAreExplained::test_nothing_raised_means_no_note[snapshot_preserve 0d / snapshot_preserve_min latest] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTheNumbersAreExplained::test_nothing_raised_means_no_note[snapshot_preserve_min all] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTheNumbersAreExplained::test_nothing_raised_means_no_note[target_preserve_min no] PASSED [ 6%] tests/test_btrbk_import_retention_semantics.py::TestTheEngineAtBtrbkTime::test_now_is_after_every_snapshot PASSED [ 6%] tests/test_btrbk_import_targets.py::test_the_destination_survives_import[ target /mnt/backup-/mnt/backup-local] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_the_destination_survives_import[ target send-receive ssh://nas/backup-ssh://nas/backup-ssh] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_the_destination_survives_import[ target raw /mnt/backup-raw:///mnt/backup-raw] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_the_destination_survives_import[ target raw ssh://nas/backup-raw+ssh://nas:/backup-raw+ssh] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_the_destination_survives_import[ target nas:/mnt/backup-ssh://nas:/mnt/backup-ssh] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_the_destination_survives_import[ target ssh://nas/backup-ssh://nas/backup-ssh] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_the_destination_survives_import[ target ssh://nas/backup\n raw_target_compress zstd-raw+ssh://nas:/backup-raw+ssh] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_the_destination_survives_import[ target nas:/mnt/backup\n raw_target_compress zstd-raw+ssh://nas:/mnt/backup-raw+ssh] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_a_declared_target_type_never_becomes_the_destination[ target send-receive ssh://nas/backup] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_a_declared_target_type_never_becomes_the_destination[ target raw /mnt/backup] PASSED [ 6%] tests/test_btrbk_import_targets.py::test_a_remote_raw_target_does_not_become_a_local_directory PASSED [ 6%] tests/test_btrbk_import_targets.py::test_an_option_under_one_target_does_not_reach_its_sibling PASSED [ 6%] tests/test_btrbk_import_targets.py::TestCompressionSettingsSurviveOrAreReported::test_btrbk_lzo_becomes_the_lzop_this_project_runs PASSED [ 6%] tests/test_btrbk_import_targets.py::TestCompressionSettingsSurviveOrAreReported::test_an_unsupported_raw_method_is_reported_and_left_out PASSED [ 6%] tests/test_btrbk_import_targets.py::TestCompressionSettingsSurviveOrAreReported::test_what_the_importer_emits_can_actually_be_loaded PASSED [ 6%] tests/test_btrbk_import_targets.py::TestCompressionSettingsSurviveOrAreReported::test_raw_only_methods_still_come_through PASSED [ 6%] tests/test_btrbk_import_targets.py::TestCompressionSettingsSurviveOrAreReported::test_stream_compress_on_a_raw_target_is_not_dropped_silently PASSED [ 6%] tests/test_btrbk_import_targets.py::TestCompressionSettingsSurviveOrAreReported::test_a_compression_level_is_reported_rather_than_assumed PASSED [ 6%] tests/test_btrbk_import_targets.py::TestCompressionSettingsSurviveOrAreReported::test_ssh_compression_is_not_mentioned_for_a_local_target PASSED [ 6%] tests/test_btrbk_import_targets.py::TestCompressionSettingsSurviveOrAreReported::test_ssh_compression_is_mentioned_for_a_remote_target PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_all_four_are_carried_over[GLOBAL] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_all_four_are_carried_over[TARGET_SCOPE] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_the_emitted_uri_carries_the_user[GLOBAL] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_the_emitted_uri_carries_the_user[TARGET_SCOPE] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_a_raw_target_gets_them_too PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_an_existing_user_in_the_url_is_not_overwritten PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_a_local_target_gets_no_ssh_options PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_a_non_numeric_port_is_reported_not_emitted PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_rate_limit_no_is_not_emitted PASSED [ 6%] tests/test_btrbk_import_targets.py::TestConnectionOptionsSurviveImport::test_what_the_importer_emits_still_loads PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_ssh_user_is_not_a_username[no] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_ssh_user_is_not_a_username[NO] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_ssh_user_is_not_a_username[off] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_ssh_user_is_not_a_username[false] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_ssh_user_is_not_a_username[0] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_ssh_identity_is_not_a_key_path[no] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_ssh_identity_is_not_a_key_path[off] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_ssh_identity_is_not_a_key_path[false] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_raw_option_does_not_make_the_target_raw[no] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_raw_option_does_not_make_the_target_raw[off] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_raw_option_does_not_make_the_target_raw[false] PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_disabled_raw_encrypt_does_not_make_the_target_raw PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_real_values_are_still_carried PASSED [ 6%] tests/test_btrbk_import_targets.py::TestBtrbkOffValuesAreNotSettings::test_a_genuinely_raw_target_is_still_raw PASSED [ 6%] tests/test_btrbk_import_targets.py::TestGlobalTargetsAreInherited::test_a_global_target_reaches_every_subvolume PASSED [ 6%] tests/test_btrbk_import_targets.py::TestGlobalTargetsAreInherited::test_a_global_target_no_longer_warns_as_misplaced PASSED [ 6%] tests/test_btrbk_import_targets.py::TestGlobalTargetsAreInherited::test_subvolume_targets_are_added_to_the_global_one PASSED [ 6%] tests/test_btrbk_import_targets.py::TestGlobalTargetsAreInherited::test_a_config_with_no_global_target_is_unchanged PASSED [ 6%] tests/test_btrbk_import_targets.py::TestGlobalTargetsAreInherited::test_the_migrated_config_still_loads PASSED [ 6%] tests/test_btrbk_import_targets.py::TestADeclaredTargetTypeIsRespected::test_an_explicit_send_receive_is_not_converted_to_raw PASSED [ 6%] tests/test_btrbk_import_targets.py::TestADeclaredTargetTypeIsRespected::test_the_ignored_raw_options_are_reported PASSED [ 7%] tests/test_btrbk_import_targets.py::TestADeclaredTargetTypeIsRespected::test_an_explicit_raw_type_is_still_raw PASSED [ 7%] tests/test_btrbk_import_targets.py::TestADeclaredTargetTypeIsRespected::test_an_undeclared_target_still_follows_raw_options PASSED [ 7%] tests/test_btrbk_import_targets.py::TestEncryptionIsNeverEmittedUnloadable::test_gpg_without_a_recipient_is_not_emitted PASSED [ 7%] tests/test_btrbk_import_targets.py::TestEncryptionIsNeverEmittedUnloadable::test_the_result_still_loads PASSED [ 7%] tests/test_btrbk_import_targets.py::TestEncryptionIsNeverEmittedUnloadable::test_dropping_it_is_reported_loudly PASSED [ 7%] tests/test_btrbk_import_targets.py::TestEncryptionIsNeverEmittedUnloadable::test_gpg_with_a_recipient_is_carried PASSED [ 7%] tests/test_btrbk_import_targets.py::TestTheBackendChoiceIsRespected::test_the_sudo_backend_elevates PASSED [ 7%] tests/test_btrbk_import_targets.py::TestTheBackendChoiceIsRespected::test_the_plain_backend_does_not PASSED [ 7%] tests/test_btrbk_import_targets.py::TestTheBackendChoiceIsRespected::test_an_unset_backend_keeps_the_previous_default PASSED [ 7%] tests/test_btrbk_import_targets.py::TestTheBackendChoiceIsRespected::test_backend_remote_is_honoured_too PASSED [ 7%] tests/test_btrbk_import_targets.py::TestLocalTargetsGetNoSshOptions::test_a_local_target_carries_no_key_or_port PASSED [ 7%] tests/test_btrbk_import_targets.py::TestLocalTargetsGetNoSshOptions::test_a_remote_target_still_carries_them PASSED [ 7%] tests/test_btrbk_import_targets.py::TestUnmappedOptionsAreReported::test_each_is_named_in_the_warnings[snapshot_create-onchange] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestUnmappedOptionsAreReported::test_each_is_named_in_the_warnings[stream_buffer-256m] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestUnmappedOptionsAreReported::test_each_is_named_in_the_warnings[lockfile-/var/lock/btrbk.lock] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestUnmappedOptionsAreReported::test_each_is_named_in_the_warnings[transaction_log-/var/log/btrbk.log] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestUnmappedOptionsAreReported::test_each_is_named_in_the_warnings[btrfs_commit_delete-after] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestUnmappedOptionsAreReported::test_each_is_named_in_the_warnings[group-nightly] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestUnmappedOptionsAreReported::test_a_disabled_one_is_not_reported PASSED [ 7%] tests/test_btrbk_import_targets.py::TestRemoteDetectionIsStructural::test_an_at_sign_inside_a_local_path_is_not_a_login[/mnt/backup/@snapshots] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestRemoteDetectionIsStructural::test_an_at_sign_inside_a_local_path_is_not_a_login[/mnt/backup/@home] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestRemoteDetectionIsStructural::test_an_at_sign_inside_a_local_path_is_not_a_login[/srv/backups@2026] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestRemoteDetectionIsStructural::test_real_remotes_are_still_detected[send-receive ssh://nas/backup] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestRemoteDetectionIsStructural::test_real_remotes_are_still_detected[raw ssh://nas/backup] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestRemoteDetectionIsStructural::test_real_remotes_are_still_detected[send-receive backup@nas:/srv/backup] PASSED [ 7%] tests/test_btrbk_import_targets.py::TestUnmappedOptionsAtTargetScope::test_a_target_scoped_option_is_reported PASSED [ 7%] tests/test_btrfs_debug.py::TestTheConfigKey::test_true_loads PASSED [ 7%] tests/test_btrfs_debug.py::TestTheConfigKey::test_default_is_off PASSED [ 7%] tests/test_btrfs_debug.py::TestTheConfigKey::test_a_non_boolean_is_refused_at_load["yes"] PASSED [ 7%] tests/test_btrfs_debug.py::TestTheConfigKey::test_a_non_boolean_is_refused_at_load[1] PASSED [ 7%] tests/test_btrfs_debug.py::TestTheConfigKey::test_a_non_boolean_is_refused_at_load["true"] PASSED [ 7%] tests/test_btrfs_debug.py::TestTheFlag::test_every_subcommand_accepts_it_before_the_command PASSED [ 7%] tests/test_btrfs_debug.py::TestTheFlag::test_it_implies_debug_logging PASSED [ 7%] tests/test_btrfs_debug.py::TestOneHelperAnswersEveryCommand::test_flag_or_config_enables_it PASSED [ 7%] tests/test_btrfs_debug.py::TestOneHelperAnswersEveryCommand::test_no_command_hard_codes_it PASSED [ 7%] tests/test_btrfs_debug.py::TestOneHelperAnswersEveryCommand::test_every_kwargs_site_uses_the_helper PASSED [ 7%] tests/test_btrfs_debug.py::TestItMeansSomething::test_the_drain_logs_each_line_with_the_process_name PASSED [ 7%] tests/test_btrfs_debug.py::TestItMeansSomething::test_without_the_name_nothing_is_logged PASSED [ 7%] tests/test_btrfs_debug.py::TestItMeansSomething::test_the_endpoint_puts_vv_on_and_names_the_process PASSED [ 7%] tests/test_btrfs_debug.py::TestItMeansSomething::test_off_by_default_the_endpoint_does_not_name_it PASSED [ 7%] tests/test_btrfs_debug.py::TestASuccessfulTransferLogsEveryLine::test_nothing_is_left_in_the_queue_when_send_snapshot_returns PASSED [ 7%] tests/test_btrfs_debug.py::TestTheSshDirectPathIsNotLeftOut::test_the_remote_receive_command_carries_vv PASSED [ 7%] tests/test_btrfs_debug.py::TestTheSshDirectPathIsNotLeftOut::test_btrfs_flags_follow_the_config_without_init PASSED [ 7%] tests/test_catch_up_leaves_out_only_what_it_may.py::TestALockedSnapshotIsAlwaysSent::test_a_snapshot_this_destination_locked_is_kept_in_the_selection PASSED [ 7%] tests/test_catch_up_leaves_out_only_what_it_may.py::TestALockedSnapshotIsAlwaysSent::test_a_parent_lock_alone_does_not_count PASSED [ 7%] tests/test_catch_up_leaves_out_only_what_it_may.py::TestALockedSnapshotIsAlwaysSent::test_another_destinations_lock_does_not_count PASSED [ 7%] tests/test_catch_up_leaves_out_only_what_it_may.py::TestAnUndatedSubvolumeIsNotTurnedIntoARequest::test_it_is_left_out_of_the_selection_and_not_reported_as_pruned PASSED [ 7%] tests/test_catch_up_leaves_out_only_what_it_may.py::TestAnUndatedSubvolumeIsNotTurnedIntoARequest::test_the_plan_without_a_selection_agrees PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkInfo::test_creation PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkInfo::test_to_dict PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkInfo::test_from_dict PASSED [ 7%] tests/test_chunked_transfer.py::TestTransferManifest::test_creation PASSED [ 7%] tests/test_chunked_transfer.py::TestTransferManifest::test_chunk_properties PASSED [ 7%] tests/test_chunked_transfer.py::TestTransferManifest::test_resume_point PASSED [ 7%] tests/test_chunked_transfer.py::TestTransferManifest::test_is_resumable PASSED [ 7%] tests/test_chunked_transfer.py::TestTransferManifest::test_serialization_round_trip PASSED [ 7%] tests/test_chunked_transfer.py::TestTransferManifest::test_save_and_load PASSED [ 7%] tests/test_chunked_transfer.py::TestTransferConfig::test_defaults PASSED [ 7%] tests/test_chunked_transfer.py::TestTransferConfig::test_chunk_size_bytes PASSED [ 7%] tests/test_chunked_transfer.py::TestTransferConfig::test_cache_dir PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedStreamWriter::test_write_chunks PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedStreamWriter::test_checksums_computed PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedStreamWriter::test_callback_called PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedStreamReader::test_read_chunks_in_order PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedStreamReader::test_verify_checksums PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedStreamReader::test_checksum_mismatch_raises PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedStreamReader::test_missing_chunk_raises PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedTransferManager::test_create_transfer PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedTransferManager::test_chunk_stream PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedTransferManager::test_get_incomplete_transfers PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedTransferManager::test_resume_transfer PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedTransferManager::test_resume_non_resumable_fails PASSED [ 7%] tests/test_chunked_transfer.py::TestChunkedTransferManager::test_mark_chunk_transferred PASSED [ 8%] tests/test_chunked_transfer.py::TestChunkedTransferManager::test_complete_transfer PASSED [ 8%] tests/test_chunked_transfer.py::TestChunkedTransferManager::test_cleanup_transfer PASSED [ 8%] tests/test_chunked_transfer.py::TestChunkedTransferManager::test_cleanup_in_progress_requires_force PASSED [ 8%] tests/test_chunked_transfer.py::TestEstimateChunkCount::test_exact_multiple PASSED [ 8%] tests/test_chunked_transfer.py::TestEstimateChunkCount::test_with_remainder PASSED [ 8%] tests/test_chunked_transfer.py::TestEstimateChunkCount::test_smaller_than_chunk PASSED [ 8%] tests/test_chunked_transfer.py::TestEstimateChunkCount::test_default_chunk_size PASSED [ 8%] tests/test_cleanup_authorship.py::TestAPreExistingArtifactIsNeverDeleted::test_a_same_named_subvolume_that_predates_the_run_survives PASSED [ 8%] tests/test_cleanup_authorship.py::TestAPreExistingArtifactIsNeverDeleted::test_the_rm_rf_fallback_is_not_reached_either PASSED [ 8%] tests/test_cleanup_authorship.py::TestAPreExistingArtifactIsNeverDeleted::test_an_artifact_this_run_created_is_still_cleaned PASSED [ 8%] tests/test_cleanup_authorship.py::TestAuthorshipIsRecordedBeforeTheTransfer::test_an_existing_local_path_reads_as_pre_existing PASSED [ 8%] tests/test_cleanup_authorship.py::TestAuthorshipIsRecordedBeforeTheTransfer::test_an_absent_local_path_reads_as_ours_to_create PASSED [ 8%] tests/test_cleanup_authorship.py::TestAuthorshipIsRecordedBeforeTheTransfer::test_a_remote_path_is_asked_over_the_remote_transport PASSED [ 8%] tests/test_cleanup_authorship.py::TestAuthorshipIsRecordedBeforeTheTransfer::test_an_unanswerable_question_assumes_pre_existing PASSED [ 8%] tests/test_cleanup_authorship.py::TestAuthorshipIsRecordedBeforeTheTransfer::test_a_remote_endpoint_with_no_transport_assumes_pre_existing PASSED [ 8%] tests/test_cleanup_authorship.py::TestTheSSHCleanerHonoursItToo::test_a_pre_existing_remote_subvolume_is_not_removed PASSED [ 8%] tests/test_cleanup_authorship.py::TestTheAuthorshipFlagIsNotOptional::test_the_local_cleanup_requires_it PASSED [ 8%] tests/test_cleanup_authorship.py::TestTheAuthorshipFlagIsNotOptional::test_no_call_site_hardcodes_it[_cleanup_partial_local_subvolume] PASSED [ 8%] tests/test_cleanup_authorship.py::TestTheAuthorshipFlagIsNotOptional::test_no_call_site_hardcodes_it[_cleanup_partial_remote_subvolume] PASSED [ 8%] tests/test_cleanup_authorship.py::TestTheTransferLoopActuallyRecordsIt::test_a_pre_existing_artifact_is_reported_as_not_ours PASSED [ 8%] tests/test_cleanup_authorship.py::TestTheTransferLoopActuallyRecordsIt::test_an_absent_artifact_is_reported_as_ours PASSED [ 8%] tests/test_cleanup_authorship.py::test_the_raw_cleanup_remains_the_reference_pattern PASSED [ 8%] tests/test_cleanup_authorship.py::TestVerifyDeletesOnlyWhatItRestored::test_a_subvolume_already_in_a_user_temp_dir_is_not_deleted PASSED [ 8%] tests/test_cleanup_authorship.py::TestVerifyDeletesOnlyWhatItRestored::test_a_subvolume_this_run_restored_is_still_deleted PASSED [ 8%] tests/test_cleanup_authorship.py::TestVerifyDeletesOnlyWhatItRestored::test_the_cleanup_loop_iterates_what_was_restored_not_what_was_planned PASSED [ 8%] tests/test_cleanup_authorship.py::TestASnapperRestoreDeletesOnlyWhatItCreated::test_a_failed_receive_removes_its_incoming_and_no_published_slot PASSED [ 8%] tests/test_cleanup_authorship.py::TestASnapperRestoreDeletesOnlyWhatItCreated::test_a_slot_that_already_held_a_snapshot_is_not_the_receive_target PASSED [ 8%] tests/test_cleanup_authorship.py::TestNoCleanupCanBeReachedWithoutDecidingAuthorship::test_the_parameter_has_no_default[_cleanup_partial_local_subvolume] PASSED [ 8%] tests/test_cleanup_authorship.py::TestNoCleanupCanBeReachedWithoutDecidingAuthorship::test_the_parameter_has_no_default[_cleanup_partial_remote_subvolume] PASSED [ 8%] tests/test_cleanup_authorship.py::TestNoCleanupCanBeReachedWithoutDecidingAuthorship::test_the_parameter_has_no_default[SSHEndpoint._cleanup_partial_subvolume] PASSED [ 8%] tests/test_cleanup_authorship.py::TestNoCleanupCanBeReachedWithoutDecidingAuthorship::test_every_ssh_call_site_passes_it PASSED [ 8%] tests/test_cleanup_authorship.py::TestNoCleanupCanBeReachedWithoutDecidingAuthorship::test_the_remote_probe_answers_the_remote PASSED [ 8%] tests/test_cleanup_authorship.py::TestNoCleanupCanBeReachedWithoutDecidingAuthorship::test_an_unreachable_probe_assumes_pre_existing PASSED [ 8%] tests/test_cleanup_recovery.py::TestCleanupPartialLocalSubvolume::test_deletes_exact_local_path_when_present PASSED [ 8%] tests/test_cleanup_recovery.py::TestCleanupPartialLocalSubvolume::test_noop_when_nothing_present PASSED [ 8%] tests/test_cleanup_recovery.py::TestCleanupPartialLocalSubvolume::test_skips_remote_endpoint PASSED [ 8%] tests/test_cleanup_recovery.py::TestCleanupPartialLocalSubvolume::test_bad_config_does_not_escape PASSED [ 8%] tests/test_cleanup_recovery.py::TestCleanupPartialLocalSubvolume::test_skips_raw_endpoint PASSED [ 8%] tests/test_cleanup_recovery.py::TestExecuteTransfersCleansPartialOnFailure::test_failure_triggers_local_cleanup PASSED [ 8%] tests/test_cleanup_recovery.py::TestExecuteTransfersCleansPartialOnFailure::test_success_does_not_trigger_cleanup PASSED [ 8%] tests/test_cleanup_recovery.py::TestChunkedPartialCleanup::test_local_chunked_failure_cleans_exact_partial PASSED [ 8%] tests/test_cleanup_recovery.py::TestChunkedPartialCleanup::test_remote_cleanup_calls_endpoint_cleaner PASSED [ 8%] tests/test_cleanup_recovery.py::TestChunkedPartialCleanup::test_remote_cleanup_noop_without_cleaner PASSED [ 8%] tests/test_cleanup_recovery.py::TestRawPartialCleanup::test_local_raw_deletes_exact_part_file PASSED [ 8%] tests/test_cleanup_recovery.py::TestRawPartialCleanup::test_local_raw_preserves_committed_final PASSED [ 8%] tests/test_cleanup_recovery.py::TestRawPartialCleanup::test_ssh_raw_deletes_via_remote_command PASSED [ 8%] tests/test_cleanup_recovery.py::TestRawPartialCleanup::test_non_raw_endpoint_is_noop PASSED [ 8%] tests/test_cleanup_recovery.py::TestRawPartialCleanup::test_no_pending_metadata_is_noop PASSED [ 8%] tests/test_cleanup_recovery.py::TestRawPartialCleanup::test_funnel_cleans_raw_stream_on_failure PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_an_unmarked_empty_subvolume_is_reported_not_deleted PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_metadata_only_body_is_no_longer_evidence PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_stale_marker_over_a_bare_subvolume_is_deleted_and_the_marker_removed PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_complete_copy_under_a_stale_marker_is_left_and_the_marker_dropped PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_marker_whose_restore_is_still_running_is_left_alone PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_an_identity_that_cannot_be_read_never_authorises_a_deletion PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_marker_naming_a_path_outside_the_destination_is_refused PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_marker_with_nothing_at_its_path_is_simply_removed PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_an_unreadable_unmarked_subvolume_is_never_deleted PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_dry_run_names_the_abandoned_restore_and_deletes_nothing PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_refused_confirmation_deletes_nothing PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_deletion_that_fails_is_counted_and_keeps_the_marker PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_refused_sudo_deletes_nothing_and_keeps_the_marker PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_the_delete_is_btrfs_subvolume_delete_of_the_marked_path PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_marker_naming_the_parent_directory_is_refused PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_a_marker_naming_a_symlink_is_refused PASSED [ 8%] tests/test_cleanup_scavenger_authorship.py::test_an_entry_that_changes_after_the_prompt_is_not_deleted PASSED [ 8%] tests/test_cli.py::TestIsLegacyMode::test_empty_argv_not_legacy PASSED [ 8%] tests/test_cli.py::TestIsLegacyMode::test_subcommand_not_legacy PASSED [ 8%] tests/test_cli.py::TestIsLegacyMode::test_absolute_path_is_legacy PASSED [ 8%] tests/test_cli.py::TestIsLegacyMode::test_relative_path_is_legacy PASSED [ 8%] tests/test_cli.py::TestIsLegacyMode::test_path_with_slash_is_legacy PASSED [ 8%] tests/test_cli.py::TestIsLegacyMode::test_ssh_url_not_legacy PASSED [ 8%] tests/test_cli.py::TestIsLegacyMode::test_help_flags_not_legacy PASSED [ 9%] tests/test_cli.py::TestIsLegacyMode::test_option_flags_not_legacy PASSED [ 9%] tests/test_cli.py::TestSubcommands::test_expected_subcommands PASSED [ 9%] tests/test_cli.py::TestSubcommands::test_subcommands_is_frozenset PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_parser_creation PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_parser_has_subparsers PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_run_command_options PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_snapshot_command_options PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_transfer_command_options PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_prune_command_options PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_list_command_options PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_config_subcommands PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_install_command_options PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_global_options PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_compression_choices PASSED [ 9%] tests/test_cli.py::TestCreateSubcommandParser::test_timer_choices PASSED [ 9%] tests/test_cli.py::TestCLIIntegration::test_legacy_mode_called PASSED [ 9%] tests/test_cli.py::TestCLIIntegration::test_subcommand_mode_called PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_version_flag PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_no_command PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_unknown_command PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_routes_to_run PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_routes_to_snapshot PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_routes_to_transfer PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_routes_to_prune PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_routes_to_list PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_routes_to_status PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_routes_to_config PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_routes_to_install PASSED [ 9%] tests/test_cli.py::TestRunSubcommand::test_routes_to_uninstall PASSED [ 9%] tests/test_cli.py::TestShowMigrationNotice::test_creates_notice_file PASSED [ 9%] tests/test_cli.py::TestShowMigrationNotice::test_shows_notice_once PASSED [ 9%] tests/test_cli.py::TestShowMigrationNotice::test_handles_write_error PASSED [ 9%] tests/test_cli.py::TestMainFunction::test_default_argv PASSED [ 9%] tests/test_cli.py::TestMainFunction::test_returns_exit_code PASSED [ 9%] tests/test_cli.py::TestMainFunction::test_main_with_none_argv PASSED [ 9%] tests/test_cli.py::TestRunLegacyMode::test_calls_legacy_main PASSED [ 9%] tests/test_cli.py::TestRunLegacyMode::test_returns_legacy_exit_code PASSED [ 9%] tests/test_cli.py::TestCommandHandlers::test_cmd_run PASSED [ 9%] tests/test_cli.py::TestCommandHandlers::test_cmd_snapshot PASSED [ 9%] tests/test_cli.py::TestCommandHandlers::test_cmd_transfer PASSED [ 9%] tests/test_cli.py::TestCommandHandlers::test_cmd_prune PASSED [ 9%] tests/test_cli.py::TestCommandHandlers::test_cmd_list PASSED [ 9%] tests/test_cli.py::TestCommandHandlers::test_cmd_status PASSED [ 9%] tests/test_cli.py::TestCommandHandlers::test_cmd_config PASSED [ 9%] tests/test_cli.py::TestCommandHandlers::test_cmd_install PASSED [ 9%] tests/test_cli.py::TestCommandHandlers::test_cmd_uninstall PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[__init__.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[common.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[completion_gen.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[completions.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[config_cmd.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[dispatcher.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[doctor.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[estimate.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[install.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[list_cmd.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[manpages.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[prune.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[raw_cmd.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[restore.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[run.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[snapper_cmd.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[snapshot.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[status.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[transfer.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[transfers_cmd.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[verify.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_cli_string_literals_are_ascii[wizard_utils.py] PASSED [ 9%] tests/test_cli_ascii_output.py::test_verify_report_renders_under_ascii_stdout[ok-True-pass-[OK]] PASSED [ 9%] tests/test_cli_ascii_output.py::test_verify_report_renders_under_ascii_stdout[unverifiable-True-unverifiable-[WARNING]] PASSED [ 9%] tests/test_cli_ascii_output.py::test_verify_report_renders_under_ascii_stdout[failed-False-fail-[FAILED]] PASSED [ 9%] tests/test_cli_ascii_output.py::test_wizard_section_header_renders_under_ascii_stdout PASSED [ 9%] tests/test_cli_ascii_output.py::test_wizard_recommended_marker_renders_under_ascii_stdout PASSED [ 10%] tests/test_cli_ascii_output.py::test_status_transaction_labels_are_ascii_and_aligned PASSED [ 10%] tests/test_cli_common.py::TestGetTimestampFormat::test_none_config_returns_default PASSED [ 10%] tests/test_cli_common.py::TestGetTimestampFormat::test_reads_from_global_config PASSED [ 10%] tests/test_cli_common.py::TestGetTimestampFormat::test_empty_format_falls_back_to_default PASSED [ 10%] tests/test_cli_common.py::TestResolveTimestampFormat::test_explicit_wins PASSED [ 10%] tests/test_cli_common.py::TestResolveTimestampFormat::test_no_config_falls_back_to_default PASSED [ 10%] tests/test_cli_common.py::TestResolveTimestampFormat::test_falls_back_to_global_config PASSED [ 10%] tests/test_cli_common.py::TestCreateGlobalParser::test_returns_parser PASSED [ 10%] tests/test_cli_common.py::TestCreateGlobalParser::test_parser_has_no_help PASSED [ 10%] tests/test_cli_common.py::TestCreateGlobalParser::test_has_verbosity_args PASSED [ 10%] tests/test_cli_common.py::TestAddVerbosityArgs::test_adds_verbose PASSED [ 10%] tests/test_cli_common.py::TestAddVerbosityArgs::test_adds_quiet PASSED [ 10%] tests/test_cli_common.py::TestAddVerbosityArgs::test_adds_debug PASSED [ 10%] tests/test_cli_common.py::TestAddVerbosityArgs::test_short_verbose PASSED [ 10%] tests/test_cli_common.py::TestAddVerbosityArgs::test_short_quiet PASSED [ 10%] tests/test_cli_common.py::TestAddVerbosityArgs::test_defaults_are_false PASSED [ 10%] tests/test_cli_common.py::TestGetLogLevel::test_debug_flag PASSED [ 10%] tests/test_cli_common.py::TestGetLogLevel::test_quiet_flag PASSED [ 10%] tests/test_cli_common.py::TestGetLogLevel::test_verbose_flag PASSED [ 10%] tests/test_cli_common.py::TestGetLogLevel::test_no_flags PASSED [ 10%] tests/test_cli_common.py::TestGetLogLevel::test_debug_takes_precedence PASSED [ 10%] tests/test_cli_common.py::TestGetLogLevel::test_missing_attributes PASSED [ 10%] tests/test_cli_common.py::TestGetLogLevel::test_partial_attributes PASSED [ 10%] tests/test_cli_common.py::TestIsInteractive::test_is_interactive_tty PASSED [ 10%] tests/test_cli_common.py::TestIsInteractive::test_is_interactive_not_tty PASSED [ 10%] tests/test_cli_common.py::TestShouldShowProgress::test_explicit_progress_flag PASSED [ 10%] tests/test_cli_common.py::TestShouldShowProgress::test_explicit_no_progress_flag PASSED [ 10%] tests/test_cli_common.py::TestShouldShowProgress::test_quiet_mode_no_progress PASSED [ 10%] tests/test_cli_common.py::TestShouldShowProgress::test_auto_detect_tty PASSED [ 10%] tests/test_cli_common.py::TestShouldShowProgress::test_auto_detect_not_tty PASSED [ 10%] tests/test_cli_common.py::TestShouldShowProgress::test_missing_attributes PASSED [ 10%] tests/test_cli_common.py::TestAddProgressArgs::test_adds_progress_flag PASSED [ 10%] tests/test_cli_common.py::TestAddProgressArgs::test_adds_no_progress_flag PASSED [ 10%] tests/test_cli_common.py::TestAddProgressArgs::test_defaults_are_false PASSED [ 10%] tests/test_cli_common.py::TestAddProgressArgs::test_mutual_exclusion PASSED [ 10%] tests/test_cli_common.py::TestAddFsChecksArgs::test_adds_fs_checks_auto PASSED [ 10%] tests/test_cli_common.py::TestAddFsChecksArgs::test_adds_fs_checks_strict PASSED [ 10%] tests/test_cli_common.py::TestAddFsChecksArgs::test_adds_fs_checks_skip PASSED [ 10%] tests/test_cli_common.py::TestAddFsChecksArgs::test_no_fs_checks_alias PASSED [ 10%] tests/test_cli_common.py::TestAddFsChecksArgs::test_default_is_auto PASSED [ 10%] tests/test_cli_common.py::TestGetFsChecksMode::test_returns_auto PASSED [ 10%] tests/test_cli_common.py::TestGetFsChecksMode::test_returns_strict PASSED [ 10%] tests/test_cli_common.py::TestGetFsChecksMode::test_returns_skip PASSED [ 10%] tests/test_cli_common.py::TestGetFsChecksMode::test_missing_attribute_defaults_to_auto PASSED [ 10%] tests/test_cli_common.py::TestGetFsChecksMode::test_none_value_defaults_to_auto PASSED [ 10%] tests/test_cli_common.py::TestThreadSshTargetConfig::test_threads_ssh_port_as_port PASSED [ 10%] tests/test_cli_common.py::TestThreadSshTargetConfig::test_default_port_is_22 PASSED [ 10%] tests/test_cli_common.py::TestThreadSshTargetConfig::test_identity_threaded_under_both_names PASSED [ 10%] tests/test_cli_common.py::TestThreadSshTargetConfig::test_no_key_sets_neither_identity_name PASSED [ 10%] tests/test_cli_common.py::TestThreadSshTargetConfig::test_auth_sock_only_when_set PASSED [ 10%] tests/test_cli_common.py::TestThreadSshTargetConfig::test_threads_sudo_hostkey_and_password_fallback PASSED [ 10%] tests/test_cli_common.py::TestChooseEndpointPortPrecedence::test_ssh_config_port_used_when_url_has_none PASSED [ 10%] tests/test_cli_common.py::TestChooseEndpointPortPrecedence::test_ssh_url_port_wins_over_config PASSED [ 10%] tests/test_cli_common.py::TestChooseEndpointPortPrecedence::test_ssh_no_port_preserved_as_none PASSED [ 10%] tests/test_cli_common.py::TestChooseEndpointPortPrecedence::test_raw_ssh_config_port_used_when_url_has_none PASSED [ 10%] tests/test_cli_common.py::TestChooseEndpointPortPrecedence::test_raw_ssh_url_port_wins_over_config PASSED [ 10%] tests/test_cli_common.py::TestChooseEndpointPortPrecedence::test_raw_ssh_defaults_to_22 PASSED [ 10%] tests/test_cli_common.py::TestDecryptFlagsWiredIntoParsers::test_restore_accepts_decrypt_flags PASSED [ 10%] tests/test_cli_common.py::TestDecryptFlagsWiredIntoParsers::test_verify_rejects_decrypt_flags PASSED [ 10%] tests/test_cli_common.py::TestDecryptFlagsWiredIntoParsers::test_snapper_restore_accepts_decrypt_flags PASSED [ 10%] tests/test_cli_common.py::TestDecryptFlagsWiredIntoParsers::test_flags_default_to_none PASSED [ 10%] tests/test_cli_exit_codes.py::TestRawVerifyOnAnEmptyTarget::test_it_does_not_report_a_clean_pass PASSED [ 10%] tests/test_cli_exit_codes.py::TestRawVerifyOnAnEmptyTarget::test_it_matches_the_general_verify_command PASSED [ 10%] tests/test_cli_exit_codes.py::TestConfigValidateWithNoVolumes::test_a_typo_that_parses_to_no_volumes_is_not_valid PASSED [ 10%] tests/test_cli_exit_codes.py::TestConfigValidateWithNoVolumes::test_a_real_config_still_validates PASSED [ 10%] tests/test_cli_exit_codes.py::TestUninstallThatRemovedNothing::test_a_privilege_skip_is_not_success PASSED [ 10%] tests/test_cli_exit_codes.py::TestUninstallThatRemovedNothing::test_a_removal_that_succeeds_still_exits_zero PASSED [ 10%] tests/test_cli_exit_codes.py::TestUninstallThatRemovedNothing::test_nothing_installed_is_still_success PASSED [ 10%] tests/test_cli_exit_codes.py::TestStatusOnASystemThatHasNeverBackedUp::test_a_source_with_no_snapshots_is_not_operational PASSED [ 10%] tests/test_cli_exit_codes.py::TestStatusOnASystemThatHasNeverBackedUp::test_a_target_with_no_backups_is_not_operational PASSED [ 10%] tests/test_cli_exit_codes.py::TestStatusOnASystemThatHasNeverBackedUp::test_a_healthy_system_still_passes PASSED [ 10%] tests/test_cli_exit_codes.py::TestListWhenALocationCannotBeRead::test_an_unreadable_source_is_not_reported_as_none PASSED [ 10%] tests/test_cli_exit_codes.py::TestListWhenALocationCannotBeRead::test_a_genuinely_empty_source_still_says_none_and_passes PASSED [ 11%] tests/test_cli_exit_codes.py::TestTheSharedShape::test_a_verdict_is_not_decided_only_inside_except_handlers[btrfs_backup_ng.cli.status-all_healthy] PASSED [ 11%] tests/test_cli_exit_codes.py::TestTheSharedShape::test_a_verdict_is_not_decided_only_inside_except_handlers[btrfs_backup_ng.cli.list_cmd-unreadable] PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_endpoint_creation_failure PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_metadata_verification_success PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_metadata_verification_with_failures PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_verification_with_errors_returns_2 PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_stream_verification PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_full_verification PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_full_verification_remote_requires_temp_dir PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_verification_exception PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_verification_keyboard_interrupt PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_quiet_mode_no_progress PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_specific_snapshot PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_ssh_endpoint_options PASSED [ 11%] tests/test_cli_verify.py::TestExecute::test_no_cleanup_option PASSED [ 11%] tests/test_cli_verify.py::TestDisplayReport::test_display_passing_results PASSED [ 11%] tests/test_cli_verify.py::TestDisplayReport::test_display_failing_results PASSED [ 11%] tests/test_cli_verify.py::TestDisplayReport::test_display_with_errors PASSED [ 11%] tests/test_cli_verify.py::TestDisplayReport::test_display_with_details PASSED [ 11%] tests/test_cli_verify.py::TestDisplayReport::test_display_json_format PASSED [ 11%] tests/test_cli_verify.py::TestDisplayJson::test_json_output_structure PASSED [ 11%] tests/test_cli_verify.py::TestDisplayJson::test_json_duration_seconds PASSED [ 11%] tests/test_cli_verify.py::TestEndpointPreparation::test_local_endpoint_path_resolution PASSED [ 11%] tests/test_cli_verify.py::TestEndpointPreparation::test_endpoint_prepare_called PASSED [ 11%] tests/test_cli_verify.py::TestEndpointPreparation::test_endpoint_prepare_failure PASSED [ 11%] tests/test_cli_verify.py::TestProgressCallback::test_progress_callback_provided PASSED [ 11%] tests/test_cli_verify.py::TestProgressCallback::test_progress_callback_none_when_quiet PASSED [ 11%] tests/test_cli_verify.py::TestGeneralVerifyAgainstRawTarget::test_default_level_detects_raw_corruption PASSED [ 11%] tests/test_cli_verify.py::TestGeneralVerifyAgainstRawTarget::test_default_level_resolves_to_stream_and_passes_on_intact_raw PASSED [ 11%] tests/test_cli_verify.py::TestGeneralVerifyAgainstRawTarget::test_legacy_no_checksum_is_unverifiable_not_false_pass PASSED [ 11%] tests/test_cli_verify.py::TestGeneralVerifyAgainstRawTarget::test_explicit_metadata_level_bypasses_raw_checksum_branch PASSED [ 11%] tests/test_cli_verify.py::TestGeneralVerifyAgainstRawTarget::test_json_output_is_clean_stdout_without_quiet PASSED [ 11%] tests/test_cli_verify.py::TestGeneralVerifyAgainstRawTarget::test_explicit_stream_level_on_raw_routes_to_checksums PASSED [ 11%] tests/test_cli_verify.py::TestGeneralVerifyAgainstRawTarget::test_explicit_full_level_on_raw_routes_to_checksums_not_restore PASSED [ 11%] tests/test_cli_verify.py::TestGeneralVerifyAgainstRawTarget::test_raw_ssh_corrupt_verdict_surfaces_via_general_verify PASSED [ 11%] tests/test_cli_verify.py::TestGeneralVerifyAgainstRawTarget::test_raw_ssh_location_recognized_and_threads_ssh_creds PASSED [ 11%] tests/test_cli_verify.py::TestVerifyVerdictOutput::test_unverifiable_is_distinct_from_pass PASSED [ 11%] tests/test_cli_verify.py::TestVerifyVerdictOutput::test_summary_states_checked_of_available_with_all_hint PASSED [ 11%] tests/test_cli_verify.py::TestVerifyVerdictOutput::test_json_verdict_pass PASSED [ 11%] tests/test_cli_verify.py::TestVerifyVerdictOutput::test_json_verdict_unverifiable PASSED [ 11%] tests/test_cli_verify.py::TestVerifyVerdictOutput::test_json_verdict_fail_on_empty_errored_run PASSED [ 11%] tests/test_cli_verify.py::TestVerifyVerdictReviewFixes::test_all_hint_suppressed_when_snapshot_named PASSED [ 11%] tests/test_cli_verify.py::TestVerifyVerdictReviewFixes::test_all_hint_shown_without_snapshot PASSED [ 11%] tests/test_cli_verify.py::TestVerifyVerdictReviewFixes::test_empty_errored_run_has_no_misleading_results_line PASSED [ 11%] tests/test_cli_verify.py::TestVerifyVerdictReviewFixes::test_json_status_fallback_never_falsely_ok PASSED [ 11%] tests/test_cli_verify.py::TestVerifyNoDecryptThreading::test_verify_endpoint_gets_no_decrypt_keys PASSED [ 11%] tests/test_cli_verify.py::TestVerifyNoDecryptThreading::test_verify_parser_has_no_decrypt_flags PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home-20260923-home--%Y%m%d-0] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home-20260923_1-home--%Y%m%d-1] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home-20260923_12-home--%Y%m%d-12] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home_20260923-home_-%Y%m%d-0] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home_20260923_2-home_-%Y%m%d-2] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home-20260923_14-home--%Y%m%d_%H-0] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home-20260923_14_3-home--%Y%m%d_%H-3] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home-20260923_120000-home--%Y%m%d_%H%M%S-0] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home-20260923_120000_2-home--%Y%m%d_%H%M%S-2] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home-20260923-143022-home--None-0] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_retention_reads_it[home-20260923-143022_7-home--None-7] PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheCounterIsReadOffTheRemainder::test_a_name_that_parsed_as_written_carries_no_counter PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheNewestIsNeverTheOneDeleted::test_a_prefix_ending_in_underscore PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheNewestIsNeverTheOneDeleted::test_an_hourly_format_with_a_quarter_hour_timer PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheNewestIsNeverTheOneDeleted::test_a_same_second_collision PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheNewestIsNeverTheOneDeleted::test_the_documented_case_still_holds PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheListingOrdersTheSameWay::test_the_bare_name_sorts_before_its_counters PASSED [ 11%] tests/test_collision_counter_is_the_only_tiebreak.py::TestTheListingOrdersTheSameWay::test_an_hour_field_is_not_a_counter_in_the_listing_either PASSED [ 11%] tests/test_completions.py::TestGetCompletionsDir::test_finds_dev_path PASSED [ 11%] tests/test_completions.py::TestGetCompletionsDir::test_finds_package_path PASSED [ 11%] tests/test_completions.py::TestGetCompletionsDir::test_handles_exception PASSED [ 11%] tests/test_completions.py::TestExecuteCompletions::test_install_action PASSED [ 11%] tests/test_completions.py::TestExecuteCompletions::test_path_action PASSED [ 11%] tests/test_completions.py::TestExecuteCompletions::test_no_action PASSED [ 11%] tests/test_completions.py::TestExecuteCompletions::test_invalid_action PASSED [ 11%] tests/test_completions.py::TestShowCompletionsPath::test_dir_not_found PASSED [ 12%] tests/test_completions.py::TestShowCompletionsPath::test_shows_path_and_files PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_completions_dir_not_found PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_unknown_shell PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_source_file_not_found PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_system_install_permission_denied PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_successful_user_install_bash PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_successful_user_install_zsh PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_successful_user_install_fish PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_successful_system_install PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_mkdir_permission_error PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_copy_permission_error PASSED [ 12%] tests/test_completions.py::TestInstallCompletions::test_copy_generic_error PASSED [ 12%] tests/test_completions.py::TestCanWriteSystem::test_root_can_write PASSED [ 12%] tests/test_completions.py::TestCanWriteSystem::test_non_root_parent_writable PASSED [ 12%] tests/test_completions.py::TestCanWriteSystem::test_non_root_parent_not_writable PASSED [ 12%] tests/test_completions.py::TestCanWriteSystem::test_non_root_parent_not_exists PASSED [ 12%] tests/test_completions.py::TestShellConfigTypes::test_bash_config_has_required_keys PASSED [ 12%] tests/test_completions.py::TestShellConfigTypes::test_zsh_config_has_required_keys PASSED [ 12%] tests/test_completions.py::TestShellConfigTypes::test_fish_config_has_required_keys PASSED [ 12%] tests/test_completions.py::TestSnapperRestoreCompletionFlags::test_backup_name_and_date_in_all_shells PASSED [ 12%] tests/test_completions.py::TestDecryptCompletionFlags::test_decrypt_flags_offered_where_decryption_happens PASSED [ 12%] tests/test_completions.py::TestDecryptCompletionFlags::test_verify_is_not_offered_decrypt_flags PASSED [ 12%] tests/test_completions.py::TestDecryptCompletionFlags::test_decrypt_flags_present_in_zsh_and_fish PASSED [ 12%] tests/test_completions.py::TestRunCompletionNoStaleFlags::test_run_has_no_fs_checks_or_positive_check_space PASSED [ 12%] tests/test_completions.py::TestSshAuthSockCompletions::test_every_command_that_reaches_a_remote_offers_it PASSED [ 12%] tests/test_completions.py::TestSshAuthSockCompletions::test_zsh_and_fish_cover_all_five PASSED [ 12%] tests/test_completions.py::TestSshAuthSockManpages::test_manpages_document_it PASSED [ 12%] tests/test_completions_up_to_date.py::test_checked_in_completion_matches_the_generator[bash] PASSED [ 12%] tests/test_completions_up_to_date.py::test_checked_in_completion_matches_the_generator[fish] PASSED [ 12%] tests/test_completions_up_to_date.py::test_checked_in_completion_matches_the_generator[zsh] PASSED [ 12%] tests/test_completions_up_to_date.py::test_every_flag_the_cli_accepts_is_offered[bash] PASSED [ 12%] tests/test_completions_up_to_date.py::test_every_flag_the_cli_accepts_is_offered[fish] PASSED [ 12%] tests/test_completions_up_to_date.py::test_every_flag_the_cli_accepts_is_offered[zsh] PASSED [ 12%] tests/test_completions_up_to_date.py::test_generated_completions_are_not_empty_shells PASSED [ 12%] tests/test_completions_up_to_date.py::test_an_unknown_shell_is_refused PASSED [ 12%] tests/test_completions_up_to_date.py::test_the_generated_completion_parses_in_its_own_shell[bash] PASSED [ 12%] tests/test_completions_up_to_date.py::test_the_generated_completion_parses_in_its_own_shell[fish] PASSED [ 12%] tests/test_completions_up_to_date.py::test_the_generated_completion_parses_in_its_own_shell[zsh] PASSED [ 12%] tests/test_completions_up_to_date.py::test_bash_completion_actually_offers_run_flags PASSED [ 12%] tests/test_completions_up_to_date.py::test_fish_completion_actually_offers_run_flags PASSED [ 12%] tests/test_config_cmd.py::TestPrompt::test_returns_user_input PASSED [ 12%] tests/test_config_cmd.py::TestPrompt::test_returns_default_on_empty_input PASSED [ 12%] tests/test_config_cmd.py::TestPrompt::test_strips_whitespace PASSED [ 12%] tests/test_config_cmd.py::TestPrompt::test_raises_keyboard_interrupt_on_eof PASSED [ 12%] tests/test_config_cmd.py::TestPrompt::test_raises_keyboard_interrupt_on_ctrl_c PASSED [ 12%] tests/test_config_cmd.py::TestPromptBool::test_returns_true_for_yes PASSED [ 12%] tests/test_config_cmd.py::TestPromptBool::test_returns_false_for_no PASSED [ 12%] tests/test_config_cmd.py::TestPromptBool::test_returns_default_on_empty PASSED [ 12%] tests/test_config_cmd.py::TestPromptBool::test_raises_keyboard_interrupt_on_eof PASSED [ 12%] tests/test_config_cmd.py::TestPromptChoice::test_returns_choice_by_number PASSED [ 12%] tests/test_config_cmd.py::TestPromptChoice::test_returns_choice_by_value PASSED [ 12%] tests/test_config_cmd.py::TestPromptChoice::test_returns_default_on_empty PASSED [ 12%] tests/test_config_cmd.py::TestPromptChoice::test_rejects_invalid_then_accepts_valid PASSED [ 12%] tests/test_config_cmd.py::TestPromptInt::test_returns_valid_int PASSED [ 12%] tests/test_config_cmd.py::TestPromptInt::test_returns_default_on_empty PASSED [ 12%] tests/test_config_cmd.py::TestPromptInt::test_rejects_out_of_range PASSED [ 12%] tests/test_config_cmd.py::TestPromptInt::test_rejects_non_numeric PASSED [ 12%] tests/test_config_cmd.py::TestGenerateConfigFromWizard::test_generates_basic_config PASSED [ 12%] tests/test_config_cmd.py::TestGenerateConfigFromWizard::test_generates_config_with_log_file PASSED [ 12%] tests/test_config_cmd.py::TestGenerateConfigFromWizard::test_generates_config_with_ssh_target PASSED [ 12%] tests/test_config_cmd.py::TestGenerateConfigFromWizard::test_generates_config_with_require_mount PASSED [ 12%] tests/test_config_cmd.py::TestGenerateConfigFromWizard::test_generates_config_with_email PASSED [ 12%] tests/test_config_cmd.py::TestGenerateConfigFromWizard::test_generates_config_with_webhook PASSED [ 12%] tests/test_config_cmd.py::TestInitConfig::test_non_interactive_outputs_to_stdout PASSED [ 12%] tests/test_config_cmd.py::TestInitConfig::test_non_interactive_writes_to_file PASSED [ 12%] tests/test_config_cmd.py::TestInitConfig::test_interactive_requires_tty PASSED [ 12%] tests/test_config_cmd.py::TestInitConfig::test_interactive_cancelled_by_user PASSED [ 12%] tests/test_config_cmd.py::TestInitConfig::test_interactive_overwrites_existing_file_when_confirmed PASSED [ 12%] tests/test_config_cmd.py::TestInitConfig::test_interactive_aborts_when_overwrite_declined PASSED [ 12%] tests/test_config_cmd.py::TestExecuteConfig::test_validate_with_no_config PASSED [ 12%] tests/test_config_cmd.py::TestExecuteConfig::test_init_action PASSED [ 12%] tests/test_config_cmd.py::TestExecuteConfig::test_unknown_action PASSED [ 12%] tests/test_config_cmd.py::TestInteractiveWizard::test_full_wizard_flow PASSED [ 13%] tests/test_config_cmd.py::TestMigrateSystemd::test_migrate_systemd_dry_run PASSED [ 13%] tests/test_config_cmd.py::TestMigrateSystemd::test_migrate_systemd_no_migration_needed PASSED [ 13%] tests/test_config_cmd.py::TestMigrateSystemd::test_migrate_systemd_success PASSED [ 13%] tests/test_config_cmd.py::TestMigrateSystemd::test_migrate_systemd_with_errors PASSED [ 13%] tests/test_config_cmd.py::TestMigrateSystemd::test_wizard_with_ssh_target PASSED [ 13%] tests/test_config_cmd.py::TestMigrateSystemd::test_wizard_requires_at_least_one_volume PASSED [ 13%] tests/test_config_cmd.py::TestMigrateSystemd::test_wizard_requires_at_least_one_target PASSED [ 13%] tests/test_config_cmd.py::TestPromptTargetEncryption::test_non_raw_targets_are_not_prompted PASSED [ 13%] tests/test_config_cmd.py::TestPromptTargetEncryption::test_raw_none_returns_empty PASSED [ 13%] tests/test_config_cmd.py::TestPromptTargetEncryption::test_raw_gpg_collects_required_recipient PASSED [ 13%] tests/test_config_cmd.py::TestPromptTargetEncryption::test_raw_gpg_reprompts_until_recipient_given PASSED [ 13%] tests/test_config_cmd.py::TestPromptTargetEncryption::test_raw_openssl_optional_cipher PASSED [ 13%] tests/test_config_cmd.py::TestGenerateConfigEncryption::test_gpg_target_serializes_and_loads PASSED [ 13%] tests/test_config_cmd.py::TestGenerateConfigEncryption::test_openssl_target_serializes_and_loads PASSED [ 13%] tests/test_config_cmd.py::TestGenerateConfigEncryption::test_non_encrypted_target_emits_no_encrypt_key PASSED [ 13%] tests/test_config_cmd.py::TestGenerateConfigEncryption::test_serializer_skips_invalid_gpg_block_without_recipient PASSED [ 13%] tests/test_config_cmd.py::TestGenerateConfigEncryption::test_serializer_enforces_raw_only_invariant PASSED [ 13%] tests/test_config_cmd.py::TestGenerateConfigEncryption::test_backslash_keyring_path_round_trips_losslessly PASSED [ 13%] tests/test_config_cmd.py::TestGenerateConfigEscaping::test_nasty_values_round_trip_losslessly PASSED [ 13%] tests/test_config_cmd.py::TestGenerateConfigEscaping::test_backslash_path_not_silently_corrupted PASSED [ 13%] tests/test_config_cmd.py::TestGenerateConfigEscaping::test_clean_config_still_valid_and_faithful PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestTheEscaperIsLossless::test_round_trip[/mnt/da"ta] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestTheEscaperIsLossless::test_round_trip[/mnt/a\\backup] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestTheEscaperIsLossless::test_round_trip[/mnt/a\\fine] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestTheEscaperIsLossless::test_round_trip[/mnt/a\\next] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestTheEscaperIsLossless::test_round_trip[/mnt/a\\though] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestTheEscaperIsLossless::test_round_trip[/mnt/plain] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestTheEscaperIsLossless::test_round_trip[/mnt/sp ace] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestTheEscaperIsLossless::test_round_trip[/mnt/\x7fdel] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestTheEscaperIsLossless::test_a_backslash_is_not_silently_reinterpreted PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestConversionSurvivesAwkwardPaths::test_converted_config_loads_back_with_the_original_path[/mnt/da"ta] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestConversionSurvivesAwkwardPaths::test_converted_config_loads_back_with_the_original_path[/mnt/a\\backup] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestConversionSurvivesAwkwardPaths::test_converted_config_loads_back_with_the_original_path[/mnt/a\\fine] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestConversionSurvivesAwkwardPaths::test_converted_config_loads_back_with_the_original_path[/mnt/a\\next] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestConversionSurvivesAwkwardPaths::test_converted_config_loads_back_with_the_original_path[/mnt/a\\though] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestConversionSurvivesAwkwardPaths::test_converted_config_loads_back_with_the_original_path[/mnt/plain] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestConversionSurvivesAwkwardPaths::test_converted_config_loads_back_with_the_original_path[/mnt/sp ace] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestConversionSurvivesAwkwardPaths::test_converted_config_loads_back_with_the_original_path[/mnt/\x7fdel] PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestEveryEmitterUsesTheCanonicalHelper::test_no_raw_interpolated_toml_strings_remain PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestNeitherPathWritesWhatItCannotLoad::test_unloadable_reason_identifies_broken_content PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestNeitherPathWritesWhatItCannotLoad::test_unloadable_reason_passes_good_content PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestNeitherPathWritesWhatItCannotLoad::test_unloadable_reason_leaves_no_temp_file_behind PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestNeitherPathWritesWhatItCannotLoad::test_import_refuses_and_writes_nothing PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestNeitherPathWritesWhatItCannotLoad::test_import_still_writes_a_good_conversion PASSED [ 13%] tests/test_config_import_refuses_unloadable.py::TestNeitherPathWritesWhatItCannotLoad::test_wizard_save_refuses_and_does_not_touch_the_real_config PASSED [ 13%] tests/test_config_loader.py::TestFindConfigFile::test_explicit_path_exists PASSED [ 13%] tests/test_config_loader.py::TestFindConfigFile::test_explicit_path_not_exists PASSED [ 13%] tests/test_config_loader.py::TestFindConfigFile::test_user_config_location PASSED [ 13%] tests/test_config_loader.py::TestFindConfigFile::test_no_config_found PASSED [ 13%] tests/test_config_loader.py::TestFindConfigFile::test_sudo_user_config_priority PASSED [ 13%] tests/test_config_loader.py::TestFindConfigFile::test_non_sudo_config_paths PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_valid_config PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_minimal_config PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_with_global_settings PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_with_retention PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_invalid_retention_min PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_invalid_retention_bucket_counts[daily = true-daily] PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_invalid_retention_bucket_counts[hourly = "seven"-hourly] PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_invalid_retention_bucket_counts[hourly = "7"-hourly] PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_invalid_retention_bucket_counts[monthly = -3-monthly] PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_invalid_retention_bucket_counts[yearly = false-yearly] PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_invalid_retention_bucket_counts[weekly = 4.0-weekly] PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_valid_retention_bucket_counts_still_load PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_non_utf8_config_is_a_config_error PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_non_string_gpg_recipient_is_a_config_error[42] PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_non_string_gpg_recipient_is_a_config_error[["key-a", "key-b"]] PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_non_string_gpg_recipient_is_a_config_error[{ id = "x" }] PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_string_gpg_recipient_still_loads PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_nonexistent_file PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_invalid_toml PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_missing_volume_path PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_explicit_empty_snapshot_prefix PASSED [ 13%] tests/test_config_loader.py::TestLoadConfig::test_load_absent_snapshot_prefix_auto_derives PASSED [ 14%] tests/test_config_loader.py::TestLoadConfig::test_load_missing_target_path PASSED [ 14%] tests/test_config_loader.py::TestLoadConfig::test_load_invalid_compression PASSED [ 14%] tests/test_config_loader.py::TestLoadConfig::test_load_valid_compression_methods PASSED [ 14%] tests/test_config_loader.py::TestLoadConfig::test_empty_config PASSED [ 14%] tests/test_config_loader.py::TestConfigWarnings::test_warning_for_missing_targets PASSED [ 14%] tests/test_config_loader.py::TestConfigWarnings::test_warning_for_disabled_volume PASSED [ 14%] tests/test_config_loader.py::TestConfigWarnings::test_warning_for_duplicate_targets PASSED [ 14%] tests/test_config_loader.py::TestConfigWarnings::test_warning_for_duplicate_volumes PASSED [ 14%] tests/test_config_loader.py::TestConfigWarnings::test_warning_for_ssh_missing_path_separator PASSED [ 14%] tests/test_config_loader.py::TestConfigWarnings::test_warning_for_invalid_snapper_type PASSED [ 14%] tests/test_config_loader.py::TestUnknownKeyWarnings::test_valid_config_has_no_unknown_key_warnings PASSED [ 14%] tests/test_config_loader.py::TestUnknownKeyWarnings::test_unknown_top_level_key PASSED [ 14%] tests/test_config_loader.py::TestUnknownKeyWarnings::test_unknown_global_key PASSED [ 14%] tests/test_config_loader.py::TestUnknownKeyWarnings::test_unknown_retention_key PASSED [ 14%] tests/test_config_loader.py::TestUnknownKeyWarnings::test_unknown_target_key_labels_index PASSED [ 14%] tests/test_config_loader.py::TestUnknownKeyWarnings::test_unknown_snapper_key PASSED [ 14%] tests/test_config_loader.py::TestSnapperSourceConfig::test_snapper_source_with_config PASSED [ 14%] tests/test_config_loader.py::TestSnapperSourceConfig::test_snapper_source_auto_creates_config PASSED [ 14%] tests/test_config_loader.py::TestSnapperSourceConfig::test_invalid_source_type PASSED [ 14%] tests/test_config_loader.py::TestNotificationConfig::test_email_notification_config PASSED [ 14%] tests/test_config_loader.py::TestNotificationConfig::test_webhook_notification_config PASSED [ 14%] tests/test_config_loader.py::TestGenerateExampleConfig::test_generate_example_config PASSED [ 14%] tests/test_config_loader.py::TestGetUserHome::test_regular_user PASSED [ 14%] tests/test_config_loader.py::TestGetUserHome::test_sudo_user PASSED [ 14%] tests/test_config_loader.py::TestGetUserHome::test_sudo_user_not_found PASSED [ 14%] tests/test_config_loader.py::TestGetUserConfigDir::test_regular_user_default PASSED [ 14%] tests/test_config_loader.py::TestGetUserConfigDir::test_xdg_config_home PASSED [ 14%] tests/test_config_loader.py::TestGetUserConfigDir::test_sudo_ignores_xdg PASSED [ 14%] tests/test_config_loader.py::TestGetDefaultConfigPath::test_default_path PASSED [ 14%] tests/test_config_loader.py::TestGetDefaultConfigPath::test_sudo_user_path PASSED [ 14%] tests/test_config_loader.py::TestTargetPathIsNormalisedAtLoad::test_surrounding_whitespace_is_removed[ ssh://user@host:/mnt/usb -ssh://user@host:/mnt/usb] PASSED [ 14%] tests/test_config_loader.py::TestTargetPathIsNormalisedAtLoad::test_surrounding_whitespace_is_removed[ /mnt/usb -/mnt/usb] PASSED [ 14%] tests/test_config_loader.py::TestTargetPathIsNormalisedAtLoad::test_surrounding_whitespace_is_removed[ raw:///mnt/usb-raw:///mnt/usb] PASSED [ 14%] tests/test_config_loader.py::TestTargetPathIsNormalisedAtLoad::test_surrounding_whitespace_is_removed[ raw+ssh://user@nas:/mnt/usb-raw+ssh://user@nas:/mnt/usb] PASSED [ 14%] tests/test_config_loader.py::TestTargetPathIsNormalisedAtLoad::test_surrounding_whitespace_is_removed[/mnt/usb-/mnt/usb] PASSED [ 14%] tests/test_config_loader.py::TestTargetPathIsNormalisedAtLoad::test_the_normalised_path_builds_the_endpoint_the_scheme_predicts PASSED [ 14%] tests/test_config_loader.py::TestTargetPathIsNormalisedAtLoad::test_interior_whitespace_is_preserved PASSED [ 14%] tests/test_config_loader.py::TestRawSshWithSudoIsFlaggedNotBlocked::test_the_combination_still_loads PASSED [ 14%] tests/test_config_loader.py::TestRawSshWithSudoIsFlaggedNotBlocked::test_it_warns_and_names_the_file_tools PASSED [ 14%] tests/test_config_loader.py::TestRawSshWithSudoIsFlaggedNotBlocked::test_raw_ssh_without_sudo_is_not_warned_about PASSED [ 14%] tests/test_config_loader.py::TestRawSshWithSudoIsFlaggedNotBlocked::test_plain_ssh_with_sudo_is_not_warned_about PASSED [ 14%] tests/test_config_loader.py::TestRawSshWithSudoIsFlaggedNotBlocked::test_local_raw_with_sudo_is_not_warned_about PASSED [ 14%] tests/test_config_schema.py::TestRetentionConfig::test_default_values PASSED [ 14%] tests/test_config_schema.py::TestRetentionConfig::test_custom_values PASSED [ 14%] tests/test_config_schema.py::TestNotificationConfig::test_is_enabled_default PASSED [ 14%] tests/test_config_schema.py::TestNotificationConfig::test_is_enabled_with_email PASSED [ 14%] tests/test_config_schema.py::TestNotificationConfig::test_is_enabled_with_webhook PASSED [ 14%] tests/test_config_schema.py::TestNotificationConfig::test_is_enabled_with_both PASSED [ 14%] tests/test_config_schema.py::TestTargetConfig::test_required_path PASSED [ 14%] tests/test_config_schema.py::TestTargetConfig::test_default_values PASSED [ 14%] tests/test_config_schema.py::TestTargetConfig::test_ssh_target PASSED [ 14%] tests/test_config_schema.py::TestVolumeConfig::test_required_path PASSED [ 14%] tests/test_config_schema.py::TestVolumeConfig::test_default_values PASSED [ 14%] tests/test_config_schema.py::TestVolumeConfig::test_auto_prefix_from_path PASSED [ 14%] tests/test_config_schema.py::TestVolumeConfig::test_custom_prefix PASSED [ 14%] tests/test_config_schema.py::TestVolumeConfig::test_explicit_empty_prefix_is_preserved PASSED [ 14%] tests/test_config_schema.py::TestVolumeConfig::test_unset_prefix_auto_derives PASSED [ 14%] tests/test_config_schema.py::TestVolumeConfig::test_with_targets PASSED [ 14%] tests/test_config_schema.py::TestVolumeConfig::test_with_retention_override PASSED [ 14%] tests/test_config_schema.py::TestGlobalConfig::test_default_values PASSED [ 14%] tests/test_config_schema.py::TestGlobalConfig::test_default_retention PASSED [ 14%] tests/test_config_schema.py::TestGlobalConfig::test_custom_values PASSED [ 14%] tests/test_config_schema.py::TestConfig::test_default_values PASSED [ 14%] tests/test_config_schema.py::TestConfig::test_get_enabled_volumes PASSED [ 14%] tests/test_config_schema.py::TestConfig::test_get_effective_retention_global PASSED [ 14%] tests/test_config_schema.py::TestConfig::test_get_effective_retention_override PASSED [ 14%] tests/test_config_validate_readiness.py::TestTheLocalReadinessProbe::test_a_missing_source_is_a_problem PASSED [ 14%] tests/test_config_validate_readiness.py::TestTheLocalReadinessProbe::test_a_file_where_a_subvolume_belongs_is_a_problem PASSED [ 14%] tests/test_config_validate_readiness.py::TestTheLocalReadinessProbe::test_an_existing_directory_is_reported_on_its_filesystem PASSED [ 14%] tests/test_config_validate_readiness.py::TestTheLocalReadinessProbe::test_a_probe_failure_is_not_a_verdict PASSED [ 14%] tests/test_config_validate_readiness.py::TestValidateReportsBothHalves::test_fictional_sources_do_not_get_a_green_light PASSED [ 14%] tests/test_config_validate_readiness.py::TestValidateReportsBothHalves::test_it_no_longer_claims_bare_validity PASSED [ 14%] tests/test_config_validate_readiness.py::TestValidateReportsBothHalves::test_it_says_which_half_it_checked PASSED [ 15%] tests/test_config_validate_readiness.py::TestValidateReportsBothHalves::test_a_usable_source_still_passes PASSED [ 15%] tests/test_config_validate_readiness.py::TestValidateReportsBothHalves::test_remote_targets_are_not_probed PASSED [ 15%] tests/test_config_validate_readiness.py::TestValidateReportsBothHalves::test_a_broken_config_file_still_errors PASSED [ 15%] tests/test_config_validate_readiness.py::TestTheExitStatusDistinguishesTheTwoFailures::test_an_invalid_file_exits_1 PASSED [ 15%] tests/test_config_validate_readiness.py::TestTheExitStatusDistinguishesTheTwoFailures::test_a_valid_file_this_machine_cannot_run_exits_2 PASSED [ 15%] tests/test_config_validate_readiness.py::TestTheExitStatusDistinguishesTheTwoFailures::test_the_two_codes_are_different PASSED [ 15%] tests/test_config_verbosity.py::TestTheConfigReachesTheConsole::test_without_a_setting_info_is_shown PASSED [ 15%] tests/test_config_verbosity.py::TestTheConfigReachesTheConsole::test_quiet_hides_info PASSED [ 15%] tests/test_config_verbosity.py::TestTheConfigReachesTheConsole::test_verbose_shows_debug PASSED [ 15%] tests/test_config_verbosity.py::TestTheConfigReachesTheConsole::test_btrfs_debug_shows_debug PASSED [ 15%] tests/test_config_verbosity.py::TestTheCommandLineWins::test_verbose_flag_over_quiet_config PASSED [ 15%] tests/test_config_verbosity.py::TestTheCommandLineWins::test_quiet_flag_over_verbose_config PASSED [ 15%] tests/test_config_verbosity.py::TestTheEnvironmentIsTheLowestSource::test_the_environment_alone_sets_the_level PASSED [ 15%] tests/test_config_verbosity.py::TestTheEnvironmentIsTheLowestSource::test_the_configuration_wins_over_the_environment PASSED [ 15%] tests/test_config_verbosity.py::TestTheEnvironmentIsTheLowestSource::test_a_flag_wins_over_the_environment PASSED [ 15%] tests/test_config_verbosity.py::TestTheEnvironmentIsTheLowestSource::test_a_value_that_is_not_a_level_is_ignored_and_said PASSED [ 15%] tests/test_config_verbosity.py::TestTheEnvironmentIsTheLowestSource::test_get_log_level_reads_the_environment_last PASSED [ 15%] tests/test_config_verbosity.py::TestTheLogFileKeepsItsOwnLevel::test_quiet_does_not_thin_the_log_file PASSED [ 15%] tests/test_config_verbosity.py::TestTheLogFileKeepsItsOwnLevel::test_the_quiet_flag_does_not_thin_the_log_file_either PASSED [ 15%] tests/test_config_verbosity.py::TestTheLogFileKeepsItsOwnLevel::test_run_prints_no_info_after_the_load_under_quiet PASSED [ 15%] tests/test_config_verbosity.py::TestTheLogFileKeepsItsOwnLevel::test_the_file_receives_what_the_console_drops PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags0-settings0-None] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags1-settings1-WARNING] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags2-settings2-DEBUG] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags3-settings3-DEBUG] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags4-settings4-WARNING] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags5-settings5-DEBUG] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags6-settings6-None] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags7-settings7-None] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags8-settings8-None] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_config_log_level[flags9-settings9-None] PASSED [ 15%] tests/test_config_verbosity.py::TestPrecedence::test_no_configuration_changes_nothing PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[list-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[list-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[status-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[status-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[prune --dry-run-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[prune --dry-run-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[doctor-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[doctor-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[run --dry-run-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[run --dry-run-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[snapshot --dry-run-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[snapshot --dry-run-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[transfer --dry-run-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[transfer --dry-run-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[estimate --volume-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[estimate --volume-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[estimate {src}-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[estimate {src}-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[restore --list-volumes-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[restore --list-volumes-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[restore --volume-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[restore --volume-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[restore --list-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[restore --list-verbose-10] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[verify {dst}-quiet-30] PASSED [ 15%] tests/test_config_verbosity.py::TestEveryCommandAppliesIt::test_console_level_after_the_configuration_loads[verify {dst}-verbose-10] PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestTheUnmountedDiskScenario::test_the_mount_point_tree_is_not_built_on_the_root_filesystem PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestTheUnmountedDiskScenario::test_the_message_names_the_likely_cause PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestSourceAndDestination::test_a_missing_destination_is_refused PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestSourceAndDestination::test_a_missing_source_is_refused PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestSourceAndDestination::test_a_missing_source_is_not_created PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestSourceAndDestination::test_both_present_succeeds PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestSnapshotCreatesOnlyBelowTheSource::test_an_absolute_folder_that_does_not_exist_is_refused PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestSnapshotCreatesOnlyBelowTheSource::test_an_absolute_folder_that_exists_is_used PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestSnapshotCreatesOnlyBelowTheSource::test_a_relative_folder_is_created_under_the_source PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestSnapshotCreatesOnlyBelowTheSource::test_a_relative_folder_is_not_created_beside_a_missing_source PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestInfrastructureBelowTheDestinationCannotRebuildIt::test_prepare_creates_the_tree_one_level_at_a_time PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestInfrastructureBelowTheDestinationCannotRebuildIt::test_a_destination_that_vanishes_after_the_check_is_not_rebuilt PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestReceiveDoesNotRebuildWhatPrepareRefused::test_receive_refuses_a_missing_destination PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestReceiveDoesNotRebuildWhatPrepareRefused::test_receive_no_longer_merely_warns PASSED [ 15%] tests/test_configured_paths_are_not_created.py::TestRawTargetsGetTheSameRule::test_prepare_refuses_a_target_that_does_not_exist PASSED [ 16%] tests/test_configured_paths_are_not_created.py::TestRawTargetsGetTheSameRule::test_prepare_creates_nothing_when_it_refuses PASSED [ 16%] tests/test_configured_paths_are_not_created.py::TestRawTargetsGetTheSameRule::test_prepare_accepts_a_target_that_exists PASSED [ 16%] tests/test_configured_paths_are_not_created.py::TestRawTargetsGetTheSameRule::test_target_lock_does_not_rebuild_a_missing_target PASSED [ 16%] tests/test_configured_paths_are_not_created.py::TestRawTargetsGetTheSameRule::test_target_lock_still_works_when_the_target_exists PASSED [ 16%] tests/test_control_lock_hardening.py::test_control_dir_is_unpredictable_and_0700 PASSED [ 16%] tests/test_control_lock_hardening.py::test_two_managers_get_distinct_control_dirs PASSED [ 16%] tests/test_control_lock_hardening.py::test_cleanup_removes_owned_control_dir PASSED [ 16%] tests/test_control_lock_hardening.py::test_explicit_control_dir_is_respected_and_not_removed PASSED [ 16%] tests/test_control_lock_hardening.py::test_control_dir_base_requires_euid_ownership PASSED [ 16%] tests/test_control_lock_hardening.py::test_command_lock_path_prefers_owned_xdg PASSED [ 16%] tests/test_control_lock_hardening.py::test_command_lock_path_falls_back_to_secure_tmp_dir PASSED [ 16%] tests/test_control_lock_hardening.py::test_command_lock_path_refuses_symlinked_dir_fail_closed PASSED [ 16%] tests/test_control_lock_hardening.py::test_stop_master_removes_owned_control_dir PASSED [ 16%] tests/test_control_socket_path.py::TestControlPathLength::test_socket_name_is_short_fixed_length PASSED [ 16%] tests/test_control_socket_path.py::TestControlPathLength::test_name_does_not_grow_with_host_or_user PASSED [ 16%] tests/test_control_socket_path.py::TestControlPathLength::test_distinct_hosts_get_distinct_sockets PASSED [ 16%] tests/test_control_socket_path.py::TestControlPathLength::test_full_path_fits_sun_path_limit_on_default_base PASSED [ 16%] tests/test_correspondence.py::test_correspondent_matches_by_received_uuid_not_name PASSED [ 16%] tests/test_correspondence.py::test_recreated_snapshot_same_name_new_uuid_is_not_present PASSED [ 16%] tests/test_correspondence.py::test_correspondent_ignores_dest_with_matching_uuid_but_empty_received PASSED [ 16%] tests/test_correspondence.py::test_correspondent_none_when_source_uuid_unknown PASSED [ 16%] tests/test_correspondence.py::test_correspondent_none_when_no_match PASSED [ 16%] tests/test_correspondence.py::test_correspondent_restore_direction_finds_backup_by_received_uuid PASSED [ 16%] tests/test_correspondence.py::test_raw_correspondent_matches_by_name_ignoring_uuid PASSED [ 16%] tests/test_correspondence.py::test_correspondent_returns_none_when_list_snapshots_raises PASSED [ 16%] tests/test_correspondence.py::test_raw_correspondent_returns_none_when_list_snapshots_raises PASSED [ 16%] tests/test_correspondence.py::test_raw_correspondent_returns_none_when_get_name_raises PASSED [ 16%] tests/test_correspondence.py::test_correspondent_none_for_arg_without_identity PASSED [ 16%] tests/test_correspondence.py::test_polymorphism_btrfs_uses_base_raw_overrides PASSED [ 16%] tests/test_correspondence.py::test_planner_and_restore_both_wired_onto_correspondent_of PASSED [ 16%] tests/test_csh_login_shell.py::test_no_string_in_the_program_carries_a_history_expanding_bang PASSED [ 16%] tests/test_csh_login_shell.py::test_the_check_itself_sees_the_pattern_that_broke PASSED [ 16%] tests/test_csh_login_shell.py::test_every_lock_script_is_csh_safe PASSED [ 16%] tests/test_csh_login_shell.py::test_the_whole_protocol_works_under_a_csh_login_shell[tcsh] SKIPPED [ 16%] tests/test_csh_login_shell.py::test_the_whole_protocol_works_under_a_csh_login_shell[csh] SKIPPED [ 16%] tests/test_delete_reads_the_lock_file_again.py::TestTheFileDecides::test_a_pin_taken_after_the_listing_is_honoured PASSED [ 16%] tests/test_delete_reads_the_lock_file_again.py::TestTheFileDecides::test_a_pin_released_after_the_listing_does_not_keep_it PASSED [ 16%] tests/test_delete_reads_the_lock_file_again.py::TestTheFileDecides::test_a_snapshot_with_no_entry_reads_as_unpinned PASSED [ 16%] tests/test_delete_reads_the_lock_file_again.py::TestAnUnreadableFileRefusesTheBatch::test_unreadable_at_the_listing_refuses_even_if_it_reads_now PASSED [ 16%] tests/test_delete_reads_the_lock_file_again.py::TestAnUnreadableFileRefusesTheBatch::test_unreadable_now_refuses_and_leaves_the_file_as_it_is PASSED [ 16%] tests/test_delete_reads_the_lock_file_again.py::TestAnUnreadableFileRefusesTheBatch::test_unreadable_now_refuses_only_that_batch PASSED [ 16%] tests/test_delete_reads_the_lock_file_again.py::TestAPinHeldInMemoryOnly::test_it_is_honoured_by_a_delete_of_a_fresh_listing PASSED [ 16%] tests/test_delete_reads_the_lock_file_again.py::TestAPinHeldInMemoryOnly::test_its_release_lets_the_delete_go_ahead PASSED [ 16%] tests/test_delete_reads_the_lock_file_again.py::TestAPinHeldInMemoryOnly::test_a_release_that_could_not_be_written_is_not_held_in_memory PASSED [ 16%] tests/test_deleted_snapshot_entry_removed.py::TestAPinTakenAfterTheReadDoesNotOutliveTheSnapshot::test_the_entry_is_removed_and_the_pin_is_reported PASSED [ 16%] tests/test_deleted_snapshot_entry_removed.py::TestAPinTakenAfterTheReadDoesNotOutliveTheSnapshot::test_another_snapshots_pin_taken_meanwhile_is_kept PASSED [ 16%] tests/test_deleted_snapshot_entry_removed.py::TestAnEntryWithNothingInItIsRemovedQuietly::test_quietly PASSED [ 16%] tests/test_deleted_snapshot_entry_removed.py::TestAnEntryWithNothingInItIsRemovedQuietly::test_a_snapshot_without_an_entry_leaves_the_file_as_it_is PASSED [ 16%] tests/test_deleted_snapshot_entry_removed.py::TestTheDeletionStands::test_a_failed_deletion_keeps_the_entry PASSED [ 16%] tests/test_deleted_snapshot_entry_removed.py::TestTheDeletionStands::test_an_entry_that_cannot_be_removed_is_a_warning PASSED [ 16%] tests/test_deletion_flags.py::TestTheDeletionFlagsTakeEffect::test_without_the_flags_only_the_delete_is_issued PASSED [ 16%] tests/test_deletion_flags.py::TestTheDeletionFlagsTakeEffect::test_convert_rw_clears_the_read_only_property_first PASSED [ 16%] tests/test_deletion_flags.py::TestTheDeletionFlagsTakeEffect::test_sync_runs_once_after_the_batch PASSED [ 16%] tests/test_deletion_flags.py::TestTheDeletionFlagsTakeEffect::test_sync_is_not_run_when_nothing_was_deleted PASSED [ 16%] tests/test_deletion_flags.py::TestTheDeletionFlagsTakeEffect::test_a_failed_convert_rw_fails_that_snapshot_and_skips_its_delete PASSED [ 16%] tests/test_deletion_flags.py::TestTheDeletionFlagsTakeEffect::test_a_failed_sync_does_not_unreport_the_deletions PASSED [ 16%] tests/test_deletion_flags.py::test_the_flag_reaches_the_endpoint_from_the_legacy_cli[convert_rw] PASSED [ 16%] tests/test_deletion_flags.py::test_the_flag_reaches_the_endpoint_from_the_legacy_cli[subvolume_sync] PASSED [ 16%] tests/test_deletion_honours_locks.py::TestARetentionLockStopsARawDeletion::test_a_locked_raw_stream_survives_the_prune PASSED [ 16%] tests/test_deletion_honours_locks.py::TestARetentionLockStopsARawDeletion::test_a_parent_lock_also_stops_it PASSED [ 16%] tests/test_deletion_honours_locks.py::TestARetentionLockStopsARawDeletion::test_an_unlocked_stream_beside_a_locked_one_is_still_deleted PASSED [ 16%] tests/test_deletion_honours_locks.py::TestARetentionLockStopsARawDeletion::test_a_locked_raw_ssh_stream_survives_too PASSED [ 16%] tests/test_deletion_verdict.py::TestTheBaseEndpoint::test_a_failed_btrfs_delete_is_a_failure_not_a_deletion PASSED [ 16%] tests/test_deletion_verdict.py::TestTheBaseEndpoint::test_an_unreadable_lock_file_fails_the_whole_batch PASSED [ 16%] tests/test_deletion_verdict.py::TestTheBaseEndpoint::test_a_retention_lock_is_a_skip_and_does_not_fail_the_run PASSED [ 16%] tests/test_deletion_verdict.py::TestTheBaseEndpoint::test_a_failed_delete_does_not_evict_the_snapshot_from_the_cache PASSED [ 16%] tests/test_deletion_verdict.py::TestTheSSHEndpoint::test_an_unusable_remote_lock_fails_the_whole_batch PASSED [ 16%] tests/test_deletion_verdict.py::TestTheSSHEndpoint::test_a_deleted_remote_snapshot_is_reported_deleted PASSED [ 16%] tests/test_deletion_verdict.py::TestTheSSHEndpoint::test_a_path_that_is_not_a_subvolume_is_a_skip_not_a_deletion PASSED [ 16%] tests/test_deletion_verdict.py::TestTheSSHEndpoint::test_a_failed_remote_delete_is_a_failure PASSED [ 16%] tests/test_deletion_verdict.py::TestTheSSHEndpoint::test_an_already_absent_remote_snapshot_is_a_skip PASSED [ 16%] tests/test_deletion_verdict.py::TestTheRawEndpoint::test_a_deleted_stream_is_reported_deleted PASSED [ 17%] tests/test_deletion_verdict.py::TestTheRawEndpoint::test_an_already_absent_stream_is_a_skip_and_is_logged PASSED [ 17%] tests/test_deletion_verdict.py::TestTheRawEndpoint::test_a_chain_referenced_parent_is_a_skip PASSED [ 17%] tests/test_deletion_verdict.py::TestTheRawEndpoint::test_a_busy_target_fails_the_whole_batch PASSED [ 17%] tests/test_deletion_verdict.py::TestTheRawEndpoint::test_an_unlink_failure_is_a_failure PASSED [ 17%] tests/test_deletion_verdict.py::TestTheRawSSHEndpoint::test_a_deleted_remote_stream_is_reported_deleted PASSED [ 17%] tests/test_deletion_verdict.py::TestTheRawSSHEndpoint::test_a_failed_remote_rm_is_a_failure PASSED [ 17%] tests/test_deletion_verdict.py::TestPruneReportsTheRealCount::test_a_pass_that_deleted_nothing_does_not_report_deletions PASSED [ 17%] tests/test_deletion_verdict.py::TestPruneReportsTheRealCount::test_skips_are_reported_without_failing_the_run PASSED [ 17%] tests/test_deletion_verdict.py::TestPruneReportsTheRealCount::test_a_partial_batch_reports_both_halves PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[Endpoint.delete_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[Endpoint.delete_snapshot] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[Endpoint.delete_old_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[SSHEndpoint.delete_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[SSHEndpoint.delete_old_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[RawEndpoint.delete_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[RawEndpoint.delete_snapshot] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[RawEndpoint.delete_old_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[RawEndpoint._delete_snapshots_locked] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_the_annotation_promises_a_verdict[SSHRawEndpoint._delete_snapshots_locked] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[Endpoint.delete_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[Endpoint.delete_snapshot] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[Endpoint.delete_old_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[SSHEndpoint.delete_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[SSHEndpoint.delete_old_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[RawEndpoint.delete_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[RawEndpoint.delete_snapshot] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[RawEndpoint.delete_old_snapshots] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[RawEndpoint._delete_snapshots_locked] PASSED [ 17%] tests/test_deletion_verdict.py::TestNoImplementationMayReportNothing::test_no_code_path_falls_off_the_end[SSHRawEndpoint._delete_snapshots_locked] PASSED [ 17%] tests/test_deletion_verdict.py::test_the_result_type_separates_skips_from_failures PASSED [ 17%] tests/test_detection.py::TestBtrfsMountInfo::test_creation PASSED [ 17%] tests/test_detection.py::TestBtrfsMountInfo::test_hash_and_equality PASSED [ 17%] tests/test_detection.py::TestBtrfsMountInfo::test_equality_with_non_mount_info PASSED [ 17%] tests/test_detection.py::TestBtrfsMountInfo::test_hash_for_set_usage PASSED [ 17%] tests/test_detection.py::TestDetectedSubvolume::test_creation PASSED [ 17%] tests/test_detection.py::TestDetectedSubvolume::test_display_path_with_mount PASSED [ 17%] tests/test_detection.py::TestDetectedSubvolume::test_display_path_without_mount PASSED [ 17%] tests/test_detection.py::TestDetectedSubvolume::test_suggested_prefix_home PASSED [ 17%] tests/test_detection.py::TestDetectedSubvolume::test_suggested_prefix_root PASSED [ 17%] tests/test_detection.py::TestDetectedSubvolume::test_suggested_prefix_nested PASSED [ 17%] tests/test_detection.py::TestDetectedSubvolume::test_hash_and_equality PASSED [ 17%] tests/test_detection.py::TestDetectedSubvolume::test_equality_with_non_subvolume PASSED [ 17%] tests/test_detection.py::TestDetectedSubvolume::test_hash_for_set_usage PASSED [ 17%] tests/test_detection.py::TestBackupSuggestion::test_is_recommended_high_priority PASSED [ 17%] tests/test_detection.py::TestBackupSuggestion::test_is_recommended_low_priority PASSED [ 17%] tests/test_detection.py::TestDetectionResult::test_recommended_subvolumes PASSED [ 17%] tests/test_detection.py::TestDetectionResult::test_excluded_subvolumes PASSED [ 17%] tests/test_detection.py::TestDetectionResult::test_optional_subvolumes PASSED [ 17%] tests/test_detection.py::TestDetectionResult::test_to_dict PASSED [ 17%] tests/test_detection.py::TestParseProcMounts::test_parse_single_btrfs_mount PASSED [ 17%] tests/test_detection.py::TestParseProcMounts::test_parse_multiple_mounts PASSED [ 17%] tests/test_detection.py::TestParseProcMounts::test_parse_empty_content PASSED [ 17%] tests/test_detection.py::TestParseProcMounts::test_parse_no_btrfs PASSED [ 17%] tests/test_detection.py::TestParseProcMounts::test_parse_complex_options PASSED [ 17%] tests/test_detection.py::TestParseProcMounts::test_parse_at_prefix_subvol PASSED [ 17%] tests/test_detection.py::TestParseProcMounts::test_parse_file_not_found PASSED [ 17%] tests/test_detection.py::TestParseProcMounts::test_excludes_removable_media_by_default PASSED [ 17%] tests/test_detection.py::TestParseProcMounts::test_includes_removable_media_when_disabled PASSED [ 17%] tests/test_detection.py::TestListSubvolumes::test_list_subvolumes_success PASSED [ 17%] tests/test_detection.py::TestListSubvolumes::test_list_subvolumes_fs_tree_no_slash PASSED [ 17%] tests/test_detection.py::TestListSubvolumes::test_list_subvolumes_unparseable_line PASSED [ 17%] tests/test_detection.py::TestListSubvolumes::test_list_subvolumes_permission_denied PASSED [ 17%] tests/test_detection.py::TestListSubvolumes::test_list_subvolumes_operation_not_permitted PASSED [ 17%] tests/test_detection.py::TestListSubvolumes::test_list_subvolumes_other_error PASSED [ 17%] tests/test_detection.py::TestListSubvolumes::test_list_subvolumes_command_not_found PASSED [ 17%] tests/test_detection.py::TestListSubvolumes::test_list_subvolumes_empty PASSED [ 17%] tests/test_detection.py::TestIsRemovableMedia::test_run_media_is_removable PASSED [ 17%] tests/test_detection.py::TestIsRemovableMedia::test_media_is_removable PASSED [ 17%] tests/test_detection.py::TestIsRemovableMedia::test_mnt_is_removable PASSED [ 17%] tests/test_detection.py::TestIsRemovableMedia::test_root_not_removable PASSED [ 17%] tests/test_detection.py::TestIsRemovableMedia::test_home_not_removable PASSED [ 17%] tests/test_detection.py::TestGetSubvolumeDetails::test_get_details_success PASSED [ 17%] tests/test_detection.py::TestGetSubvolumeDetails::test_get_details_command_not_found PASSED [ 18%] tests/test_detection.py::TestGetSubvolumeDetails::test_get_details_command_fails PASSED [ 18%] tests/test_detection.py::TestCorrelateSubvolumes::test_correlate_by_id PASSED [ 18%] tests/test_detection.py::TestCorrelateSubvolumes::test_correlate_by_path PASSED [ 18%] tests/test_detection.py::TestCorrelateSubvolumes::test_correlate_unmounted_subvol PASSED [ 18%] tests/test_detection.py::TestCorrelateSubvolumes::test_adds_mounted_subvolumes_not_in_list PASSED [ 18%] tests/test_detection.py::TestCorrelateSubvolumes::test_adds_root_subvolume_from_mount PASSED [ 18%] tests/test_detection.py::TestCorrelateSubvolumes::test_no_duplicate_subvolumes_added PASSED [ 18%] tests/test_detection.py::TestCorrelateSubvolumes::test_adds_subvolume_with_normalized_path PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_home_as_user_data PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_user_home_as_user_data PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_root_as_system_root PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_at_root_as_system_root PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_snapshots_directory PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_generic_snapshots PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_timeshift_snapshots PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_root_snapshots_dir PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_home_snapshots_dir PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_with_parent_uuid PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_var_lib_machines_as_internal PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_var_lib_docker_as_internal PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_var_cache_as_variable PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_var_log_as_variable PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_opt_as_system_data PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_srv_as_system_data PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_unknown_path PASSED [ 18%] tests/test_detection.py::TestClassifySubvolume::test_classify_relative_path_normalized PASSED [ 18%] tests/test_detection.py::TestSuggestSnapshotDir::test_with_mount_point PASSED [ 18%] tests/test_detection.py::TestSuggestSnapshotDir::test_with_root_mount PASSED [ 18%] tests/test_detection.py::TestSuggestSnapshotDir::test_without_mount_point PASSED [ 18%] tests/test_detection.py::TestGetPriorityAndReason::test_user_data_priority PASSED [ 18%] tests/test_detection.py::TestGetPriorityAndReason::test_system_root_priority PASSED [ 18%] tests/test_detection.py::TestGetPriorityAndReason::test_system_data_priority PASSED [ 18%] tests/test_detection.py::TestGetPriorityAndReason::test_variable_priority_var_log PASSED [ 18%] tests/test_detection.py::TestGetPriorityAndReason::test_variable_priority_other PASSED [ 18%] tests/test_detection.py::TestGetPriorityAndReason::test_unknown_priority PASSED [ 18%] tests/test_detection.py::TestClassifyAllSubvolumes::test_classifies_all PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_classify_root_from_snapper_config PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_classify_home_from_snapper_config PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_classify_opt_from_snapper_config PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_classify_var_log_from_snapper_config PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_does_not_reclassify_snapshots PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_returns_path_map PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_reclassify_with_snapper_regenerates_suggestions PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_partial_name_match PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_unknown_snapper_name_preserves_classification PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_adds_missing_snapper_managed_root PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_adds_missing_snapper_managed_home PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_does_not_duplicate_existing_subvolume PASSED [ 18%] tests/test_detection.py::TestSnapperAwareClassification::test_adds_multiple_missing_snapper_subvolumes PASSED [ 18%] tests/test_detection.py::TestGenerateSuggestions::test_generates_suggestions_for_user_data PASSED [ 18%] tests/test_detection.py::TestGenerateSuggestions::test_excludes_snapshots PASSED [ 18%] tests/test_detection.py::TestGenerateSuggestions::test_excludes_internal PASSED [ 18%] tests/test_detection.py::TestGenerateSuggestions::test_sorted_by_priority PASSED [ 18%] tests/test_detection.py::TestScanSystem::test_scan_system_success PASSED [ 18%] tests/test_detection.py::TestScanSystem::test_scan_system_no_btrfs PASSED [ 18%] tests/test_detection.py::TestScanSystem::test_scan_system_permission_denied_no_partial PASSED [ 18%] tests/test_detection.py::TestScanSystem::test_scan_system_permission_denied_with_partial PASSED [ 18%] tests/test_detection.py::TestScanSystem::test_scan_system_deduplicates_devices PASSED [ 18%] tests/test_detection.py::TestDetectSubvolumes::test_detect_and_classify PASSED [ 18%] tests/test_detection.py::TestProcessDetectionResult::test_processes_result PASSED [ 18%] tests/test_detection.py::TestCLIIntegration::test_detect_json_output PASSED [ 18%] tests/test_detection.py::TestCLIIntegration::test_detect_no_btrfs PASSED [ 18%] tests/test_detection.py::TestCLIIntegration::test_detect_displays_results PASSED [ 18%] tests/test_detection.py::TestConfigDiffSummary::test_show_added_volume PASSED [ 18%] tests/test_detection.py::TestConfigDiffSummary::test_show_removed_volume PASSED [ 18%] tests/test_detection.py::TestConfigDiffSummary::test_show_modified_volume PASSED [ 18%] tests/test_detection.py::TestConfigDiffSummary::test_show_retention_changes PASSED [ 18%] tests/test_detection.py::TestConfigDiffSummary::test_show_added_email_notifications PASSED [ 18%] tests/test_detection.py::TestConfigDiffSummary::test_show_added_webhook_notifications PASSED [ 18%] tests/test_detection.py::TestConfigDiffSummary::test_invalid_existing_config PASSED [ 18%] tests/test_detection.py::TestConfigDiffText::test_show_text_diff_additions PASSED [ 18%] tests/test_detection.py::TestConfigDiffText::test_show_text_diff_removals PASSED [ 18%] tests/test_detection.py::TestConfigDiffText::test_show_text_diff_no_changes PASSED [ 19%] tests/test_detection.py::TestConfigDiffText::test_show_text_diff_headers PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_volume_selection_all PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_volume_selection_specific PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_cancel PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_with_ssh_target PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_with_mount_target PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_invalid_selection_fallback PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_with_global_settings PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_no_suggestions PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_partial_result PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_with_existing_config_diff PASSED [ 19%] tests/test_detection.py::TestDetectionWizard::test_wizard_save_to_file PASSED [ 19%] tests/test_docs_commands.py::test_docs_have_example_commands PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:153] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:154] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:155] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:158] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:161] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:172] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:175] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:178] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:181] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:202] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:240] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:243] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:244] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:245] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:252] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:255] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:258] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:288] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:289] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:292] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:295] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:296] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:299] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:302] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:305] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:308] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:356] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:357] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:539] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:881] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:902] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:914] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:918] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:929] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:932] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:967] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:970] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:973] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:981] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:984] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:993] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:996] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:999] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1015] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1026] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1029] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1030] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1033] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1049] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1055] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1056] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1059] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1067] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1084] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1091] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1102] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1105] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1113] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1383] PASSED [ 19%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1420] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1421] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1502] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1555] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1691] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1692] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1695] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1699] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1703] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1706] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1709] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1712] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1809] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1812] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1815] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1818] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1821] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1830] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1834] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1843] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1847] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1864] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1868] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1872] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1899] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:1941] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2060] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2065] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2076] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2080] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2094] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2097] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2101] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2123] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2126] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2147] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2150] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2153] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2157] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2166] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2181] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2185] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2201] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2207] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2210] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2218] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2226] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2232] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2235] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2238] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2269] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2272] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2280] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2289] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2293] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2301] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2308] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2347] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2350] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2353] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2356] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2359] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2379] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2382] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2404] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2407] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2410] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2411] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2414] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2433] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2436] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2439] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2442] PASSED [ 20%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2445] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2448] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2452] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2455] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2457] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2474] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2475] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2478] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2481] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2482] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2485] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2489] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2500] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2503] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2558] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2561] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2562] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2565] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2568] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2577] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2580] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2583] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2586] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2589] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2592] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2595] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2622] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2688] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2691] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2698] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2701] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2704] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2705] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2708] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2720] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2730] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2772] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2775] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2778] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2779] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2780] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2781] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2784] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2787] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2800] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2803] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2876] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2879] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2888] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2891] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2923] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2926] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2929] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2936] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:2998] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3001] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3004] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3045] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3048] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3104] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3105] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3106] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3109] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3110] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3111] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3112] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3134] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3219] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3222] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3232] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3239] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3240] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3241] PASSED [ 21%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3244] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3252] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3269] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3272] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3275] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3278] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3315] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3316] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3418] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[README.md:3424] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:33] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:54] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:72] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:75] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:78] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:81] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:91] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:98] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:101] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:120] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:264] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:289] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:292] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:295] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:298] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:325] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:330] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:345] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:369] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:464] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:468] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:481] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:550] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:582] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:622] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:623] PASSED [ 22%] tests/test_docs_commands.py::test_doc_command_parses[SNAPPER-INTEGRATION.md:631] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[completions-] SKIPPED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[config-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[doctor-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[estimate-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[install-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[list-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[manpages-] SKIPPED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[prune-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[raw-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[restore-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[run-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[snapper-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[snapshot-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[status-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[transfer-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[transfers-] SKIPPED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[uninstall-] SKIPPED [ 22%] tests/test_docs_cover_every_flag.py::test_every_flag_appears_in_the_man_page[verify-] PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_the_no_man_page_list_names_only_real_commands PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_the_escaping_normaliser_actually_works PASSED [ 22%] tests/test_docs_cover_every_flag.py::test_a_mangled_flag_does_not_count_as_documented PASSED [ 22%] tests/test_doctor.py::TestDiagnosticSeverity::test_severity_values PASSED [ 22%] tests/test_doctor.py::TestDiagnosticSeverity::test_all_severities_exist PASSED [ 22%] tests/test_doctor.py::TestDiagnosticCategory::test_category_values PASSED [ 22%] tests/test_doctor.py::TestDiagnosticCategory::test_all_categories_exist PASSED [ 22%] tests/test_doctor.py::TestDiagnosticFinding::test_basic_finding PASSED [ 22%] tests/test_doctor.py::TestDiagnosticFinding::test_finding_with_details PASSED [ 22%] tests/test_doctor.py::TestDiagnosticFinding::test_fixable_finding PASSED [ 22%] tests/test_doctor.py::TestDiagnosticFinding::test_fix_action_property PASSED [ 22%] tests/test_doctor.py::TestDiagnosticFinding::test_to_dict PASSED [ 22%] tests/test_doctor.py::TestDiagnosticFinding::test_to_dict_with_fix_description PASSED [ 22%] tests/test_doctor.py::TestDiagnosticReport::test_empty_report PASSED [ 22%] tests/test_doctor.py::TestDiagnosticReport::test_report_counts PASSED [ 22%] tests/test_doctor.py::TestDiagnosticReport::test_exit_code_healthy PASSED [ 22%] tests/test_doctor.py::TestDiagnosticReport::test_exit_code_warnings PASSED [ 22%] tests/test_doctor.py::TestDiagnosticReport::test_exit_code_errors PASSED [ 22%] tests/test_doctor.py::TestDiagnosticReport::test_exit_code_critical PASSED [ 23%] tests/test_doctor.py::TestDiagnosticReport::test_fixable_count PASSED [ 23%] tests/test_doctor.py::TestDiagnosticReport::test_duration PASSED [ 23%] tests/test_doctor.py::TestDiagnosticReport::test_to_dict PASSED [ 23%] tests/test_doctor.py::TestFixResult::test_successful_fix PASSED [ 23%] tests/test_doctor.py::TestFixResult::test_failed_fix PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_init_without_config PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_init_with_config_path PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_checks_registered PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_check_config_exists_no_config PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_check_config_exists_file_exists PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_check_config_exists_file_missing PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_check_config_valid_success PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_check_config_valid_with_warnings PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_check_compression_no_config PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_check_compression_available PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_check_compression_missing PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_run_diagnostics_filters_categories PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_run_diagnostics_all_categories PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_run_diagnostics_progress_callback PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_apply_fixes_no_fixable PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_apply_fixes_calls_fix_action PASSED [ 23%] tests/test_doctor.py::TestDoctor::test_apply_fixes_handles_exception PASSED [ 23%] tests/test_doctor.py::TestDoctorSystemChecks::test_check_systemd_timer_active PASSED [ 23%] tests/test_doctor.py::TestDoctorSystemChecks::test_check_systemd_timer_not_installed PASSED [ 23%] tests/test_doctor.py::TestDoctorSystemChecks::test_check_destination_space_no_config PASSED [ 23%] tests/test_doctor.py::TestDoctorSystemChecks::test_check_last_backup_age_no_config PASSED [ 23%] tests/test_doctor.py::TestDoctorSystemChecks::test_check_destination_space_with_config PASSED [ 23%] tests/test_doctor.py::TestDoctorSystemChecks::test_check_destination_space_low PASSED [ 23%] tests/test_doctor.py::TestDoctorSystemChecks::test_check_destination_space_critical PASSED [ 23%] tests/test_doctor.py::TestDoctorVolumePaths::test_check_volume_paths_no_config PASSED [ 23%] tests/test_doctor.py::TestDoctorVolumePaths::test_check_volume_paths_valid PASSED [ 23%] tests/test_doctor.py::TestDoctorVolumePaths::test_check_volume_paths_missing PASSED [ 23%] tests/test_doctor.py::TestDoctorVolumePaths::test_check_volume_paths_not_btrfs PASSED [ 23%] tests/test_doctor.py::TestDoctorTargetReachability::test_check_target_reachability_no_config PASSED [ 23%] tests/test_doctor.py::TestDoctorTargetReachability::test_check_target_reachability_local_exists PASSED [ 23%] tests/test_doctor.py::TestDoctorTargetReachability::test_check_target_reachability_local_missing PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_get_severity_prefix PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_print_report_basic PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_print_report_quiet_mode PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_print_report_with_fixable PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_print_report_with_hint PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_print_json PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_print_json_with_fixes PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_print_fix_results PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_execute_doctor_basic PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_execute_doctor_json_output PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_execute_doctor_with_category_filter PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_execute_doctor_with_fix PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_execute_doctor_with_fix_results PASSED [ 23%] tests/test_doctor.py::TestCliDoctor::test_execute_doctor_with_volume_filter PASSED [ 23%] tests/test_doctor.py::TestDoctorSSHTarget::test_check_ssh_target_success PASSED [ 23%] tests/test_doctor.py::TestDoctorSSHTarget::test_check_ssh_target_failure PASSED [ 23%] tests/test_doctor.py::TestDoctorSSHTarget::test_check_ssh_target_exception PASSED [ 23%] tests/test_doctor.py::TestDoctorRecentFailures::test_check_recent_failures_no_config PASSED [ 23%] tests/test_doctor.py::TestDoctorRecentFailures::test_check_recent_failures_no_log_configured PASSED [ 23%] tests/test_doctor.py::TestDoctorRecentFailures::test_check_recent_failures_log_not_exists PASSED [ 23%] tests/test_doctor.py::TestDoctorInteractiveFix::test_apply_fixes_interactive_skips PASSED [ 23%] tests/test_doctor.py::TestDoctorInteractiveFix::test_apply_fixes_fix_returns_false PASSED [ 23%] tests/test_doctor.py::TestDoctorCheckFailure::test_run_diagnostics_check_exception PASSED [ 23%] tests/test_doctor.py::TestDoctorLastBackupAge::test_check_last_backup_age_no_transaction_log PASSED [ 23%] tests/test_doctor.py::TestDoctorSnapshotChecks::test_check_parent_chains_no_config PASSED [ 23%] tests/test_doctor.py::TestDoctorSnapshotChecks::test_check_parent_chains_with_config PASSED [ 23%] tests/test_doctor.py::TestDoctorSnapshotChecks::test_check_snapshot_dates_with_config PASSED [ 23%] tests/test_doctor.py::TestDoctorStaleLockLoop::test_check_stale_locks_reports_a_held_lock PASSED [ 23%] tests/test_doctor.py::TestDoctorStaleLockLoop::test_check_stale_locks_held_lock_is_not_an_all_clear PASSED [ 23%] tests/test_doctor.py::TestDoctorStaleLockLoop::test_check_stale_locks_empty_locks PASSED [ 23%] tests/test_doctor.py::TestDoctorStaleLockLoop::test_check_stale_locks_read_error PASSED [ 23%] tests/test_doctor.py::TestDoctorTransactionLogParsing::test_check_recent_failures_with_failures PASSED [ 23%] tests/test_doctor.py::TestDoctorTransactionLogParsing::test_check_recent_failures_all_success PASSED [ 23%] tests/test_doctor.py::TestDoctorTransactionLogParsing::test_check_recent_failures_read_error PASSED [ 23%] tests/test_doctor.py::TestDoctorLastBackupAgeCalculation::test_check_last_backup_age_recent PASSED [ 23%] tests/test_doctor.py::TestDoctorLastBackupAgeCalculation::test_check_last_backup_age_old PASSED [ 23%] tests/test_doctor.py::TestDoctorLastBackupAgeCalculation::test_check_last_backup_age_medium PASSED [ 24%] tests/test_doctor.py::TestDoctorLastBackupAgeCalculation::test_check_last_backup_age_no_transfers PASSED [ 24%] tests/test_doctor.py::TestDoctorLastBackupAgeCalculation::test_check_last_backup_age_read_error PASSED [ 24%] tests/test_doctor.py::TestDoctorCompressionOnVolumes::test_check_compression_on_volume_target PASSED [ 24%] tests/test_doctor.py::TestDoctorCompressionOnVolumes::test_check_compression_none_skipped PASSED [ 24%] tests/test_doctor.py::TestCliDoctorEdgeCases::test_execute_doctor_config_load_error PASSED [ 24%] tests/test_doctor.py::TestCliDoctorEdgeCases::test_execute_doctor_progress_callback_called PASSED [ 24%] tests/test_doctor.py::TestCliDoctorEdgeCases::test_execute_doctor_volume_filter_string PASSED [ 24%] tests/test_doctor.py::TestCliDoctorEdgeCases::test_get_severity_prefix_unknown PASSED [ 24%] tests/test_doctor.py::TestCliDoctorEdgeCases::test_print_report_no_problems_quiet PASSED [ 24%] tests/test_doctor.py::TestDoctorTimestampParsing::test_ts_to_epoch_parses_iso_and_epoch PASSED [ 24%] tests/test_doctor.py::TestDoctorTimestampParsing::test_last_backup_age_computes_from_iso_timestamp PASSED [ 24%] tests/test_doctor.py::TestDoctorTimestampParsing::test_recent_failures_filters_by_iso_timestamp PASSED [ 24%] tests/test_doctor.py::TestDoctorSSHProbeContract::test_test_ssh_connection_returns_bool_not_dict PASSED [ 24%] tests/test_doctor.py::TestDoctorSSHProbeContract::test_probe_receives_a_host_not_a_uri PASSED [ 24%] tests/test_doctor.py::TestDoctorSSHProbeContract::test_rawssh_target_is_probed_over_ssh_too PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_rawssh_is_probed_over_ssh_not_stat_ed_locally PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_local_raw_target_checks_the_filesystem_path PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_a_genuinely_missing_local_raw_target_is_still_an_error PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_ssh_target_still_routes_to_the_ssh_check PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_a_target_with_no_usable_path_is_an_error_not_a_pass[shell://cat > /dev/null] PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_a_target_with_no_usable_path_is_an_error_not_a_pass[raw://mnt/usb/backups] PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_a_target_with_no_usable_path_is_an_error_not_a_pass[backup@nas:/mnt/store] PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_an_unreachable_target_is_named_as_configured PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_the_probe_receives_the_port_and_the_identity_file PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_a_configured_ssh_port_is_used_when_the_uri_omits_one PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_an_ipv6_target_is_probed_without_brackets PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_space_check_skips_a_target_with_no_usable_path[shell://cat] PASSED [ 24%] tests/test_doctor.py::TestTargetReachabilityRoutesByScheme::test_space_check_skips_a_target_with_no_usable_path[backup@nas:/mnt/store] PASSED [ 24%] tests/test_doctor_counts_loader_warnings.py::TestLoaderWarningsReachTheReport::test_warning_changes_the_exit_code PASSED [ 24%] tests/test_doctor_counts_loader_warnings.py::TestLoaderWarningsReachTheReport::test_warning_is_a_counted_finding_not_just_a_log_line PASSED [ 24%] tests/test_doctor_counts_loader_warnings.py::TestLoaderWarningsReachTheReport::test_every_warning_is_reported_not_only_the_first PASSED [ 24%] tests/test_doctor_counts_loader_warnings.py::TestLoaderWarningsReachTheReport::test_no_warnings_means_no_warning_findings PASSED [ 24%] tests/test_doctor_counts_loader_warnings.py::TestLoaderWarningsReachTheReport::test_self_loading_doctor_reports_each_warning_exactly_once PASSED [ 24%] tests/test_doctor_counts_loader_warnings.py::TestUnloadableConfigStillRuns::test_config_error_does_not_leave_the_list_unbound PASSED [ 24%] tests/test_doctor_counts_loader_warnings.py::TestAConfigThatBacksUpNothingIsNotBlessed::test_all_volumes_disabled_draws_a_warning PASSED [ 24%] tests/test_doctor_counts_loader_warnings.py::TestAConfigThatBacksUpNothingIsNotBlessed::test_zero_declared_volumes_draws_a_warning PASSED [ 24%] tests/test_doctor_counts_loader_warnings.py::TestAConfigThatBacksUpNothingIsNotBlessed::test_an_enabled_volume_still_gets_the_ok PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheLockFileIsReadWhereRunWritesIt::test_an_absolute_snapshot_dir PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheLockFileIsReadWhereRunWritesIt::test_a_missing_base_is_not_an_all_clear PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestEveryPinIsReportedWithItsHolder::test_a_live_holder_is_named PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestEveryPinIsReportedWithItsHolder::test_a_pin_without_a_record_is_reported_and_not_judged PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestEveryPinIsReportedWithItsHolder::test_fixes_touch_neither_a_live_nor_an_unrecorded_pin PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheFixesDoctorCanProve::test_an_entry_for_a_snapshot_that_no_longer_exists_is_removed PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheFixesDoctorCanProve::test_an_entry_that_holds_nothing_is_removed PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheFixesDoctorCanProve::test_a_restore_pin_whose_holder_is_gone_is_removed_with_its_record PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheFixesDoctorCanProve::test_a_parent_pin_whose_holder_is_gone_is_removed PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheFixesDoctorCanProve::test_a_record_that_outlived_its_pin_is_removed_when_dead PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheFixesDoctorCanProve::test_a_dead_record_in_a_directory_store_is_swept PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheFixesDoctorCanProve::test_a_local_targets_store_is_examined_too PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheLockCheckSaysWhichAllClearItIs::test_no_locks_at_all PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheLockCheckSaysWhichAllClearItIs::test_a_held_lock_nobody_can_identify_is_reported PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheLockCheckSaysWhichAllClearItIs::test_an_unreadable_lock_file_is_not_an_all_clear PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheRecentFailuresCheck::test_a_run_that_started_and_never_finished_is_reported PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheRecentFailuresCheck::test_a_started_record_with_a_partner_is_not_reported PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheRecentFailuresCheck::test_an_empty_window_is_not_all_zero_operations_successful PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheRecentFailuresCheck::test_a_genuinely_clean_window_is_still_ok PASSED [ 24%] tests/test_doctor_earns_its_verdicts.py::TestTheRecentFailuresCheck::test_failures_are_still_reported PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestNoCheckClaimsAPassItDidNotEarn::test_an_unimplemented_check_never_reports_ok PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestNoCheckClaimsAPassItDidNotEarn::test_the_two_known_stubs_report_info PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestNoCheckClaimsAPassItDidNotEarn::test_the_message_says_it_was_not_checked[_check_parent_chains] PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestNoCheckClaimsAPassItDidNotEarn::test_the_message_says_it_was_not_checked[_check_snapshot_dates] PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestNoCheckClaimsAPassItDidNotEarn::test_an_unimplemented_check_does_not_change_the_exit_code PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestNoCheckClaimsAPassItDidNotEarn::test_a_check_with_no_config_stays_silent PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestTheRemoteDecompressorIsActuallyChecked::test_a_missing_remote_decompressor_is_an_error PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestTheRemoteDecompressorIsActuallyChecked::test_an_unreachable_remote_is_not_reported_as_fine PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestTheRemoteDecompressorIsActuallyChecked::test_a_present_remote_decompressor_passes PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestTheRemoteDecompressorIsActuallyChecked::test_a_local_only_target_is_not_probed_over_ssh PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestTheProgramNamesComeFromTheCanonicalTable::test_every_method_maps_to_a_real_program PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestTheProgramNamesComeFromTheCanonicalTable::test_lzo_is_checked_as_lzop PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestTheProgramNamesComeFromTheCanonicalTable::test_doctor_uses_that_mapping PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestAProbeThatNeverRanSaysSo::test_a_timeout_is_not_an_answer_about_the_remote PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestAProbeThatNeverRanSaysSo::test_ssh_failing_to_start_is_not_an_answer_either PASSED [ 24%] tests/test_doctor_reports_only_what_it_checked.py::TestAProbeThatNeverRanSaysSo::test_a_genuine_absence_is_still_reported PASSED [ 25%] tests/test_doctor_reports_only_what_it_checked.py::TestAProbeThatNeverRanSaysSo::test_a_present_program_is_still_reported PASSED [ 25%] tests/test_doctor_reports_only_what_it_checked.py::TestAProbeThatNeverRanSaysSo::test_local_failure_is_distinct_from_every_real_exit_status PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_parse_duration_raises_value_error[1000000000d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_parse_duration_raises_value_error[999999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_parse_duration_raises_value_error[99999999y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_parse_duration_raises_value_error[99999999M] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_subtract_duration_raises_value_error[1000000000d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_subtract_duration_raises_value_error[999999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_subtract_duration_raises_value_error[99999999y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_subtract_duration_raises_value_error[99999999M] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_subtract_duration_raises_value_error[999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_subtract_duration_raises_value_error[100000000w] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_subtract_duration_raises_value_error[3000y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_the_message_names_the_value_not_an_internal_year PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_usable_durations_are_untouched[1s] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_usable_durations_are_untouched[30m] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_usable_durations_are_untouched[12h] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_usable_durations_are_untouched[1d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_usable_durations_are_untouched[30d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_usable_durations_are_untouched[2w] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_usable_durations_are_untouched[6M] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_usable_durations_are_untouched[1y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestProducersReportOutOfRangeAsValueError::test_usable_durations_are_untouched[100y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_refuses_every_unusable_min[1000000000d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_refuses_every_unusable_min[999999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_refuses_every_unusable_min[99999999y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_refuses_every_unusable_min[99999999M] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_refuses_every_unusable_min[999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_refuses_every_unusable_min[100000000w] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_refuses_every_unusable_min[3000y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_still_accepts_every_usable_min[1s] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_still_accepts_every_usable_min[30m] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_still_accepts_every_usable_min[12h] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_still_accepts_every_usable_min[1d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_still_accepts_every_usable_min[30d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_still_accepts_every_usable_min[2w] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_still_accepts_every_usable_min[6M] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_still_accepts_every_usable_min[1y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_still_accepts_every_usable_min[100y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[1000000000d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[999999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[99999999y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[99999999M] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[100000000w] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[3000y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[1s] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[30m] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[12h] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[1d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[30d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[2w] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[6M] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[1y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheBoundaryCheckDescribesTheOperationItGuards::test_loader_verdict_matches_engine_verdict[100y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_apply_retention_raises_retention_error_not_overflow[1000000000d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_apply_retention_raises_retention_error_not_overflow[999999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_apply_retention_raises_retention_error_not_overflow[99999999y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_apply_retention_raises_retention_error_not_overflow[99999999M] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_apply_retention_raises_retention_error_not_overflow[999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_apply_retention_raises_retention_error_not_overflow[100000000w] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_apply_retention_raises_retention_error_not_overflow[3000y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_degenerate_precheck_does_not_propagate[1000000000d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_degenerate_precheck_does_not_propagate[999999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_degenerate_precheck_does_not_propagate[99999999y] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_degenerate_precheck_does_not_propagate[99999999M] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_degenerate_precheck_does_not_propagate[999999999d] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_degenerate_precheck_does_not_propagate[100000000w] PASSED [ 25%] tests/test_duration_out_of_range.py::TestTheDestructivePathFailsClosed::test_degenerate_precheck_does_not_propagate[3000y] PASSED [ 25%] tests/test_empty_listing_diagnosis.py::TestInferringThePrefixFromAName::test_it_recovers_the_prefix_a_listing_would_need[home-20260818-021031-home-] PASSED [ 25%] tests/test_empty_listing_diagnosis.py::TestInferringThePrefixFromAName::test_it_recovers_the_prefix_a_listing_would_need[home-operator-bbng-e2e-src-20260818-021031-home-operator-bbng-e2e-src-] PASSED [ 25%] tests/test_empty_listing_diagnosis.py::TestInferringThePrefixFromAName::test_it_recovers_the_prefix_a_listing_would_need[20260818-021031-] PASSED [ 25%] tests/test_empty_listing_diagnosis.py::TestInferringThePrefixFromAName::test_it_recovers_the_prefix_a_listing_would_need[README.md-None] PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestInferringThePrefixFromAName::test_it_recovers_the_prefix_a_listing_would_need[snapshot-None] PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestInferringThePrefixFromAName::test_it_recovers_the_prefix_a_listing_would_need[-None] PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestInferringThePrefixFromAName::test_it_honours_a_configured_timestamp_format PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestInferringThePrefixFromAName::test_the_longest_timestamp_wins PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestALocationThatIsGenuinelyEmpty::test_no_explanation_is_offered PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestALocationThatIsGenuinelyEmpty::test_entries_that_are_not_snapshots_do_not_count PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestALocationWhosePrefixDidNotMatch::test_it_says_the_location_is_not_empty PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestALocationWhosePrefixDidNotMatch::test_it_names_the_prefix_that_would_work PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestALocationWhosePrefixDidNotMatch::test_it_tells_the_operator_what_to_run PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestALocationWhosePrefixDidNotMatch::test_the_most_common_prefix_is_the_one_suggested PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestALocationWhosePrefixDidNotMatch::test_a_prefix_that_already_matches_is_not_suggested PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestALocationWhosePrefixDidNotMatch::test_a_diagnostic_failure_is_never_fatal PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestTheRemoteVariant::test_a_prefix_present_at_the_destination_is_suggested PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestTheRemoteVariant::test_snapshots_only_elsewhere_say_so_instead PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestTheRemoteVariant::test_it_does_not_enumerate_locally PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestTheRemoteVariant::test_a_failed_remote_probe_is_not_fatal PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestTheCommandUsesTheExplanation::test_a_prefix_mismatch_is_explained_and_exits_nonzero PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestTheCommandUsesTheExplanation::test_a_genuinely_empty_location_keeps_the_plain_wording PASSED [ 26%] tests/test_empty_listing_diagnosis.py::TestTheCommandUsesTheExplanation::test_the_command_survives_a_broken_diagnostic PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestEveryStderrPipeIsDrained::test_the_scan_sees_the_known_sites PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestEveryStderrPipeIsDrained::test_each_site_attaches_a_tail_or_is_named_here PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestEveryStderrPipeIsDrained::test_the_named_exceptions_still_exist PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheBaseEndpoint::test_receive_attaches_a_tail_and_the_report_reads_it PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheBaseEndpoint::test_send_attaches_a_tail PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheBaseEndpoint::test_a_receive_that_floods_stderr_still_finishes PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheRawEndpoint::test_receive_pipeline_attaches_a_tail PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheRawEndpoint::test_send_pipeline_attaches_a_tail PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheRawEndpoint::test_a_receive_pipeline_that_floods_stderr_still_finishes[single stage] PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheRawEndpoint::test_a_receive_pipeline_that_floods_stderr_still_finishes[pipefail] PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheRawSshEndpoint::test_a_receive_whose_ssh_floods_stderr_still_finishes[direct to ssh] PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheRawSshEndpoint::test_a_receive_whose_ssh_floods_stderr_still_finishes[local stage then ssh] PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheSshEndpoint::test_a_remote_receive_that_floods_stderr_still_finishes PASSED [ 26%] tests/test_endpoints_drain_stderr.py::TestTheSshEndpoint::test_a_chunked_receive_that_floods_stderr_still_finishes PASSED [ 26%] tests/test_error_delivery.py::test_uncaught_exception_renders_clean_line_not_traceback PASSED [ 26%] tests/test_error_delivery.py::test_abort_error_renders_its_message_without_debug_hint PASSED [ 26%] tests/test_error_delivery.py::test_keyboard_interrupt_is_clean_130 PASSED [ 26%] tests/test_error_delivery.py::test_failed_command_yields_nonempty_message PASSED [ 26%] tests/test_error_delivery.py::test_failed_command_includes_captured_stderr PASSED [ 26%] tests/test_error_delivery.py::test_same_second_snapshot_collision_is_explained PASSED [ 26%] tests/test_error_delivery.py::test_coarse_format_collision_names_the_period_not_the_second PASSED [ 26%] tests/test_error_delivery.py::test_seconds_format_collision_keeps_same_second_diagnosis PASSED [ 26%] tests/test_error_delivery.py::test_constant_format_collision_blames_the_format PASSED [ 26%] tests/test_error_delivery.py::test_unsupported_openssl_cipher_aborts_with_clear_message PASSED [ 26%] tests/test_error_delivery.py::test_supported_openssl_cipher_is_not_false_rejected PASSED [ 26%] tests/test_error_delivery.py::test_openssl_support_probe_discriminates PASSED [ 26%] tests/test_error_delivery.py::test_probe_fails_open_when_openssl_missing PASSED [ 26%] tests/test_error_delivery.py::test_probe_fails_open_on_oserror PASSED [ 26%] tests/test_error_delivery.py::test_probe_fails_open_on_timeout PASSED [ 26%] tests/test_error_delivery.py::test_checksum_symlink_reports_plain_reason PASSED [ 26%] tests/test_error_delivery.py::test_banner_reports_failure_not_complete PASSED [ 26%] tests/test_error_delivery.py::test_banner_reports_complete_on_success PASSED [ 26%] tests/test_error_delivery.py::test_send_snapshot_wraps_valueerror PASSED [ 26%] tests/test_error_delivery.py::test_raw_encrypt_plain_output_shows_failure_reason PASSED [ 26%] tests/test_errors.py::TestErrorCategory::test_transient_categories PASSED [ 26%] tests/test_errors.py::TestErrorCategory::test_permanent_categories PASSED [ 26%] tests/test_errors.py::TestBackupError::test_basic_creation PASSED [ 26%] tests/test_errors.py::TestBackupError::test_with_suggested_action PASSED [ 26%] tests/test_errors.py::TestBackupError::test_with_original_error PASSED [ 26%] tests/test_errors.py::TestBackupError::test_with_context PASSED [ 26%] tests/test_errors.py::TestBackupError::test_repr PASSED [ 26%] tests/test_errors.py::TestTransientErrors::test_transient_network_error PASSED [ 26%] tests/test_errors.py::TestTransientErrors::test_transient_timeout_error PASSED [ 26%] tests/test_errors.py::TestTransientErrors::test_transient_space_error PASSED [ 26%] tests/test_errors.py::TestTransientErrors::test_transient_busy_error PASSED [ 26%] tests/test_errors.py::TestTransientErrors::test_transient_lock_error PASSED [ 26%] tests/test_errors.py::TestPermanentErrors::test_permanent_permission_error PASSED [ 26%] tests/test_errors.py::TestPermanentErrors::test_permanent_corrupted_error PASSED [ 26%] tests/test_errors.py::TestPermanentErrors::test_permanent_config_error PASSED [ 26%] tests/test_errors.py::TestPermanentErrors::test_permanent_not_found_error PASSED [ 26%] tests/test_errors.py::TestPermanentErrors::test_permanent_unsupported_error PASSED [ 26%] tests/test_errors.py::TestSpecificErrors::test_snapshot_transfer_error PASSED [ 26%] tests/test_errors.py::TestSpecificErrors::test_chunk_transfer_error PASSED [ 26%] tests/test_errors.py::TestSpecificErrors::test_chunk_checksum_error PASSED [ 27%] tests/test_errors.py::TestSpecificErrors::test_insufficient_space_error PASSED [ 27%] tests/test_errors.py::TestSpecificErrors::test_ssh_connection_error PASSED [ 27%] tests/test_errors.py::TestSpecificErrors::test_ssh_authentication_error PASSED [ 27%] tests/test_errors.py::TestClassifyError::test_classify_already_backup_error PASSED [ 27%] tests/test_errors.py::TestClassifyError::test_classify_network_errors PASSED [ 27%] tests/test_errors.py::TestClassifyError::test_classify_timeout_errors PASSED [ 27%] tests/test_errors.py::TestClassifyError::test_classify_permission_errors PASSED [ 27%] tests/test_errors.py::TestClassifyError::test_classify_not_found_errors PASSED [ 27%] tests/test_errors.py::TestClassifyError::test_classify_busy_errors PASSED [ 27%] tests/test_errors.py::TestClassifyError::test_classify_space_errors PASSED [ 27%] tests/test_errors.py::TestClassifyError::test_classify_with_stderr PASSED [ 27%] tests/test_errors.py::TestClassifyError::test_classify_unknown_error PASSED [ 27%] tests/test_errors.py::TestClassifySSHError::test_exit_code_255 PASSED [ 27%] tests/test_errors.py::TestClassifySSHError::test_exit_code_1 PASSED [ 27%] tests/test_errors.py::TestClassifySSHError::test_authentication_failure PASSED [ 27%] tests/test_errors.py::TestClassifyTransferError::test_transfer_error_with_context PASSED [ 27%] tests/test_estimate.py::TestFormatSize::test_format_bytes PASSED [ 27%] tests/test_estimate.py::TestFormatSize::test_format_kibibytes PASSED [ 27%] tests/test_estimate.py::TestFormatSize::test_format_mebibytes PASSED [ 27%] tests/test_estimate.py::TestFormatSize::test_format_gibibytes PASSED [ 27%] tests/test_estimate.py::TestFormatSize::test_format_tebibytes PASSED [ 27%] tests/test_estimate.py::TestFormatSize::test_format_none PASSED [ 27%] tests/test_estimate.py::TestParseSize::test_parse_bytes PASSED [ 27%] tests/test_estimate.py::TestParseSize::test_parse_kibibytes PASSED [ 27%] tests/test_estimate.py::TestParseSize::test_parse_mebibytes PASSED [ 27%] tests/test_estimate.py::TestParseSize::test_parse_gibibytes PASSED [ 27%] tests/test_estimate.py::TestParseSize::test_parse_tebibytes PASSED [ 27%] tests/test_estimate.py::TestParseSize::test_parse_si_units PASSED [ 27%] tests/test_estimate.py::TestParseSize::test_parse_invalid PASSED [ 27%] tests/test_estimate.py::TestSnapshotEstimate::test_basic_estimate PASSED [ 27%] tests/test_estimate.py::TestSnapshotEstimate::test_incremental_estimate PASSED [ 27%] tests/test_estimate.py::TestTransferEstimate::test_empty_estimate PASSED [ 27%] tests/test_estimate.py::TestTransferEstimate::test_add_full_snapshot PASSED [ 27%] tests/test_estimate.py::TestTransferEstimate::test_add_incremental_snapshot PASSED [ 27%] tests/test_estimate.py::TestTransferEstimate::test_multiple_snapshots PASSED [ 27%] tests/test_estimate.py::TestEstimateSnapshotFullSize::test_filesystem_du_is_the_first_method PASSED [ 27%] tests/test_estimate.py::TestEstimateSnapshotFullSize::test_du_fallback PASSED [ 27%] tests/test_estimate.py::TestEstimateSnapshotFullSize::test_all_methods_fail PASSED [ 27%] tests/test_estimate.py::TestEstimateIncrementalSize::test_send_no_data_success PASSED [ 27%] tests/test_estimate.py::TestEstimateIncrementalSize::test_send_no_data_with_sudo PASSED [ 27%] tests/test_estimate.py::TestEstimateIncrementalSize::test_fallback_to_size_diff PASSED [ 27%] tests/test_estimate.py::TestEstimateIncrementalSize::test_size_diff_negative_returns_zero PASSED [ 27%] tests/test_estimate.py::TestEstimateIncrementalSize::test_timeout_failure PASSED [ 27%] tests/test_estimate.py::TestEstimateIncrementalSize::test_file_not_found_failure PASSED [ 27%] tests/test_estimate.py::TestEstimateSnapshotFullSizeAdvanced::test_uses_sudo_when_not_root PASSED [ 27%] tests/test_estimate.py::TestEstimateSnapshotFullSizeAdvanced::test_no_sudo_when_root PASSED [ 27%] tests/test_estimate.py::TestEstimateSnapshotFullSizeAdvanced::test_timeout_handling PASSED [ 27%] tests/test_estimate.py::TestEstimateSnapshotFullSizeAdvanced::test_oserror_handling PASSED [ 27%] tests/test_estimate.py::TestEstimateSnapshotFullSizeAdvanced::test_du_value_error_fallthrough PASSED [ 27%] tests/test_estimate.py::TestEstimateTransfer::test_empty_source PASSED [ 27%] tests/test_estimate.py::TestEstimateTransfer::test_all_snapshots_at_destination PASSED [ 27%] tests/test_estimate.py::TestEstimateTransfer::test_new_snapshot_full_transfer PASSED [ 27%] tests/test_estimate.py::TestEstimateTransfer::test_incremental_transfer_estimation PASSED [ 27%] tests/test_estimate.py::TestEstimateTransfer::test_dest_list_snapshots_fails PASSED [ 27%] tests/test_estimate.py::TestEstimateTransfer::test_explicit_snapshot_list PASSED [ 27%] tests/test_estimate.py::TestEstimateTransfer::test_uses_ssh_sudo_from_config PASSED [ 27%] tests/test_estimate.py::TestPrintEstimate::test_print_empty_estimate PASSED [ 27%] tests/test_estimate.py::TestPrintEstimate::test_print_full_snapshot PASSED [ 27%] tests/test_estimate.py::TestPrintEstimate::test_print_incremental_snapshot PASSED [ 27%] tests/test_estimate.py::TestPrintEstimate::test_print_long_snapshot_name_truncated PASSED [ 27%] tests/test_estimate.py::TestPrintEstimate::test_print_multiple_snapshots PASSED [ 27%] tests/test_estimate.py::TestPrintEstimate::test_print_totals PASSED [ 27%] tests/test_estimate.py::TestParseSizeEdgeCases::test_parse_with_whitespace PASSED [ 27%] tests/test_estimate.py::TestParseSizeEdgeCases::test_parse_float_value PASSED [ 27%] tests/test_estimate.py::TestParseSizeEdgeCases::test_parse_large_tib PASSED [ 27%] tests/test_estimate.py::TestParseSizeEdgeCases::test_parse_case_sensitivity PASSED [ 27%] tests/test_estimate.py::TestExecuteEstimate::test_no_args_shows_error PASSED [ 27%] tests/test_estimate.py::TestExecuteEstimate::test_volume_no_config PASSED [ 27%] tests/test_estimate.py::TestExecuteEstimate::test_volume_not_found PASSED [ 27%] tests/test_estimate.py::TestEstimateFromConfig::test_config_load_error PASSED [ 27%] tests/test_estimate.py::TestEstimateFromConfig::test_volume_no_targets PASSED [ 27%] tests/test_estimate.py::TestEstimateFromConfig::test_invalid_target_index PASSED [ 27%] tests/test_estimate.py::TestEstimateFromConfig::test_source_endpoint_prepare_fails PASSED [ 28%] tests/test_estimate.py::TestEstimateFromConfig::test_dest_endpoint_prepare_fails PASSED [ 28%] tests/test_estimate.py::TestEstimateFromConfig::test_estimation_fails PASSED [ 28%] tests/test_estimate.py::TestEstimateFromConfig::test_successful_estimation PASSED [ 28%] tests/test_estimate.py::TestEstimateFromConfig::test_successful_estimation_json_output PASSED [ 28%] tests/test_estimate.py::TestEstimateFromConfig::test_explicit_config_path PASSED [ 28%] tests/test_estimate.py::TestEstimateDirect::test_source_endpoint_prepare_fails PASSED [ 28%] tests/test_estimate.py::TestEstimateDirect::test_dest_endpoint_prepare_fails PASSED [ 28%] tests/test_estimate.py::TestEstimateDirect::test_estimation_fails PASSED [ 28%] tests/test_estimate.py::TestEstimateDirect::test_successful_estimation PASSED [ 28%] tests/test_estimate.py::TestEstimateDirect::test_successful_estimation_json_output PASSED [ 28%] tests/test_estimate.py::TestEstimateDirect::test_ssh_source_path PASSED [ 28%] tests/test_estimate.py::TestEstimateDirect::test_ssh_dest_path PASSED [ 28%] tests/test_estimate.py::TestPrintJson::test_empty_estimate PASSED [ 28%] tests/test_estimate.py::TestPrintJson::test_full_snapshot PASSED [ 28%] tests/test_estimate.py::TestPrintJson::test_incremental_snapshot PASSED [ 28%] tests/test_estimate.py::TestPrintJson::test_multiple_snapshots PASSED [ 28%] tests/test_estimate.py::TestPrintJson::test_human_readable_sizes PASSED [ 28%] tests/test_estimate.py::TestExecuteEstimateIntegration::test_direct_mode_called PASSED [ 28%] tests/test_estimate.py::TestExecuteEstimateIntegration::test_config_mode_called PASSED [ 28%] tests/test_estimate.py::TestExecuteEstimateIntegration::test_missing_source_with_dest PASSED [ 28%] tests/test_estimate.py::TestExecuteEstimateIntegration::test_missing_dest_with_source PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheTextPrinterDecides::test_a_complete_estimate_without_a_check PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheTextPrinterDecides::test_an_unmeasured_snapshot_without_a_check PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheTextPrinterDecides::test_a_check_that_fits PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheTextPrinterDecides::test_a_check_that_finds_the_destination_short PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheTextPrinterDecides::test_a_check_with_nothing_measured PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheTextPrinterDecides::test_a_check_on_a_partial_sum_says_so PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheTextPrinterDecides::test_a_check_that_could_not_be_made PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheTextPrinterDecides::test_nothing_to_transfer_is_complete PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheJsonPrinterDecides::test_a_complete_estimate PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheJsonPrinterDecides::test_an_unmeasured_snapshot PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheJsonPrinterDecides::test_a_check_that_fits PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheJsonPrinterDecides::test_a_check_that_finds_the_destination_short PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheJsonPrinterDecides::test_a_check_that_could_not_be_made PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheJsonPrinterDecides::test_an_unmeasured_snapshot_under_a_check_that_fits PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheCommandEndToEnd::test_every_status[text] PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheCommandEndToEnd::test_every_status[json] PASSED [ 28%] tests/test_estimate_exit_status.py::TestTheCommandEndToEnd::test_nothing_ran_is_still_1 PASSED [ 28%] tests/test_estimate_remote_source.py::TestARemoteSourceIsMeasuredWhereItLives::test_each_snapshot_is_asked_of_the_endpoint PASSED [ 28%] tests/test_estimate_remote_source.py::TestARemoteSourceIsMeasuredWhereItLives::test_incremental_sizes_are_not_estimated_and_it_is_said PASSED [ 28%] tests/test_estimate_remote_source.py::TestARemoteSourceIsMeasuredWhereItLives::test_a_snapshot_the_remote_cannot_measure_is_unmeasured PASSED [ 28%] tests/test_estimate_remote_source.py::TestARemoteSourceIsMeasuredWhereItLives::test_snapshots_already_at_the_destination_are_not_measured PASSED [ 28%] tests/test_estimate_remote_source.py::TestALocalSourceStillUsesTheLocalLadder::test_a_mock_endpoint_is_not_taken_for_a_remote_one PASSED [ 28%] tests/test_estimate_remote_source.py::TestTheRemoteMeasurementElevatesFirst::test_sudo_first_and_its_answer_is_taken PASSED [ 28%] tests/test_estimate_remote_source.py::TestTheRemoteMeasurementElevatesFirst::test_a_refused_sudo_is_followed_by_the_user PASSED [ 28%] tests/test_estimate_remote_source.py::TestTheRemoteMeasurementElevatesFirst::test_a_total_of_zero_under_sudo_is_no_answer PASSED [ 28%] tests/test_estimate_remote_source.py::TestTheRemoteMeasurementElevatesFirst::test_without_elevation_only_the_user_is_asked PASSED [ 28%] tests/test_estimate_remote_source.py::TestTheRemoteMeasurementElevatesFirst::test_no_answer_from_either_is_none PASSED [ 28%] tests/test_estimate_remote_source.py::TestTheRemoteMeasurementElevatesFirst::test_an_incremental_is_not_measured PASSED [ 28%] tests/test_estimate_remote_source.py::TestTheCommandGivesARemoteSourceItsPath::test_the_source_endpoint_gets_the_path_and_the_ssh_options PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheTotalSaysWhetherItIsAFloor::test_an_underestimating_incremental_marks_the_total PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheTotalSaysWhetherItIsAFloor::test_a_measured_full_transfer_does_not PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheTotalSaysWhetherItIsAFloor::test_one_underestimate_among_many_is_enough PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheTotalSaysWhetherItIsAFloor::test_the_size_diff_fallback_counts_too PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheTotalSaysWhetherItIsAFloor::test_both_named_methods_are_covered PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheTotalSaysWhetherItIsAFloor::test_an_incremental_with_no_size_does_not_taint_the_total PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheOutputSaysSo::test_the_total_is_qualified_when_it_is_a_floor PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheOutputSaysSo::test_the_row_is_marked_too PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheOutputSaysSo::test_a_measured_total_is_not_hedged PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheJsonCarriesItToo::test_the_flag_is_emitted PASSED [ 28%] tests/test_estimate_reports_its_confidence.py::TestTheJsonCarriesItToo::test_it_is_false_for_a_measured_transfer PASSED [ 28%] tests/test_estimate_without_sudo.py::TestWhereSudoRefuses::test_a_readable_tree_is_measured_by_the_user_after_sudo_refuses PASSED [ 28%] tests/test_estimate_without_sudo.py::TestWhereSudoRefuses::test_the_progress_estimate_is_the_same_measurement PASSED [ 28%] tests/test_estimate_without_sudo.py::TestWhereSudoRefuses::test_an_incremental_transfer_is_still_not_sized PASSED [ 28%] tests/test_estimate_without_sudo.py::TestWhereSudoRefuses::test_without_a_sudo_to_run_the_user_measures_directly PASSED [ 28%] tests/test_estimate_without_sudo.py::TestWhereSudoRefuses::test_root_measures_directly_and_asks_no_sudo PASSED [ 28%] tests/test_estimate_without_sudo.py::TestWhereSudoRefuses::test_a_tree_this_user_cannot_read_in_full_gets_no_size PASSED [ 28%] tests/test_estimate_without_sudo.py::TestWhereSudoAnswers::test_an_answer_under_sudo_is_not_measured_again PASSED [ 28%] tests/test_estimate_without_sudo.py::TestWhereSudoAnswers::test_a_timeout_is_not_retried_as_the_user PASSED [ 28%] tests/test_estimate_without_sudo.py::TestOnBtrfs::test_a_readable_tree_is_measured_by_btrfs_not_du SKIPPED [ 28%] tests/test_estimate_without_sudo.py::TestOnBtrfs::test_a_tree_of_inline_files_is_measured_by_du SKIPPED [ 28%] tests/test_estimate_without_sudo.py::TestOnBtrfs::test_a_sparse_file_is_measured_below_its_apparent_size SKIPPED [ 28%] tests/test_estimate_without_sudo.py::TestOnBtrfs::test_reflinked_copies_count_once_per_name SKIPPED [ 29%] tests/test_estimate_without_sudo.py::TestTheSpaceCheckKnowsWhatItWasGiven::test_a_measurement_that_does_not_fit_is_refused PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheSpaceCheckKnowsWhatItWasGiven::test_an_upper_bound_that_does_not_fit_warns_and_proceeds PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheSpaceCheckKnowsWhatItWasGiven::test_an_upper_bound_that_fits_passes_quietly PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheSpaceCheckKnowsWhatItWasGiven::test_a_floor_that_does_not_fit_is_refused PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheSpaceCheckKnowsWhatItWasGiven::test_a_floor_that_fits_says_space_was_not_verified PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheSpaceCheckKnowsWhatItWasGiven::test_no_estimate_still_proceeds_with_the_warning PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheSpaceCheckKnowsWhatItWasGiven::test_the_report_names_the_bound PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheEstimateCommand::test_a_size_is_printed_not_unknown PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheEstimateCommand::test_a_floor_and_a_ceiling_together_keep_the_floor PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheSshEndpointsLocalMeasurement::test_it_is_the_shared_ladder_and_never_a_prompting_sudo PASSED [ 29%] tests/test_estimate_without_sudo.py::TestTheSshEndpointsLocalMeasurement::test_root_asks_no_sudo_for_it PASSED [ 29%] tests/test_estimate_without_sudo.py::TestOneTable::test_the_three_names_parse_alike PASSED [ 29%] tests/test_estimate_without_sudo.py::TestOneTable::test_subvolume_show_is_never_run PASSED [ 29%] tests/test_estimate_without_sudo.py::TestOneTable::test_a_filesystem_du_total_of_zero_is_not_a_size PASSED [ 29%] tests/test_estimate_without_sudo.py::TestOneTable::test_an_os_error_is_no_answer_not_an_exception PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_there_are_examples_and_targets_to_check PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_every_compress_value_is_runnable_on_its_target PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_compression_is_demonstrated_somewhere PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_an_ssh_target_demonstrates_it PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_a_raw_target_demonstrates_it_too PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_every_example_still_parses[config.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_every_example_still_parses[minimal.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_every_example_still_parses[remote-backup.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_every_example_still_parses[server.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::test_every_example_still_parses[snapper.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_there_are_files_to_check PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[README.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[docs/CLI-REFERENCE.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[docs/GLOSSARY.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[docs/MIGRATING-FROM-BTRBK.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[docs/REMOTE-LOCKS.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[docs/RESTORE-OVERWRITE.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[docs/SNAPPER-INTEGRATION.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[examples/config.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[examples/minimal.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[examples/remote-backup.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[examples/server.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_claims_compression_is_raw_only[examples/snapper.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[README.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[docs/CLI-REFERENCE.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[docs/GLOSSARY.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[docs/MIGRATING-FROM-BTRBK.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[docs/REMOTE-LOCKS.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[docs/RESTORE-OVERWRITE.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[docs/SNAPPER-INTEGRATION.md] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[examples/config.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[examples/minimal.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[examples/remote-backup.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[examples/server.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_no_file_advertises_a_method_the_code_cannot_run[examples/snapper.toml] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_the_scan_examines_real_enumerations PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_the_check_detects_a_method_nothing_implements[# compress = "none|gzip|brotli|zstd"] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_the_check_detects_a_method_nothing_implements[| `compress` | Compression: gzip, snappy, zstd, lz4 |] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_the_check_detects_a_method_nothing_implements[Compression method: none, gzip, lzma, zstd] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_the_check_detects_a_method_nothing_implements[# none | gzip | bzip3 | zstd | lz4 | xz |] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_ordinary_prose_is_not_flagged[| `compress` | Compression: gzip, pigz, zstd, lz4, xz, lzo, bzip2 |] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_ordinary_prose_is_not_flagged[# none | gzip | pigz | zstd | lz4 | xz |] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_ordinary_prose_is_not_flagged[Use `--compress zstd` for a fast, well-supported default.] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_ordinary_prose_is_not_flagged[| `--ssh-host-key-policy` | accept-new, strict |] PASSED [ 29%] tests/test_examples_use_runnable_compression.py::TestTheProseAgreesWithTheCode::test_ordinary_prose_is_not_flagged[The importer maps snapshot_create always, onchange, ondemand or no.] PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_a_received_copy_carrying_the_stream_identity_is_ok PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_a_subvolume_with_no_received_uuid_is_invalid PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_a_copy_of_something_else_is_invalid PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_not_a_subvolume_is_invalid_without_asking_for_privilege PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_nothing_at_the_path_is_invalid PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_the_shape_check_never_consults_the_mount_table PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_an_identity_that_cannot_be_read_is_unverifiable PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_an_unknown_source_identity_is_unverifiable PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_a_stat_failure_on_the_path_is_unverifiable PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_the_stream_identity_is_the_received_uuid_when_the_source_is_a_copy PASSED [ 29%] tests/test_executor_verdict.py::TestTheVerdictMatrix::test_the_verdict_has_the_shape_verify_uses PASSED [ 29%] tests/test_executor_verdict.py::TestARawDestinationKeepsItsOwnVerdict::test_the_committed_stream_is_judged_by_its_sidecar PASSED [ 29%] tests/test_executor_verdict.py::TestARawDestinationKeepsItsOwnVerdict::test_a_stream_missing_from_the_listing_is_unverifiable_not_invalid PASSED [ 30%] tests/test_executor_verdict.py::TestTheExecutorActsOnTheVerdict::test_ok_is_recorded_and_the_snapshot_counts_as_transferred PASSED [ 30%] tests/test_executor_verdict.py::TestTheExecutorActsOnTheVerdict::test_invalid_fails_the_transfer_and_cleans_under_authorship PASSED [ 30%] tests/test_executor_verdict.py::TestTheExecutorActsOnTheVerdict::test_invalid_does_not_clean_what_predates_the_run PASSED [ 30%] tests/test_executor_verdict.py::TestTheExecutorActsOnTheVerdict::test_invalid_is_cleaned_on_a_remote_btrfs_destination_too PASSED [ 30%] tests/test_executor_verdict.py::TestTheExecutorActsOnTheVerdict::test_unverifiable_keeps_the_artifact_and_counts_as_transferred PASSED [ 30%] tests/test_executor_verdict.py::TestTheExecutorActsOnTheVerdict::test_a_verdict_that_cannot_be_computed_is_unverifiable PASSED [ 30%] tests/test_executor_verdict.py::TestTheExecutorActsOnTheVerdict::test_the_verdict_is_reported_on_the_log PASSED [ 30%] tests/test_executor_verdict.py::TestTheLockId::test_the_default_is_the_destination_id PASSED [ 30%] tests/test_executor_verdict.py::TestTheLockId::test_a_given_lock_id_is_used_for_every_pin PASSED [ 30%] tests/test_executor_verdict.py::TestReleaseOnFailure::test_a_failed_backup_keeps_its_pin_by_default PASSED [ 30%] tests/test_executor_verdict.py::TestReleaseOnFailure::test_a_failed_restore_releases_its_pin PASSED [ 30%] tests/test_executor_verdict.py::TestTheEstimateIsAskedOfTheSource::test_the_space_check_uses_the_source_endpoints_measurement PASSED [ 30%] tests/test_executor_verdict.py::TestTheEstimateIsAskedOfTheSource::test_an_incremental_transfer_is_not_a_failed_estimate PASSED [ 30%] tests/test_executor_verdict.py::TestTheEstimateIsAskedOfTheSource::test_the_parent_is_handed_to_the_source_endpoint PASSED [ 30%] tests/test_executor_verdict.py::TestTheEstimateIsAskedOfTheSource::test_a_snapshot_without_a_measuring_endpoint_falls_back_to_local PASSED [ 30%] tests/test_executor_verdict.py::TestTheEstimateIsAskedOfTheSource::test_a_local_endpoint_measures_locally PASSED [ 30%] tests/test_executor_verdict.py::TestTheSshSourceMeasuresOnTheRemote::test_a_full_send_is_sized_by_a_remote_filesystem_du PASSED [ 30%] tests/test_executor_verdict.py::TestTheSshSourceMeasuresOnTheRemote::test_an_incremental_send_is_not_measured PASSED [ 30%] tests/test_executor_verdict.py::TestTheSshSourceMeasuresOnTheRemote::test_nothing_measurable_is_none_not_an_error PASSED [ 30%] tests/test_executor_verdict.py::TestTheSshIdentityProbe::test_reads_the_identity_on_the_remote PASSED [ 30%] tests/test_executor_verdict.py::TestTheSshIdentityProbe::test_a_failed_probe_is_none PASSED [ 30%] tests/test_exit_cleanup.py::TestAFatalSignalEndsTheRunCleanly::test_pins_and_control_dirs_are_let_go_and_the_process_dies_of_it[SIGTERM] PASSED [ 30%] tests/test_exit_cleanup.py::TestAFatalSignalEndsTheRunCleanly::test_pins_and_control_dirs_are_let_go_and_the_process_dies_of_it[SIGHUP] PASSED [ 30%] tests/test_exit_cleanup.py::TestAFatalSignalEndsTheRunCleanly::test_the_entry_point_is_what_installs_the_handlers PASSED [ 30%] tests/test_exit_cleanup.py::TestAFatalSignalEndsTheRunCleanly::test_a_connection_made_on_a_worker_thread_is_covered PASSED [ 30%] tests/test_exit_cleanup.py::TestAFatalSignalEndsTheRunCleanly::test_a_second_signal_does_not_abandon_the_cleanup PASSED [ 30%] tests/test_exit_cleanup.py::TestAFatalSignalEndsTheRunCleanly::test_the_handler_can_run_while_the_registry_is_being_changed PASSED [ 30%] tests/test_exit_cleanup.py::TestAnIgnoredSignalStaysIgnored::test_under_nohup_a_hangup_releases_nothing PASSED [ 30%] tests/test_exit_cleanup.py::TestCtrlC::test_there_is_no_sigint_handler_and_the_exit_sweeps PASSED [ 30%] tests/test_exit_cleanup.py::TestCtrlC::test_the_connection_is_still_there_while_the_interrupt_unwinds PASSED [ 30%] tests/test_exit_cleanup.py::TestCtrlC::test_a_worker_transfer_keeps_its_lock_until_it_finishes PASSED [ 30%] tests/test_exit_cleanup.py::TestWritersStopBeforeLocksGo::test_an_interrupt_stops_the_scope_s_children_before_the_outer_release PASSED [ 30%] tests/test_exit_cleanup.py::TestWritersStopBeforeLocksGo::test_a_shell_pipeline_is_stopped_with_its_own_children PASSED [ 30%] tests/test_exit_cleanup.py::TestWritersStopBeforeLocksGo::test_a_normal_return_hands_live_children_to_the_enclosing_scope PASSED [ 30%] tests/test_exit_cleanup.py::TestWritersStopBeforeLocksGo::test_a_scope_that_succeeds_leaves_its_children_alone PASSED [ 30%] tests/test_exit_cleanup.py::TestWritersStopBeforeLocksGo::test_the_transfer_engine_runs_in_a_scope PASSED [ 30%] tests/test_exit_cleanup.py::TestWritersStopBeforeLocksGo::test_a_fatal_signal_stops_children_before_it_releases PASSED [ 30%] tests/test_exit_cleanup.py::TestTheControlDirectory::test_its_removal_is_registered_before_it_exists PASSED [ 30%] tests/test_exit_cleanup.py::TestTheControlDirectory::test_a_stopped_master_can_be_started_again PASSED [ 30%] tests/test_exit_cleanup.py::TestTheControlDirectory::test_the_exit_cleanup_stops_a_running_master_first PASSED [ 30%] tests/test_exit_cleanup.py::TestTheControlDirectory::test_the_removal_never_touches_a_directory_it_does_not_own PASSED [ 30%] tests/test_exit_cleanup.py::TestTheDrainIsResumable::test_an_interrupted_cleanup_does_not_stop_the_others PASSED [ 30%] tests/test_exit_cleanup.py::TestTheDrainIsResumable::test_connections_go_after_locks PASSED [ 30%] tests/test_exit_cleanup.py::TestTheDrainIsResumable::test_installing_off_the_main_thread_is_refused PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestTheConfigLayerStillHonoursIt::test_an_unset_prefix_is_derived PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestTheConfigLayerStillHonoursIt::test_an_explicit_empty_prefix_is_preserved PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestTheConfigLayerStillHonoursIt::test_a_bare_timestamp_name_results PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestInferenceRespectsAnExplicitEmptyPrefix::test_it_is_not_overridden PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestInferenceRespectsAnExplicitEmptyPrefix::test_inference_still_runs_when_no_prefix_was_asked_for PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestInferenceRespectsAnExplicitEmptyPrefix::test_an_explicit_non_empty_prefix_is_still_respected PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestInferenceRespectsAnExplicitEmptyPrefix::test_a_non_empty_prefix_suppresses_inference_even_if_not_marked_chosen PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestInferenceRespectsAnExplicitEmptyPrefix::test_a_bare_timestamp_location_lists_under_an_explicit_empty_prefix PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestTheChoiceSurvivesEveryLayer::test_the_endpoint_records_it PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestTheChoiceSurvivesEveryLayer::test_it_defaults_to_not_explicit PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestTheChoiceSurvivesEveryLayer::test_the_restore_cli_marks_a_given_prefix_as_chosen[] PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestTheChoiceSurvivesEveryLayer::test_the_restore_cli_marks_a_given_prefix_as_chosen[home-] PASSED [ 30%] tests/test_explicit_empty_prefix.py::TestTheChoiceSurvivesEveryLayer::test_a_volumes_explicit_empty_prefix_reaches_args PASSED [ 30%] tests/test_fatal_errors_are_not_retried.py::test_a_refused_password_is_attempted_once PASSED [ 30%] tests/test_fatal_errors_are_not_retried.py::test_a_transient_failure_is_still_retried PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_config_file_reaches_the_subcommand[argv0-/global.toml] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_config_file_reaches_the_subcommand[argv1-/sub.toml] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_config_file_reaches_the_subcommand[argv2-/sub.toml] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_config_file_reaches_the_subcommand[argv3-None] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_config_file_reaches_the_subcommand[argv4-/global.toml] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_config_file_reaches_the_subcommand[argv5-/sub.toml] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_quiet_reaches_the_subcommand[argv0-True] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_quiet_reaches_the_subcommand[argv1-True] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_quiet_reaches_the_subcommand[argv2-False] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_quiet_reaches_the_subcommand[argv3-True] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_quiet_reaches_the_subcommand[argv4-False] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_a_config_file_never_arrives_as_a_snapper_config_name[argv0] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_a_config_file_never_arrives_as_a_snapper_config_name[argv1] PASSED [ 30%] tests/test_global_options_survive_subcommands.py::test_a_config_file_never_arrives_as_a_snapper_config_name[argv2] PASSED [ 31%] tests/test_global_options_survive_subcommands.py::test_snapper_config_names_still_work[argv0-root] PASSED [ 31%] tests/test_global_options_survive_subcommands.py::test_snapper_config_names_still_work[argv1-home] PASSED [ 31%] tests/test_global_options_survive_subcommands.py::test_snapper_config_names_still_work[argv2-root] PASSED [ 31%] tests/test_global_options_survive_subcommands.py::test_snapper_config_names_still_work[argv3-None] PASSED [ 31%] tests/test_global_options_survive_subcommands.py::test_snapper_config_names_still_work[argv4-root] PASSED [ 31%] tests/test_global_options_survive_subcommands.py::test_every_config_file_option_is_covered PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.__util__-Snapshot] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.__util__-read_locks] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.__util__-write_locks] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.cli.prune-execute_prune] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.cli.prune-is_degenerate_policy] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.cli.prune-plan_retention_of] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.cli.restore-_cleared_by_unlock] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.cli.restore-_execute_cleanup] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.cli.restore-_execute_unlock] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.cli.run-_catch_up_selector] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.cli.run-_run_lock] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.cli.run-_run_lock_path] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.config.schema-RetentionConfig] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.core.doctor-Doctor._lock_file_findings] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.core.layout-PlainLayout] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.core.layout-read_markers] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.core.operations-_execute_transfers] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.core.operations-sync_snapshots] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.core.planning-plan_transfer_sequence] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.core.planning-snapshots_present_on] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.core.restore-restore_snapshots] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.core.target-parse_target] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint-choose_endpoint] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-DeletionResult] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-Endpoint] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-Endpoint._lock_store_manager] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-Endpoint._record_holder] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-Endpoint._unrecorded_pins] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-Endpoint._update_lock_entry] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-Endpoint.correspondent_of] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-Endpoint.delete_snapshots] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-Endpoint.get_id] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.common-Endpoint.set_lock] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.raw_metadata-RawSnapshot] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.endpoint.ssh-SSHEndpoint._build_lock_manager] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.lifecycle-drain] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.lifecycle-register] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.retention-apply_retention] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-Holder] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockBusy] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager._start_heartbeat] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager.acquire_once] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager.acquire_shared] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager.keep_record_past_exit] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager.live_locks] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager.release] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager.release_holder] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager.shared_records] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-RemoteLockManager.sweep_dead_holders] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-holders_beside] PASSED [ 31%] tests/test_glossary.py::test_every_code_reference_resolves[btrfs_backup_ng.sshutil.lock-local_manager] PASSED [ 31%] tests/test_glossary.py::test_the_glossary_names_enough_references PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/core/planning.py- Presence is decided purely by correspondence -- ``received_uuid == stream_uuid`` for\n btrfs, name for raw -- via the polymorphic ``correspondent_of`` (which never raises; a listing\n failure yields None -> absent). This is the shared presence authority used by both the\n] PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/core/operations.py- for snap in source_snapshots:\n if destination_id in snap.parent_locks:\n source_endpoint.set_lock(snap, destination_id, False, parent=True)\n if snap.get_name() not in present_names:\n continue # not yet on the destination -> keep its own lock\n if destination_id in snap.locks:\n source_endpoint.set_lock(snap, destination_id, False)\n] PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/endpoint/common.py- if snapshot.locks or snapshot.parent_locks:\n logger.info("Skipping locked snapshot: %s", snapshot)\n result.skip(snapshot, "held by a retention lock")\n continue\n] PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/endpoint/common.py- guard = str(self._get_lock_file_path()) + ".guard"\n with FileLock(guard):\n lock_dict = self._read_locks()\n] PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/sshutil/lock.py- "name": name,\n "lock_id": str(lock_id),\n "operation": operation or str(lock_id),\n "hostname": self._hostname or "unknown",\n "pid": os.getpid(),\n "shared": True,\n] PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/sshutil/lock.py-DEFAULT_HEARTBEAT_INTERVAL = 30\n] PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/sshutil/lock.py-DEFAULT_STALE_AFTER = 180\n] PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/sshutil/lock.py-DEAD_HOLDER_MULTIPLE = 2\n] PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/cli/restore.py- held = str(held)\n if lock_id == "all":\n return held == "unknown" or held.startswith("restore:")\n wanted = lock_id if lock_id.startswith("restore:") else f"restore:{lock_id}"\n return held == wanted\n] PASSED [ 31%] tests/test_glossary.py::test_every_excerpt_is_still_in_its_file[src/btrfs_backup_ng/cli/run.py- Keyed by a digest of the resolved config path so two different\n configurations never share a lock, while the same configuration always\n] PASSED [ 31%] tests/test_glossary.py::test_there_are_excerpts_to_check PASSED [ 31%] tests/test_glossary.py::test_the_lock_file_example_is_what_write_locks_produces PASSED [ 31%] tests/test_glossary.py::test_the_holder_record_example_has_the_keys_a_record_carries PASSED [ 31%] tests/test_glossary.py::test_the_constants_quoted_are_the_constants_in_force PASSED [ 32%] tests/test_glossary.py::test_the_retired_phrases_are_listed PASSED [ 32%] tests/test_glossary.py::test_a_retired_phrase_is_not_in_the_source_or_docs[sidecar for a holder record-holder sidecar|sidecar (beside|next to) the lock|lock[- ]file sidecar|pin sidecar] PASSED [ 32%] tests/test_glossary.py::test_a_retired_phrase_is_not_in_the_source_or_docs[stale lock as a verdict-\\"Stale lock|Stale lock on|stale lock(s)? (found|detected)] PASSED [ 32%] tests/test_glossary.py::test_a_retired_phrase_is_not_in_the_source_or_docs[ledger in a message-logger\\.\\w+\\([^)]*ledger|print\\([^)]*ledger] PASSED [ 32%] tests/test_glossary.py::test_a_retired_phrase_is_not_in_the_source_or_docs[remote lock as a kind-remote lock store] PASSED [ 32%] tests/test_glossary.py::test_the_glossary_is_linked_from_the_readme_and_the_lock_docs PASSED [ 32%] tests/test_glossary.py::test_the_glossary_ships_in_the_sdist PASSED [ 32%] tests/test_glossary.py::test_every_index_link_points_at_a_heading PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestARecordRemovedFromUnderALiveHolderComesBackWhole::test_beside_another_holder_it_returns_with_its_identity PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestARecordRemovedFromUnderALiveHolderComesBackWhole::test_alone_it_returns_with_its_directories PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestARecordRemovedFromUnderALiveHolderComesBackWhole::test_the_record_that_returns_is_the_complete_one PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestAReleasedPinStaysReleased::test_nothing_comes_back_after_release_shared PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestABeatElevatesAsTheAcquireDid::test_a_shared_pin_on_a_root_owned_store_is_kept_alive PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestABeatElevatesAsTheAcquireDid::test_an_exclusive_lock_on_a_root_owned_store_is_kept_alive PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestABeatElevatesAsTheAcquireDid::test_a_beat_that_can_write_does_not_elevate PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestARemovalElevatesAsTheAcquireDid::test_a_shared_release_removes_its_record PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestARemovalElevatesAsTheAcquireDid::test_an_exclusive_release_removes_its_record PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestARemovalElevatesAsTheAcquireDid::test_a_release_by_record_removes_it PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestARemovalElevatesAsTheAcquireDid::test_a_sweep_removes_an_abandoned_record PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestARemovalElevatesAsTheAcquireDid::test_a_removal_that_can_write_does_not_elevate PASSED [ 32%] tests/test_heartbeat_rewrites_the_record.py::TestARemovalElevatesAsTheAcquireDid::test_a_broken_lock_is_still_left_alone PASSED [ 32%] tests/test_hostkey_policy.py::test_loader_defaults_to_accept_new PASSED [ 32%] tests/test_hostkey_policy.py::test_loader_accepts_strict PASSED [ 32%] tests/test_hostkey_policy.py::test_loader_rejects_invalid_policy_fail_closed PASSED [ 32%] tests/test_hostkey_policy.py::test_master_strict_emits_yes PASSED [ 32%] tests/test_hostkey_policy.py::test_master_accept_new_emits_accept_new PASSED [ 32%] tests/test_hostkey_policy.py::test_endpoint_strict_survives_the_config_whitelist PASSED [ 32%] tests/test_hostkey_policy.py::test_endpoint_accept_new_survives_the_config_whitelist PASSED [ 32%] tests/test_hostkey_policy.py::test_endpoint_defaults_to_accept_new PASSED [ 32%] tests/test_hostkey_policy.py::test_raw_strict_emits_yes PASSED [ 32%] tests/test_hostkey_policy.py::test_raw_accept_new_emits_accept_new PASSED [ 32%] tests/test_hostkey_policy.py::test_raw_default_is_accept_new PASSED [ 32%] tests/test_hostkey_policy.py::test_every_handler_threading_ssh_sudo_also_threads_host_key_policy PASSED [ 32%] tests/test_hostkey_policy.py::test_snapper_subcommands_accept_ssh_host_key_policy[argv0] PASSED [ 32%] tests/test_hostkey_policy.py::test_snapper_subcommands_accept_ssh_host_key_policy[argv1] PASSED [ 32%] tests/test_in_place_is_refused.py::TestTheRefusal::test_refuses_with_the_reason_and_restores_nothing PASSED [ 32%] tests/test_in_place_is_refused.py::TestTheRefusal::test_refuses_before_any_endpoint_is_prepared PASSED [ 32%] tests/test_in_place_is_refused.py::TestTheRefusal::test_the_confirmation_flag_does_not_unlock_it PASSED [ 32%] tests/test_in_place_is_refused.py::TestTheRefusal::test_dry_run_refuses_too PASSED [ 32%] tests/test_in_place_is_refused.py::TestTheRefusal::test_the_config_driven_mode_refuses_as_well PASSED [ 32%] tests/test_in_place_is_refused.py::test_without_the_flag_nothing_changes PASSED [ 32%] tests/test_in_place_is_refused.py::test_the_help_says_it_is_not_implemented[--in-place] PASSED [ 32%] tests/test_install.py::TestResolveExecStart::test_resolves_via_path PASSED [ 32%] tests/test_install.py::TestResolveExecStart::test_falls_back_when_not_on_path PASSED [ 32%] tests/test_install.py::TestResolveExecStart::test_template_uses_resolved_path PASSED [ 32%] tests/test_install.py::TestExecuteInstallWritesResolvedExecStart::test_user_install_service_has_resolved_execstart PASSED [ 32%] tests/test_install_config_visibility.py::TestASystemUnitThatCannotSeeTheConfig::test_it_warns PASSED [ 32%] tests/test_install_config_visibility.py::TestASystemUnitThatCannotSeeTheConfig::test_it_names_the_config_that_will_be_missed PASSED [ 32%] tests/test_install_config_visibility.py::TestASystemUnitThatCannotSeeTheConfig::test_it_predicts_the_exact_failure PASSED [ 32%] tests/test_install_config_visibility.py::TestASystemUnitThatCannotSeeTheConfig::test_it_offers_both_safe_routes PASSED [ 32%] tests/test_install_config_visibility.py::TestASystemUnitThatCannotSeeTheConfig::test_it_explains_why_the_path_is_not_simply_baked_in PASSED [ 32%] tests/test_install_config_visibility.py::TestWhenThereIsNothingToWarnAbout::test_a_user_unit_is_silent PASSED [ 32%] tests/test_install_config_visibility.py::TestWhenThereIsNothingToWarnAbout::test_a_system_config_is_silent PASSED [ 32%] tests/test_install_config_visibility.py::TestWhenThereIsNothingToWarnAbout::test_no_config_at_all_still_says_something_useful PASSED [ 32%] tests/test_install_config_visibility.py::TestWhenThereIsNothingToWarnAbout::test_a_discovery_failure_never_breaks_the_install PASSED [ 32%] tests/test_install_config_visibility.py::TestTheUnitDoesNotPointAtAHomeDirectory::test_the_service_template_has_no_config_flag PASSED [ 32%] tests/test_install_config_visibility.py::TestARootTimerDoesNotRunAUserWritableBinary::test_a_home_directory_binary_is_flagged_for_a_system_unit PASSED [ 32%] tests/test_install_config_visibility.py::TestARootTimerDoesNotRunAUserWritableBinary::test_a_world_writable_binary_is_flagged PASSED [ 32%] tests/test_install_config_visibility.py::TestARootTimerDoesNotRunAUserWritableBinary::test_a_user_unit_is_not_flagged PASSED [ 32%] tests/test_install_config_visibility.py::TestARootTimerDoesNotRunAUserWritableBinary::test_a_root_owned_system_path_is_not_flagged PASSED [ 32%] tests/test_install_config_visibility.py::TestARootTimerDoesNotRunAUserWritableBinary::test_a_missing_binary_does_not_break_the_install PASSED [ 32%] tests/test_install_config_visibility.py::TestTheDirectoryDecidesWhoCanReplaceTheBinary::test_a_root_owned_system_chain_is_clean PASSED [ 32%] tests/test_install_config_visibility.py::TestTheDirectoryDecidesWhoCanReplaceTheBinary::test_a_user_owned_directory_is_named PASSED [ 32%] tests/test_install_config_visibility.py::TestTheDirectoryDecidesWhoCanReplaceTheBinary::test_a_sticky_directory_is_not_itself_a_way_in PASSED [ 32%] tests/test_install_config_visibility.py::TestTheDirectoryDecidesWhoCanReplaceTheBinary::test_an_unreadable_directory_is_reported_not_skipped PASSED [ 32%] tests/test_install_config_visibility.py::TestTheDirectoryDecidesWhoCanReplaceTheBinary::test_a_world_writable_root_directory_is_flagged PASSED [ 32%] tests/test_install_config_visibility.py::TestTheDirectoryDecidesWhoCanReplaceTheBinary::test_the_warning_names_the_directory PASSED [ 32%] tests/test_install_config_visibility.py::TestAFailedTrustCheckIsNotAPass::test_an_unreadable_binary_says_it_was_not_checked PASSED [ 32%] tests/test_install_config_visibility.py::TestAMissingExecutableIsReportedAtInstallTime::test_a_missing_binary_is_reported PASSED [ 32%] tests/test_install_config_visibility.py::TestAMissingExecutableIsReportedAtInstallTime::test_a_user_unit_is_reported_too PASSED [ 32%] tests/test_install_config_visibility.py::TestAMissingExecutableIsReportedAtInstallTime::test_an_existing_binary_is_not_reported PASSED [ 32%] tests/test_install_config_visibility.py::TestAMissingExecutableIsReportedAtInstallTime::test_the_install_still_succeeds_and_says_so PASSED [ 32%] tests/test_interrupt_stops_new_work.py::TestTheStopFlag::test_nothing_is_refused_until_a_stop_is_requested PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheStopFlag::test_after_a_stop_the_refusal_is_said_once_in_plain_language PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheStopFlag::test_a_backoff_wait_returns_at_once_when_the_stop_comes PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheStopFlag::test_a_backoff_wait_after_the_stop_does_not_wait_at_all PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestThePoolHelper::test_an_interrupt_stops_new_work_cancels_the_queue_and_is_re_raised PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestThePoolHelper::test_what_is_already_running_is_not_cancelled PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestThePoolHelper::test_an_ordinary_failure_is_not_an_interrupt PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheDrainRequestsTheStop::test_a_fatal_signal_stops_new_work_before_the_locks_go PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheExecutorBeginsNoFurtherTransfer::test_the_transfer_in_flight_finishes_and_the_rest_are_not_started PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheExecutorBeginsNoFurtherTransfer::test_a_snapshot_not_started_is_never_reported_as_delivered PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheSnapperSyncBeginsNoFurtherSnapshot::test_the_rest_of_the_plan_is_not_started PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRunPipelineBeginsNothingNew::test_no_snapshot_is_taken PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRunPipelineBeginsNothingNew::test_a_target_a_worker_picks_up_is_not_transferred PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRunPipelineBeginsNothingNew::test_the_prune_after_the_transfers_is_not_started PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRunPipelineBeginsNothingNew::test_a_snapper_volume_begins_no_further_target PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRunPipelineBeginsNothingNew::test_the_snapper_prune_is_not_started PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestDeletionsStopBetweenSnapshots::test_a_prune_pass_begins_no_further_deletion PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestDeletionsStopBetweenSnapshots::test_a_snapper_slot_pass_begins_no_further_deletion PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestDeletionsStopBetweenSnapshots::test_a_raw_snapper_batch_is_not_started PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestThePoolsInRun::test_the_volume_pool_starts_no_queued_volume PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestThePoolsInRun::test_the_target_pool_starts_no_queued_target_and_does_not_prune PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestThePoolsInExecution::test_the_volume_pool_starts_no_queued_volume PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestThePoolsInExecution::test_the_target_pool_starts_no_queued_target PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestThePoolsInExecution::test_a_queued_target_in_a_volume_worker_s_pool_is_not_run PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestThePoolsInExecution::test_a_job_a_worker_picks_up_after_the_stop_is_not_run PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheEntryPointsRequestTheStop::test_the_dispatcher PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheEntryPointsRequestTheStop::test_the_program_entry_point PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_the_context_allows_the_first_attempt_and_no_other PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_the_context_does_not_sleep_out_its_backoff PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_the_context_waits_nothing_once_stopped PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_an_attempt_is_not_retried PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_an_attempt_does_not_sleep_out_its_backoff PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_an_attempt_waits_nothing_once_stopped PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_an_async_attempt_waits_nothing_once_stopped PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_the_attempts_stop_after_the_first PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_a_decorated_call_is_made_once PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_a_decorated_call_interrupted_in_its_backoff_is_not_repeated PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryFrameworkRetriesNothing::test_retry_call_is_made_once PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheSshTransferIsNotRetried::test_without_an_interrupt_a_failed_attempt_is_retried PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheSshTransferIsNotRetried::test_a_transfer_killed_by_the_interrupt_is_not_sent_again PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheSshTransferIsNotRetried::test_a_retryable_error_after_the_interrupt_is_not_retried PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheSshTransferIsNotRetried::test_an_interrupt_during_the_backoff_ends_it PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestRemoteCommandsAreNotRetried::test_without_an_interrupt_a_failed_command_is_retried PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestRemoteCommandsAreNotRetried::test_a_failed_command_is_not_retried_after_the_interrupt PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestRemoteCommandsAreNotRetried::test_a_refused_password_is_not_asked_again_after_the_interrupt PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestRemoteCommandsAreNotRetried::test_without_an_interrupt_a_refused_password_is_asked_again PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRealRunAfterCtrlC::test_in_flight_work_ends_and_nothing_new_starts[process] PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRealRunAfterCtrlC::test_in_flight_work_ends_and_nothing_new_starts[group] PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheLastMomentsBeforeWorkBegins::test_no_target_is_prepared_after_a_stop_during_the_snapshot PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheLastMomentsBeforeWorkBegins::test_a_transfer_begins_nothing_after_a_stop_during_its_setup PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheLastMomentsBeforeWorkBegins::test_an_ssh_transfer_starts_no_stream_after_a_stop_during_its_checks PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryHelpersWithoutProductionCallers::test_an_async_backoff_ends_when_the_stop_comes PASSED [ 33%] tests/test_interrupt_stops_new_work.py::TestTheRetryHelpersWithoutProductionCallers::test_retry_call_reports_the_calls_it_made_when_a_stop_ends_its_backoff PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestUndoOnFailure::test_it_runs_when_the_block_fails_and_not_when_it_completes PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestUndoOnFailure::test_a_failure_the_caller_handles_itself_is_left_to_it PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestUndoOnFailure::test_it_is_owed_to_the_exit_drain_only_while_the_block_runs PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestUndoOnFailure::test_the_drain_runs_it_after_the_writers_and_before_the_locks PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::test_a_fatal_signal_undoes_after_the_writer_and_before_the_lock PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestTheTransferEngine::test_ctrl_c_removes_this_run_s_partial_after_its_writer_stopped PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestTheTransferEngine::test_an_unexpected_error_removes_it_too PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestTheTransferEngine::test_what_was_there_before_the_run_is_not_this_run_s PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestTheTransferEngine::test_a_transfer_error_is_cleaned_once PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestTheSshReceiveLock::test_an_interrupted_receive_is_undone_before_its_lock_goes PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestTheSshReceiveLock::test_a_receive_that_completes_is_left_alone PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::TestTheSshReceiveLock::test_what_was_at_the_path_before_is_not_this_run_s PASSED [ 33%] tests/test_interrupted_receive_cleanup.py::test_the_real_ssh_cleaner_refuses_what_it_did_not_create PASSED [ 33%] tests/test_legacy_cleanup_verdict.py::test_a_clean_prune_reports_clean PASSED [ 33%] tests/test_legacy_cleanup_verdict.py::test_a_failed_deletion_is_not_clean PASSED [ 33%] tests/test_legacy_cleanup_verdict.py::test_a_failed_deletion_on_a_destination_is_not_clean PASSED [ 33%] tests/test_legacy_cleanup_verdict.py::test_a_skip_is_not_a_failure PASSED [ 33%] tests/test_legacy_cleanup_verdict.py::test_an_abort_is_reported_not_swallowed PASSED [ 33%] tests/test_legacy_cleanup_verdict.py::test_a_failed_deletion_is_visible_at_default_verbosity PASSED [ 33%] tests/test_legacy_cleanup_verdict.py::test_run_task_treats_a_retention_failure_as_a_failed_run PASSED [ 34%] tests/test_legacy_never_creates.py::TestTheSourceIsLookedAtFirst::test_a_missing_source_is_refused_and_nothing_is_built_beside_it PASSED [ 34%] tests/test_legacy_never_creates.py::TestTheSourceIsLookedAtFirst::test_a_missing_source_with_an_absolute_folder_creates_nothing_either PASSED [ 34%] tests/test_legacy_never_creates.py::TestTheDefaultIsDotSnapshotsInsideTheSource::test_the_default_folder_is_created_under_the_source_and_passed_through PASSED [ 34%] tests/test_legacy_never_creates.py::TestTheDefaultIsDotSnapshotsInsideTheSource::test_the_settings_default_matches PASSED [ 34%] tests/test_legacy_never_creates.py::TestAnExplicitSnapshotFolderIsHonoured::test_an_absolute_folder_that_exists_is_used_as_given PASSED [ 34%] tests/test_legacy_never_creates.py::TestAnExplicitSnapshotFolderIsHonoured::test_an_absolute_folder_that_does_not_exist_is_refused_and_not_created PASSED [ 34%] tests/test_legacy_never_creates.py::TestAnExplicitSnapshotFolderIsHonoured::test_a_relative_folder_is_created_under_the_source PASSED [ 34%] tests/test_legacy_never_creates.py::TestAnExplicitSnapshotFolderIsHonoured::test_a_relative_folder_that_climbs_out_of_the_source_must_exist PASSED [ 34%] tests/test_legacy_never_creates.py::TestASilentNewChainIsRefused::test_refuses_with_all_three_remedies_and_creates_nothing PASSED [ 34%] tests/test_legacy_never_creates.py::TestASilentNewChainIsRefused::test_an_absolute_empty_folder_is_refused_the_same_way PASSED [ 34%] tests/test_legacy_never_creates.py::TestASilentNewChainIsRefused::test_accept_full_send_proceeds_and_the_folder_is_then_used PASSED [ 34%] tests/test_legacy_never_creates.py::TestASilentNewChainIsRefused::test_the_flag_is_needed_only_once PASSED [ 34%] tests/test_legacy_never_creates.py::TestASilentNewChainIsRefused::test_pointing_at_the_default_chain_is_remedy_two PASSED [ 34%] tests/test_legacy_never_creates.py::TestASilentNewChainIsRefused::test_another_prefix_s_chain_does_not_count PASSED [ 34%] tests/test_legacy_never_creates.py::TestASilentNewChainIsRefused::test_no_chain_anywhere_means_a_first_run_and_no_refusal PASSED [ 34%] tests/test_legacy_never_creates.py::TestASilentNewChainIsRefused::test_the_hostname_prefix_default_is_what_is_looked_for PASSED [ 34%] tests/test_legacy_never_creates.py::TestTheFlagExists::test_accept_full_send_parses_and_defaults_off PASSED [ 34%] tests/test_legacy_never_creates.py::TestTheRefusalIsReported::test_legacy_main_prints_the_diagnosis_not_only_process_aborted PASSED [ 34%] tests/test_legacy_remote_source_refused.py::test_an_ssh_source_is_refused_with_the_reason PASSED [ 34%] tests/test_legacy_remote_source_refused.py::test_the_refusal_names_where_ssh_is_accepted PASSED [ 34%] tests/test_legacy_remote_source_refused.py::test_the_legacy_help_no_longer_promises_a_remote_source PASSED [ 34%] tests/test_listing_never_creates.py::test_the_mid_run_vanish_raises_instead_of_recreating PASSED [ 34%] tests/test_listing_never_creates.py::test_a_missing_destination_is_unreadable_not_empty PASSED [ 34%] tests/test_listing_never_creates.py::test_a_missing_source_snapshot_dir_is_a_legitimate_baseline PASSED [ 34%] tests/test_listing_never_creates.py::test_a_file_at_the_path_is_diagnosed_for_both_roles[_dest_endpoint] PASSED [ 34%] tests/test_listing_never_creates.py::test_a_file_at_the_path_is_diagnosed_for_both_roles[_source_endpoint] PASSED [ 34%] tests/test_listing_never_creates.py::test_an_existing_directory_lists_exactly_as_before PASSED [ 34%] tests/test_listing_never_creates.py::test_correspondents_of_still_never_raises_and_never_creates PASSED [ 34%] tests/test_loader_knows_every_key_it_reads.py::test_skip_remote_lock_on_a_target_is_a_known_key PASSED [ 34%] tests/test_loader_knows_every_key_it_reads.py::test_the_email_timeout_is_read_and_known PASSED [ 34%] tests/test_loader_knows_every_key_it_reads.py::test_the_email_timeout_keeps_its_default_when_absent PASSED [ 34%] tests/test_local_lock_directory_store.py::TestARemotePinIsHonouredLocally::test_the_directory_store_is_read_in_the_lock_file_shape PASSED [ 34%] tests/test_local_lock_directory_store.py::TestARemotePinIsHonouredLocally::test_the_listing_carries_the_remote_pin PASSED [ 34%] tests/test_local_lock_directory_store.py::TestARemotePinIsHonouredLocally::test_a_local_prune_refuses_to_delete_what_a_remote_restore_holds PASSED [ 34%] tests/test_local_lock_directory_store.py::TestARemotePinIsHonouredLocally::test_a_pin_taken_after_the_listing_still_blocks_the_delete PASSED [ 34%] tests/test_local_lock_directory_store.py::TestARemotePinIsHonouredLocally::test_an_unanswerable_store_deletes_nothing PASSED [ 34%] tests/test_local_lock_directory_store.py::TestARemotePinIsHonouredLocally::test_a_pin_with_an_unreadable_payload_still_blocks PASSED [ 34%] tests/test_local_lock_directory_store.py::TestALocalPinIsVisibleToTheSshSide::test_set_lock_writes_a_holder_the_remote_guard_sees PASSED [ 34%] tests/test_local_lock_directory_store.py::TestALocalPinIsVisibleToTheSshSide::test_a_parent_pin_is_keyed_apart PASSED [ 34%] tests/test_local_lock_directory_store.py::TestALocalPinIsVisibleToTheSshSide::test_unlock_reconciles_the_store PASSED [ 34%] tests/test_local_lock_directory_store.py::TestALocalPinIsVisibleToTheSshSide::test_an_unwritable_store_stops_the_run_unless_opted_out PASSED [ 34%] tests/test_local_lock_directory_store.py::TestALocationWithoutTheDirectoryIsUnchanged::test_the_lock_file_is_written_and_read_as_before PASSED [ 34%] tests/test_local_lock_directory_store.py::TestALocationWithoutTheDirectoryIsUnchanged::test_a_non_regular_non_directory_entry_is_still_refused PASSED [ 34%] tests/test_local_lock_directory_store.py::TestALocationWithoutTheDirectoryIsUnchanged::test_the_refusal_for_a_directory_is_gone PASSED [ 34%] tests/test_local_transfer_returncode.py::TestDoProcessTransferReturnCodes::test_nonzero_receive_code_is_returned PASSED [ 34%] tests/test_local_transfer_returncode.py::TestDoProcessTransferReturnCodes::test_nonzero_send_code_is_returned PASSED [ 34%] tests/test_local_transfer_returncode.py::TestDoProcessTransferReturnCodes::test_all_zero_on_success PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestTwoObjectsOneSnapshot::test_both_pins_survive_and_a_release_drops_only_its_own PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestTwoThreadsOneSource::test_a_released_pin_does_not_come_back PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestTwoThreadsOneSource::test_a_pin_taken_by_another_thread_is_not_erased PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestTwoThreadsOneSource::test_staggered_listings_end_with_nothing_held PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestTwoThreadsOneSource::test_the_callers_copy_still_records_its_own_change PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestTheChangeAndNothingElse::test_the_other_key_other_holders_and_other_snapshots_pass_through PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestTheChangeAndNothingElse::test_nothing_is_written_when_nothing_changes[release-of-an-id-not-held] PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestTheChangeAndNothingElse::test_nothing_is_written_when_nothing_changes[pin-of-an-id-already-held] PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestRealThreadsThroughTheRealExecutor::test_every_transfer_succeeds_and_nothing_is_left_held[an-interrupted-runs-leftovers] PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestRealThreadsThroughTheRealExecutor::test_every_transfer_succeeds_and_nothing_is_left_held[a-clean-start] PASSED [ 34%] tests/test_lock_file_records_only_the_change.py::TestRealThreadsThroughTheRealExecutor::test_every_target_fails_and_every_targets_pin_is_kept PASSED [ 34%] tests/test_lock_holders_beside_the_ledger.py::TestARecordIsWrittenBesideTheFile::test_a_pin_and_a_parent_pin_each_get_a_record PASSED [ 34%] tests/test_lock_holders_beside_the_ledger.py::TestARecordIsWrittenBesideTheFile::test_a_release_removes_the_record_and_only_that_one PASSED [ 34%] tests/test_lock_holders_beside_the_ledger.py::TestARecordIsWrittenBesideTheFile::test_the_holders_directory_is_not_a_snapshot PASSED [ 34%] tests/test_lock_holders_beside_the_ledger.py::TestTheRecordOutlivesTheProcessAsThePinDoes::test_the_exit_cleanups_leave_the_record PASSED [ 34%] tests/test_lock_holders_beside_the_ledger.py::TestTheRecordIsEvidenceNotProtection::test_a_record_that_cannot_be_written_is_a_warning_and_the_pin_stands PASSED [ 34%] tests/test_lock_holders_beside_the_ledger.py::TestUnlockReleasesTheRecordsOfThePinsItRemoves::test_unlock_all PASSED [ 34%] tests/test_lock_holders_beside_the_ledger.py::TestStatusShowsWhoHoldsEachPin::test_a_live_holder_and_a_gone_one PASSED [ 34%] tests/test_lock_persistence.py::test_load_locks_into_maps_persisted_locks PASSED [ 34%] tests/test_lock_persistence.py::test_list_snapshots_loads_persisted_locks PASSED [ 34%] tests/test_lock_persistence.py::test_lock_persists_across_endpoint_instances PASSED [ 34%] tests/test_lock_persistence.py::test_corrupt_lock_file_treated_as_unlocked_not_abort PASSED [ 34%] tests/test_lock_persistence.py::test_reconcile_clears_lock_when_present_on_destination PASSED [ 34%] tests/test_lock_persistence.py::test_reconcile_keeps_lock_when_absent_from_destination PASSED [ 34%] tests/test_lock_persistence.py::test_reconcile_keeps_lock_for_recreated_snapshot_via_real_correspondence PASSED [ 34%] tests/test_lock_persistence.py::test_reconcile_and_planner_agree_end_to_end PASSED [ 35%] tests/test_lock_persistence.py::test_persisted_lock_survives_retention_across_runs PASSED [ 35%] tests/test_lock_persistence.py::test_delete_snapshots_skips_persisted_lock PASSED [ 35%] tests/test_lock_persistence.py::test_write_locks_is_atomic_and_leaves_no_temp PASSED [ 35%] tests/test_lock_persistence.py::test_write_locks_replaces_stale_temp PASSED [ 35%] tests/test_lock_persistence.py::test_set_lock_preserves_concurrent_locks_on_other_snapshots PASSED [ 35%] tests/test_lock_persistence.py::test_set_lock_aborts_on_corrupt_lock_file_without_clobber PASSED [ 35%] tests/test_lock_persistence.py::test_retention_refuses_to_delete_on_corrupt_lock_file PASSED [ 35%] tests/test_lock_persistence.py::test_delete_snapshots_refuses_on_corrupt_lock_file PASSED [ 35%] tests/test_lock_persistence.py::test_write_locks_does_not_clobber_through_symlinked_temp PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestBothLoggerTreesReachTheFile::test_the_shared_logger_is_captured PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestBothLoggerTreesReachTheFile::test_a_package_module_logger_is_captured[btrfs_backup_ng.cli.run] PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestBothLoggerTreesReachTheFile::test_a_package_module_logger_is_captured[btrfs_backup_ng.cli.transfer] PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestBothLoggerTreesReachTheFile::test_a_package_module_logger_is_captured[btrfs_backup_ng.core.operations] PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestBothLoggerTreesReachTheFile::test_a_package_module_logger_is_captured[btrfs_backup_ng.core.restore] PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestBothLoggerTreesReachTheFile::test_a_package_module_logger_is_captured[btrfs_backup_ng.endpoint.ssh] PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestBothLoggerTreesReachTheFile::test_info_and_debug_are_captured_not_just_warnings PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestTheHandlerIsDetachedCleanly::test_removal_detaches_from_both_trees PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestTheHandlerIsDetachedCleanly::test_replacing_the_handler_does_not_double_attach PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestTheHandlerIsDetachedCleanly::test_no_duplicate_lines_from_a_single_record PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestTheWarningsAreEmittedAfterTheHandlerExists::test_a_config_warning_reaches_the_log_file[run] PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestTheWarningsAreEmittedAfterTheHandlerExists::test_a_config_warning_reaches_the_log_file[transfer] PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestTheWarningsAreEmittedAfterTheHandlerExists::test_a_config_warning_reaches_the_log_file[prune] PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestTheWarningsAreEmittedAfterTheHandlerExists::test_a_config_warning_reaches_the_log_file[snapshot] PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestFileLoggingDoesNotLeakState::test_the_level_is_restored_on_removal PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestFileLoggingDoesNotLeakState::test_repeated_enable_disable_does_not_drift PASSED [ 35%] tests/test_log_file_captures_the_run.py::TestOnlyOurOwnLoggersAreCaptured::test_a_third_party_logger_does_not_leak_into_the_file PASSED [ 35%] tests/test_logger.py::TestSetLevel::test_set_level_with_string PASSED [ 35%] tests/test_logger.py::TestSetLevel::test_set_level_with_constant PASSED [ 35%] tests/test_logger.py::TestSetLevel::test_set_level_case_insensitive PASSED [ 35%] tests/test_logger.py::TestSetLevel::test_set_level_invalid_string PASSED [ 35%] tests/test_logger.py::TestSetLevel::test_set_level_updates_handlers PASSED [ 35%] tests/test_logger.py::TestRichLogger::test_singleton_pattern PASSED [ 35%] tests/test_logger.py::TestRichLogger::test_initial_message PASSED [ 35%] tests/test_logger.py::TestRichLogger::test_write_message PASSED [ 35%] tests/test_logger.py::TestRichLogger::test_write_multiline PASSED [ 35%] tests/test_logger.py::TestRichLogger::test_write_returns_zero PASSED [ 35%] tests/test_logger.py::TestRichLogger::test_flush_does_nothing PASSED [ 35%] tests/test_logger.py::TestRichLogger::test_max_messages PASSED [ 35%] tests/test_logger.py::TestCreateLogger::test_create_logger_no_live_layout PASSED [ 35%] tests/test_logger.py::TestCreateLogger::test_create_logger_with_live_layout PASSED [ 35%] tests/test_logger.py::TestCreateLogger::test_create_logger_with_level_string PASSED [ 35%] tests/test_logger.py::TestCreateLogger::test_create_logger_with_level_constant PASSED [ 35%] tests/test_logger.py::TestCreateLogger::test_create_logger_clears_handlers PASSED [ 35%] tests/test_logger.py::TestCreateLogger::test_create_logger_propagate_false PASSED [ 35%] tests/test_logger.py::TestLoggerBasicUsage::test_logger_exists PASSED [ 35%] tests/test_logger.py::TestLoggerBasicUsage::test_logger_can_log PASSED [ 35%] tests/test_logger.py::TestLoggerBasicUsage::test_logger_respects_level PASSED [ 35%] tests/test_logger.py::TestFileLogging::test_add_file_handler_creates_file PASSED [ 35%] tests/test_logger.py::TestFileLogging::test_add_file_handler_with_level_string PASSED [ 35%] tests/test_logger.py::TestFileLogging::test_add_file_handler_with_level_constant PASSED [ 35%] tests/test_logger.py::TestFileLogging::test_add_file_handler_creates_parent_dirs PASSED [ 35%] tests/test_logger.py::TestFileLogging::test_add_file_handler_replaces_existing_handler PASSED [ 35%] tests/test_logger.py::TestFileLogging::test_remove_file_handler PASSED [ 35%] tests/test_logger.py::TestFileLogging::test_remove_file_handler_when_none PASSED [ 35%] tests/test_logger_level_changes_take_effect.py::test_the_shared_logger_is_known_to_the_manager PASSED [ 35%] tests/test_logger_level_changes_take_effect.py::test_lowering_the_level_after_an_info_was_refused_enables_info_again PASSED [ 35%] tests/test_logger_level_changes_take_effect.py::test_quiet_then_a_lower_console_level_delivers_info_records PASSED [ 35%] tests/test_logger_level_changes_take_effect.py::test_quiet_does_not_thin_a_debug_log_file_for_the_endpoints PASSED [ 35%] tests/test_logger_level_changes_take_effect.py::test_a_log_file_receives_endpoint_lines_whatever_the_console_level PASSED [ 35%] tests/test_manpages.py::TestGetManpagesDir::test_finds_dev_path PASSED [ 35%] tests/test_manpages.py::TestGetManpagesDir::test_finds_package_path PASSED [ 35%] tests/test_manpages.py::TestGetManpagesDir::test_handles_exception PASSED [ 35%] tests/test_manpages.py::TestExecuteManpages::test_install_action PASSED [ 35%] tests/test_manpages.py::TestExecuteManpages::test_path_action PASSED [ 35%] tests/test_manpages.py::TestExecuteManpages::test_no_action PASSED [ 35%] tests/test_manpages.py::TestExecuteManpages::test_invalid_action PASSED [ 35%] tests/test_manpages.py::TestShowManpagesPath::test_dir_not_found PASSED [ 35%] tests/test_manpages.py::TestShowManpagesPath::test_shows_path_and_files PASSED [ 35%] tests/test_manpages.py::TestInstallManpages::test_man_dir_not_found PASSED [ 35%] tests/test_manpages.py::TestInstallManpages::test_cannot_write_to_dest PASSED [ 35%] tests/test_manpages.py::TestInstallManpages::test_cannot_create_dest_dir PASSED [ 35%] tests/test_manpages.py::TestInstallManpages::test_no_man_pages_found PASSED [ 35%] tests/test_manpages.py::TestInstallManpages::test_successful_user_install PASSED [ 36%] tests/test_manpages.py::TestInstallManpages::test_successful_system_install PASSED [ 36%] tests/test_manpages.py::TestInstallManpages::test_install_with_prefix PASSED [ 36%] tests/test_manpages.py::TestInstallManpages::test_gzip_permission_error PASSED [ 36%] tests/test_manpages.py::TestInstallManpages::test_gzip_generic_error PASSED [ 36%] tests/test_manpages.py::TestCanWrite::test_root_can_write PASSED [ 36%] tests/test_manpages.py::TestCanWrite::test_non_root_path_exists_writable PASSED [ 36%] tests/test_manpages.py::TestCanWrite::test_non_root_path_exists_not_writable PASSED [ 36%] tests/test_manpages.py::TestCanWrite::test_non_root_parent_writable PASSED [ 36%] tests/test_manpages.py::TestCanWrite::test_non_root_find_ancestor PASSED [ 36%] tests/test_manpages.py::TestCanWrite::test_non_root_no_ancestor PASSED [ 36%] tests/test_manpages.py::TestUpdateMandb::test_mandb_success PASSED [ 36%] tests/test_manpages.py::TestUpdateMandb::test_mandb_not_found PASSED [ 36%] tests/test_manpages.py::TestUpdateMandb::test_mandb_timeout PASSED [ 36%] tests/test_manpages.py::TestUpdateMandb::test_mandb_subprocess_error PASSED [ 36%] tests/test_missing_sudo.py::TestTheSeam::test_root_needs_no_prefix_and_no_sudo PASSED [ 36%] tests/test_missing_sudo.py::TestTheSeam::test_a_user_with_sudo_gets_the_prefix PASSED [ 36%] tests/test_missing_sudo.py::TestTheSeam::test_a_user_without_sudo_is_refused_with_the_one_message PASSED [ 36%] tests/test_missing_sudo.py::TestThePrivilegedWrites::test_a_denied_write_says_sudo_is_not_installed[not-root] PASSED [ 36%] tests/test_missing_sudo.py::TestThePrivilegedWrites::test_a_denied_write_says_sudo_is_not_installed[root] PASSED [ 36%] tests/test_missing_sudo.py::TestTheLocalBtrfsCommand::test_a_btrfs_command_says_sudo_is_not_installed[not-root] PASSED [ 36%] tests/test_missing_sudo.py::TestTheLocalBtrfsCommand::test_a_btrfs_command_says_sudo_is_not_installed[root] PASSED [ 36%] tests/test_missing_sudo.py::TestTheRemount::test_a_remount_says_sudo_is_not_installed[not-root] PASSED [ 36%] tests/test_missing_sudo.py::TestTheRemount::test_a_remount_says_sudo_is_not_installed[root] PASSED [ 36%] tests/test_missing_sudo.py::TestTheLockManagers::test_the_local_store_reports_the_reason PASSED [ 36%] tests/test_missing_sudo.py::TestTheLockManagers::test_the_raw_store_reports_the_reason PASSED [ 36%] tests/test_missing_sudo.py::TestTheLockManagers::test_root_runs_the_script_itself PASSED [ 36%] tests/test_missing_sudo.py::TestTheSnapperPrune::test_a_slot_delete_says_sudo_is_not_installed[not-root] PASSED [ 36%] tests/test_missing_sudo.py::TestTheSnapperPrune::test_a_slot_delete_says_sudo_is_not_installed[root] PASSED [ 36%] tests/test_missing_sudo.py::TestTheRestoreCleanup::test_it_refuses_once_before_asking_the_operator PASSED [ 36%] tests/test_missing_sudo.py::TestTheRestoreCleanup::test_a_dry_run_needs_no_sudo PASSED [ 36%] tests/test_missing_sudo.py::TestTheRestoreCleanup::test_root_deletes_without_sudo PASSED [ 36%] tests/test_missing_sudo.py::TestTheSnapperSlotScripts::test_the_fallback_still_runs_when_the_verb_fails PASSED [ 36%] tests/test_missing_sudo.py::TestTheSnapperSlotScripts::test_a_failed_verb_names_the_reason_in_the_log PASSED [ 36%] tests/test_missing_sudo.py::TestTheSnapperSlotScripts::test_an_elevated_shell_is_refused_with_the_reason PASSED [ 36%] tests/test_missing_sudo.py::TestTheSnapperSlotScripts::test_root_runs_the_verb_itself PASSED [ 36%] tests/test_missing_sudo.py::TestTheSnapperSlotScripts::test_the_writability_probe_still_runs PASSED [ 36%] tests/test_missing_sudo.py::TestThePartialCleanup::test_a_partial_says_it_could_not_be_removed[not-root] PASSED [ 36%] tests/test_missing_sudo.py::TestThePartialCleanup::test_a_partial_says_it_could_not_be_removed[root] PASSED [ 36%] tests/test_missing_sudo.py::TestTheSshEndpointsLocalSide::test_the_direct_send_stops_with_the_reason PASSED [ 36%] tests/test_missing_sudo.py::TestTheSshEndpointsLocalSide::test_the_whole_send_is_not_retried PASSED [ 36%] tests/test_missing_sudo.py::TestTheSshEndpointsLocalSide::test_priming_as_root_asks_no_sudo PASSED [ 36%] tests/test_missing_sudo.py::TestTheSshEndpointsLocalSide::test_priming_without_sudo_stops_with_the_reason PASSED [ 36%] tests/test_missing_sudo.py::TestTheSshEndpointsLocalSide::test_the_shell_pipeline_builds_no_sudo_for_root PASSED [ 36%] tests/test_missing_sudo.py::TestTheRunStartsWithTheAnswer::test_run_says_so_before_touching_anything PASSED [ 36%] tests/test_missing_sudo.py::TestDoctor::test_root_is_fine PASSED [ 36%] tests/test_missing_sudo.py::TestDoctor::test_no_sudo_is_an_error_with_the_remedy PASSED [ 36%] tests/test_missing_sudo.py::TestDoctor::test_a_refusing_sudo_is_noted_not_an_error PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_octal_escapes_are_decoded[/run/media/u/My\\040Backup-/run/media/u/My Backup] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_octal_escapes_are_decoded[/mnt/two\\040words\\040here-/mnt/two words here] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_octal_escapes_are_decoded[/mnt/tab\\011sep-/mnt/tab\tsep] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_octal_escapes_are_decoded[/mnt/nl\\012here-/mnt/nl\nhere] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_octal_escapes_are_decoded[/mnt/back\\134slash-/mnt/back\\slash] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_octal_escapes_are_decoded[/mnt/plain-/mnt/plain] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_malformed_escapes_are_left_alone[/mnt/not\\09x] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_malformed_escapes_are_left_alone[/mnt/trailing\\04] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_malformed_escapes_are_left_alone[/mnt/\\999high] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheDecoder::test_malformed_escapes_are_left_alone[/mnt/\\abc] PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheFedoraLayoutWorks::test_is_mounted_finds_a_mount_point_containing_a_space PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheFedoraLayoutWorks::test_get_mount_info_decodes_the_mount_point PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheFedoraLayoutWorks::test_is_btrfs_recognises_a_drive_whose_label_has_a_space PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheFedoraLayoutWorks::test_the_gate_accepts_the_udisks2_layout PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheFedoraLayoutWorks::test_the_gate_still_refuses_when_that_drive_is_absent PASSED [ 36%] tests/test_mount_table_parsing.py::TestAMemoryBackedMountIsRefused::test_a_memory_filesystem_is_refused[tmpfs] PASSED [ 36%] tests/test_mount_table_parsing.py::TestAMemoryBackedMountIsRefused::test_a_memory_filesystem_is_refused[ramfs] PASSED [ 36%] tests/test_mount_table_parsing.py::TestAMemoryBackedMountIsRefused::test_a_memory_filesystem_is_refused[devtmpfs] PASSED [ 36%] tests/test_mount_table_parsing.py::TestAMemoryBackedMountIsRefused::test_a_real_filesystem_is_accepted PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheUpgradeErrorDiagnosesItself::test_it_names_the_mounted_drive_and_the_line_to_write PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheUpgradeErrorDiagnosesItself::test_a_genuinely_absent_drive_keeps_the_original_message PASSED [ 36%] tests/test_mount_table_parsing.py::TestTheUpgradeErrorDiagnosesItself::test_root_is_never_suggested PASSED [ 36%] tests/test_native_restore_lock.py::test_set_lock_without_source_does_not_raise PASSED [ 36%] tests/test_native_restore_lock.py::test_send_without_source_reaches_exec PASSED [ 36%] tests/test_native_restore_lock.py::test_read_write_locks_without_source_round_trip PASSED [ 36%] tests/test_native_restore_lock.py::test_ssh_endpoint_str_path_lock_file PASSED [ 37%] tests/test_native_restore_lock.py::test_snapshot_still_requires_source PASSED [ 37%] tests/test_native_restore_lock.py::test_restore_local_endpoint_uses_backup_prefix PASSED [ 37%] tests/test_native_restore_lock.py::test_incremental_parent_is_the_backup_side_snapshot PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_the_scanner_sees_the_sites_it_is_built_to_see PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_no_unregistered_creation_site PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_no_stale_registry_entry PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_each_function_has_exactly_the_registered_sites PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_a_message_is_a_string_never_a_call PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_an_output_location_is_created_only_where_one_can_be_named PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_a_layer_that_only_sees_backup_locations_creates_none PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_a_below_site_cannot_build_an_ancestor PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_only_an_output_or_state_site_may_build_ancestors PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestEveryCreationSiteIsClassified::test_primitives_live_only_in_util PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestCreateBelow::test_creates_components_under_an_existing_base PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestCreateBelow::test_with_no_parts_it_only_verifies_the_base PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestCreateBelow::test_is_idempotent PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestCreateBelow::test_a_missing_base_is_refused_and_nothing_is_created PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestCreateBelow::test_a_base_that_vanishes_after_the_check_is_refused_not_rebuilt PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestCreateBelow::test_a_file_in_the_way_is_diagnosed PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestCreateBelow::test_escaping_the_base_is_a_programming_error PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestAnOutputLocationIsCreated::test_a_restore_destination_is_created PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestAnOutputLocationIsCreated::test_the_restore_local_endpoint_creates_its_destination PASSED [ 37%] tests/test_no_configured_path_is_created.py::TestAnOutputLocationIsCreated::test_verify_temp_dir_is_created PASSED [ 37%] tests/test_notification_accuracy.py::TestTheNotificationDescribesWhatHappened::test_a_run_that_delivered_something_is_partial_not_failure PASSED [ 37%] tests/test_notification_accuracy.py::TestTheNotificationDescribesWhatHappened::test_a_run_that_delivered_nothing_is_still_a_failure PASSED [ 37%] tests/test_notification_accuracy.py::TestTheNotificationDescribesWhatHappened::test_snapshots_created_is_counted_where_snapshots_are_created PASSED [ 37%] tests/test_notification_timeouts.py::test_the_stdlib_default_is_block_forever PASSED [ 37%] tests/test_notification_timeouts.py::test_email_has_a_timeout_field_matching_the_webhook PASSED [ 37%] tests/test_notification_timeouts.py::test_every_tls_mode_passes_an_explicit_timeout[none-SMTP] PASSED [ 37%] tests/test_notification_timeouts.py::test_every_tls_mode_passes_an_explicit_timeout[starttls-SMTP] PASSED [ 37%] tests/test_notification_timeouts.py::test_every_tls_mode_passes_an_explicit_timeout[ssl-SMTP_SSL] PASSED [ 37%] tests/test_notification_timeouts.py::test_the_live_socket_is_bounded_too[none] PASSED [ 37%] tests/test_notification_timeouts.py::test_the_live_socket_is_bounded_too[starttls] PASSED [ 37%] tests/test_notification_timeouts.py::test_the_live_socket_is_bounded_too[ssl] PASSED [ 37%] tests/test_notification_timeouts.py::test_a_server_without_a_socket_does_not_crash_the_notification PASSED [ 37%] tests/test_notification_timeouts.py::test_the_webhook_transport_still_passes_its_timeout PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_default_values PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_with_all_fields PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_dict PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_text_minimal PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_text_with_details PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_text_with_snapshots PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_text_with_transfers PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_text_with_pruned PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_text_with_duration PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_text_with_errors PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_html_success PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_html_failure PASSED [ 37%] tests/test_notifications.py::TestNotificationEvent::test_to_html_partial PASSED [ 37%] tests/test_notifications.py::TestEmailConfig::test_default_values PASSED [ 37%] tests/test_notifications.py::TestEmailConfig::test_custom_values PASSED [ 37%] tests/test_notifications.py::TestWebhookConfig::test_default_values PASSED [ 37%] tests/test_notifications.py::TestWebhookConfig::test_custom_values PASSED [ 37%] tests/test_notifications.py::TestNotificationConfig::test_default_values PASSED [ 37%] tests/test_notifications.py::TestNotificationConfig::test_is_enabled_false_by_default PASSED [ 37%] tests/test_notifications.py::TestNotificationConfig::test_is_enabled_with_email PASSED [ 37%] tests/test_notifications.py::TestNotificationConfig::test_is_enabled_with_webhook PASSED [ 37%] tests/test_notifications.py::TestSendEmail::test_disabled_returns_false PASSED [ 37%] tests/test_notifications.py::TestSendEmail::test_no_recipients_returns_false PASSED [ 37%] tests/test_notifications.py::TestSendEmail::test_success_skipped_when_on_success_false PASSED [ 37%] tests/test_notifications.py::TestSendEmail::test_failure_skipped_when_on_failure_false PASSED [ 37%] tests/test_notifications.py::TestSendEmail::test_partial_treated_as_failure PASSED [ 37%] tests/test_notifications.py::TestSendEmail::test_send_plain_smtp PASSED [ 37%] tests/test_notifications.py::TestSendEmail::test_send_starttls_smtp PASSED [ 37%] tests/test_notifications.py::TestSendEmail::test_send_ssl_smtp PASSED [ 37%] tests/test_notifications.py::TestSendEmail::test_send_email_exception_returns_false PASSED [ 37%] tests/test_notifications.py::TestSendWebhook::test_disabled_returns_false PASSED [ 37%] tests/test_notifications.py::TestSendWebhook::test_no_url_returns_false PASSED [ 37%] tests/test_notifications.py::TestSendWebhook::test_success_skipped_when_on_success_false PASSED [ 37%] tests/test_notifications.py::TestSendWebhook::test_failure_skipped_when_on_failure_false PASSED [ 37%] tests/test_notifications.py::TestSendWebhook::test_send_webhook_success PASSED [ 37%] tests/test_notifications.py::TestSendWebhook::test_send_webhook_with_custom_headers PASSED [ 37%] tests/test_notifications.py::TestSendWebhook::test_send_webhook_non_success_status PASSED [ 38%] tests/test_notifications.py::TestSendWebhook::test_send_webhook_http_error PASSED [ 38%] tests/test_notifications.py::TestSendWebhook::test_send_webhook_url_error PASSED [ 38%] tests/test_notifications.py::TestSendWebhook::test_send_webhook_generic_exception PASSED [ 38%] tests/test_notifications.py::TestSendNotifications::test_no_notifications_enabled PASSED [ 38%] tests/test_notifications.py::TestSendNotifications::test_email_only PASSED [ 38%] tests/test_notifications.py::TestSendNotifications::test_webhook_only PASSED [ 38%] tests/test_notifications.py::TestSendNotifications::test_both_enabled PASSED [ 38%] tests/test_notifications.py::TestCreateBackupEvent::test_success_event PASSED [ 38%] tests/test_notifications.py::TestCreateBackupEvent::test_failure_event PASSED [ 38%] tests/test_notifications.py::TestCreateBackupEvent::test_partial_event PASSED [ 38%] tests/test_notifications.py::TestCreateBackupEvent::test_default_errors PASSED [ 38%] tests/test_notifications.py::TestCreatePruneEvent::test_success_event PASSED [ 38%] tests/test_notifications.py::TestCreatePruneEvent::test_failure_event PASSED [ 38%] tests/test_notifications.py::TestCreatePruneEvent::test_partial_event PASSED [ 38%] tests/test_notifications.py::TestCreatePruneEvent::test_default_errors PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestRetentionInheritsPerKey::test_the_volume_keeps_what_it_did_not_write PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestRetentionInheritsPerKey::test_a_target_inherits_through_the_volume PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestRetentionInheritsPerKey::test_the_source_inherits_through_the_volume PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestRetentionInheritsPerKey::test_a_config_with_no_scoped_keys_is_unchanged PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestRetentionInheritsPerKey::test_a_policy_built_in_code_still_replaces_wholesale PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestOptionalTargets::test_optional_defaults_to_false PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestOptionalTargets::test_optional_is_parsed[true-True] PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestOptionalTargets::test_optional_is_parsed[false-False] PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestOptionalTargets::test_optional_is_parsed["yes"-True] PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestOptionalTargets::test_a_value_with_no_reading_is_refused PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestOptionalTargets::test_an_absent_optional_target_does_not_fail_the_run PASSED [ 38%] tests/test_optional_targets_and_inheritance.py::TestOptionalTargets::test_a_required_absent_target_still_fails_the_run PASSED [ 38%] tests/test_output_overwrite_guard.py::TestClobberPredicate::test_no_output_never_clobbers PASSED [ 38%] tests/test_output_overwrite_guard.py::TestClobberPredicate::test_missing_file_does_not_clobber PASSED [ 38%] tests/test_output_overwrite_guard.py::TestClobberPredicate::test_existing_file_clobbers PASSED [ 38%] tests/test_output_overwrite_guard.py::TestClobberPredicate::test_force_permits_the_clobber PASSED [ 38%] tests/test_output_overwrite_guard.py::TestImportRefusesToClobber::test_refuses_and_leaves_the_file_byte_for_byte PASSED [ 38%] tests/test_output_overwrite_guard.py::TestImportRefusesToClobber::test_force_replaces_it PASSED [ 38%] tests/test_output_overwrite_guard.py::TestImportRefusesToClobber::test_a_new_file_is_written_without_force PASSED [ 38%] tests/test_output_overwrite_guard.py::TestImportRefusesToClobber::test_refusal_happens_before_the_conversion_runs PASSED [ 38%] tests/test_output_overwrite_guard.py::TestInitRefusesToClobberWhenNotInteractive::test_refuses_and_leaves_the_file PASSED [ 38%] tests/test_output_overwrite_guard.py::TestInitRefusesToClobberWhenNotInteractive::test_force_replaces_it PASSED [ 38%] tests/test_output_overwrite_guard.py::TestInitRefusesToClobberWhenNotInteractive::test_a_new_file_is_written_without_force PASSED [ 38%] tests/test_output_overwrite_guard.py::TestTheFlagIsActuallyReachable::test_force_is_accepted_on_the_command_line[import] PASSED [ 38%] tests/test_output_overwrite_guard.py::TestTheFlagIsActuallyReachable::test_force_is_accepted_on_the_command_line[init] PASSED [ 38%] tests/test_overwrite_is_not_silently_ignored.py::TestTheFlagIsNotSilentlyIgnored::test_passing_overwrite_says_it_is_not_applied PASSED [ 38%] tests/test_overwrite_is_not_silently_ignored.py::TestTheFlagIsNotSilentlyIgnored::test_it_is_reported_even_when_something_else_is_wrong PASSED [ 38%] tests/test_overwrite_is_not_silently_ignored.py::TestTheFlagIsNotSilentlyIgnored::test_the_rest_of_the_restore_still_runs PASSED [ 38%] tests/test_overwrite_is_not_silently_ignored.py::TestTheDestructiveMachineryIsGone::test_no_replacement_helpers_remain PASSED [ 38%] tests/test_packaging_data_files.py::TestEveryShippedFileIsDeclared::test_all_man_pages_are_declared PASSED [ 38%] tests/test_packaging_data_files.py::TestEveryShippedFileIsDeclared::test_all_completion_scripts_are_declared PASSED [ 38%] tests/test_packaging_data_files.py::TestEveryShippedFileIsDeclared::test_declared_patterns_all_resolve PASSED [ 38%] tests/test_packaging_data_files.py::TestEveryShippedFileIsDeclared::test_installed_under_fhs_share_paths PASSED [ 38%] tests/test_packaging_data_files.py::TestLookupFindsDataUnderThePrefix::test_manpages_found_under_prefix PASSED [ 38%] tests/test_packaging_data_files.py::TestLookupFindsDataUnderThePrefix::test_completions_found_under_prefix PASSED [ 38%] tests/test_packaging_data_files.py::TestLookupFindsDataUnderThePrefix::test_manpages_prefix_without_the_pages_is_not_accepted PASSED [ 38%] tests/test_packaging_data_files.py::test_source_checkout_still_resolves[manpages] SKIPPED [ 38%] tests/test_packaging_data_files.py::test_source_checkout_still_resolves[completions] SKIPPED [ 38%] tests/test_permission_hint_targets_the_right_endpoint.py::TestLocalFailuresDoNotGetSshAdvice::test_no_ssh_sudo_suggestion_for_a_local_destination PASSED [ 38%] tests/test_permission_hint_targets_the_right_endpoint.py::TestLocalFailuresDoNotGetSshAdvice::test_the_underlying_error_is_still_reported PASSED [ 38%] tests/test_permission_hint_targets_the_right_endpoint.py::TestRemoteFailuresStillGetSshAdvice::test_ssh_advice_is_given_for_a_remote_destination PASSED [ 38%] tests/test_permission_hint_targets_the_right_endpoint.py::TestPresenceIsNeverUsedAsAProxyForValue::test_is_remote_is_declared_on_the_base_endpoint PASSED [ 38%] tests/test_permission_hint_targets_the_right_endpoint.py::TestPresenceIsNeverUsedAsAProxyForValue::test_hasattr_is_true_everywhere_so_it_cannot_discriminate[LocalEndpoint] PASSED [ 38%] tests/test_permission_hint_targets_the_right_endpoint.py::TestPresenceIsNeverUsedAsAProxyForValue::test_hasattr_is_true_everywhere_so_it_cannot_discriminate[SSHEndpoint] PASSED [ 38%] tests/test_permission_hint_targets_the_right_endpoint.py::TestPresenceIsNeverUsedAsAProxyForValue::test_hasattr_is_true_everywhere_so_it_cannot_discriminate[RawEndpoint] PASSED [ 38%] tests/test_permission_hint_targets_the_right_endpoint.py::TestPresenceIsNeverUsedAsAProxyForValue::test_hasattr_is_true_everywhere_so_it_cannot_discriminate[SSHRawEndpoint] PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestTheHelperItself::test_closing_lets_the_writer_die_when_the_consumer_goes PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestTheHelperItself::test_without_it_the_writer_blocks PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestTheHelperItself::test_it_tolerates_none_and_an_already_closed_pipe PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestTheHelperItself::test_it_never_raises_on_a_hostile_object PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestEveryHandoffReleasesItsPipe::test_the_shared_builder_releases_before_reassigning PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestEveryHandoffReleasesItsPipe::test_the_ssh_receive_releases_the_pipe_it_was_given PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestEveryHandoffReleasesItsPipe::test_the_local_receive_releases_the_pipe_it_was_given PASSED [ 38%] tests/test_pipeline_fd_handoff.py::test_a_full_three_stage_chain_unwinds_when_the_consumer_dies PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestNoHandoffCanBeWrittenWithoutReleasingThePipe::test_every_popen_handoff_is_released PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestNoHandoffCanBeWrittenWithoutReleasingThePipe::test_the_chainer_releases_each_pipe_as_it_hands_it_on PASSED [ 38%] tests/test_pipeline_fd_handoff.py::TestNoHandoffCanBeWrittenWithoutReleasingThePipe::test_both_pipelines_declare_their_own_stage_order PASSED [ 38%] tests/test_planner_listing_cost.py::TestPresenceDetectionCostsOneListing::test_one_listing_regardless_of_snapshot_count[1] PASSED [ 39%] tests/test_planner_listing_cost.py::TestPresenceDetectionCostsOneListing::test_one_listing_regardless_of_snapshot_count[5] PASSED [ 39%] tests/test_planner_listing_cost.py::TestPresenceDetectionCostsOneListing::test_one_listing_regardless_of_snapshot_count[44] PASSED [ 39%] tests/test_planner_listing_cost.py::TestPresenceDetectionCostsOneListing::test_one_listing_regardless_of_snapshot_count[200] PASSED [ 39%] tests/test_planner_listing_cost.py::TestPresenceDetectionCostsOneListing::test_raw_destinations_too PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[btrfs-normal match] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[btrfs-source has no uuid] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[btrfs-empty destination] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[btrfs-two destinations share a received_uuid] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[btrfs-destination has no received_uuid] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[btrfs-name collides but uuid does not] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[raw-normal match] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[raw-source has no uuid] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[raw-empty destination] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[raw-two destinations share a received_uuid] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[raw-destination has no received_uuid] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_same_verdict[raw-name collides but uuid does not] PASSED [ 39%] tests/test_planner_listing_cost.py::TestTheBatchFormAgreesWithTheSingularOne::test_the_batch_form_returns_the_same_objects PASSED [ 39%] tests/test_planner_listing_cost.py::TestItNeverRaises::test_a_failing_listing_yields_nothing[btrfs] PASSED [ 39%] tests/test_planner_listing_cost.py::TestItNeverRaises::test_a_failing_listing_yields_nothing[raw] PASSED [ 39%] tests/test_planner_listing_cost.py::TestItNeverRaises::test_the_planner_degrades_rather_than_raising PASSED [ 39%] tests/test_planner_listing_cost.py::TestUnknownIdentityIsNeverPresence::test_an_unidentifiable_source_never_matches PASSED [ 39%] tests/test_planner_listing_cost.py::TestUnknownIdentityIsNeverPresence::test_a_real_uuid_still_matches_a_real_received_uuid PASSED [ 39%] tests/test_planner_listing_cost.py::TestUnknownIdentityIsNeverPresence::test_no_partial_identity_counts_as_presence[-] PASSED [ 39%] tests/test_planner_listing_cost.py::TestUnknownIdentityIsNeverPresence::test_no_partial_identity_counts_as_presence[-u1] PASSED [ 39%] tests/test_planner_listing_cost.py::TestUnknownIdentityIsNeverPresence::test_no_partial_identity_counts_as_presence[u1-] PASSED [ 39%] tests/test_planner_listing_cost.py::TestUnknownIdentityIsNeverPresence::test_no_partial_identity_counts_as_presence[u1-other] PASSED [ 39%] tests/test_planner_required_chain.py::TestABtrfsSourceNamesItsPredecessor::test_the_predecessor_is_the_newest_older_snapshot PASSED [ 39%] tests/test_planner_required_chain.py::TestABtrfsSourceNamesItsPredecessor::test_the_oldest_needs_nothing PASSED [ 39%] tests/test_planner_required_chain.py::TestABtrfsSourceNamesItsPredecessor::test_a_same_second_pair_orders_by_listing_position PASSED [ 39%] tests/test_planner_required_chain.py::TestABtrfsSourceNamesItsPredecessor::test_an_undated_snapshot_has_no_predecessor_and_is_nobodys PASSED [ 39%] tests/test_planner_required_chain.py::TestABtrfsSourceNamesItsPredecessor::test_a_snapshot_the_source_does_not_list_needs_nothing PASSED [ 39%] tests/test_planner_required_chain.py::TestABtrfsSourceNamesItsPredecessor::test_a_listing_failure_offers_no_chain_rather_than_raising PASSED [ 39%] tests/test_planner_required_chain.py::TestARawStoreNamesTheSidecarsParent::test_an_increment_needs_the_stream_its_sidecar_names PASSED [ 39%] tests/test_planner_required_chain.py::TestARawStoreNamesTheSidecarsParent::test_a_full_stream_needs_nothing PASSED [ 39%] tests/test_planner_required_chain.py::TestARawStoreNamesTheSidecarsParent::test_the_predecessor_is_not_assumed_for_a_full_stream PASSED [ 39%] tests/test_planner_required_chain.py::TestARawStoreNamesTheSidecarsParent::test_a_parent_the_store_no_longer_holds_is_a_refusal_not_nothing PASSED [ 39%] tests/test_planner_required_chain.py::TestTheSelectionExpandsToItsChain::test_one_snapshot_onto_empty_media_brings_the_whole_chain PASSED [ 39%] tests/test_planner_required_chain.py::TestTheSelectionExpandsToItsChain::test_the_chain_stops_at_what_the_destination_holds PASSED [ 39%] tests/test_planner_required_chain.py::TestTheSelectionExpandsToItsChain::test_a_present_middle_ancestor_ends_the_walk PASSED [ 39%] tests/test_planner_required_chain.py::TestTheSelectionExpandsToItsChain::test_a_present_selection_is_skipped_without_expanding PASSED [ 39%] tests/test_planner_required_chain.py::TestTheSelectionExpandsToItsChain::test_without_a_source_endpoint_the_selection_is_planned_as_given PASSED [ 39%] tests/test_planner_required_chain.py::TestTheSelectionExpandsToItsChain::test_a_list_selects_several PASSED [ 39%] tests/test_planner_required_chain.py::TestTheSelectionExpandsToItsChain::test_no_incremental_still_brings_the_chain_as_full_sends PASSED [ 39%] tests/test_planner_required_chain.py::TestTheSelectionExpandsToItsChain::test_the_expansion_is_announced PASSED [ 39%] tests/test_planner_required_chain.py::TestARawIncrementIsRefusedWithoutItsParent::test_the_chain_is_expanded_when_the_parent_is_at_the_store PASSED [ 39%] tests/test_planner_required_chain.py::TestARawIncrementIsRefusedWithoutItsParent::test_a_missing_parent_refuses_before_anything_is_planned PASSED [ 39%] tests/test_planner_required_chain.py::TestARawIncrementIsRefusedWithoutItsParent::test_a_requirement_the_source_does_not_list_is_refused_not_followed PASSED [ 39%] tests/test_planner_required_chain.py::TestARawIncrementIsRefusedWithoutItsParent::test_an_increment_already_at_the_destination_is_not_refused PASSED [ 39%] tests/test_planner_required_chain.py::TestTheReceivedName::test_a_raw_stream_is_received_under_its_snapshot_name PASSED [ 39%] tests/test_planner_required_chain.py::TestTheReceivedName::test_a_subvolume_is_received_under_its_basename PASSED [ 39%] tests/test_planner_required_chain.py::TestTheReceivedName::test_the_verdict_on_a_raw_source_probes_the_subvolume_name PASSED [ 39%] tests/test_planner_required_chain.py::TestARefusingSendIsThisTransfersFailure::test_an_abort_from_send_becomes_a_transfer_error PASSED [ 39%] tests/test_planner_required_chain.py::TestARefusingSendIsThisTransfersFailure::test_the_executor_records_it_and_releases_the_restore_pin PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBePlannedWithoutSkippingWhatIsPresent::test_a_present_snapshot_is_planned_again PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBePlannedWithoutSkippingWhatIsPresent::test_a_present_parent_still_serves_the_increment PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBePlannedWithoutSkippingWhatIsPresent::test_an_undated_present_selection_is_planned_in_full PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBeCheckedWithoutBeingExpanded::test_an_increment_whose_parent_is_neither_present_nor_selected_is_refused PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBeCheckedWithoutBeingExpanded::test_the_selection_is_not_expanded PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBeCheckedWithoutBeingExpanded::test_a_selected_parent_satisfies_the_requirement PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBeCheckedWithoutBeingExpanded::test_a_present_parent_satisfies_the_requirement PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBeCheckedWithoutBeingExpanded::test_a_present_selection_that_will_be_skipped_needs_nothing PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBeCheckedWithoutBeingExpanded::test_a_present_selection_planned_again_still_needs_its_parent PASSED [ 39%] tests/test_planner_required_chain.py::TestASelectionMayBeCheckedWithoutBeingExpanded::test_a_parent_the_store_no_longer_holds_is_refused_the_same_way PASSED [ 39%] tests/test_post_send_tail_is_bounded.py::test_a_wedged_tail_is_given_up_on_when_no_wall_clock_is_set PASSED [ 39%] tests/test_post_send_tail_is_bounded.py::test_a_tail_within_the_fallback_is_left_alone PASSED [ 39%] tests/test_post_send_tail_is_bounded.py::test_a_send_still_running_is_not_a_tail PASSED [ 39%] tests/test_post_send_tail_is_bounded.py::test_a_configured_wall_clock_keeps_precedence PASSED [ 39%] tests/test_post_send_tail_is_bounded.py::test_both_monitor_loops_bound_their_tail PASSED [ 39%] tests/test_post_send_tail_is_bounded.py::test_the_error_names_the_limit_as_ours PASSED [ 39%] tests/test_prepare_failure_accounting.py::TestAPreparationFailureIsReportedAsAFailure::test_one_failed_target_alongside_a_good_one_fails_the_volume PASSED [ 39%] tests/test_prepare_failure_accounting.py::TestAPreparationFailureIsReportedAsAFailure::test_the_error_names_the_target PASSED [ 39%] tests/test_prepare_failure_accounting.py::TestAPreparationFailureIsReportedAsAFailure::test_several_failures_are_all_counted PASSED [ 39%] tests/test_prepare_failure_accounting.py::TestAPreparationFailureIsReportedAsAFailure::test_a_single_failing_target_still_fails PASSED [ 40%] tests/test_prepare_failure_accounting.py::TestASuccessfulRunIsStillASuccess::test_all_targets_succeeding_reports_success PASSED [ 40%] tests/test_prepare_failure_accounting.py::TestASuccessfulRunIsStillASuccess::test_a_satisfied_mount_check_does_not_count_as_a_failure PASSED [ 40%] tests/test_prepare_failure_accounting.py::TestTheEarlyReturnCountsToo::test_every_target_failing_is_counted PASSED [ 40%] tests/test_prepare_failure_accounting.py::TestTheFixDoesNotSabotageWorkingTargets::test_a_good_target_alongside_a_failing_one_still_transfers PASSED [ 40%] tests/test_prepare_failure_accounting.py::TestTheFixDoesNotSabotageWorkingTargets::test_a_failing_volume_returns_rather_than_raising PASSED [ 40%] tests/test_prepare_failure_accounting.py::TestTheFixDoesNotSabotageWorkingTargets::test_a_second_volume_is_still_backed_up PASSED [ 40%] tests/test_privileged_fs.py::TestTheDirectRouteIsTriedFirst::test_a_writable_destination_never_shells_out PASSED [ 40%] tests/test_privileged_fs.py::TestTheDirectRouteIsTriedFirst::test_mkdir_in_a_writable_parent_never_shells_out PASSED [ 40%] tests/test_privileged_fs.py::TestTheDirectRouteIsTriedFirst::test_chmod_of_an_owned_path_never_shells_out PASSED [ 40%] tests/test_privileged_fs.py::TestTheDirectRouteIsTriedFirst::test_rmtree_of_an_owned_tree_never_shells_out PASSED [ 40%] tests/test_privileged_fs.py::TestTheDirectRouteIsTriedFirst::test_the_uid_does_not_decide_it_ownership_does PASSED [ 40%] tests/test_privileged_fs.py::TestElevationIsTheFallback::test_an_unwritable_destination_falls_back_to_sudo PASSED [ 40%] tests/test_privileged_fs.py::TestElevationIsTheFallback::test_the_fallback_is_non_interactive_by_default PASSED [ 40%] tests/test_privileged_fs.py::TestElevationIsTheFallback::test_a_foreground_caller_may_allow_the_prompt PASSED [ 40%] tests/test_privileged_fs.py::TestElevationIsTheFallback::test_the_written_bytes_reach_sudo_on_stdin PASSED [ 40%] tests/test_privileged_fs.py::TestElevationIsTheFallback::test_root_does_not_shell_out_at_all PASSED [ 40%] tests/test_privileged_fs.py::TestWhenBothRoutesFail::test_it_names_the_path_that_could_not_be_written PASSED [ 40%] tests/test_privileged_fs.py::TestWhenBothRoutesFail::test_it_repeats_what_sudo_actually_said PASSED [ 40%] tests/test_privileged_fs.py::TestWhenBothRoutesFail::test_it_offers_a_remedy PASSED [ 40%] tests/test_privileged_fs.py::TestWhenBothRoutesFail::test_it_explains_why_the_documented_sudoers_did_not_cover_this PASSED [ 40%] tests/test_privileged_fs.py::TestWhenBothRoutesFail::test_the_binary_named_is_the_one_that_was_refused PASSED [ 40%] tests/test_privileged_fs.py::TestWhenBothRoutesFail::test_it_is_not_a_calledprocesserror_repr PASSED [ 40%] tests/test_privileged_fs.py::TestOnlyPermissionFailuresEscalate::test_a_non_permission_failure_never_shells_out_to_sudo[enoent] PASSED [ 40%] tests/test_privileged_fs.py::TestOnlyPermissionFailuresEscalate::test_a_non_permission_failure_never_shells_out_to_sudo[enotdir] PASSED [ 40%] tests/test_privileged_fs.py::TestOnlyPermissionFailuresEscalate::test_a_non_permission_failure_never_shells_out_to_sudo[eisdir] PASSED [ 40%] tests/test_privileged_fs.py::TestOnlyPermissionFailuresEscalate::test_a_non_permission_failure_never_shells_out_to_sudo[enospc] PASSED [ 40%] tests/test_privileged_fs.py::TestOnlyPermissionFailuresEscalate::test_a_non_permission_failure_never_shells_out_to_sudo[erofs] PASSED [ 40%] tests/test_privileged_fs.py::TestOnlyPermissionFailuresEscalate::test_a_permission_failure_still_escalates[eacces] PASSED [ 40%] tests/test_privileged_fs.py::TestOnlyPermissionFailuresEscalate::test_a_permission_failure_still_escalates[eperm] PASSED [ 40%] tests/test_privileged_fs.py::TestElevationDoesNotFollowASymlink::test_it_refuses_rather_than_elevating_onto_the_link[write] PASSED [ 40%] tests/test_privileged_fs.py::TestElevationDoesNotFollowASymlink::test_it_refuses_rather_than_elevating_onto_the_link[chmod] PASSED [ 40%] tests/test_privileged_fs.py::TestElevationDoesNotFollowASymlink::test_the_message_names_where_the_link_pointed PASSED [ 40%] tests/test_privileged_fs.py::TestTheDirectRouteCannotBeRaced::test_a_write_refuses_a_link_even_with_the_guard_disabled PASSED [ 40%] tests/test_privileged_fs.py::TestTheDirectRouteCannotBeRaced::test_a_chmod_refuses_a_link_even_with_the_guard_disabled PASSED [ 40%] tests/test_privileged_fs.py::TestTheDirectRouteCannotBeRaced::test_a_real_file_is_still_written_and_chmodded PASSED [ 40%] tests/test_privileged_fs.py::TestTheDirectRouteCannotBeRaced::test_an_existing_file_is_truncated_not_appended PASSED [ 40%] tests/test_progress.py::TestIsInteractive::test_returns_true_when_tty PASSED [ 40%] tests/test_progress.py::TestIsInteractive::test_returns_false_when_not_tty PASSED [ 40%] tests/test_progress.py::TestParseSize::test_parse_bytes_suffix PASSED [ 40%] tests/test_progress.py::TestParseSize::test_parse_size_with_binary_units PASSED [ 40%] tests/test_progress.py::TestParseSize::test_parse_plain_number PASSED [ 40%] tests/test_progress.py::TestParseSize::test_parse_with_whitespace PASSED [ 40%] tests/test_progress.py::TestParseSize::test_parse_invalid_returns_none PASSED [ 40%] tests/test_progress.py::TestParseSize::test_parse_float_bytes PASSED [ 40%] tests/test_progress.py::TestParseSize::test_parse_size_with_decimal PASSED [ 40%] tests/test_progress.py::TestParseSize::test_multipliers_exist PASSED [ 40%] tests/test_progress.py::TestEstimateSnapshotSize::test_incremental_returns_none PASSED [ 40%] tests/test_progress.py::TestEstimateSnapshotSize::test_parses_the_filesystem_du_total PASSED [ 40%] tests/test_progress.py::TestEstimateSnapshotSize::test_uses_sudo_when_not_root PASSED [ 40%] tests/test_progress.py::TestEstimateSnapshotSize::test_fallback_to_du PASSED [ 40%] tests/test_progress.py::TestEstimateSnapshotSize::test_returns_none_when_all_fail PASSED [ 40%] tests/test_progress.py::TestEstimateSnapshotSize::test_handles_timeout PASSED [ 40%] tests/test_progress.py::TestEstimateSnapshotSize::test_handles_file_not_found PASSED [ 40%] tests/test_progress.py::TestRichProgressPipe::test_read_updates_progress PASSED [ 40%] tests/test_progress.py::TestRichProgressPipe::test_read_full_data PASSED [ 40%] tests/test_progress.py::TestRichProgressPipe::test_read_default_chunk_size PASSED [ 40%] tests/test_progress.py::TestRichProgressPipe::test_close PASSED [ 40%] tests/test_progress.py::TestRichProgressPipe::test_close_idempotent PASSED [ 40%] tests/test_progress.py::TestRichProgressPipe::test_context_manager PASSED [ 40%] tests/test_progress.py::TestRichProgressPipe::test_fileno PASSED [ 40%] tests/test_progress.py::TestProgressReader::test_transfers_data_with_progress PASSED [ 40%] tests/test_progress.py::TestProgressReader::test_handles_read_error PASSED [ 40%] tests/test_progress.py::TestProgressReader::test_closes_dest_on_completion PASSED [ 40%] tests/test_progress.py::TestProgressReader::test_is_daemon_thread PASSED [ 40%] tests/test_progress.py::TestCreateRichProgress::test_creates_progress_when_rich_available PASSED [ 40%] tests/test_progress.py::TestCreateRichProgress::test_returns_none_when_rich_unavailable PASSED [ 40%] tests/test_progress.py::TestSimpleTransfer::test_transfers_data PASSED [ 40%] tests/test_progress.py::TestSimpleTransfer::test_returns_process_codes PASSED [ 40%] tests/test_progress.py::TestRunTransferWithProgress::test_falls_back_to_simple_when_no_rich PASSED [ 40%] tests/test_progress.py::TestRunTransferWithProgress::test_uses_progress_reader PASSED [ 40%] tests/test_progress.py::TestRunTransferWithProgress::test_logs_reader_error PASSED [ 40%] tests/test_progress.py::TestRunTransferWithProgress::test_updates_final_progress PASSED [ 40%] tests/test_prune_gates.py::TestPruneHonoursRequireMount::test_a_target_that_is_not_a_mount_point_is_refused PASSED [ 41%] tests/test_prune_gates.py::TestPruneHonoursRequireMount::test_a_target_without_require_mount_is_unaffected PASSED [ 41%] tests/test_prune_gates.py::TestAMissingSnapshotDirDoesNotSkipTheTargets::test_targets_are_pruned_when_the_source_dir_is_gone PASSED [ 41%] tests/test_prune_honours_scopes.py::test_source_and_target_prune_under_their_own_policies PASSED [ 41%] tests/test_prune_honours_scopes.py::test_prune_agrees_with_the_run_pipeline_on_the_same_config PASSED [ 41%] tests/test_prune_honours_scopes.py::test_a_degenerate_source_policy_stops_the_source_only PASSED [ 41%] tests/test_prune_honours_scopes.py::test_dry_run_reports_each_scope_and_does_not_cry_degenerate PASSED [ 41%] tests/test_prune_notification_status.py::test_failed_deletions_are_not_reported_as_success PASSED [ 41%] tests/test_prune_notification_status.py::test_a_clean_prune_is_still_success PASSED [ 41%] tests/test_prune_notification_status.py::test_a_prune_with_nothing_to_delete_is_success PASSED [ 41%] tests/test_prune_notification_status.py::test_every_volume_failing_is_a_failure PASSED [ 41%] tests/test_prune_notification_status.py::test_some_volumes_failing_is_partial PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestPruneOnASnapperVolume::test_deletes_what_the_snapper_plan_deletes PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestPruneOnASnapperVolume::test_the_plan_is_asked_with_the_target_policy_and_runs_options PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestPruneOnASnapperVolume::test_the_source_is_not_pruned PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestPruneOnASnapperVolume::test_every_target_is_pruned_under_its_own_policy PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestDryRun::test_deletes_nothing_and_says_what_it_would PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestRefusals::test_a_degenerate_target_policy_is_refused_without_force PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestRefusals::test_an_enumeration_failure_deletes_nothing_and_fails PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestRefusals::test_an_optional_absent_target_is_skipped_not_failed PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestRefusals::test_declining_the_prompt_deletes_nothing PASSED [ 41%] tests/test_prune_prunes_snapper_destinations.py::TestTheOptionsBuilderIsShared::test_run_and_prune_open_the_destination_the_same_way PASSED [ 41%] tests/test_prune_safety.py::test_degenerate_all_zero_buckets_with_tiny_min PASSED [ 41%] tests/test_prune_safety.py::test_not_degenerate_short_window_policy PASSED [ 41%] tests/test_prune_safety.py::test_not_degenerate_with_a_bucket PASSED [ 41%] tests/test_prune_safety.py::test_degenerate_policy_refused_without_force PASSED [ 41%] tests/test_prune_safety.py::test_degenerate_policy_proceeds_with_force PASSED [ 41%] tests/test_prune_safety.py::test_non_tty_proceeds_without_prompt PASSED [ 41%] tests/test_prune_safety.py::test_tty_confirmation_decline_aborts PASSED [ 41%] tests/test_prune_safety.py::test_tty_confirmation_accept_proceeds PASSED [ 41%] tests/test_prune_safety.py::test_yes_flag_skips_prompt PASSED [ 41%] tests/test_prune_safety.py::test_dry_run_never_deletes PASSED [ 41%] tests/test_prune_safety.py::test_resolved_policy_log_includes_yearly PASSED [ 41%] tests/test_raw_atomic_write.py::test_part_file_is_never_discovered PASSED [ 41%] tests/test_raw_atomic_write.py::test_receive_then_commit_publishes_atomically PASSED [ 41%] tests/test_raw_atomic_write.py::test_commit_missing_part_fails_loud PASSED [ 41%] tests/test_raw_atomic_write.py::test_commit_without_receive_is_noop PASSED [ 41%] tests/test_raw_atomic_write.py::test_ssh_commit_publishes_with_sync_mv_sync_then_writes_the_sidecar PASSED [ 41%] tests/test_raw_atomic_write.py::test_ssh_commit_measures_the_part_file_before_the_rename PASSED [ 41%] tests/test_raw_atomic_write.py::test_ssh_commit_hashes_the_stream_once_even_when_the_digest_fails PASSED [ 41%] tests/test_raw_atomic_write.py::test_ssh_commit_holds_the_target_lock_across_rename_and_sidecar PASSED [ 41%] tests/test_raw_atomic_write.py::test_ssh_commit_raises_on_remote_failure PASSED [ 41%] tests/test_raw_atomic_write.py::test_ssh_commit_wraps_in_sudo_when_configured PASSED [ 41%] tests/test_raw_atomic_write.py::test_commit_never_overwrites_a_committed_final PASSED [ 41%] tests/test_raw_atomic_write.py::test_part_name_distinguishes_machines PASSED [ 41%] tests/test_raw_atomic_write.py::test_remote_part_write_refuses_to_clobber_or_follow_a_symlink PASSED [ 41%] tests/test_raw_atomic_write.py::test_the_refusal_works_in_the_shells_a_remote_may_run[sh] PASSED [ 41%] tests/test_raw_atomic_write.py::test_the_refusal_works_in_the_shells_a_remote_may_run[dash] PASSED [ 41%] tests/test_raw_atomic_write.py::test_the_refusal_works_in_the_shells_a_remote_may_run[bash] PASSED [ 41%] tests/test_raw_backfill.py::test_streams_without_sidecar_finds_only_sidecarless PASSED [ 41%] tests/test_raw_backfill.py::test_filename_inferred_snapshot_is_labeled_honestly PASSED [ 41%] tests/test_raw_backfill.py::test_backfill_writes_unknown_completeness_sidecar PASSED [ 41%] tests/test_raw_backfill.py::test_backfill_then_verify_is_ok PASSED [ 41%] tests/test_raw_backfill.py::test_backfill_dry_run_writes_nothing PASSED [ 41%] tests/test_raw_backfill.py::test_backfill_no_candidates PASSED [ 41%] tests/test_raw_backfill.py::test_backfill_json_output PASSED [ 41%] tests/test_raw_backfill.py::test_ssh_streams_without_sidecar PASSED [ 41%] tests/test_raw_backfill.py::test_stream_completeness_round_trips PASSED [ 41%] tests/test_raw_backfill.py::test_dispatcher_parses_raw_backfill PASSED [ 41%] tests/test_raw_backfill.py::test_native_backup_stays_complete PASSED [ 41%] tests/test_raw_backfill.py::test_backfill_symlinked_meta_tmp_cannot_truncate_outside_file PASSED [ 41%] tests/test_raw_backfill.py::test_backfill_skips_symlinked_stream PASSED [ 41%] tests/test_raw_backfill.py::test_backfill_rechecks_and_skips_if_sidecar_appears PASSED [ 41%] tests/test_raw_backfill.py::test_remote_find_rejects_out_of_target_paths PASSED [ 41%] tests/test_raw_backfill.py::test_ssh_list_snapshots_stamps_filename_inferred PASSED [ 41%] tests/test_raw_backfill.py::test_backfill_nonexistent_target PASSED [ 41%] tests/test_raw_backfill.py::test_ssh_streams_without_sidecar_empty PASSED [ 41%] tests/test_raw_checksum.py::test_sha256_file_matches_hashlib PASSED [ 41%] tests/test_raw_checksum.py::test_sha256_file_missing_returns_none PASSED [ 41%] tests/test_raw_checksum.py::test_sha256_file_without_posix_fadvise PASSED [ 41%] tests/test_raw_checksum.py::test_commit_records_checksum_of_committed_stream PASSED [ 41%] tests/test_raw_checksum.py::test_checksum_seal_is_best_effort PASSED [ 41%] tests/test_raw_checksum.py::test_remote_sha256_parses_valid_digest PASSED [ 41%] tests/test_raw_checksum.py::test_remote_sha256_rejects_non_hex_output PASSED [ 42%] tests/test_raw_checksum.py::test_remote_sha256_empty_output_returns_none PASSED [ 42%] tests/test_raw_checksum.py::test_remote_hash_script_falls_through_when_sha256sum_absent PASSED [ 42%] tests/test_raw_checksum.py::test_remote_sidecar_records_checksum PASSED [ 42%] tests/test_raw_checksum.py::test_remote_checksum_exception_stays_best_effort PASSED [ 42%] tests/test_raw_cmd.py::test_coerce_bare_path_becomes_raw_scheme PASSED [ 42%] tests/test_raw_cmd.py::test_coerce_raw_schemes_pass_through[raw:///backups/x] PASSED [ 42%] tests/test_raw_cmd.py::test_coerce_raw_schemes_pass_through[raw+ssh://host/backups/x] PASSED [ 42%] tests/test_raw_cmd.py::test_coerce_rejects_non_raw_scheme PASSED [ 42%] tests/test_raw_cmd.py::test_human_size PASSED [ 42%] tests/test_raw_cmd.py::test_ssh_sudo_is_threaded_to_endpoint PASSED [ 42%] tests/test_raw_cmd.py::test_execute_raw_no_action_returns_1 PASSED [ 42%] tests/test_raw_cmd.py::test_execute_raw_dispatches_list PASSED [ 42%] tests/test_raw_cmd.py::test_raw_list_human_lists_backups PASSED [ 42%] tests/test_raw_cmd.py::test_raw_list_json_is_valid_and_authoritative PASSED [ 42%] tests/test_raw_cmd.py::test_raw_list_empty_target_is_ok PASSED [ 42%] tests/test_raw_cmd.py::test_raw_list_rejects_non_raw_scheme PASSED [ 42%] tests/test_raw_cmd.py::test_raw_list_refuses_a_missing_local_target PASSED [ 42%] tests/test_raw_cmd.py::test_dispatcher_parses_raw_list PASSED [ 42%] tests/test_raw_cmd.py::test_dispatcher_routes_raw_to_execute_raw PASSED [ 42%] tests/test_raw_compress_integrity.py::test_thread_raw_compression_copies_target_compress PASSED [ 42%] tests/test_raw_compress_integrity.py::test_thread_raw_compression_defaults_none_when_absent PASSED [ 42%] tests/test_raw_compress_integrity.py::test_thread_raw_compression_override_wins PASSED [ 42%] tests/test_raw_compress_integrity.py::test_thread_raw_compression_no_override_uses_target PASSED [ 42%] tests/test_raw_compress_integrity.py::test_guard_raises_when_raw_endpoint_missing_compress PASSED [ 42%] tests/test_raw_compress_integrity.py::test_guard_passes_when_raw_endpoint_has_compress PASSED [ 42%] tests/test_raw_compress_integrity.py::test_guard_noop_when_no_compression_requested PASSED [ 42%] tests/test_raw_compress_integrity.py::test_guard_noop_for_non_raw_endpoint PASSED [ 42%] tests/test_raw_compress_integrity.py::test_choose_endpoint_threads_compress_into_raw_endpoint PASSED [ 42%] tests/test_raw_compress_integrity.py::test_compress_none_sentinel_normalized_not_rejected PASSED [ 42%] tests/test_raw_compress_integrity.py::test_commit_records_compress_in_sidecar_and_round_trips PASSED [ 42%] tests/test_raw_compress_integrity.py::test_send_snapshot_suppresses_transfer_compress_for_raw PASSED [ 42%] tests/test_raw_compress_integrity.py::test_send_snapshot_neutralises_transfer_compress_for_non_raw PASSED [ 42%] tests/test_raw_compress_integrity.py::test_ssh_raw_receive_pipeline_is_compress_then_encrypt PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypt_keeps_plaintext_and_writes_remediation_sidecar PASSED [ 42%] tests/test_raw_encrypt.py::test_shred_removes_plaintext_only_after_verified_proof PASSED [ 42%] tests/test_raw_encrypt.py::test_shred_keeps_plaintext_when_proof_fails PASSED [ 42%] tests/test_raw_encrypt.py::test_decrypt_matches_plaintext_true_and_false PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypt_dry_run_changes_nothing PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypt_refuses_raw_ssh PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypt_gpg_requires_recipient PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypt_openssl_requires_passphrase PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypt_no_plaintext_streams PASSED [ 42%] tests/test_raw_encrypt.py::test_dispatcher_parses_raw_encrypt PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypted_stream_verifies_after_remediation[False] PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypted_stream_verifies_after_remediation[True] PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypt_part_symlink_cannot_redirect_write PASSED [ 42%] tests/test_raw_encrypt.py::test_remediate_refuses_non_encryption_method PASSED [ 42%] tests/test_raw_encrypt.py::test_remediate_refuses_existing_encrypted_target PASSED [ 42%] tests/test_raw_encrypt.py::test_existing_encrypted_not_clobbered PASSED [ 42%] tests/test_raw_encrypt.py::test_partial_failure_shreds_verified_keeps_unverified PASSED [ 42%] tests/test_raw_encrypt.py::test_confirm_prompt_abort_keeps_plaintext PASSED [ 42%] tests/test_raw_encrypt.py::test_confirm_prompt_yes_proceeds PASSED [ 42%] tests/test_raw_encrypt.py::test_encrypt_json_output PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_raw_gpg_with_recipient_is_carried PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_raw_ssh_gpg_is_carried PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_raw_openssl_enc_is_allowed PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_gpg_keyring_and_openssl_cipher_are_carried PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_gpg_without_recipient_fails_closed PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_encrypt_on_ssh_btrfs_target_fails_closed PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_encrypt_on_local_btrfs_target_fails_closed PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_invalid_encrypt_value_fails_closed PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_raw_plaintext_is_allowed PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_non_raw_without_encrypt_is_unaffected PASSED [ 42%] tests/test_raw_encryption.py::TestParseTargetEncryption::test_compress_is_not_rejected_on_non_raw PASSED [ 42%] tests/test_raw_encryption.py::TestLoadConfigRoundTrip::test_gpg_target_survives_full_load PASSED [ 42%] tests/test_raw_encryption.py::TestLoadConfigRoundTrip::test_gpg_without_recipient_fails_at_load PASSED [ 42%] tests/test_raw_encryption.py::TestThreadRawEncryption::test_copies_all_encryption_fields PASSED [ 42%] tests/test_raw_encryption.py::TestAssertEncryptionApplied::test_noop_when_not_requested PASSED [ 42%] tests/test_raw_encryption.py::TestAssertEncryptionApplied::test_noop_when_applied PASSED [ 42%] tests/test_raw_encryption.py::TestAssertEncryptionApplied::test_raises_when_requested_but_endpoint_lacks_it PASSED [ 42%] tests/test_raw_encryption.py::TestAssertEncryptionApplied::test_raises_when_endpoint_encrypt_is_none_string PASSED [ 42%] tests/test_raw_encryption.py::TestChooseEndpointThreadsEncryption::test_raw_endpoint_receives_encryption_config PASSED [ 42%] tests/test_raw_encryption.py::TestChooseEndpointThreadsEncryption::test_encrypt_none_string_is_plaintext_not_rejected PASSED [ 43%] tests/test_raw_encryption.py::TestRealGpgPipeline::test_gpg_output_is_real_ciphertext_and_decrypts PASSED [ 43%] tests/test_raw_encryption.py::TestRealGpgPipeline::test_plaintext_control_is_not_encrypted PASSED [ 43%] tests/test_raw_encryption.py::TestRealOpensslPipeline::test_openssl_output_is_encrypted_and_decrypts PASSED [ 43%] tests/test_raw_encryption.py::TestSSHRawEndpointEncryption::test_ssh_raw_pipeline_includes_gpg_stage PASSED [ 43%] tests/test_raw_encryption.py::TestSSHRawEndpointEncryption::test_ssh_raw_pipeline_includes_openssl_stage PASSED [ 43%] tests/test_raw_encryption.py::TestSSHRawEndpointEncryption::test_ssh_raw_plaintext_pipeline_has_no_encryption_stage PASSED [ 43%] tests/test_raw_encryption.py::TestSSHRawRealRoundTrip::test_raw_ssh_localhost_gpg_roundtrip SKIPPED [ 43%] tests/test_raw_encryption_cli_roundtrip.py::TestRunThreadsEncryption::test_encryption_reaches_the_real_destination_endpoint PASSED [ 43%] tests/test_raw_encryption_cli_roundtrip.py::TestRunThreadsEncryption::test_aborts_fail_closed_when_threading_is_dropped PASSED [ 43%] tests/test_raw_encryption_cli_roundtrip.py::TestRunThreadsEncryption::test_plaintext_target_is_unaffected PASSED [ 43%] tests/test_raw_encryption_cli_roundtrip.py::TestTransferThreadsEncryption::test_encryption_reaches_endpoint_via_transfer_command PASSED [ 43%] tests/test_raw_encryption_cli_roundtrip.py::TestTransferThreadsEncryption::test_aborts_fail_closed_when_threading_dropped PASSED [ 43%] tests/test_raw_encryption_cli_roundtrip.py::TestSnapperBackupThreadsEncryption::test_encryption_reaches_endpoint_via_snapper_backup PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_basic_creation PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_with_compression PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_with_encryption PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_with_openssl_encryption PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_with_openssl_custom_cipher PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_encryption_requires_recipient PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_invalid_encryption_method PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_invalid_compression PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_repr PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_get_id PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_prepare_accepts_an_existing_target PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_prepare_refuses_a_target_that_does_not_exist PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_check_tools_finds_missing PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpoint::test_check_tools_all_present PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointPipeline::test_build_pipeline_no_processing PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointPipeline::test_build_pipeline_compression_only PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointPipeline::test_build_pipeline_encryption_only PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointPipeline::test_build_pipeline_with_keyring PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointPipeline::test_build_pipeline_compression_and_encryption PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointPipeline::test_build_pipeline_openssl_encryption PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointPipeline::test_build_pipeline_compression_and_openssl PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointRestorePipeline::test_build_restore_pipeline_no_processing PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointRestorePipeline::test_build_restore_pipeline_compressed PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointRestorePipeline::test_build_restore_pipeline_encrypted PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointRestorePipeline::test_build_restore_pipeline_compressed_and_encrypted PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointRestorePipeline::test_build_restore_pipeline_openssl_encrypted PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointRestorePipeline::test_build_restore_pipeline_compressed_and_openssl PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointSnapshotManagement::test_list_snapshots_empty PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointSnapshotManagement::test_list_snapshots_with_prefix PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointSnapshotManagement::test_list_snapshots_caching PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointSnapshotManagement::test_delete_snapshot PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointSnapshotManagement::test_delete_old_snapshots PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpoint::test_basic_creation PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpoint::test_requires_hostname PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpoint::test_repr PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpoint::test_get_id PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpoint::test_build_ssh_command PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpoint::test_build_ssh_command_default_port PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointIntegration::test_receive_requires_snapshot_name PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointIntegration::test_send_requires_existing_file PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointReceive::test_receive_sets_pending_metadata PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointReceive::test_receive_writes_stream_to_output_file PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointReceive::test_receive_with_compression PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointReceive::test_receive_with_encryption PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointExecutePipeline::test_execute_pipeline_empty_raises PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointExecutePipeline::test_execute_pipeline_single_command PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointExecutePipeline::test_execute_pipeline_multi_command PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointSend::test_send_existing_file PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointExecuteRestorePipeline::test_execute_restore_single_command PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointExecuteRestorePipeline::test_execute_restore_multi_command PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointDeleteSnapshots::test_delete_snapshots_handles_errors PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointDeleteSnapshots::test_delete_old_snapshots_keep_zero PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointDeleteSnapshots::test_delete_updates_cache PASSED [ 43%] tests/test_raw_endpoint.py::TestRawEndpointGetSpaceInfo::test_get_space_info PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_prepare_confirms_the_remote_directory_exists PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_prepare_with_sudo PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_prepare_failure PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_execute_pipeline_no_local_processing PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_execute_pipeline_with_compression PASSED [ 43%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_execute_pipeline_with_sudo PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_list_snapshots_empty PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_list_snapshots_with_metadata PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_list_snapshots_discovers_sidecar_less_remote PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_list_snapshots_dedups_meta_and_stream_by_path PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_list_snapshots_second_pass_skips_part PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_list_snapshots_second_pass_skips_meta_tmp PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_list_snapshots_skips_unstatable_stream PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_list_snapshots_caching PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_delete_snapshots_remote PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_delete_snapshots_failure PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointMethods::test_delete_updates_cache PASSED [ 44%] tests/test_raw_endpoint.py::TestOpenSSLPassphrase::test_get_openssl_passphrase_primary_env PASSED [ 44%] tests/test_raw_endpoint.py::TestOpenSSLPassphrase::test_get_openssl_passphrase_btrbk_fallback PASSED [ 44%] tests/test_raw_endpoint.py::TestOpenSSLPassphrase::test_get_openssl_passphrase_not_set PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_compression_pipeline[gzip-.gz] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_compression_pipeline[pigz-.gz] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_compression_pipeline[zstd-.zst] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_compression_pipeline[lz4-.lz4] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_compression_pipeline[xz-.xz] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_compression_pipeline[lzo-.lzo] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_compression_pipeline[bzip2-.bz2] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_compression_pipeline[pbzip2-.bz2] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_decompression_pipeline[gzip] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_decompression_pipeline[pigz] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_decompression_pipeline[zstd] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_decompression_pipeline[lz4] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_decompression_pipeline[xz] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_decompression_pipeline[lzo] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_decompression_pipeline[bzip2] PASSED [ 44%] tests/test_raw_endpoint.py::TestAllCompressionMethods::test_decompression_pipeline[pbzip2] PASSED [ 44%] tests/test_raw_endpoint.py::TestSSHRawEndpointRemoteExec::test_exec_remote_command_builds_ssh PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealCompressionPipelines::test_pigz_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealCompressionPipelines::test_bzip2_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealCompressionPipelines::test_pbzip2_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealCompressionPipelines::test_lzo_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealCompressionPipelines::test_gzip_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealCompressionPipelines::test_zstd_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealCompressionPipelines::test_lz4_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealCompressionPipelines::test_xz_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealEncryptionPipelines::test_openssl_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRealEncryptionPipelines::test_compression_plus_openssl_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestShellPipelineExecution::test_execute_pipeline_actually_compresses PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestShellPipelineExecution::test_multi_stage_pipeline_execution PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestRestorePipelineExecution::test_restore_pipeline_decompresses PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestGPGEncryptionPipelines::test_gpg_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestGPGEncryptionPipelines::test_compression_plus_gpg_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestMetadataIntegration::test_metadata_save_and_load_roundtrip PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestMetadataIntegration::test_metadata_json_format PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestMetadataIntegration::test_discover_snapshots_from_metadata PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestMetadataIntegration::test_discover_snapshots_without_metadata PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestFullReceiveWorkflow::test_receive_commit_restore_workflow PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestFullReceiveWorkflow::test_list_and_delete_workflow PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestSSHRawEndpointIntegration::test_ssh_command_construction PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestSSHRawEndpointIntegration::test_ssh_endpoint_id PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestSSHRawEndpointIntegration::test_ssh_endpoint_repr PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestSSHRawEndpointIntegration::test_ssh_localhost_prepare SKIPPED [ 44%] tests/test_raw_endpoint_integration.py::TestSSHRawEndpointIntegration::test_ssh_localhost_pipeline SKIPPED [ 44%] tests/test_raw_endpoint_integration.py::TestBinaryDataIntegrity::test_binary_data_with_null_bytes PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestBinaryDataIntegrity::test_binary_data_through_full_pipeline PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestCompressionLevels::test_zstd_levels_produce_different_sizes PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestEdgeCases::test_empty_input PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestEdgeCases::test_large_data PASSED [ 44%] tests/test_raw_endpoint_integration.py::TestEdgeCases::test_path_with_spaces PASSED [ 44%] tests/test_raw_enumeration_integrity.py::test_sidecar_name_differs_from_filename_counts_once PASSED [ 44%] tests/test_raw_enumeration_integrity.py::test_two_streams_same_base_name_count_once PASSED [ 44%] tests/test_raw_enumeration_integrity.py::test_empty_name_sidecar_is_not_a_phantom PASSED [ 44%] tests/test_raw_enumeration_integrity.py::test_ssh_empty_name_sidecar_is_skipped PASSED [ 44%] tests/test_raw_enumeration_integrity.py::test_ssh_double_slash_config_path_does_not_double_count PASSED [ 44%] tests/test_raw_enumeration_integrity.py::test_ssh_two_streams_same_base_name_count_once PASSED [ 44%] tests/test_raw_enumeration_integrity.py::TestTheRemoteListingHonoursTheSnapshotPrefix::test_a_prefix_excludes_another_volumes_sidecar_backed_stream PASSED [ 44%] tests/test_raw_enumeration_integrity.py::TestTheRemoteListingHonoursTheSnapshotPrefix::test_the_other_prefix_selects_the_other_volume PASSED [ 44%] tests/test_raw_enumeration_integrity.py::TestTheRemoteListingHonoursTheSnapshotPrefix::test_no_prefix_still_lists_everything PASSED [ 44%] tests/test_raw_enumeration_integrity.py::TestTheRemoteListingHonoursTheSnapshotPrefix::test_it_filters_on_the_recorded_name_not_the_filename PASSED [ 45%] tests/test_raw_enumeration_integrity.py::TestTheRemoteListingHonoursTheSnapshotPrefix::test_the_two_transports_agree_on_the_same_files PASSED [ 45%] tests/test_raw_lock.py::test_target_lock_is_mutually_exclusive PASSED [ 45%] tests/test_raw_lock.py::test_target_lock_released_after_context PASSED [ 45%] tests/test_raw_lock.py::test_target_lock_excludes_across_processes PASSED [ 45%] tests/test_raw_lock.py::test_fifo_lock_file_does_not_hang PASSED [ 45%] tests/test_raw_lock.py::test_lock_fstat_failure_maps_to_runtime_error PASSED [ 45%] tests/test_raw_lock.py::test_hostile_lock_messages_are_plain_language PASSED [ 45%] tests/test_raw_lock.py::test_planted_lock_directory_degrades_to_runtime_error PASSED [ 45%] tests/test_raw_lock.py::test_planted_lock_symlink_is_refused PASSED [ 45%] tests/test_raw_lock.py::test_lock_timeout_defaults_from_config PASSED [ 45%] tests/test_raw_lock.py::test_lock_file_is_not_a_snapshot PASSED [ 45%] tests/test_raw_lock.py::test_ssh_target_lock_actually_excludes PASSED [ 45%] tests/test_raw_lock.py::test_backfill_reports_busy_target PASSED [ 45%] tests/test_raw_lock.py::test_encrypt_reports_busy_target PASSED [ 45%] tests/test_raw_lock.py::test_prune_takes_lock_once_for_whole_pass PASSED [ 45%] tests/test_raw_lock.py::test_ssh_prune_issues_remote_rm PASSED [ 45%] tests/test_raw_lock.py::test_backup_commit_still_works_under_lock PASSED [ 45%] tests/test_raw_lock.py::test_rawssh_backup_commit_publishes_stream_and_sidecar_under_the_lock PASSED [ 45%] tests/test_raw_lock.py::test_rawssh_part_file_is_not_world_readable PASSED [ 45%] tests/test_raw_metadata.py::TestRawSnapshot::test_basic_creation PASSED [ 45%] tests/test_raw_metadata.py::TestRawSnapshot::test_with_compression_and_encryption PASSED [ 45%] tests/test_raw_metadata.py::TestRawSnapshot::test_metadata_path PASSED [ 45%] tests/test_raw_metadata.py::TestRawSnapshot::test_is_incremental PASSED [ 45%] tests/test_raw_metadata.py::TestRawSnapshot::test_to_dict PASSED [ 45%] tests/test_raw_metadata.py::TestRawSnapshot::test_from_dict PASSED [ 45%] tests/test_raw_metadata.py::TestRawSnapshot::test_save_and_load_metadata PASSED [ 45%] tests/test_raw_metadata.py::TestGetFileExtension::test_no_compression_no_encryption PASSED [ 45%] tests/test_raw_metadata.py::TestGetFileExtension::test_with_compression_only PASSED [ 45%] tests/test_raw_metadata.py::TestGetFileExtension::test_with_encryption_only PASSED [ 45%] tests/test_raw_metadata.py::TestGetFileExtension::test_with_openssl_encryption_only PASSED [ 45%] tests/test_raw_metadata.py::TestGetFileExtension::test_with_compression_and_encryption PASSED [ 45%] tests/test_raw_metadata.py::TestGetFileExtension::test_with_compression_and_openssl_encryption PASSED [ 45%] tests/test_raw_metadata.py::TestParseStreamFilename::test_plain_stream PASSED [ 45%] tests/test_raw_metadata.py::TestParseStreamFilename::test_compressed_stream PASSED [ 45%] tests/test_raw_metadata.py::TestParseStreamFilename::test_encrypted_stream PASSED [ 45%] tests/test_raw_metadata.py::TestParseStreamFilename::test_openssl_encrypted_stream PASSED [ 45%] tests/test_raw_metadata.py::TestParseStreamFilename::test_compressed_and_encrypted PASSED [ 45%] tests/test_raw_metadata.py::TestParseStreamFilename::test_compressed_and_openssl_encrypted PASSED [ 45%] tests/test_raw_metadata.py::TestDiscoverRawSnapshots::test_empty_directory PASSED [ 45%] tests/test_raw_metadata.py::TestDiscoverRawSnapshots::test_nonexistent_directory PASSED [ 45%] tests/test_raw_metadata.py::TestDiscoverRawSnapshots::test_discover_from_metadata_files PASSED [ 45%] tests/test_raw_metadata.py::TestDiscoverRawSnapshots::test_discover_from_filenames PASSED [ 45%] tests/test_raw_metadata.py::TestDiscoverRawSnapshots::test_prefix_filter PASSED [ 45%] tests/test_raw_metadata.py::TestDiscoverRawSnapshots::test_sorted_by_creation_time PASSED [ 45%] tests/test_raw_metadata.py::TestCompressionConfig::test_all_algorithms_have_config PASSED [ 45%] tests/test_raw_metadata.py::TestCompressionConfig::test_the_two_transports_accept_the_same_methods PASSED [ 45%] tests/test_raw_metadata.py::TestCompressionConfig::test_both_spellings_of_lzo_run_the_same_program PASSED [ 45%] tests/test_raw_metadata.py::TestCompressionConfig::test_config_has_required_fields PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_restore_uses_recorded_cipher_not_endpoint_default PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_btrbk_passphrase_only_round_trips PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_invalid_cipher_rejected_at_construction PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_explicit_unset_cipher_defaults_and_is_valid[None] PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_explicit_unset_cipher_defaults_and_is_valid[] PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_null_cipher_none_is_refused[none] PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_null_cipher_none_is_refused[NONE] PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_null_cipher_none_is_refused[None] PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_aead_cipher_is_refused[aes-256-gcm] PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_aead_cipher_is_refused[aes-128-ccm] PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_aead_cipher_is_refused[aes-256-ocb] PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_aead_cipher_is_refused[chacha20-poly1305] PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_trailing_newline_cipher_is_rejected PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_chacha20_round_trips PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_malicious_sidecar_cipher_rejected_at_restore PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_restore_without_passphrase_fails_loud PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_a_missing_openssl_is_named_before_a_missing_passphrase PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_a_raw_ssh_restore_names_it_before_contacting_the_remote PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_a_raw_ssh_restore_without_passphrase_fails_before_contacting_the_remote PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_legacy_snapshot_without_recorded_cipher_uses_endpoint_default PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_send_pipeline_quotes_argv_local PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_send_pipeline_quotes_argv_ssh PASSED [ 45%] tests/test_raw_openssl_cipher.py::test_rich_progress_receive_build_error_becomes_transfer_error PASSED [ 45%] tests/test_raw_parent_protection.py::test_protect_rescues_kept_childs_parent_chain PASSED [ 45%] tests/test_raw_parent_protection.py::test_protect_allows_whole_chain_delete PASSED [ 46%] tests/test_raw_parent_protection.py::test_protect_kept_child_missing_parent_warns_no_crash PASSED [ 46%] tests/test_raw_parent_protection.py::test_protect_legacy_null_parent_left_as_is PASSED [ 46%] tests/test_raw_parent_protection.py::test_protect_cycle_does_not_hang PASSED [ 46%] tests/test_raw_parent_protection.py::test_btrfs_base_protect_is_noop PASSED [ 46%] tests/test_raw_parent_protection.py::test_chain_guard_protects_survivor_referenced_parent PASSED [ 46%] tests/test_raw_parent_protection.py::test_chain_guard_allows_whole_chain_via_session PASSED [ 46%] tests/test_raw_parent_protection.py::test_delete_locked_skips_protected_parent_on_disk PASSED [ 46%] tests/test_raw_part_file_safety.py::TestPartNameIsPrivateToOneTransfer::test_two_endpoints_do_not_share_a_part_path PASSED [ 46%] tests/test_raw_part_file_safety.py::TestPartNameIsPrivateToOneTransfer::test_part_name_still_ends_with_the_suffix_discovery_ignores PASSED [ 46%] tests/test_raw_part_file_safety.py::TestPartNameIsPrivateToOneTransfer::test_part_name_is_a_sibling_of_the_final_stream PASSED [ 46%] tests/test_raw_part_file_safety.py::TestPartFileIsOpenedSafely::test_symlink_at_the_part_path_is_refused PASSED [ 46%] tests/test_raw_part_file_safety.py::TestPartFileIsOpenedSafely::test_existing_file_is_refused PASSED [ 46%] tests/test_raw_part_file_safety.py::TestPartFileIsOpenedSafely::test_mode_is_private PASSED [ 46%] tests/test_raw_part_file_safety.py::TestPartFileIsOpenedSafely::test_received_stream_is_private PASSED [ 46%] tests/test_raw_part_file_safety.py::test_symlink_planted_at_the_derivable_part_name_is_not_followed PASSED [ 46%] tests/test_raw_part_file_safety.py::test_stream_contents_survive_the_fd_handoff PASSED [ 46%] tests/test_raw_part_file_safety.py::test_compressed_pipeline_also_writes_through_the_descriptor PASSED [ 46%] tests/test_raw_phantom_streams.py::TestAPhantomIsNotListed::test_a_sidecar_without_its_stream_is_not_a_backup PASSED [ 46%] tests/test_raw_phantom_streams.py::TestAPhantomIsNotListed::test_it_is_reported_rather_than_dropped_quietly PASSED [ 46%] tests/test_raw_phantom_streams.py::TestAPhantomIsNotListed::test_real_backups_beside_it_are_unaffected PASSED [ 46%] tests/test_raw_phantom_streams.py::TestAPhantomIsNotListed::test_a_stream_without_a_sidecar_is_still_found PASSED [ 46%] tests/test_raw_phantom_streams.py::TestTheRetentionConsequence::test_a_phantom_no_longer_occupies_a_keep_slot PASSED [ 46%] tests/test_raw_phantom_streams.py::test_the_check_follows_the_recorded_stream_path[.btrfs] PASSED [ 46%] tests/test_raw_phantom_streams.py::test_the_check_follows_the_recorded_stream_path[.btrfs.zst] PASSED [ 46%] tests/test_raw_phantom_streams.py::test_the_check_follows_the_recorded_stream_path[.btrfs.gz] PASSED [ 46%] tests/test_raw_pipeline_validation.py::test_unknown_compress_algo_fails_loud PASSED [ 46%] tests/test_raw_pipeline_validation.py::test_unknown_encrypt_method_fails_loud PASSED [ 46%] tests/test_raw_pipeline_validation.py::test_restore_missing_tool_preflights_with_clear_message PASSED [ 46%] tests/test_raw_pipeline_validation.py::test_restore_preflight_passes_when_tools_present PASSED [ 46%] tests/test_raw_pipeline_validation.py::test_pipeline_construction_is_independent_of_tool_availability PASSED [ 46%] tests/test_raw_pipeline_validation.py::test_backup_prepare_fails_loud_on_missing_tool PASSED [ 46%] tests/test_raw_pipeline_validation.py::test_backup_prepare_ok_when_tools_present PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_a_mismatched_prefix_can_be_inferred PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_a_mismatched_prefix_is_explained PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_sidecars_are_not_counted_as_snapshots PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_compressed_and_encrypted_streams_are_recognised[.btrfs] PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_compressed_and_encrypted_streams_are_recognised[.btrfs.gz] PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_compressed_and_encrypted_streams_are_recognised[.btrfs.zst] PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_compressed_and_encrypted_streams_are_recognised[.btrfs.zst.gpg] PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_compressed_and_encrypted_streams_are_recognised[.btrfs.zst.enc] PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_a_matching_prefix_reports_nothing_wrong PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_a_genuinely_empty_location_reports_nothing PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_an_unreadable_location_does_not_abort PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestARawLocationWithBackupsIsNeverReportedEmpty::test_two_prefixes_are_both_reported PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestTheSeamIsWhatMakesThisWork::test_a_btrfs_entry_is_its_own_snapshot_name PASSED [ 46%] tests/test_raw_prefix_diagnostics.py::TestTheSeamIsWhatMakesThisWork::test_a_raw_entry_is_stripped_to_its_snapshot_name PASSED [ 46%] tests/test_raw_restore_integrity.py::test_corrupt_stored_stream_is_refused_before_restore PASSED [ 46%] tests/test_raw_restore_integrity.py::test_intact_stream_passes_verification_and_restores PASSED [ 46%] tests/test_raw_restore_integrity.py::test_legacy_stream_without_checksum_skips_verify PASSED [ 46%] tests/test_raw_restore_integrity.py::test_verify_does_not_block_when_checksum_unreadable PASSED [ 46%] tests/test_raw_restore_integrity.py::test_skip_verify_allows_corrupt_restore_for_last_copy_recovery PASSED [ 46%] tests/test_raw_restore_integrity.py::test_restore_pipeline_pipefail_surfaces_midpipe_failure PASSED [ 46%] tests/test_raw_restore_integrity.py::test_multistage_restore_pipeline_uses_pipefail PASSED [ 46%] tests/test_raw_retention_honours_locks.py::test_keep_counts_usable_backups_not_total_streams[None] PASSED [ 46%] tests/test_raw_retention_honours_locks.py::test_keep_counts_usable_backups_not_total_streams[s.20240105T120000] PASSED [ 46%] tests/test_raw_retention_honours_locks.py::test_keep_counts_usable_backups_not_total_streams[s.20240101T120000] PASSED [ 46%] tests/test_raw_retention_honours_locks.py::test_keep_counts_usable_backups_not_total_streams[s.20240103T120000] PASSED [ 46%] tests/test_raw_retention_honours_locks.py::test_a_locked_stream_is_never_deleted PASSED [ 46%] tests/test_raw_retention_honours_locks.py::test_the_newest_unlocked_streams_are_the_ones_kept PASSED [ 46%] tests/test_raw_sidecar.py::test_commit_writes_authoritative_v2_sidecar PASSED [ 46%] tests/test_raw_sidecar.py::test_sidecar_written_atomically_at_0600 PASSED [ 46%] tests/test_raw_sidecar.py::test_committed_sidecar_is_discovered_with_authoritative_metadata PASSED [ 46%] tests/test_raw_sidecar.py::test_sidecar_records_openssl_cipher PASSED [ 46%] tests/test_raw_sidecar.py::test_receive_gates_openssl_cipher_to_openssl_only PASSED [ 46%] tests/test_raw_sidecar.py::test_sidecar_write_failure_does_not_fail_the_backup PASSED [ 46%] tests/test_raw_sidecar.py::test_snapper_raw_meta_and_snapper_meta_coexist_without_double_count PASSED [ 46%] tests/test_raw_sidecar.py::test_from_dict_tolerates_explicit_null_blocks PASSED [ 46%] tests/test_raw_sidecar.py::test_leftover_meta_tmp_is_not_discovered PASSED [ 46%] tests/test_raw_sidecar.py::test_v1_sidecar_loads_with_defaults PASSED [ 46%] tests/test_raw_sidecar.py::test_v2_round_trip_preserves_new_fields PASSED [ 46%] tests/test_raw_sidecar_robustness.py::test_damaged_sidecar_does_not_abort_directory_listing PASSED [ 46%] tests/test_raw_sidecar_robustness.py::test_vanishing_sidecarless_stream_does_not_abort_listing PASSED [ 46%] tests/test_raw_sidecar_robustness.py::test_corrupt_sidecar_warns_rather_than_silently_degrading PASSED [ 47%] tests/test_raw_sidecar_robustness.py::test_ssh_corrupt_remote_sidecar_warns PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_serialize_is_exactly_the_on_disk_bytes PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_local_write_sidecar_is_atomic_and_0600 PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_local_and_remote_sidecar_bytes_are_identical PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_ssh_write_sidecar_builds_atomic_script_at_meta_path PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_ssh_write_sidecar_raises_on_remote_failure PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_ssh_commit_sidecar_failure_stays_best_effort PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_remote_meta_path_equals_stream_plus_meta[snap.btrfs] PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_remote_meta_path_equals_stream_plus_meta[snap] PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_remote_meta_path_equals_stream_plus_meta[root.20240115T120000.btrfs.zst.gpg] PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_remote_meta_path_equals_stream_plus_meta[weird name.btrfs] PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_remote_meta_path_equals_stream_plus_meta[a.b.c.d.e] PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_custom_provenance_round_trips_through_write_sidecar PASSED [ 47%] tests/test_raw_sidecar_writer.py::test_local_commit_routes_through_write_sidecar PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_basic_interface PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_time_obj_is_struct_time_like_btrfs_snapshot PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_ordering_and_sort PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_name_based_equality PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_cross_type_equality_with_btrfs_snapshot PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_unhashable_like_snapshot PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_find_parent_picks_most_recent_older PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_set_lock_on_a_local_raw_target_is_held_in_memory_and_recorded PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_set_lock_on_a_raw_ssh_target_refuses_to_pretend PASSED [ 47%] tests/test_raw_snapshot_interface.py::test_list_snapshots_threads_endpoint_locally PASSED [ 47%] tests/test_raw_snapshot_time.py::test_the_zone_is_put_back_after_the_fixture PASSED [ 47%] tests/test_raw_snapshot_time.py::test_an_aware_utc_created_renders_as_local PASSED [ 47%] tests/test_raw_snapshot_time.py::test_the_rendered_time_agrees_with_the_name_beside_it PASSED [ 47%] tests/test_raw_snapshot_time.py::test_a_naive_created_is_read_as_utc PASSED [ 47%] tests/test_raw_snapshot_time.py::TestRestoreBeforeSelectsTheRightBackup::test_the_backup_just_before_the_cutoff_is_chosen PASSED [ 47%] tests/test_raw_snapshot_time.py::TestRestoreBeforeSelectsTheRightBackup::test_a_cutoff_before_every_backup_selects_none PASSED [ 47%] tests/test_raw_snapshot_time.py::TestRestoreBeforeSelectsTheRightBackup::test_a_cutoff_after_every_backup_selects_the_newest PASSED [ 47%] tests/test_raw_snapshot_time.py::test_ordering_against_a_btrfs_snapshot_is_still_well_defined PASSED [ 47%] tests/test_raw_ssh_list_errors.py::test_guard_raises_on_ssh_connection_failure PASSED [ 47%] tests/test_raw_ssh_list_errors.py::test_guard_noop_on_success PASSED [ 47%] tests/test_raw_ssh_list_errors.py::test_guard_raises_when_the_listing_command_itself_failed PASSED [ 47%] tests/test_raw_ssh_list_errors.py::test_guard_accepts_a_genuinely_empty_target PASSED [ 47%] tests/test_raw_ssh_list_errors.py::test_list_snapshots_unreachable_host_raises PASSED [ 47%] tests/test_raw_ssh_list_errors.py::test_list_snapshots_reachable_empty_target_returns_empty PASSED [ 47%] tests/test_raw_ssh_list_errors.py::test_ssh_command_fails_fast_on_a_down_host PASSED [ 47%] tests/test_raw_ssh_list_errors.py::test_streams_without_sidecar_unreachable_raises PASSED [ 47%] tests/test_raw_ssh_restore.py::test_send_reads_remote_stream_and_decompresses_locally PASSED [ 47%] tests/test_raw_ssh_restore.py::test_send_plaintext_is_just_remote_cat PASSED [ 47%] tests/test_raw_ssh_restore.py::test_send_missing_remote_stream_raises_clearly PASSED [ 47%] tests/test_raw_ssh_restore.py::test_prepare_preflight_fails_loud_when_remote_lacks_posix_tools PASSED [ 47%] tests/test_raw_ssh_restore.py::test_prepare_preflight_passes_when_tools_present PASSED [ 47%] tests/test_raw_ssh_restore.py::test_prepare_fails_loud_when_local_compress_tool_missing PASSED [ 47%] tests/test_raw_ssh_restore.py::test_send_encrypted_decrypts_locally_after_ssh_cat PASSED [ 47%] tests/test_raw_ssh_restore.py::test_send_ssh_sudo_wraps_remote_cat_in_sudo_sh_c PASSED [ 47%] tests/test_raw_ssh_restore.py::test_list_second_pass_stat_is_portable_and_sudo_scoped PASSED [ 47%] tests/test_raw_ssh_restore.py::test_remote_sidecar_size_cmd_is_portable PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_real_stream_is_recognised[s.20260110T120000.btrfs] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_real_stream_is_recognised[s.20260110T120000.btrfs.gz] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_real_stream_is_recognised[s.20260110T120000.btrfs.zst] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_real_stream_is_recognised[s.20260110T120000.btrfs.zst.gpg] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_real_stream_is_recognised[s.20260110T120000.btrfs.zst.enc] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_real_stream_is_recognised[s.20260110T120000.btrfs.gpg] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_foreign_file_is_not_a_backup[s.20260110T120000.btrfs.gz.info] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_foreign_file_is_not_a_backup[notes.btrfs.txt] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_foreign_file_is_not_a_backup[s.btrfs.bak] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_a_foreign_file_is_not_a_backup[unrelated.info] PASSED [ 47%] tests/test_raw_stream_identity.py::TestRawDiscoveryListsOnlyItsOwnStreams::test_discovery_ignores_the_sidecar PASSED [ 47%] tests/test_raw_stream_identity.py::TestEveryRawListingUsesTheSameStreamRule::test_the_backfill_scan_ignores_a_foreign_sidecar PASSED [ 47%] tests/test_raw_stream_identity.py::TestEveryRawListingUsesTheSameStreamRule::test_every_listing_site_consults_is_stream PASSED [ 47%] tests/test_raw_stream_identity.py::TestSkipRemoteLockReachesTheEndpoint::test_skip_remote_lock_reaches_a_raw_ssh_endpoint PASSED [ 47%] tests/test_raw_stream_identity.py::TestSkipRemoteLockReachesTheEndpoint::test_skip_remote_lock_still_reaches_an_ssh_endpoint PASSED [ 47%] tests/test_raw_verify.py::test_compute_stream_checksum_matches_sealed PASSED [ 47%] tests/test_raw_verify.py::test_ssh_compute_stream_checksum_delegates_to_remote PASSED [ 47%] tests/test_raw_verify.py::test_verify_all_ok PASSED [ 47%] tests/test_raw_verify.py::test_verify_detects_corruption PASSED [ 47%] tests/test_raw_verify.py::test_verify_unverifiable_when_no_recorded_checksum PASSED [ 47%] tests/test_raw_verify.py::test_verify_error_when_stream_unreadable PASSED [ 47%] tests/test_raw_verify.py::test_verify_error_over_ssh_when_remote_hash_none PASSED [ 47%] tests/test_raw_verify.py::test_verify_snapshot_filter PASSED [ 48%] tests/test_raw_verify.py::test_verify_snapshot_not_found PASSED [ 48%] tests/test_raw_verify.py::test_verify_json PASSED [ 48%] tests/test_raw_verify.py::test_verify_rejects_non_raw_scheme PASSED [ 48%] tests/test_raw_verify.py::test_verify_empty_target PASSED [ 48%] tests/test_raw_verify.py::test_verify_all_unverifiable_exits_zero PASSED [ 48%] tests/test_raw_verify.py::test_verify_unsupported_algorithm_is_unverifiable PASSED [ 48%] tests/test_raw_verify.py::test_open_target_construction_error_keeps_prefix PASSED [ 48%] tests/test_raw_verify.py::test_primitive_ok_on_intact_stream PASSED [ 48%] tests/test_raw_verify.py::test_primitive_corrupt_on_changed_bytes PASSED [ 48%] tests/test_raw_verify.py::test_primitive_unverifiable_when_no_recorded_checksum PASSED [ 48%] tests/test_raw_verify.py::test_primitive_unverifiable_on_foreign_algorithm_skips_read PASSED [ 48%] tests/test_raw_verify.py::test_primitive_error_when_stream_unreadable PASSED [ 48%] tests/test_raw_verify.py::test_primitive_ssh_marks_remote_untrusted PASSED [ 48%] tests/test_raw_verify.py::test_ssh_auth_sock_renders_as_identity_agent PASSED [ 48%] tests/test_raw_verify.py::test_dispatcher_parses_raw_verify PASSED [ 48%] tests/test_rawssh_elevates_only_when_needed.py::test_no_ssh_sudo_never_elevates_and_never_probes PASSED [ 48%] tests/test_rawssh_elevates_only_when_needed.py::test_a_target_the_user_owns_is_not_elevated PASSED [ 48%] tests/test_rawssh_elevates_only_when_needed.py::test_a_target_the_user_cannot_use_still_elevates PASSED [ 48%] tests/test_rawssh_elevates_only_when_needed.py::test_the_probe_runs_once_per_endpoint PASSED [ 48%] tests/test_rawssh_elevates_only_when_needed.py::test_the_probe_creates_nothing PASSED [ 48%] tests/test_rawssh_elevates_only_when_needed.py::test_a_direct_listing_is_not_reported_as_never_run PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestPreflightSendAsksTheRemote::test_a_stream_missing_on_the_remote_is_refused_even_though_it_exists_here PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestPreflightSendAsksTheRemote::test_a_stream_present_on_the_remote_passes_though_nothing_is_here PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestPreflightSendAsksTheRemote::test_send_performs_the_same_checks_it_delegates PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestTheIntegrityCheckIsNotPaidTwice::test_a_restore_hashes_the_stream_once PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestTheIntegrityCheckIsNotPaidTwice::test_a_corrupt_stream_is_still_refused PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestSpaceIsMeasuredOnTheRemote::test_the_figures_come_from_the_remote_filesystem PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestSpaceIsMeasuredOnTheRemote::test_a_row_whose_outer_fields_contain_spaces_is_parsed[a mount point with spaces-/dev/disk4s2 1000000 400000 600000 40% /Volumes/Backup Drive] PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestSpaceIsMeasuredOnTheRemote::test_a_row_whose_outer_fields_contain_spaces_is_parsed[a device with spaces-//user@nas/Backup Drive 1000000 400000 600000 40% /Volumes/backup] PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestSpaceIsMeasuredOnTheRemote::test_an_unreadable_remote_reports_nothing_rather_than_a_local_figure PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestSpaceIsMeasuredOnTheRemote::test_an_unparseable_table_is_not_read_as_an_empty_disk PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestRemotenessIsSettledBeforeTheBaseInitialiserRuns::test_is_remote_is_a_class_attribute PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestRemotenessIsSettledBeforeTheBaseInitialiserRuns::test_a_relative_target_path_is_not_resolved_against_the_local_cwd PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestRemotenessIsSettledBeforeTheBaseInitialiserRuns::test_the_target_path_stays_a_string PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestNoInheritedMethodTouchesTheLocalFilesystem::test_the_exemption_list_has_no_stale_entries PASSED [ 48%] tests/test_rawssh_is_actually_remote.py::TestNoInheritedMethodTouchesTheLocalFilesystem::test_inherited_methods_do_not_reach_the_local_filesystem PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: a password is required] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: a terminal is required to read the password; either use ssh's -t option] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: no askpass program specified] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: user is not in the sudoers file] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: sorry, user backup is not allowed to execute '/bin/find' as root] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: no tty present and no askpass program specified] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: sorry, you must have a tty to run sudo] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: no valid sudoers sources found, quitting] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: sudoers specifies that root is not allowed to sudo] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[sudo: effective uid is not 0, is /usr/bin/sudo on a nosuid filesystem?] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_real_sudo_refusals_are_detected[bash: sudo: command not found] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_a_refusal_in_another_language_is_still_a_refusal[de_DE.UTF-8-sudo: Ein Passwort ist notwendig] XFAIL [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_a_refusal_in_another_language_is_still_a_refusal[fr_FR.UTF-8-sudo: il est n\xe9cessaire de saisir un mot de passe] XFAIL [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_a_refusal_in_another_language_is_still_a_refusal[ja_JP.UTF-8-sudo: \u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059] XFAIL [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_a_refusal_in_another_language_is_still_a_refusal[ru_RU.UTF-8-sudo: \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c] XFAIL [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_denials_without_the_sudo_prefix_are_still_caught[Sorry, user backup is not allowed to execute '/bin/find' as root on nas.] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_denials_without_the_sudo_prefix_are_still_caught[backup is not in the sudoers file.] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_denials_without_the_sudo_prefix_are_still_caught[Sorry, user backup may not run sudo on nas.] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_sudo_warnings_that_still_run_the_command_are_not_denials[sudo: unable to load /usr/lib64/libsss_sudo.so: cannot open shared object file] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_sudo_warnings_that_still_run_the_command_are_not_denials[sudo: unable to initialize SSS source. Is SSSD installed on your machine?] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_sudo_warnings_that_still_run_the_command_are_not_denials[sudo: setrlimit(RLIMIT_CORE): Operation not permitted] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_sudo_warnings_that_still_run_the_command_are_not_denials[sudo: /etc/sudo.conf is owned by uid 1000, should be 0] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_ordinary_failures_are_not_mistaken_for_a_refusal[] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_ordinary_failures_are_not_mistaken_for_a_refusal[find: '/backup/gone': No such file or directory] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_ordinary_failures_are_not_mistaken_for_a_refusal[cat: /backup/x.btrfs: Permission denied] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoDenialIsRecognised::test_ordinary_failures_are_not_mistaken_for_a_refusal[ssh: connect to host nas port 22: No route to host] PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestListingRefusesToReportAnEmptyTarget::test_a_refused_find_raises_instead_of_returning_no_snapshots PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestListingRefusesToReportAnEmptyTarget::test_an_empty_but_reachable_target_is_still_empty PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestListingRefusesToReportAnEmptyTarget::test_an_ordinary_nonzero_is_a_failed_listing_not_a_refusal PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestListingRefusesToReportAnEmptyTarget::test_an_unreachable_host_still_raises PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestListingRefusesToReportAnEmptyTarget::test_list_snapshots_propagates_the_refusal PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoStderrSurvivesTheRedirect::test_elevated_find_keeps_the_redirect_inside_sh_c PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestSudoStderrSurvivesTheRedirect::test_the_unelevated_command_shape_is_unchanged PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestElevationIsNonInteractive::test_every_elevated_command_uses_sudo_n PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestElevationIsNonInteractive::test_no_elevation_when_ssh_sudo_is_off PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestElevationIsNonInteractive::test_the_capability_probe_is_not_elevated PASSED [ 48%] tests/test_rawssh_sudo_denial.py::TestElevationIsNonInteractive::test_the_existence_check_is_elevated_when_the_user_cannot_do_it PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsNonInteractive::test_the_existence_check_is_not_elevated_when_the_user_can_do_it PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestPrepareExplainsWhatRawSshNeeds::test_a_refused_mkdir_names_the_file_tools_not_btrfs PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestPrepareExplainsWhatRawSshNeeds::test_an_unrelated_ssh_failure_is_not_relabelled PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestSidecarCheckDoesNotInventAbsence::test_a_refused_check_raises_rather_than_reporting_no_sidecar PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestSidecarCheckDoesNotInventAbsence::test_a_benign_sudo_warning_on_success_does_not_abort PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestSidecarCheckDoesNotInventAbsence::test_a_benign_warning_with_a_real_absence_still_reports_absent PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestSidecarCheckDoesNotInventAbsence::test_a_genuinely_missing_sidecar_is_still_reported_absent PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestSidecarCheckDoesNotInventAbsence::test_a_present_sidecar_is_reported_present PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestSidecarCheckDoesNotInventAbsence::test_the_check_is_elevated_exactly_once PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestPerFileStatFailuresAreClassified::test_a_refused_stat_raises_rather_than_shrinking_the_listing PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestPerFileStatFailuresAreClassified::test_a_vanished_file_is_still_skipped PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestPerFileStatFailuresAreClassified::test_a_stattable_stream_is_still_listed PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestRetentionDoesNotSilentlyStopRunning::test_a_refused_delete_aborts_instead_of_reporting_success PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestSudoMessagesArePinnedToAPredictableLanguage::test_elevated_commands_pin_the_locale PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestSudoMessagesArePinnedToAPredictableLanguage::test_the_unelevated_command_is_untouched PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_any_failure_to_run_the_command_is_an_error_not_an_empty_target[sudo: a password is required] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_any_failure_to_run_the_command_is_an_error_not_an_empty_target[sudo: sorry, you must have a tty to run sudo] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_any_failure_to_run_the_command_is_an_error_not_an_empty_target[sudo: no valid sudoers sources found, quitting] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_any_failure_to_run_the_command_is_an_error_not_an_empty_target[sudo: sudoers specifies that root is not allowed to sudo] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_any_failure_to_run_the_command_is_an_error_not_an_empty_target[sudo: effective uid is not 0, is /usr/bin/sudo on a nosuid filesystem?] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_any_failure_to_run_the_command_is_an_error_not_an_empty_target[bash: sudo: command not found] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_any_failure_to_run_the_command_is_an_error_not_an_empty_target[sudo: irgendein unbekannter fehler] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_any_failure_to_run_the_command_is_an_error_not_an_empty_target[] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_the_sentinel_makes_an_empty_target_genuinely_empty PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_a_find_failure_after_a_real_run_blames_the_listing PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_an_unelevated_listing_is_unaffected PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_the_sentinel_never_leaks_into_a_user_facing_message PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_the_elevated_command_actually_emits_the_sentinel PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotGuessed::test_the_unelevated_command_carries_no_sentinel PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestTheSentinelDoesNotMaskTheInnerExitStatus::test_the_wrapper_captures_and_reraises_the_inner_status PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestTheSentinelDoesNotMaskTheInnerExitStatus::test_a_real_shell_propagates_the_inner_status[false-1] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestTheSentinelDoesNotMaskTheInnerExitStatus::test_a_real_shell_propagates_the_inner_status[true-0] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestTheSentinelDoesNotMaskTheInnerExitStatus::test_a_real_shell_propagates_the_inner_status[(exit 2)-2] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestTheSentinelDoesNotMaskTheInnerExitStatus::test_a_failed_elevated_listing_is_not_reported_as_an_empty_target PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestNoMessageLeaksTheInternalMarker::test_error_messages_are_sanitised[255-No route to host-Cannot reach] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestNoMessageLeaksTheInternalMarker::test_error_messages_are_sanitised[1-sudo: a password is required-never run] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestNoMessageLeaksTheInternalMarker::test_error_messages_are_sanitised[1-anything at all-never run] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotReGuessed::test_a_sudo_message_never_overrules_the_sentinel[sudo: unable to resolve host nas: Name or service not known] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotReGuessed::test_a_sudo_message_never_overrules_the_sentinel[sudo: unable to send audit message: Operation not permitted] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotReGuessed::test_a_sudo_message_never_overrules_the_sentinel[sudo: a password is required] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotReGuessed::test_an_inner_255_is_not_blamed_on_the_transport PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestElevationIsProvenNotReGuessed::test_a_transport_failure_without_the_sentinel_still_raises PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestARefusalCannotForgeTheProof::test_the_echoed_command_does_not_count_as_proof PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestARefusalCannotForgeTheProof::test_a_genuine_run_does_count_as_proof PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestARefusalCannotForgeTheProof::test_the_listing_guard_raises_on_the_echoed_refusal PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestARefusalCannotForgeTheProof::test_list_snapshots_does_not_return_empty_on_the_echoed_refusal PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestARefusalCannotForgeTheProof::test_the_emitted_command_never_contains_the_literal_marker PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestARefusalCannotForgeTheProof::test_a_real_shell_still_prints_the_marker_intact PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestTheMarkerAlwaysStartsItsOwnLine::test_a_partial_stderr_line_before_the_marker_does_not_suppress_it PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestTheMarkerAlwaysStartsItsOwnLine::test_the_emitter_starts_a_fresh_line PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestTheMarkerAlwaysStartsItsOwnLine::test_the_command_stays_a_single_line PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestTheMarkerAlwaysStartsItsOwnLine::test_splitting_the_literal_still_holds PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestFindsStderrReachesTheGuard::test_no_listing_command_discards_stderr[False] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestFindsStderrReachesTheGuard::test_no_listing_command_discards_stderr[True] PASSED [ 49%] tests/test_rawssh_sudo_denial.py::TestFindsStderrReachesTheGuard::test_the_guard_repeats_finds_reason PASSED [ 49%] tests/test_readiness_is_fresh.py::TestTheCacheItself::test_a_fresh_entry_is_reused_without_force PASSED [ 49%] tests/test_readiness_is_fresh.py::TestTheCacheItself::test_force_refresh_ignores_a_fresh_entry PASSED [ 49%] tests/test_readiness_is_fresh.py::TestTheCacheItself::test_a_stale_pass_is_still_written_into_the_config PASSED [ 49%] tests/test_readiness_is_fresh.py::TestTheTransferGateRefreshes::test_the_pre_transfer_check_forces_a_refresh PASSED [ 49%] tests/test_readiness_is_fresh.py::TestTheTransferGateRefreshes::test_force_refresh_has_at_least_one_caller_now PASSED [ 49%] tests/test_readiness_is_fresh.py::TestTheTransferGateRefreshes::test_the_inner_check_does_not_refresh_again PASSED [ 49%] tests/test_readiness_is_fresh.py::test_every_gating_key_can_still_fail_the_transfer[ssh_connection] PASSED [ 49%] tests/test_readiness_is_fresh.py::test_every_gating_key_can_still_fail_the_transfer[btrfs_command] PASSED [ 49%] tests/test_readiness_is_fresh.py::test_every_gating_key_can_still_fail_the_transfer[write_permissions] PASSED [ 49%] tests/test_readiness_is_fresh.py::test_every_gating_key_can_still_fail_the_transfer[btrfs_filesystem] PASSED [ 49%] tests/test_receiving_locks.py::TestDifferentDestinationsRunInParallel::test_two_different_subvolumes_are_not_serialised PASSED [ 49%] tests/test_receiving_locks.py::TestDifferentDestinationsRunInParallel::test_many_different_subvolumes_at_once PASSED [ 49%] tests/test_receiving_locks.py::TestTheSameDestinationIsRefused::test_a_second_transfer_to_one_path_is_refused PASSED [ 49%] tests/test_receiving_locks.py::TestTheSameDestinationIsRefused::test_the_refusal_names_the_holder PASSED [ 49%] tests/test_receiving_locks.py::TestTheSameDestinationIsRefused::test_the_path_is_free_again_afterwards PASSED [ 49%] tests/test_receiving_locks.py::TestTheSameDestinationIsRefused::test_a_failed_transfer_still_frees_the_path PASSED [ 49%] tests/test_receiving_locks.py::TestItIsReentrantWithinOneProcess::test_the_same_process_may_take_it_twice PASSED [ 50%] tests/test_receiving_locks.py::TestItIsReentrantWithinOneProcess::test_the_inner_scope_does_not_release_it_early PASSED [ 50%] tests/test_receiving_locks.py::TestTheLockRootDoesNotFollowTheTransfer::test_it_stays_on_the_target_when_the_path_is_repointed PASSED [ 50%] tests/test_receiving_locks.py::TestTheLockRootDoesNotFollowTheTransfer::test_the_pin_is_removed_afterwards PASSED [ 50%] tests/test_receiving_locks.py::TestTheLockRootDoesNotFollowTheTransfer::test_an_existing_pin_is_restored_not_clobbered PASSED [ 50%] tests/test_receiving_locks.py::TestTheDestinationIsTheReceivedSubvolume::test_it_is_named_after_the_source_basename PASSED [ 50%] tests/test_receiving_locks.py::TestTheDestinationIsTheReceivedSubvolume::test_two_snapper_slots_do_not_collide PASSED [ 50%] tests/test_receiving_locks.py::TestALocalTargetIsUnaffected::test_a_local_endpoint_is_a_no_op PASSED [ 50%] tests/test_receiving_locks.py::TestTheOperatorCanOptOut::test_skip_remote_lock_lets_an_unlockable_target_through PASSED [ 50%] tests/test_receiving_locks.py::TestTheOperatorCanOptOut::test_without_it_an_unlockable_target_stops_the_transfer PASSED [ 50%] tests/test_receiving_locks.py::TestTheLockNameIsDistinctFromASnapshotPin::test_receiving_and_pinning_do_not_share_a_name PASSED [ 50%] tests/test_receiving_locks.py::TestTheReceiveStopsBeforeItsLockGoes::test_the_ssh_receive_lock PASSED [ 50%] tests/test_receiving_locks.py::TestTheReceiveStopsBeforeItsLockGoes::test_every_exclusive_hold PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_fixture_name_does_not_round_trip PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_a_listing_returns_the_names_it_observed PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_add_snapshot_carries_the_observed_name_into_the_cache PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_a_lock_set_under_an_observed_name_survives_a_fresh_listing PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_the_ssh_listing_remembers_the_observed_name PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_snapper_metadata_is_named_after_the_name_the_backup_used PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_a_subvolume_is_a_snapshot_and_clutter_is_not PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_with_an_empty_prefix_only_the_inode_check_separates_clutter PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_a_timestamp_less_snapshot_sorts_last PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_newly_visible_snapshots_are_announced PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_an_all_canonical_pool_is_not_announced PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_a_lock_on_a_timestamp_less_snapshot_survives_relisting PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_the_ssh_listing_separates_the_same_way PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_count_based_retention_neither_counts_nor_deletes_the_undated PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_prune_marks_a_newly_visible_deletion PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_the_confirmation_marker_discriminates PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_a_collision_creates_the_suffixed_sibling PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_the_lowest_free_suffix_wins PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_the_dst_fold_pair_lands_as_base_and_suffix PASSED [ 50%] tests/test_remembered_snapshot_names.py::test_btrfs_correspondence_never_matches_by_name_even_for_suffixes PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_raw_script_element_executes[single-word-args] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_raw_script_element_executes[semicolon-and-quotes] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_raw_script_element_executes[redirect-and-or] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_raw_script_element_executes[loop-with-expansion] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_raw_script_element_executes[test-and-and] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_raw_script_element_executes[both-quote-kinds] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_raw_script_element_executes[printf-embedded-space] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_raw_script_element_executes[backtick] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_pre_quoted_script_element_is_the_bug[single-word-args] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_pre_quoted_script_element_is_the_bug[semicolon-and-quotes] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_pre_quoted_script_element_is_the_bug[redirect-and-or] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_pre_quoted_script_element_is_the_bug[loop-with-expansion] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_pre_quoted_script_element_is_the_bug[test-and-and] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_pre_quoted_script_element_is_the_bug[both-quote-kinds] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_pre_quoted_script_element_is_the_bug[printf-embedded-space] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestProducerOwnsEscaping::test_pre_quoted_script_element_is_the_bug[backtick] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestWordsInsideAScriptAreCallerQuoted::test_interpolated_path_must_be_quoted_by_the_caller[/mnt/my backup] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestWordsInsideAScriptAreCallerQuoted::test_interpolated_path_must_be_quoted_by_the_caller[/mnt/bob's] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestWordsInsideAScriptAreCallerQuoted::test_interpolated_path_must_be_quoted_by_the_caller[/mnt/a b'c$(x)] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestWordsInsideAScriptAreCallerQuoted::test_interpolated_path_must_be_quoted_by_the_caller[/mnt/back;up] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestWordsInsideAScriptAreCallerQuoted::test_unquoted_interpolation_breaks PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_script_is_passed_raw[single-word-args] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_script_is_passed_raw[semicolon-and-quotes] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_script_is_passed_raw[redirect-and-or] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_script_is_passed_raw[loop-with-expansion] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_script_is_passed_raw[test-and-and] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_script_is_passed_raw[both-quote-kinds] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_script_is_passed_raw[printf-embedded-space] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_script_is_passed_raw[backtick] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_captured_argv_executes_through_a_real_shell[single-word-args] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_captured_argv_executes_through_a_real_shell[semicolon-and-quotes] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_captured_argv_executes_through_a_real_shell[redirect-and-or] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_captured_argv_executes_through_a_real_shell[loop-with-expansion] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_captured_argv_executes_through_a_real_shell[test-and-and] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_captured_argv_executes_through_a_real_shell[both-quote-kinds] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_captured_argv_executes_through_a_real_shell[printf-embedded-space] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::TestSnapperRunShellHonoursTheContract::test_captured_argv_executes_through_a_real_shell[backtick] PASSED [ 50%] tests/test_remote_command_escaping_contract.py::test_local_branch_passes_the_script_raw_too PASSED [ 50%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_asked_only_when_the_transfer_is_compressed PASSED [ 50%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_program_asked_for_is_the_methods_decompressor[bzip2] PASSED [ 50%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_program_asked_for_is_the_methods_decompressor[gzip] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_program_asked_for_is_the_methods_decompressor[lz4] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_program_asked_for_is_the_methods_decompressor[lzo] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_program_asked_for_is_the_methods_decompressor[lzop] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_program_asked_for_is_the_methods_decompressor[pbzip2] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_program_asked_for_is_the_methods_decompressor[pigz] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_program_asked_for_is_the_methods_decompressor[xz] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_program_asked_for_is_the_methods_decompressor[zstd] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_a_missing_program_is_an_error_naming_it_and_the_host PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_a_probe_that_could_not_run_is_not_a_pass PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheProbe::test_the_answer_is_cached_with_the_other_probes PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheTransferIsRefusedBeforeAnyByte::test_the_direct_pipe_refuses PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheTransferIsRefusedBeforeAnyByte::test_the_direct_pipe_proceeds_when_the_program_is_there PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheTransferIsRefusedBeforeAnyByte::test_an_older_diagnostics_dict_without_the_key_is_not_a_refusal PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheReceivesStatusIsTheVerdict::test_a_missing_decompressor_fails_the_receive_and_is_named[sudo-n-sh] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheReceivesStatusIsTheVerdict::test_a_missing_decompressor_fails_the_receive_and_is_named[sudo-n-dash] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheReceivesStatusIsTheVerdict::test_a_missing_decompressor_fails_the_receive_and_is_named[sudo-S-sh] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheReceivesStatusIsTheVerdict::test_a_missing_decompressor_fails_the_receive_and_is_named[sudo-S-dash] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheReceivesStatusIsTheVerdict::test_a_present_decompressor_delivers_the_stream[sudo-n-sh] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheReceivesStatusIsTheVerdict::test_a_present_decompressor_delivers_the_stream[sudo-n-dash] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheReceivesStatusIsTheVerdict::test_a_present_decompressor_delivers_the_stream[sudo-S-sh] PASSED [ 51%] tests/test_remote_decompressor_probe.py::TestTheReceivesStatusIsTheVerdict::test_a_present_decompressor_delivers_the_stream[sudo-S-dash] PASSED [ 51%] tests/test_remote_destination_not_created.py::TestSshDestinationIsNeverCreated::test_a_missing_destination_refuses_and_names_the_remedy PASSED [ 51%] tests/test_remote_destination_not_created.py::TestSshDestinationIsNeverCreated::test_an_existing_destination_passes_without_a_mkdir PASSED [ 51%] tests/test_remote_destination_not_created.py::TestSshDestinationIsNeverCreated::test_a_transport_failure_keeps_its_identity PASSED [ 51%] tests/test_remote_destination_not_created.py::TestSshDestinationIsNeverCreated::test_a_probe_failure_refuses_rather_than_raising PASSED [ 51%] tests/test_remote_destination_not_created.py::TestSshDestinationIsNeverCreated::test_send_receive_stops_at_the_refusal PASSED [ 51%] tests/test_remote_destination_not_created.py::TestRawSshTargetIsNeverCreated::test_a_missing_target_refuses_with_the_remedy_and_no_mkdir PASSED [ 51%] tests/test_remote_destination_not_created.py::TestRawSshTargetIsNeverCreated::test_an_existing_target_prepares_without_a_mkdir PASSED [ 51%] tests/test_remote_destination_not_created.py::TestRawSshTargetIsNeverCreated::test_the_login_user_probe_no_longer_creates PASSED [ 51%] tests/test_remote_destination_not_created.py::TestRawSshTargetIsNeverCreated::test_a_sudo_denial_still_gets_the_sudoers_diagnosis PASSED [ 51%] tests/test_remote_destination_not_created.py::TestTheTransferEngineNeverCreates::test_a_missing_local_destination_refuses_and_creates_nothing PASSED [ 51%] tests/test_remote_destination_not_created.py::TestTheTransferEngineNeverCreates::test_a_file_at_the_local_destination_is_diagnosed PASSED [ 51%] tests/test_remote_destination_not_created.py::TestTheTransferEngineNeverCreates::test_an_existing_local_destination_passes PASSED [ 51%] tests/test_remote_destination_not_created.py::TestTheTransferEngineNeverCreates::test_a_remote_refusal_stops_the_send_with_the_endpoint_message PASSED [ 51%] tests/test_remote_destination_not_created.py::TestTheTransferEngineNeverCreates::test_a_verified_remote_destination_passes PASSED [ 51%] tests/test_remote_destination_not_created.py::TestTheTransferEngineNeverCreates::test_a_remote_endpoint_without_the_check_is_left_to_its_prepare PASSED [ 51%] tests/test_remote_locks.py::TestTheLockTreeNeverInventsTheTarget::test_acquire_on_a_missing_target_refuses_and_creates_nothing PASSED [ 51%] tests/test_remote_locks.py::TestTheLockTreeNeverInventsTheTarget::test_acquire_shared_on_a_missing_target_refuses_and_creates_nothing PASSED [ 51%] tests/test_remote_locks.py::TestTheLockTreeNeverInventsTheTarget::test_an_existing_target_still_gets_its_lock_tree PASSED [ 51%] tests/test_remote_locks.py::TestExclusion::test_a_second_holder_is_refused PASSED [ 51%] tests/test_remote_locks.py::TestExclusion::test_the_refusal_names_the_holder PASSED [ 51%] tests/test_remote_locks.py::TestExclusion::test_release_lets_the_next_contender_in PASSED [ 51%] tests/test_remote_locks.py::TestExclusion::test_concurrent_contenders_produce_exactly_one_winner PASSED [ 51%] tests/test_remote_locks.py::TestTheScriptsAreNotBashOnly::test_the_protocol_behaves_identically_under_every_posix_shell[dash] PASSED [ 51%] tests/test_remote_locks.py::TestTheScriptsAreNotBashOnly::test_the_protocol_behaves_identically_under_every_posix_shell[bash] PASSED [ 51%] tests/test_remote_locks.py::TestSharedPinsDoNotBlockEachOther::test_two_restores_can_pin_the_same_snapshot PASSED [ 51%] tests/test_remote_locks.py::TestSharedPinsDoNotBlockEachOther::test_a_backup_can_pin_what_a_restore_is_reading PASSED [ 51%] tests/test_remote_locks.py::TestSharedPinsDoNotBlockEachOther::test_the_snapshot_stays_pinned_until_the_LAST_holder_leaves PASSED [ 51%] tests/test_remote_locks.py::TestSharedPinsDoNotBlockEachOther::test_many_concurrent_holders_all_succeed PASSED [ 51%] tests/test_remote_locks.py::TestSharedPinsDoNotBlockEachOther::test_a_holder_releases_only_its_own_pin PASSED [ 51%] tests/test_remote_locks.py::TestNamesAreNotMangledIntoEachOther::test_a_snapshot_whose_name_needs_encoding_is_still_seen PASSED [ 51%] tests/test_remote_locks.py::TestNamesAreNotMangledIntoEachOther::test_two_lock_ids_that_used_to_collide_get_separate_records PASSED [ 51%] tests/test_remote_locks.py::TestNamesAreNotMangledIntoEachOther::test_encoding_is_injective_over_awkward_names PASSED [ 51%] tests/test_remote_locks.py::TestNamesAreNotMangledIntoEachOther::test_status_reports_the_real_name_not_the_encoded_one PASSED [ 51%] tests/test_remote_locks.py::TestNamesAreNotMangledIntoEachOther::test_unlock_clears_a_pin_on_an_awkwardly_named_snapshot PASSED [ 51%] tests/test_remote_locks.py::TestNamesAreNotMangledIntoEachOther::test_a_target_path_with_a_space_does_not_misdirect_the_sweeper PASSED [ 51%] tests/test_remote_locks.py::TestNamesAreNotMangledIntoEachOther::test_an_unnameable_holder_can_still_be_unlocked PASSED [ 51%] tests/test_remote_locks.py::TestNamesAreNotMangledIntoEachOther::test_an_unnameable_holder_on_an_encoded_name_still_blocks PASSED [ 51%] tests/test_remote_locks.py::TestNamesAreNotMangledIntoEachOther::test_an_unnameable_holder_reads_back_recognisably PASSED [ 51%] tests/test_remote_locks.py::TestTheAcquisitionWindow::test_a_lock_taken_microseconds_ago_is_not_treated_as_dead PASSED [ 51%] tests/test_remote_locks.py::TestTheAcquisitionWindow::test_a_genuinely_dead_lock_is_still_breakable PASSED [ 51%] tests/test_remote_locks.py::TestTheOperatorCanOptOut::test_without_the_flag_an_unrecordable_lock_stops_the_run PASSED [ 51%] tests/test_remote_locks.py::TestTheOperatorCanOptOut::test_the_flag_lets_it_continue PASSED [ 51%] tests/test_remote_locks.py::TestTheOperatorCanOptOut::test_the_flag_does_not_silence_the_readers PASSED [ 51%] tests/test_remote_locks.py::TestTheConfigOptionIsReal::test_a_target_can_carry_skip_remote_lock PASSED [ 51%] tests/test_remote_locks.py::TestTheConfigOptionIsReal::test_it_reaches_the_endpoint_config PASSED [ 51%] tests/test_remote_locks.py::TestAbandonedHoldersAreSwept::test_a_long_dead_holder_file_is_removed PASSED [ 51%] tests/test_remote_locks.py::TestAbandonedHoldersAreSwept::test_a_merely_unrefreshed_holder_is_left_alone PASSED [ 51%] tests/test_remote_locks.py::TestCleanupOnExit::test_an_interrupted_run_releases_its_pins PASSED [ 51%] tests/test_remote_locks.py::TestCleanupOnExit::test_an_exclusive_lock_taken_without_a_heartbeat_is_released_too PASSED [ 51%] tests/test_remote_locks.py::TestCleanupOnExit::test_cleanup_never_raises_on_a_broken_transport PASSED [ 51%] tests/test_remote_locks.py::TestCleanupOnExit::test_a_release_that_did_not_run_stays_registered PASSED [ 51%] tests/test_remote_locks.py::TestStaleness::test_a_dead_holder_is_broken_after_the_threshold PASSED [ 52%] tests/test_remote_locks.py::TestStaleness::test_a_live_holder_is_not_broken PASSED [ 52%] tests/test_remote_locks.py::TestStaleness::test_staleness_is_judged_on_the_target_not_the_client PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_a_slower_breaker_never_takes_a_lock_broken_meanwhile[current-date-*] PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_a_slower_breaker_never_takes_a_lock_broken_meanwhile[older-version-date-*] PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_a_slower_breaker_never_takes_a_lock_broken_meanwhile[empty-date-*] PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_a_slower_breaker_never_takes_a_lock_broken_meanwhile[current-rm-*owner.*|*info.json|*heartbeat] PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_a_slower_breaker_never_takes_a_lock_broken_meanwhile[older-version-rm-*owner.*|*info.json|*heartbeat] PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_a_slower_breaker_never_takes_a_lock_broken_meanwhile[current-rmdir-*] PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_a_slower_breaker_never_takes_a_lock_broken_meanwhile[older-version-rmdir-*] PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_a_slower_breaker_never_takes_a_lock_broken_meanwhile[empty-rmdir-*] PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_many_contenders_on_one_dead_lock_leave_one_winner PASSED [ 52%] tests/test_remote_locks.py::TestBreakingADeadLockHasOneWinner::test_a_claimant_that_finds_another_record_withdraws PASSED [ 52%] tests/test_remote_locks.py::TestAFailedMkdirIsNotContention::test_a_lock_that_cannot_be_created_says_why PASSED [ 52%] tests/test_remote_locks.py::TestReleaseTouchesOnlyItsOwnLock::test_a_holder_whose_lock_was_broken_leaves_the_successor_s_alone PASSED [ 52%] tests/test_remote_locks.py::TestReleaseTouchesOnlyItsOwnLock::test_its_heartbeat_does_not_write_itself_into_the_successor_s_lock PASSED [ 52%] tests/test_remote_locks.py::TestReleaseTouchesOnlyItsOwnLock::test_the_successor_releases_normally PASSED [ 52%] tests/test_remote_locks.py::TestListing::test_live_locks_are_listed_and_stale_ones_are_not PASSED [ 52%] tests/test_remote_locks.py::TestListing::test_a_lock_with_unreadable_details_is_still_a_lock PASSED [ 52%] tests/test_remote_locks.py::TestTheGuardAProcessConsults::test_a_snapshot_locked_by_another_process_is_blocked PASSED [ 52%] tests/test_remote_locks.py::TestTheGuardAProcessConsults::test_an_unreadable_lock_state_is_not_answered PASSED [ 52%] tests/test_remote_locks.py::TestTheGuardAProcessConsults::test_a_query_that_could_not_run_is_not_a_clean_answer PASSED [ 52%] tests/test_remote_locks.py::TestTheGuardAProcessConsults::test_nothing_locked_blocks_nothing PASSED [ 52%] tests/test_remote_locks.py::TestWriterAndReaderAgree::test_every_shape_delete_is_called_with_yields_the_same_name[snapshot0-root.20240101T120000] PASSED [ 52%] tests/test_remote_locks.py::TestWriterAndReaderAgree::test_every_shape_delete_is_called_with_yields_the_same_name[snapshot1-root.20240101T120000] PASSED [ 52%] tests/test_remote_locks.py::TestWriterAndReaderAgree::test_every_shape_delete_is_called_with_yields_the_same_name[snapshot2-root.20240101T120000] PASSED [ 52%] tests/test_remote_locks.py::TestWriterAndReaderAgree::test_every_shape_delete_is_called_with_yields_the_same_name[/backup/root.20240101T120000-root.20240101T120000] PASSED [ 52%] tests/test_remote_locks.py::TestWriterAndReaderAgree::test_the_name_the_guard_looks_up_is_the_name_set_lock_wrote PASSED [ 52%] tests/test_remote_locks.py::TestReleaseIsNotPremature::test_a_parent_lock_still_held_keeps_the_remote_lock PASSED [ 52%] tests/test_remote_locks.py::TestOneProcessOneManager::test_the_same_path_gets_the_same_manager PASSED [ 52%] tests/test_remote_locks.py::TestOneProcessOneManager::test_a_changed_path_gets_a_new_manager PASSED [ 52%] tests/test_remote_locks.py::TestOneProcessOneManager::test_locking_a_snapshot_twice_in_one_process_is_not_contention PASSED [ 52%] tests/test_remote_locks.py::TestOneProcessOneManager::test_threads_racing_for_the_manager_get_the_same_one PASSED [ 52%] tests/test_remote_locks.py::TestStatusAndUnlockTellTheTruth::test_status_reports_a_lock_taken_by_another_process PASSED [ 52%] tests/test_remote_locks.py::TestStatusAndUnlockTellTheTruth::test_a_lock_with_unreadable_details_is_reported_not_omitted PASSED [ 52%] tests/test_remote_locks.py::TestStatusAndUnlockTellTheTruth::test_unlock_releases_what_the_new_state_drops PASSED [ 52%] tests/test_remote_locks.py::TestStatusAndUnlockTellTheTruth::test_unlock_drops_one_holder_and_leaves_the_other PASSED [ 52%] tests/test_remote_locks.py::TestStatusAndUnlockTellTheTruth::test_unlock_does_not_disturb_a_running_operations_target_lock PASSED [ 52%] tests/test_remote_locks.py::TestReleaseIsNotRecursive::test_an_unexpected_file_is_left_alone_rather_than_deleted PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_a_heartbeat_that_appears_between_two_stats_reads_as_busy PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_a_stat_that_prints_a_status_block_is_never_arithmetic PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_a_lock_that_vanished_between_the_mkdir_and_the_stat_is_taken PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_every_lock_script_parses_and_reads_time_through_one_function PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_the_holder_scan_does_arithmetic_only_on_integers PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_a_date_without_epoch_seconds_is_never_arithmetic PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_a_lock_taken_microseconds_ago_is_listed_as_live PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_is_locked_answers_live_stale_and_unreadable_correctly[sh] PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_is_locked_answers_live_stale_and_unreadable_correctly[dash] PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_is_locked_answers_live_stale_and_unreadable_correctly[bash] PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_is_locked_never_answers_not_locked_when_it_could_not_ask PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_a_target_clock_that_cannot_be_read_holds_every_pin PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_unlock_all_does_not_sweep_a_pin_whose_age_cannot_be_read PASSED [ 52%] tests/test_remote_locks.py::TestTheAgeIsAlwaysAnInteger::test_a_lock_root_that_cannot_be_listed_is_not_an_empty_one PASSED [ 52%] tests/test_remote_shell_quoting.py::TestReceiveChunkedQuotesDest::test_nasty_path_passed_raw PASSED [ 52%] tests/test_remote_shell_quoting.py::TestReceiveChunkedQuotesDest::test_clean_path_unchanged PASSED [ 52%] tests/test_remote_shell_quoting.py::TestExecRemoteCommandQuotesElements::test_path_element_with_space_is_quoted PASSED [ 52%] tests/test_remote_shell_quoting.py::TestExecRemoteCommandQuotesElements::test_metachars_are_neutralized PASSED [ 52%] tests/test_remote_shell_quoting.py::TestExecRemoteCommandQuotesElements::test_clean_elements_unchanged PASSED [ 52%] tests/test_remote_shell_quoting.py::TestDiagnoseQuotesPaths::test_write_permissions_quotes_path PASSED [ 52%] tests/test_remote_shell_quoting.py::TestDiagnoseQuotesPaths::test_btrfs_filesystem_quotes_path PASSED [ 52%] tests/test_remote_shell_quoting.py::TestDiagnoseQuotesPaths::test_btrfs_receive_quotes_sudo_path PASSED [ 52%] tests/test_remote_shell_quoting.py::TestDiagnoseQuotesPaths::test_clean_path_not_extra_quoted PASSED [ 52%] tests/test_remove_locks_flag.py::test_it_removes_the_locks_of_the_named_destinations PASSED [ 52%] tests/test_remove_locks_flag.py::test_it_leaves_another_destinations_lock_alone PASSED [ 52%] tests/test_remove_locks_flag.py::test_it_removes_parent_locks_too PASSED [ 52%] tests/test_remove_locks_flag.py::test_the_count_it_reports_is_the_number_it_removed PASSED [ 52%] tests/test_remove_locks_flag.py::test_run_task_actually_consults_the_flag PASSED [ 52%] tests/test_rename_noreplace.py::test_renames_onto_an_absent_target PASSED [ 52%] tests/test_rename_noreplace.py::test_refuses_an_existing_empty_directory_where_os_rename_would_replace_it PASSED [ 52%] tests/test_rename_noreplace.py::test_refuses_an_existing_file_and_a_populated_directory PASSED [ 52%] tests/test_rename_noreplace.py::test_a_missing_source_is_an_ordinary_oserror PASSED [ 52%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_nothing_is_transferred_to_an_unmounted_local_target[True-local] PASSED [ 52%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_nothing_is_transferred_to_an_unmounted_local_target[True-raw] PASSED [ 52%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_nothing_is_transferred_to_an_unmounted_local_target[MOUNT-local] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_nothing_is_transferred_to_an_unmounted_local_target[MOUNT-raw] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_a_mounted_drive_lets_the_backup_through[local] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_a_mounted_drive_lets_the_backup_through[raw] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_a_subdirectory_under_a_mounted_drive_is_allowed PASSED [ 53%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_a_subdirectory_is_stopped_when_the_drive_is_absent PASSED [ 53%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_remote_targets_are_not_blocked_by_the_local_mount_table[ssh://user@host:/backups] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAnAbsentDriveStopsTheBackup::test_remote_targets_are_not_blocked_by_the_local_mount_table[raw+ssh://user@host/backups] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheTransferCommandEnforcesItToo::test_an_unmounted_target_transfers_nothing[True-local] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheTransferCommandEnforcesItToo::test_an_unmounted_target_transfers_nothing[True-raw] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheTransferCommandEnforcesItToo::test_an_unmounted_target_transfers_nothing[MOUNT-local] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheTransferCommandEnforcesItToo::test_an_unmounted_target_transfers_nothing[MOUNT-raw] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheTransferCommandEnforcesItToo::test_a_mounted_target_is_allowed[local] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheTransferCommandEnforcesItToo::test_a_mounted_target_is_allowed[raw] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheTransferCommandEnforcesItToo::test_a_subdirectory_under_a_mounted_drive_is_allowed PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_the_dangerous_values_still_fail_at_load[""] PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_the_dangerous_values_still_fail_at_load[" "] PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_the_dangerous_values_still_fail_at_load[[1]] PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_the_dangerous_values_still_fail_at_load["mnt/backup"] PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_the_dangerous_values_still_fail_at_load["/"] PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_the_dangerous_values_still_fail_at_load["/mnt/.."] PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_the_dangerous_values_still_fail_at_load[123] PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_the_dangerous_values_still_fail_at_load[1.5] PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_a_mount_point_loads_and_reaches_the_target PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_booleans_still_load[true-True] PASSED [ 53%] tests/test_require_mount_enforced.py::TestValidationIsWiredIntoTheLoader::test_booleans_still_load[false-False] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_a_subdirectory_gets_the_mount_point FAILED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_a_mount_point_target_keeps_true PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_a_deep_target_finds_the_real_mount FAILED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_it_declines_to_guess_when_nothing_is_mounted PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_it_never_invents_a_mount_point_that_cannot_exist[/mnt/backup] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_it_never_invents_a_mount_point_that_cannot_exist[/run/media/operator/USB-DRIVE] PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_a_raw_uri_target_is_seen_through FAILED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_it_never_names_a_memory_backed_filesystem PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_an_unreadable_mount_table_does_not_crash_the_wizard PASSED [ 53%] tests/test_require_mount_enforced.py::TestTheWizardDerivesAUsableValue::test_what_it_derives_always_loads PASSED [ 53%] tests/test_require_mount_enforced.py::TestAMountPointIsRefusedForARemoteTarget::test_a_string_on_a_remote_target_warns[ssh://backup@server:/backups/box1] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAMountPointIsRefusedForARemoteTarget::test_a_string_on_a_remote_target_warns[raw+ssh://backup@server/backups/box1] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAMountPointIsRefusedForARemoteTarget::test_true_on_a_remote_target_still_loads[ssh://backup@server:/backups/box1] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAMountPointIsRefusedForARemoteTarget::test_true_on_a_remote_target_still_loads[raw+ssh://backup@server/backups/box1] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAMountPointIsRefusedForARemoteTarget::test_a_string_on_a_local_target_is_unaffected[/mnt/backup/box1] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAMountPointIsRefusedForARemoteTarget::test_a_string_on_a_local_target_is_unaffected[raw:///mnt/backup/box1] PASSED [ 53%] tests/test_require_mount_enforced.py::TestAMountPointIsRefusedForARemoteTarget::test_the_bare_user_at_host_form_is_left_to_the_gate PASSED [ 53%] tests/test_require_mount_enforced.py::TestAConfigThatCanNeverRunIsNamedAtLoad::test_a_target_outside_its_named_mount_is_warned_about PASSED [ 53%] tests/test_require_mount_enforced.py::TestAConfigThatCanNeverRunIsNamedAtLoad::test_it_still_loads_so_other_targets_keep_working PASSED [ 53%] tests/test_require_mount_enforced.py::TestAConfigThatCanNeverRunIsNamedAtLoad::test_the_gate_still_refuses_that_target PASSED [ 53%] tests/test_require_mount_enforced.py::TestAConfigThatCanNeverRunIsNamedAtLoad::test_a_correct_pairing_is_not_warned_about PASSED [ 53%] tests/test_require_mount_path.py::TestTheSubdirectoryCaseNowWorks::test_a_subdirectory_of_a_mounted_drive_passes PASSED [ 53%] tests/test_require_mount_path.py::TestTheSubdirectoryCaseNowWorks::test_the_mount_point_itself_still_passes PASSED [ 53%] tests/test_require_mount_path.py::TestTheSubdirectoryCaseNowWorks::test_a_deeper_subdirectory_passes PASSED [ 53%] tests/test_require_mount_path.py::TestTheSubdirectoryCaseNowWorks::test_the_drive_being_absent_still_aborts PASSED [ 53%] tests/test_require_mount_path.py::TestTheSubdirectoryCaseNowWorks::test_a_raw_target_under_the_mount_passes PASSED [ 53%] tests/test_require_mount_path.py::TestAMountThatProtectsNothingIsRefused::test_a_target_outside_the_named_mount_aborts PASSED [ 53%] tests/test_require_mount_path.py::TestAMountThatProtectsNothingIsRefused::test_it_aborts_even_when_the_named_mount_is_present PASSED [ 53%] tests/test_require_mount_path.py::TestAMountThatProtectsNothingIsRefused::test_a_sibling_with_a_shared_prefix_is_not_inside PASSED [ 53%] tests/test_require_mount_path.py::TestTheBooleanFormIsUnchanged::test_true_still_requires_the_target_itself_to_be_a_mount PASSED [ 53%] tests/test_require_mount_path.py::TestTheBooleanFormIsUnchanged::test_true_still_refuses_a_subdirectory PASSED [ 53%] tests/test_require_mount_path.py::TestTheBooleanFormIsUnchanged::test_false_checks_nothing PASSED [ 53%] tests/test_require_mount_path.py::TestTheBooleanFormIsUnchanged::test_remote_targets_stay_exempt[ssh://user@host:/backups] PASSED [ 53%] tests/test_require_mount_path.py::TestTheBooleanFormIsUnchanged::test_remote_targets_stay_exempt[raw+ssh://user@host/backups] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_a_path_is_accepted PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_booleans_are_accepted[True] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_booleans_are_accepted[False] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_numbers_are_coerced_by_truthiness[1-True] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_numbers_are_coerced_by_truthiness[0-False] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_numbers_are_coerced_by_truthiness[1.5-True] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_numbers_are_coerced_by_truthiness[0.0-False] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[true-True] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[True-True] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[yes-True] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[on-True] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[1-True] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[false-False] PASSED [ 53%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[FALSE-False] PASSED [ 54%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[no-False] PASSED [ 54%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[off-False] PASSED [ 54%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_quoted_booleans_are_coerced[0-False] PASSED [ 54%] tests/test_require_mount_path.py::TestBadValuesAreCoercedAndNamed::test_a_relative_path_is_kept_for_the_gate_to_refuse PASSED [ 54%] tests/test_require_mount_path.py::TestTheTwoValuesThatStillFailLoudly::test_an_empty_string_is_rejected[] PASSED [ 54%] tests/test_require_mount_path.py::TestTheTwoValuesThatStillFailLoudly::test_an_empty_string_is_rejected[ ] PASSED [ 54%] tests/test_require_mount_path.py::TestTheTwoValuesThatStillFailLoudly::test_an_empty_string_is_rejected[\t] PASSED [ 54%] tests/test_require_mount_path.py::TestTheTwoValuesThatStillFailLoudly::test_uninterpretable_types_are_rejected[value0] PASSED [ 54%] tests/test_require_mount_path.py::TestTheTwoValuesThatStillFailLoudly::test_uninterpretable_types_are_rejected[value1] PASSED [ 54%] tests/test_require_mount_path.py::TestTheTwoValuesThatStillFailLoudly::test_uninterpretable_types_are_rejected[None] PASSED [ 54%] tests/test_require_mount_path.py::TestAVacuousMountLoadsButCannotRun::test_it_loads[/] PASSED [ 54%] tests/test_require_mount_path.py::TestAVacuousMountLoadsButCannotRun::test_it_loads[//] PASSED [ 54%] tests/test_require_mount_path.py::TestAVacuousMountLoadsButCannotRun::test_it_loads[/.] PASSED [ 54%] tests/test_require_mount_path.py::TestAVacuousMountLoadsButCannotRun::test_it_loads[/mnt/..] PASSED [ 54%] tests/test_require_mount_path.py::TestAVacuousMountLoadsButCannotRun::test_the_gate_refuses_it[/] PASSED [ 54%] tests/test_require_mount_path.py::TestAVacuousMountLoadsButCannotRun::test_the_gate_refuses_it[/.] PASSED [ 54%] tests/test_require_mount_path.py::TestAVacuousMountLoadsButCannotRun::test_the_gate_refuses_it[/mnt/..] PASSED [ 54%] tests/test_require_mount_path.py::TestTheConfigWriterPreservesIt::test_a_mount_point_survives_a_round_trip PASSED [ 54%] tests/test_require_mount_path.py::TestTheConfigWriterPreservesIt::test_the_written_value_loads_back_unchanged PASSED [ 54%] tests/test_require_mount_path.py::TestTheConfigWriterPreservesIt::test_true_still_emits_a_boolean PASSED [ 54%] tests/test_require_mount_path.py::TestTheConfigWriterPreservesIt::test_false_emits_nothing PASSED [ 54%] tests/test_restore.py::TestFindSnapshotByName::test_finds_existing PASSED [ 54%] tests/test_restore.py::TestFindSnapshotByName::test_returns_none_for_missing PASSED [ 54%] tests/test_restore.py::TestFindSnapshotByName::test_empty_list PASSED [ 54%] tests/test_restore.py::TestFindSnapshotBeforeTime::test_finds_most_recent_before PASSED [ 54%] tests/test_restore.py::TestFindSnapshotBeforeTime::test_returns_none_if_all_after PASSED [ 54%] tests/test_restore.py::TestFindSnapshotBeforeTime::test_includes_exact_match PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestination::test_validates_existing_btrfs PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestination::test_creates_missing_directory PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestination::test_rejects_non_btrfs PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestination::test_in_place_requires_force PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestination::test_in_place_with_force PASSED [ 54%] tests/test_restore.py::TestListRemoteSnapshots::test_lists_all PASSED [ 54%] tests/test_restore.py::TestListRemoteSnapshots::test_filters_by_prefix PASSED [ 54%] tests/test_restore.py::TestExecuteStatus::test_status_no_source PASSED [ 54%] tests/test_restore.py::TestFindSnapshotBeforeTimeEdgeCases::test_snapshot_without_time_obj_attribute PASSED [ 54%] tests/test_restore.py::TestFindSnapshotBeforeTimeEdgeCases::test_snapshot_with_none_time_obj PASSED [ 54%] tests/test_restore.py::TestFindSnapshotBeforeTimeEdgeCases::test_mixed_snapshots_some_without_time PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestinationEdgeCases::test_in_place_with_force_allowed PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestinationEdgeCases::test_creates_nested_directories PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestinationEdgeCases::test_mkdir_permission_error PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestinationEdgeCases::test_status_no_locks PASSED [ 54%] tests/test_restore.py::TestValidateRestoreDestinationEdgeCases::test_status_with_restore_locks PASSED [ 54%] tests/test_restore.py::TestExecuteUnlock::test_unlock_no_source PASSED [ 54%] tests/test_restore.py::TestExecuteUnlock::test_unlock_no_lock_file PASSED [ 54%] tests/test_restore.py::TestExecuteUnlock::test_unlock_all_restore_locks PASSED [ 54%] tests/test_restore.py::TestExecuteUnlock::test_unlock_specific_session PASSED [ 54%] tests/test_restore.py::TestExecuteUnlock::test_unlock_nonexistent_session PASSED [ 54%] tests/test_restore.py::TestExecuteListVolumes::test_list_volumes_no_config PASSED [ 54%] tests/test_restore.py::TestExecuteListVolumes::test_list_volumes_empty_config PASSED [ 54%] tests/test_restore.py::TestExecuteListVolumes::test_list_volumes_with_volumes PASSED [ 54%] tests/test_restore.py::TestExecuteConfigRestore::test_config_restore_no_config PASSED [ 54%] tests/test_restore.py::TestExecuteConfigRestore::test_config_restore_volume_not_found PASSED [ 54%] tests/test_restore.py::TestExecuteConfigRestore::test_config_restore_no_targets PASSED [ 54%] tests/test_restore.py::TestExecuteConfigRestore::test_config_restore_invalid_target_index PASSED [ 54%] tests/test_restore.py::TestExecuteConfigRestore::test_config_restore_list_mode PASSED [ 54%] tests/test_restore.py::TestExecuteConfigRestore::test_config_restore_no_destination PASSED [ 54%] tests/test_restore.py::TestExecuteRestore::test_no_source_shows_error PASSED [ 54%] tests/test_restore.py::TestExecuteRestore::test_no_destination_shows_error PASSED [ 54%] tests/test_restore.py::TestExecuteRestore::test_list_volumes_mode PASSED [ 54%] tests/test_restore.py::TestExecuteRestore::test_volume_mode PASSED [ 54%] tests/test_restore.py::TestExecuteRestore::test_list_mode PASSED [ 54%] tests/test_restore.py::TestExecuteRestore::test_status_mode PASSED [ 54%] tests/test_restore.py::TestExecuteRestore::test_unlock_mode PASSED [ 54%] tests/test_restore.py::TestExecuteRestore::test_cleanup_mode PASSED [ 54%] tests/test_restore.py::TestExecuteMainRestore::test_destination_validation_failure PASSED [ 54%] tests/test_restore.py::TestExecuteMainRestore::test_backup_endpoint_failure PASSED [ 54%] tests/test_restore.py::TestExecuteMainRestore::test_local_endpoint_failure PASSED [ 54%] tests/test_restore.py::TestExecuteMainRestore::test_restore_error PASSED [ 54%] tests/test_restore.py::TestExecuteMainRestore::test_successful_restore PASSED [ 54%] tests/test_restore.py::TestExecuteMainRestore::test_restore_with_failures_returns_1 PASSED [ 54%] tests/test_restore.py::TestExecuteMainRestore::test_invalid_before_date_format PASSED [ 54%] tests/test_restore.py::TestExecuteList::test_list_no_source PASSED [ 55%] tests/test_restore.py::TestExecuteList::test_list_endpoint_failure PASSED [ 55%] tests/test_restore.py::TestExecuteList::test_list_empty PASSED [ 55%] tests/test_restore.py::TestExecuteList::test_list_with_snapshots PASSED [ 55%] tests/test_restore.py::TestExecuteList::test_list_exception PASSED [ 55%] tests/test_restore.py::TestPrepareBackupEndpoint::test_local_endpoint PASSED [ 55%] tests/test_restore.py::TestPrepareBackupEndpoint::test_ssh_endpoint PASSED [ 55%] tests/test_restore.py::TestPrepareLocalEndpoint::test_creates_directory PASSED [ 55%] tests/test_restore.py::TestPrepareLocalEndpoint::test_threads_timestamp_format PASSED [ 55%] tests/test_restore.py::TestPrepareLocalEndpoint::test_calls_prepare PASSED [ 55%] tests/test_restore.py::TestParseDatetime::test_parse_date_only PASSED [ 55%] tests/test_restore.py::TestParseDatetime::test_parse_date_with_time PASSED [ 55%] tests/test_restore.py::TestParseDatetime::test_parse_date_with_time_no_seconds PASSED [ 55%] tests/test_restore.py::TestParseDatetime::test_parse_iso_format PASSED [ 55%] tests/test_restore.py::TestParseDatetime::test_parse_invalid_format PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_no_snapshots_returns_none PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_exception_returns_none PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_cancel_returns_none PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_empty_input_returns_none PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_select_and_confirm PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_select_and_decline PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_invalid_input_then_valid PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_out_of_range_then_valid PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_keyboard_interrupt PASSED [ 55%] tests/test_restore.py::TestInteractiveSelect::test_eof_error PASSED [ 55%] tests/test_restore.py::TestExecuteListVolumesExtended::test_no_config_file PASSED [ 55%] tests/test_restore.py::TestExecuteListVolumesExtended::test_config_load_error PASSED [ 55%] tests/test_restore.py::TestExecuteListVolumesExtended::test_no_volumes_configured PASSED [ 55%] tests/test_restore.py::TestExecuteListVolumesExtended::test_lists_volumes_with_targets PASSED [ 55%] tests/test_restore.py::TestExecuteConfigRestoreExtended::test_no_config_file PASSED [ 55%] tests/test_restore.py::TestExecuteConfigRestoreExtended::test_config_load_error PASSED [ 55%] tests/test_restore.py::TestExecuteConfigRestoreExtended::test_volume_not_found PASSED [ 55%] tests/test_restore.py::TestExecuteConfigRestoreExtended::test_volume_no_targets PASSED [ 55%] tests/test_restore.py::TestExecuteConfigRestoreExtended::test_invalid_target_index PASSED [ 55%] tests/test_restore.py::TestExecuteConfigRestoreExtended::test_list_mode_with_config PASSED [ 55%] tests/test_restore.py::TestExecuteConfigRestoreExtended::test_no_destination_for_restore PASSED [ 55%] tests/test_restore.py::TestExecuteConfigRestoreExtended::test_successful_config_restore PASSED [ 55%] tests/test_restore.py::TestExecuteStatusDetailed::test_endpoint_prepare_fails PASSED [ 55%] tests/test_restore.py::TestExecuteStatusDetailed::test_status_with_mixed_locks PASSED [ 55%] tests/test_restore.py::TestExecuteStatusDetailed::test_status_with_no_lock_file_reports_no_locks PASSED [ 55%] tests/test_restore.py::TestExecuteStatusDetailed::test_status_that_cannot_read_the_locks_is_not_a_clean_report PASSED [ 55%] tests/test_restore.py::TestExecuteUnlockDetailed::test_endpoint_prepare_fails PASSED [ 55%] tests/test_restore.py::TestExecuteUnlockDetailed::test_unlock_lock_read_error PASSED [ 55%] tests/test_restore.py::TestExecuteUnlockDetailed::test_unlock_empty_locks PASSED [ 55%] tests/test_restore.py::TestExecuteUnlockDetailed::test_unlock_specific_session PASSED [ 55%] tests/test_restore.py::TestExecuteUnlockDetailed::test_unlock_all_restore_locks PASSED [ 55%] tests/test_restore.py::TestExecuteMainRestoreExtended::test_destination_validation_fails PASSED [ 55%] tests/test_restore.py::TestExecuteMainRestoreExtended::test_backup_endpoint_fails PASSED [ 55%] tests/test_restore.py::TestExecuteMainRestoreExtended::test_local_endpoint_fails PASSED [ 55%] tests/test_restore.py::TestExecuteMainRestoreExtended::test_invalid_before_datetime PASSED [ 55%] tests/test_restore.py::TestListSnapperBackups::test_a_directory_without_a_snapper_layout_raises PASSED [ 55%] tests/test_restore.py::TestListSnapperBackups::test_an_empty_snapshots_dir_is_genuinely_empty PASSED [ 55%] tests/test_restore.py::TestListSnapperBackups::test_finds_numbered_snapshots PASSED [ 55%] tests/test_restore.py::TestListSnapperBackups::test_ignores_non_numeric_directories PASSED [ 55%] tests/test_restore.py::TestListSnapperBackups::test_ignores_directories_without_snapshot_subdir PASSED [ 55%] tests/test_restore.py::TestListSnapperBackups::test_parses_info_xml PASSED [ 55%] tests/test_restore.py::TestListSnapperBackups::test_handles_invalid_info_xml PASSED [ 55%] tests/test_restore.py::TestListSnapperBackups::test_returns_sorted_by_number PASSED [ 55%] tests/test_restore.py::TestListRawSnapperBackups::test_backup_metadata_from_dict_round_trips PASSED [ 55%] tests/test_restore.py::TestListRawSnapperBackups::test_local_raw_enumeration_sorted PASSED [ 55%] tests/test_restore.py::TestListRawSnapperBackups::test_local_raw_metadata_fields_preserved PASSED [ 55%] tests/test_restore.py::TestListRawSnapperBackups::test_ignores_non_snapper_sidecars PASSED [ 55%] tests/test_restore.py::TestListRawSnapperBackups::test_bad_sidecar_is_skipped PASSED [ 55%] tests/test_restore.py::TestListRawSnapperBackups::test_missing_dir_raises PASSED [ 55%] tests/test_restore.py::TestListRawSnapperBackups::test_an_existing_raw_dir_with_no_sidecars_is_empty PASSED [ 55%] tests/test_restore.py::TestListRawSnapperBackups::test_remote_raw_ssh_enumeration PASSED [ 55%] tests/test_restore.py::TestRawSnapperResolutionFixes::test_list_duplicate_numbers_stable_order PASSED [ 55%] tests/test_restore.py::TestRawSnapperResolutionFixes::test_endpoint_options_threaded_into_choose_endpoint PASSED [ 55%] tests/test_restore.py::TestRemoteSnapperEnumerationErrors::test_success_parses_names PASSED [ 55%] tests/test_restore.py::TestRemoteSnapperEnumerationErrors::test_missing_dir_returns_empty PASSED [ 55%] tests/test_restore.py::TestRemoteSnapperEnumerationErrors::test_permission_denied_raises_actionable PASSED [ 55%] tests/test_restore.py::TestRemoteSnapperEnumerationErrors::test_unreachable_host_raises PASSED [ 55%] tests/test_restore.py::TestRestoreDecryptOptions::test_keyring_and_cipher_threaded PASSED [ 55%] tests/test_restore.py::TestRestoreDecryptOptions::test_absent_flags_not_threaded PASSED [ 56%] tests/test_restore.py::TestRestoreInfersTheSnapshotPrefix::test_a_single_present_prefix_is_applied_and_finds_the_backups PASSED [ 56%] tests/test_restore.py::TestRestoreInfersTheSnapshotPrefix::test_two_prefixes_are_ambiguous_and_must_not_be_guessed PASSED [ 56%] tests/test_restore.py::TestRestoreInfersTheSnapshotPrefix::test_a_genuinely_empty_location_infers_nothing PASSED [ 56%] tests/test_restore.py::TestRestoreInfersTheSnapshotPrefix::test_the_prefix_is_put_back_if_it_still_finds_nothing PASSED [ 56%] tests/test_restore.py::TestRestoreInfersTheSnapshotPrefix::test_an_endpoint_without_the_capability_does_not_break PASSED [ 56%] tests/test_restore.py::TestRestoreInfersTheSnapshotPrefix::test_a_restore_that_still_finds_nothing_fails PASSED [ 56%] tests/test_restore.py::TestRestoreInfersTheSnapshotPrefix::test_restore_snapshots_actually_calls_the_inference PASSED [ 56%] tests/test_restore.py::TestRestoreInfersTheSnapshotPrefix::test_an_explicit_prefix_is_never_replaced PASSED [ 56%] tests/test_restore.py::TestRestoreInfersTheSnapshotPrefix::test_inference_still_runs_when_no_prefix_was_given PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheLatestBringsItsChainOntoEmptyMedia::test_the_chain_is_sent_oldest_first_with_the_backup_side_parents PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheLatestBringsItsChainOntoEmptyMedia::test_the_selection_by_name_is_expanded_too PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheLatestBringsItsChainOntoEmptyMedia::test_the_oldest_alone_lands_one_subvolume PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheLatestBringsItsChainOntoEmptyMedia::test_no_incremental_sends_the_chain_in_full PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheLatestBringsItsChainOntoEmptyMedia::test_options_reach_every_transfer PASSED [ 56%] tests/test_restore_as_transfer.py::TestPresenceIsCorrespondenceNotName::test_a_rerun_after_success_skips_by_the_streams_identity PASSED [ 56%] tests/test_restore_as_transfer.py::TestPresenceIsCorrespondenceNotName::test_all_present_under_all_counts_every_target_as_skipped PASSED [ 56%] tests/test_restore_as_transfer.py::TestPresenceIsCorrespondenceNotName::test_a_present_ancestor_is_the_parent_and_is_not_resent PASSED [ 56%] tests/test_restore_as_transfer.py::TestPresenceIsCorrespondenceNotName::test_a_present_middle_ancestor_stops_the_chain PASSED [ 56%] tests/test_restore_as_transfer.py::TestASameNameStrangerIsRefusedBeforeStreaming::test_a_subvolume_without_received_uuid_is_refused_and_left PASSED [ 56%] tests/test_restore_as_transfer.py::TestASameNameStrangerIsRefusedBeforeStreaming::test_a_copy_of_something_else_is_refused PASSED [ 56%] tests/test_restore_as_transfer.py::TestASameNameStrangerIsRefusedBeforeStreaming::test_an_identity_that_cannot_be_read_is_not_assumed_absent PASSED [ 56%] tests/test_restore_as_transfer.py::TestASameNameStrangerIsRefusedBeforeStreaming::test_a_plain_directory_is_refused PASSED [ 56%] tests/test_restore_as_transfer.py::TestASameNameStrangerIsRefusedBeforeStreaming::test_the_whole_plan_is_checked_before_anything_moves PASSED [ 56%] tests/test_restore_as_transfer.py::TestASameNameStrangerIsRefusedBeforeStreaming::test_the_dry_run_refuses_what_the_run_refuses PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheRunHoldsRestorePinsAndReleasesThemOnFailure::test_pins_are_taken_under_the_restore_session_id PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheRunHoldsRestorePinsAndReleasesThemOnFailure::test_a_clean_run_leaves_nothing_pinned PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheRunHoldsRestorePinsAndReleasesThemOnFailure::test_a_failed_receive_releases_the_snapshot_and_parent_pins PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheRunHoldsRestorePinsAndReleasesThemOnFailure::test_a_failure_is_counted_named_and_its_dependants_not_streamed PASSED [ 56%] tests/test_restore_as_transfer.py::TestThePreviewIsTheRun::test_the_dry_run_prints_exactly_the_plan_the_run_executes[selection0-False-False] PASSED [ 56%] tests/test_restore_as_transfer.py::TestThePreviewIsTheRun::test_the_dry_run_prints_exactly_the_plan_the_run_executes[selection1-False-True] PASSED [ 56%] tests/test_restore_as_transfer.py::TestThePreviewIsTheRun::test_the_dry_run_prints_exactly_the_plan_the_run_executes[selection2-True-False] PASSED [ 56%] tests/test_restore_as_transfer.py::TestThePreviewIsTheRun::test_the_dry_run_prints_exactly_the_plan_the_run_executes[selection3-True-False] PASSED [ 56%] tests/test_restore_as_transfer.py::TestThePreviewIsTheRun::test_the_first_previews_as_full PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheRunMarker::test_a_marker_names_the_receive_while_it_runs_and_is_gone_after PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheRunMarker::test_a_marker_records_the_landing_path_and_this_process PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheRunMarker::test_a_failed_receive_whose_partial_was_removed_leaves_no_marker PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheRunMarker::test_a_failed_receive_whose_partial_remains_keeps_its_marker PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheRunMarker::test_progress_is_reported_per_receive PASSED [ 56%] tests/test_restore_as_transfer.py::TestSelectionErrorsAreRaisedBeforeAnythingMoves::test_a_named_snapshot_that_is_not_there PASSED [ 56%] tests/test_restore_as_transfer.py::TestSelectionErrorsAreRaisedBeforeAnythingMoves::test_no_snapshot_before_the_time PASSED [ 56%] tests/test_restore_as_transfer.py::TestSelectionErrorsAreRaisedBeforeAnythingMoves::test_before_time_picks_the_newest_not_after_it PASSED [ 56%] tests/test_restore_as_transfer.py::TestSelectionErrorsAreRaisedBeforeAnythingMoves::test_an_empty_location_is_a_failed_restore_with_the_diagnosis PASSED [ 56%] tests/test_restore_as_transfer.py::TestARawSourceRestoresItsStoredChain::test_one_increment_onto_empty_media_brings_its_parent_first PASSED [ 56%] tests/test_restore_as_transfer.py::TestARawSourceRestoresItsStoredChain::test_an_increment_whose_parent_is_gone_is_refused_before_streaming PASSED [ 56%] tests/test_restore_as_transfer.py::TestTheDestinationIsReadUnderTheSourcesPrefix::test_the_prefix_is_copied_and_the_listing_flushed PASSED [ 56%] tests/test_restore_as_transfer.py::test_the_removed_planners_are_gone_not_neutralised PASSED [ 56%] tests/test_restore_configured_options.py::TestAConfiguredPasswordAuthChoiceReachesTheRestore::test_an_explicit_false_is_carried PASSED [ 56%] tests/test_restore_configured_options.py::TestAConfiguredPasswordAuthChoiceReachesTheRestore::test_the_default_true_is_not_reported_as_a_choice PASSED [ 56%] tests/test_restore_configured_options.py::TestAConfiguredPasswordAuthChoiceReachesTheRestore::test_an_explicit_false_sudo_still_matches_the_default PASSED [ 56%] tests/test_restore_configured_options.py::TestAConfiguredPasswordAuthChoiceReachesTheRestore::test_the_endpoint_is_told_not_to_fall_back PASSED [ 56%] tests/test_restore_configured_options.py::TestAConfiguredPasswordAuthChoiceReachesTheRestore::test_the_fallback_stays_on_when_nothing_disables_it PASSED [ 56%] tests/test_restore_destination_prefix_parity.py::TestAnAlreadyRestoredSnapshotIsSkipped::test_the_destination_is_listed_under_the_inferred_prefix PASSED [ 56%] tests/test_restore_destination_prefix_parity.py::TestAnAlreadyRestoredSnapshotIsSkipped::test_the_present_snapshot_is_not_in_the_restore_set PASSED [ 56%] tests/test_restore_destination_prefix_parity.py::TestTheGuardsAroundTheSync::test_a_memoised_destination_listing_is_not_trusted PASSED [ 56%] tests/test_restore_destination_prefix_parity.py::TestTheGuardsAroundTheSync::test_a_non_string_prefix_is_not_copied_through PASSED [ 56%] tests/test_restore_destination_prefix_parity.py::TestTheFixIsANoOpWhereItShouldBe::test_an_explicit_prefix_is_never_overridden PASSED [ 56%] tests/test_restore_destination_prefix_parity.py::TestTheFixIsANoOpWhereItShouldBe::test_a_location_that_lists_fine_leaves_the_destination_alone PASSED [ 56%] tests/test_restore_destination_prefix_parity.py::TestTheFixIsANoOpWhereItShouldBe::test_a_failed_inference_does_not_corrupt_the_prefix PASSED [ 56%] tests/test_restore_destination_prefix_parity.py::TestTheFixIsANoOpWhereItShouldBe::test_a_listing_that_raises_also_puts_the_prefix_back PASSED [ 56%] tests/test_restore_destination_prefix_parity.py::TestTheFixIsANoOpWhereItShouldBe::test_the_retry_is_not_served_from_the_stale_cache PASSED [ 56%] tests/test_restore_honours_config_flag.py::test_the_named_config_is_the_one_read PASSED [ 56%] tests/test_restore_honours_config_flag.py::test_an_explicit_flag_still_wins PASSED [ 56%] tests/test_restore_honours_config_flag.py::test_without_a_config_path_it_falls_back PASSED [ 56%] tests/test_restore_honours_config_flag.py::test_an_unreadable_config_does_not_crash_the_command PASSED [ 56%] tests/test_restore_honours_config_flag.py::test_every_call_site_passes_the_config_path PASSED [ 56%] tests/test_restore_layout.py::TestWhatIsAtTheLandingName::test_nothing_there_is_none PASSED [ 56%] tests/test_restore_layout.py::TestWhatIsAtTheLandingName::test_a_subvolume_without_received_uuid_is_an_interrupted_restore PASSED [ 56%] tests/test_restore_layout.py::TestWhatIsAtTheLandingName::test_a_copy_of_another_snapshot_names_both_identities PASSED [ 56%] tests/test_restore_layout.py::TestWhatIsAtTheLandingName::test_an_unreadable_identity_is_said_not_assumed PASSED [ 56%] tests/test_restore_layout.py::TestWhatIsAtTheLandingName::test_a_received_copy_against_an_unknown_stream_identity PASSED [ 56%] tests/test_restore_layout.py::TestWhatIsAtTheLandingName::test_a_plain_directory_or_file_is_described_without_a_probe PASSED [ 56%] tests/test_restore_layout.py::TestWhatIsAtTheLandingName::test_a_dangling_symlink_is_something_not_nothing PASSED [ 56%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_no_marker_directory_means_no_markers PASSED [ 57%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_a_stale_marker_over_a_bare_subvolume_is_abandoned PASSED [ 57%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_a_live_process_means_in_progress PASSED [ 57%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_a_complete_copy_under_a_stale_marker_is_complete PASSED [ 57%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_an_unreadable_identity_is_unreadable_never_abandoned PASSED [ 57%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_nothing_at_the_path_is_missing PASSED [ 57%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_a_marker_naming_a_path_elsewhere_is_foreign PASSED [ 57%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_a_marker_whose_name_disagrees_with_its_path_is_foreign PASSED [ 57%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_a_plain_directory_under_a_marker_is_not_a_subvolume PASSED [ 57%] tests/test_restore_layout.py::TestWhatAMarkerAuthorises::test_a_malformed_marker_is_reported_not_skipped PASSED [ 57%] tests/test_restore_layout.py::TestTheLayoutWritesAndClearsMarkers::test_a_receive_writes_an_atomic_marker_naming_its_landing PASSED [ 57%] tests/test_restore_layout.py::TestTheLayoutWritesAndClearsMarkers::test_a_verified_copy_clears_its_marker PASSED [ 57%] tests/test_restore_layout.py::TestTheLayoutWritesAndClearsMarkers::test_finish_clears_a_failed_entry_only_when_its_partial_is_gone PASSED [ 57%] tests/test_restore_layout.py::TestTheLayoutWritesAndClearsMarkers::test_the_receive_endpoint_is_the_endpoint_to_everything_else PASSED [ 57%] tests/test_restore_list_prefix_parity.py::TestListInfersLikeRestoreDoes::test_it_lists_the_prefix_the_location_uses PASSED [ 57%] tests/test_restore_list_prefix_parity.py::TestListInfersLikeRestoreDoes::test_it_says_that_it_inferred PASSED [ 57%] tests/test_restore_list_prefix_parity.py::TestTheContractListDependsOn::test_the_helper_leaves_the_inferred_prefix_set PASSED [ 57%] tests/test_restore_list_prefix_parity.py::TestTheContractListDependsOn::test_it_restores_the_previous_prefix_when_nothing_is_found PASSED [ 57%] tests/test_restore_list_prefix_parity.py::TestTheContractListDependsOn::test_an_explicit_prefix_is_not_second_guessed PASSED [ 57%] tests/test_restore_list_prefix_parity.py::TestTheContractListDependsOn::test_two_prefixes_are_not_guessed_between PASSED [ 57%] tests/test_restore_list_prefix_parity.py::TestTheContractListDependsOn::test_a_genuinely_empty_location_still_says_so PASSED [ 57%] tests/test_restore_lock_reporting.py::TestTheCapabilityMatchesTheBehaviour::test_the_flag_predicts_whether_a_lock_is_recorded[Endpoint] PASSED [ 57%] tests/test_restore_lock_reporting.py::TestTheCapabilityMatchesTheBehaviour::test_the_flag_predicts_whether_a_lock_is_recorded[LocalEndpoint] PASSED [ 57%] tests/test_restore_lock_reporting.py::TestTheCapabilityMatchesTheBehaviour::test_the_flag_predicts_whether_a_lock_is_recorded[ShellEndpoint] PASSED [ 57%] tests/test_restore_lock_reporting.py::TestTheCapabilityMatchesTheBehaviour::test_the_flag_predicts_whether_a_lock_is_recorded[SSHEndpoint] PASSED [ 57%] tests/test_restore_lock_reporting.py::TestTheCapabilityMatchesTheBehaviour::test_the_flag_predicts_whether_a_lock_is_recorded[RawEndpoint] PASSED [ 57%] tests/test_restore_lock_reporting.py::TestTheCapabilityMatchesTheBehaviour::test_the_flag_predicts_whether_a_lock_is_recorded[SSHRawEndpoint] PASSED [ 57%] tests/test_restore_lock_reporting.py::TestTheCapabilityMatchesTheBehaviour::test_the_lock_is_held_in_memory_either_way PASSED [ 57%] tests/test_restore_lock_reporting.py::TestARawLocationPersistsItsPins::test_status_reports_the_pin PASSED [ 57%] tests/test_restore_lock_reporting.py::TestARawLocationPersistsItsPins::test_unlock_clears_the_pin PASSED [ 57%] tests/test_restore_lock_reporting.py::TestATargetThatDoesPersistLocks::test_an_absent_lock_file_genuinely_means_no_locks PASSED [ 57%] tests/test_restore_lock_reporting.py::TestATargetThatDoesPersistLocks::test_existing_locks_are_reported PASSED [ 57%] tests/test_restore_lock_reporting.py::TestATargetThatDoesPersistLocks::test_an_unreadable_lock_file_is_an_error_not_a_clean_report PASSED [ 57%] tests/test_restore_lock_reporting.py::TestATargetThatDoesPersistLocks::test_the_error_does_not_trail_off_after_a_colon PASSED [ 57%] tests/test_restore_lock_reporting.py::TestATargetThatDoesPersistLocks::test_unlock_does_not_overwrite_locks_it_could_not_read PASSED [ 57%] tests/test_restore_lock_reporting.py::TestATargetThatDoesPersistLocks::test_unlock_removes_the_lock_and_leaves_others PASSED [ 57%] tests/test_restore_lock_reporting.py::TestReadingLocksDistinguishesAbsentFromUnreadable::test_absent_is_no_locks PASSED [ 57%] tests/test_restore_lock_reporting.py::TestReadingLocksDistinguishesAbsentFromUnreadable::test_a_directory_where_the_lock_file_belongs_is_the_shared_store PASSED [ 57%] tests/test_restore_lock_reporting.py::TestReadingLocksDistinguishesAbsentFromUnreadable::test_a_symlink_raises_because_the_writer_refuses_to_follow_one PASSED [ 57%] tests/test_restore_lock_reporting.py::TestReadingLocksDistinguishesAbsentFromUnreadable::test_a_regular_file_parses PASSED [ 57%] tests/test_restore_says_what_it_did.py::TestItSaysWhyThereIsNothingToDo::test_an_already_present_snapshot_is_named PASSED [ 57%] tests/test_restore_says_what_it_did.py::TestItSaysWhyThereIsNothingToDo::test_a_genuinely_empty_result_still_says_so PASSED [ 57%] tests/test_restore_says_what_it_did.py::TestACheckThatCannotRunDoesNotAnswer::test_an_unreadable_identity_refuses_rather_than_assuming_absent PASSED [ 57%] tests/test_restore_says_what_it_did.py::TestACheckThatCannotRunDoesNotAnswer::test_a_readable_entry_still_answers_both_ways PASSED [ 57%] tests/test_restore_says_what_it_did.py::TestACheckThatCannotRunDoesNotAnswer::test_the_restore_refuses_before_streaming PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheBackupsAreCounted::test_a_snapper_location_is_not_reported_as_empty PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheBackupsAreCounted::test_a_plain_location_says_nothing_about_snapper PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheBackupsAreCounted::test_an_enumeration_that_fails_is_not_zero PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestThePinsAreShown::test_a_pin_held_by_a_restore_is_shown_beside_its_backup PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestThePinsAreShown::test_a_raw_backup_is_pinned_by_its_stream_name PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheOptionsFollowTheRestoreCommand::test_each_connection_option_reaches_the_enumeration[ssh_sudo-ssh_sudo-True] PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheOptionsFollowTheRestoreCommand::test_each_connection_option_reaches_the_enumeration[ssh_key-ssh_key-/k] PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheOptionsFollowTheRestoreCommand::test_each_connection_option_reaches_the_enumeration[ssh_key-ssh_identity_file-/k] PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheOptionsFollowTheRestoreCommand::test_each_connection_option_reaches_the_enumeration[ssh_auth_sock-ssh_auth_sock-/s] PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheOptionsFollowTheRestoreCommand::test_each_connection_option_reaches_the_enumeration[ssh_host_key_policy-ssh_host_key_policy-strict] PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheOptionsFollowTheRestoreCommand::test_each_connection_option_reaches_the_enumeration[skip_remote_lock-skip_remote_lock-True] PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheOptionsFollowTheRestoreCommand::test_each_connection_option_reaches_the_enumeration[gpg_keyring-gpg_keyring-/r] PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheOptionsFollowTheRestoreCommand::test_each_connection_option_reaches_the_enumeration[openssl_cipher-openssl_cipher-aes] PASSED [ 57%] tests/test_restore_status_reports_snapper_backups.py::TestTheOptionsFollowTheRestoreCommand::test_nothing_set_is_nothing_threaded PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_the_matching_target_supplies_its_ssh_key PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_the_right_target_is_chosen_when_several_are_configured PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_a_trailing_slash_still_matches PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_an_unrelated_source_contributes_nothing PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_only_transport_options_are_returned PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_no_config_file_is_not_an_error PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_an_unreadable_config_is_not_an_error PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_missing_config_attribute_is_not_an_error PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_schema_defaults_are_not_reported_as_configured PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::test_an_explicitly_set_value_is_kept_even_if_it_equals_nothing_special PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::TestTheOptionsReachTheEndpointNotJustTheDict::test_the_configured_port_is_threaded_under_the_key_endpoints_read PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::TestTheOptionsReachTheEndpointNotJustTheDict::test_it_actually_reaches_a_real_endpoint PASSED [ 57%] tests/test_restore_uses_configured_target_options.py::TestTheOptionsReachTheEndpointNotJustTheDict::test_a_port_in_the_url_still_wins PASSED [ 57%] tests/test_restore_view_prefix_parity.py::TestTheViewsAgree::test_list_finds_them PASSED [ 57%] tests/test_restore_view_prefix_parity.py::TestTheViewsAgree::test_interactive_finds_them_too PASSED [ 58%] tests/test_restore_view_prefix_parity.py::TestTheViewsAgree::test_status_counts_them_too PASSED [ 58%] tests/test_restore_view_prefix_parity.py::TestTheViewsAgree::test_each_view_says_which_prefix_it_used PASSED [ 58%] tests/test_restore_view_prefix_parity.py::TestInferenceStillOnlyAppliesWhenItShould::test_a_genuinely_empty_location_is_still_empty PASSED [ 58%] tests/test_restore_view_prefix_parity.py::TestInferenceStillOnlyAppliesWhenItShould::test_a_location_that_lists_fine_is_not_second_guessed PASSED [ 58%] tests/test_restore_view_prefix_parity.py::TestItIsOnePrimitiveNotThreeCopies::test_every_view_goes_through_the_same_helper PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_minutes PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_hours PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_days PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_weeks PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_invalid_format PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_empty_string PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_no_unit PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_unknown_unit PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_float_value PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_case_sensitive PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_seconds PASSED [ 58%] tests/test_retention.py::TestParseDuration::test_parse_years PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_extract_default_format PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_extract_no_timestamp PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_preferred_format_parses_custom_names PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_extract_invalid_timestamp PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_a_collision_counter_is_dated_by_the_timestamp_before_it PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_the_prefix_is_not_guessed PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_other_formats_are_not_guessed[snap-20240115_143022] PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_other_formats_are_not_guessed[backup-20240115143022] PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_other_formats_are_not_guessed[2024-01-15T14:30:22] PASSED [ 58%] tests/test_retention.py::TestExtractTimestamp::test_other_formats_are_not_guessed[snap-2024-01-15_143022] PASSED [ 58%] tests/test_retention.py::TestGetBucketKey::test_hourly_bucket PASSED [ 58%] tests/test_retention.py::TestGetBucketKey::test_daily_bucket PASSED [ 58%] tests/test_retention.py::TestGetBucketKey::test_weekly_bucket PASSED [ 58%] tests/test_retention.py::TestGetBucketKey::test_weekly_bucket_is_iso_week_no_year_boundary_split PASSED [ 58%] tests/test_retention.py::TestGetBucketKey::test_weekly_bucket_jan1_maps_to_prior_iso_year PASSED [ 58%] tests/test_retention.py::TestGetBucketKey::test_monthly_bucket PASSED [ 58%] tests/test_retention.py::TestGetBucketKey::test_yearly_bucket PASSED [ 58%] tests/test_retention.py::TestGetBucketKey::test_unknown_bucket_type PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_unparseable_timestamp_kept PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_custom_get_name_function PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_invalid_min_raises_and_deletes_nothing PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_unparseable_does_not_steal_latest PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_future_dated_does_not_steal_latest PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_skew_within_tolerance_is_valid_and_can_be_latest PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_with_prefix PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_keep_within_min_period PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_daily_retention PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_hourly_retention PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_empty_snapshot_list PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_always_keep_latest PASSED [ 58%] tests/test_retention.py::TestApplyRetention::test_combined_retention PASSED [ 58%] tests/test_retention.py::TestFormatRetentionSummary::test_basic_summary PASSED [ 58%] tests/test_retention.py::TestFormatRetentionSummary::test_empty_delete_list PASSED [ 58%] tests/test_retention.py::TestFormatRetentionSummary::test_custom_get_name PASSED [ 58%] tests/test_retention.py::TestFormatRetentionSummary::test_truncates_long_delete_list PASSED [ 58%] tests/test_retention.py::TestSubtractDuration::test_fixed_units_unchanged PASSED [ 58%] tests/test_retention.py::TestSubtractDuration::test_calendar_month_full_31_day_month PASSED [ 58%] tests/test_retention.py::TestSubtractDuration::test_calendar_month_day_clamp_non_leap PASSED [ 58%] tests/test_retention.py::TestSubtractDuration::test_12M_equals_1y_calendar PASSED [ 58%] tests/test_retention.py::TestSubtractDuration::test_year_leap_day_clamp PASSED [ 58%] tests/test_retention.py::TestSubtractDuration::test_invalid_duration_raises_valueerror PASSED [ 58%] tests/test_retention.py::TestSubtractDuration::test_calendar_min_keeps_snapshot_a_30day_cutoff_would_prune PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_it_is_recognised_in_any_case[all] PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_it_is_recognised_in_any_case[ALL] PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_it_is_recognised_in_any_case[ all ] PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_nothing_else_is[1d] PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_nothing_else_is[0s] PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_nothing_else_is[] PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_nothing_else_is[allx] PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_nothing_else_is[None] PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_nothing_else_is[7] PASSED [ 58%] tests/test_retention_min_all.py::TestTheValue::test_the_cutoff_is_before_every_possible_snapshot PASSED [ 58%] tests/test_retention_min_all.py::TestTheLoader::test_it_loads_at_every_scope PASSED [ 58%] tests/test_retention_min_all.py::TestTheLoader::test_a_narrower_scope_inherits_it PASSED [ 58%] tests/test_retention_min_all.py::TestTheEngine::test_buckets_cannot_select_anything_to_delete PASSED [ 58%] tests/test_retention_min_all.py::TestTheEngine::test_zero_buckets_delete_nothing_either PASSED [ 59%] tests/test_retention_min_all.py::TestTheEngine::test_a_count_cannot_select_anything_to_delete PASSED [ 59%] tests/test_retention_min_all.py::TestTheEngine::test_the_reason_names_the_setting PASSED [ 59%] tests/test_retention_min_all.py::TestTheGuardsAndPlans::test_it_is_not_degenerate PASSED [ 59%] tests/test_retention_min_all.py::TestTheGuardsAndPlans::test_the_prune_plan_deletes_nothing PASSED [ 59%] tests/test_retention_min_all.py::TestTheGuardsAndPlans::test_run_sends_everything_a_target_is_missing PASSED [ 59%] tests/test_retention_min_all.py::TestTheGuardsAndPlans::test_plan_retention_of_agrees PASSED [ 59%] tests/test_retention_min_all.py::TestTheGuardsAndPlans::test_the_snapper_plan_deletes_nothing PASSED [ 59%] tests/test_retention_min_all.py::TestTheGuardsAndPlans::test_the_run_summary_shows_it PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-Ymd-HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-Ymd] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-YmdTHM] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-YmdTHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-Y-m-d_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-Y-m-d] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-YmdHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-YmdTHMSz] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-Y-m-dTH:M:S] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[bare-snap_Ymd_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--Ymd-HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--Ymd] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--YmdTHM] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--YmdTHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--Y-m-d_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--Y-m-d] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--YmdHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--YmdTHMSz] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--Y-m-dTH:M:S] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home--snap_Ymd_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-Ymd-HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-Ymd] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-YmdTHM] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-YmdTHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-Y-m-d_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-Y-m-d] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-YmdHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-YmdTHMSz] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-Y-m-dTH:M:S] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[home.-snap_Ymd_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-Ymd-HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-Ymd] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-YmdTHM] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-YmdTHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-Y-m-d_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-Y-m-d] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-YmdHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-YmdTHMSz] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-Y-m-dTH:M:S] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[p_-snap_Ymd_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--Ymd-HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--Ymd] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--YmdTHM] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--YmdTHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--Y-m-d_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--Y-m-d] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--YmdHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--YmdTHMSz] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--Y-m-dTH:M:S] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_over_generated_names[root-snapshots--snap_Ymd_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[Ymd-HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[Ymd] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[YmdTHM] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[YmdTHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[Y-m-d_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[Y-m-d] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[YmdHMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[YmdTHMSz] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[Y-m-dTH:M:S] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_under_another_configured_format[snap_Ymd_HMS] PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheTwoAgree::test_a_dated_listing_is_never_undated_here PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheSevenDigitCounter::test_it_is_the_day PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestTheSevenDigitCounter::test_a_six_digit_counter_is_the_day_too PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestNothingIsGuessed::test_no_format_outside_the_rule_is_tried PASSED [ 59%] tests/test_retention_reads_names_like_the_listing.py::TestNothingIsGuessed::test_digits_inside_a_name_are_not_a_timestamp PASSED [ 60%] tests/test_retention_reads_names_like_the_listing.py::TestNothingIsGuessed::test_offset_names_come_back_naive_and_ordered PASSED [ 60%] tests/test_retention_reads_names_like_the_listing.py::TestNothingIsGuessed::test_struct_time_without_offset_has_no_gmtoff PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestDating::test_a_counter_is_dated_by_the_timestamp_before_it[_1] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestDating::test_a_counter_is_dated_by_the_timestamp_before_it[_2] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestDating::test_a_counter_is_dated_by_the_timestamp_before_it[_12] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestDating::test_a_counter_is_dated_by_the_timestamp_before_it[_999] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestDating::test_a_timestamp_ending_in_digits_keeps_its_meaning PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestDating::test_retention_reads_a_digit_suffix_as_the_listing_does PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestDating::test_the_default_format_with_a_counter PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestDating::test_a_name_with_no_timestamp_is_still_none PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestRetention::test_the_latest_and_the_day_s_first_are_kept_whatever_the_order[order0] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestRetention::test_the_latest_and_the_day_s_first_are_kept_whatever_the_order[order1] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestRetention::test_the_latest_and_the_day_s_first_are_kept_whatever_the_order[order2] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestRetention::test_the_latest_and_the_day_s_first_are_kept_whatever_the_order[order3] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestRetention::test_the_latest_and_the_day_s_first_are_kept_whatever_the_order[order4] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestRetention::test_the_latest_and_the_day_s_first_are_kept_whatever_the_order[order5] PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestRetention::test_counter_named_snapshots_are_no_longer_kept_forever PASSED [ 60%] tests/test_retention_reads_the_collision_counter.py::TestRetention::test_the_counter_orders_numerically_not_as_text PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_it_keeps_that_many_when_no_floor_applies[1] PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_it_keeps_that_many_when_no_floor_applies[5] PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_it_keeps_that_many_when_no_floor_applies[10] PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_it_keeps_that_many_when_no_floor_applies[39] PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_min_still_protects_recent_snapshots PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_it_keeps_the_NEWEST_ones PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_asking_for_more_than_exist_deletes_nothing PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_it_ignores_the_time_BUCKETS PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_unorderable_snapshots_are_still_kept PASSED [ 60%] tests/test_retention_scopes.py::TestCountBasedRetention::test_keep_zero_means_use_the_buckets PASSED [ 60%] tests/test_retention_scopes.py::TestACountPolicyIsNotDegenerate::test_zero_buckets_with_a_count_is_allowed PASSED [ 60%] tests/test_retention_scopes.py::TestACountPolicyIsNotDegenerate::test_zero_buckets_without_a_count_is_still_refused PASSED [ 60%] tests/test_retention_scopes.py::TestPerScopeResolution::test_the_source_uses_source_retention PASSED [ 60%] tests/test_retention_scopes.py::TestPerScopeResolution::test_a_target_uses_its_own_policy PASSED [ 60%] tests/test_retention_scopes.py::TestPerScopeResolution::test_a_target_without_one_falls_back PASSED [ 60%] tests/test_retention_scopes.py::TestPerScopeResolution::test_a_config_with_no_new_keys_is_unchanged PASSED [ 60%] tests/test_retention_scopes.py::TestPerScopeResolution::test_volume_retention_still_covers_both_when_it_is_the_only_override PASSED [ 60%] tests/test_retention_scopes.py::TestBadCountsAndContradictions::test_a_non_count_is_refused_at_load[-1] PASSED [ 60%] tests/test_retention_scopes.py::TestBadCountsAndContradictions::test_a_non_count_is_refused_at_load["30"] PASSED [ 60%] tests/test_retention_scopes.py::TestBadCountsAndContradictions::test_a_non_count_is_refused_at_load[1.5] PASSED [ 60%] tests/test_retention_scopes.py::TestBadCountsAndContradictions::test_a_non_count_is_refused_at_load[true] PASSED [ 60%] tests/test_retention_scopes.py::TestBadCountsAndContradictions::test_setting_both_keep_and_buckets_warns PASSED [ 60%] tests/test_retention_scopes.py::TestBadCountsAndContradictions::test_keep_alone_does_not_warn PASSED [ 60%] tests/test_retention_timezone.py::test_an_offset_timestamp_comes_back_naive[home.20260101T120000+0100] PASSED [ 60%] tests/test_retention_timezone.py::test_an_offset_timestamp_comes_back_naive[home.20260101T120000-0500] PASSED [ 60%] tests/test_retention_timezone.py::test_an_offset_timestamp_comes_back_naive[home.20260101T120000+0000] PASSED [ 60%] tests/test_retention_timezone.py::test_it_can_be_compared_with_now PASSED [ 60%] tests/test_retention_timezone.py::test_the_instant_is_preserved_not_just_stripped PASSED [ 60%] tests/test_retention_timezone.py::test_the_config_import_format_is_the_one_that_was_broken PASSED [ 60%] tests/test_retention_timezone.py::test_naive_formats_are_unchanged[home.20260101-120000-%Y%m%d-%H%M%S] PASSED [ 60%] tests/test_retention_timezone.py::test_naive_formats_are_unchanged[home.20260101-120000-None] PASSED [ 60%] tests/test_retry.py::TestRetryPolicy::test_default_values PASSED [ 60%] tests/test_retry.py::TestRetryPolicy::test_custom_values PASSED [ 60%] tests/test_retry.py::TestRetryPolicy::test_calculate_delay_exponential PASSED [ 60%] tests/test_retry.py::TestRetryPolicy::test_calculate_delay_capped PASSED [ 60%] tests/test_retry.py::TestRetryPolicy::test_calculate_delay_with_jitter PASSED [ 60%] tests/test_retry.py::TestRetryPolicy::test_is_retryable_backup_error PASSED [ 60%] tests/test_retry.py::TestRetryPolicy::test_is_retryable_builtin_exceptions PASSED [ 60%] tests/test_retry.py::TestRetryPolicy::test_attempts_generator PASSED [ 60%] tests/test_retry.py::TestRetryAttempt::test_is_first_and_last PASSED [ 60%] tests/test_retry.py::TestRetryAttempt::test_should_retry_transient_error PASSED [ 60%] tests/test_retry.py::TestRetryAttempt::test_should_retry_permanent_error PASSED [ 60%] tests/test_retry.py::TestRetryAttempt::test_should_retry_last_attempt PASSED [ 60%] tests/test_retry.py::TestRetryAttempt::test_wait PASSED [ 60%] tests/test_retry.py::TestRetryAttempt::test_wait_on_last_attempt PASSED [ 60%] tests/test_retry.py::TestWithRetryDecorator::test_success_on_first_attempt PASSED [ 60%] tests/test_retry.py::TestWithRetryDecorator::test_success_after_retries PASSED [ 60%] tests/test_retry.py::TestWithRetryDecorator::test_failure_after_max_attempts PASSED [ 60%] tests/test_retry.py::TestWithRetryDecorator::test_permanent_error_no_retry PASSED [ 60%] tests/test_retry.py::TestWithRetryDecorator::test_with_policy_object PASSED [ 60%] tests/test_retry.py::TestRetryCall::test_success_returns_result PASSED [ 60%] tests/test_retry.py::TestRetryCall::test_failure_returns_result PASSED [ 60%] tests/test_retry.py::TestRetryCall::test_unwrap_success PASSED [ 60%] tests/test_retry.py::TestRetryCall::test_unwrap_failure PASSED [ 60%] tests/test_retry.py::TestRetryCall::test_with_args_and_kwargs PASSED [ 61%] tests/test_retry.py::TestRetryContext::test_success_on_first_attempt PASSED [ 61%] tests/test_retry.py::TestRetryContext::test_success_after_retries PASSED [ 61%] tests/test_retry.py::TestRetryContext::test_exhausted_after_max_attempts PASSED [ 61%] tests/test_retry.py::TestRetryContext::test_permanent_error_stops_retry PASSED [ 61%] tests/test_retry.py::TestRetryContext::test_with_dict_config PASSED [ 61%] tests/test_retry.py::TestDefaultPolicies::test_transfer_policy PASSED [ 61%] tests/test_retry.py::TestDefaultPolicies::test_network_policy PASSED [ 61%] tests/test_retry.py::TestDefaultPolicies::test_quick_policy PASSED [ 61%] tests/test_retry.py::TestAsyncRetry::test_wait_async PASSED [ 61%] tests/test_retry.py::TestAsyncRetry::test_wait_async_on_last_attempt PASSED [ 61%] tests/test_retry.py::TestAsyncRetry::test_with_retry_async_success PASSED [ 61%] tests/test_retry.py::TestAsyncRetry::test_with_retry_async_retries PASSED [ 61%] tests/test_retry.py::TestAsyncRetry::test_with_retry_async_failure PASSED [ 61%] tests/test_retry.py::TestAsyncRetry::test_with_retry_async_permanent_error PASSED [ 61%] tests/test_retry.py::TestAsyncRetry::test_with_retry_async_with_policy PASSED [ 61%] tests/test_retry.py::TestOnRetryCallback::test_on_retry_callback_called PASSED [ 61%] tests/test_retry.py::TestOnRetryCallback::test_on_retry_callback_async PASSED [ 61%] tests/test_retry.py::TestRetryResultUnwrap::test_unwrap_no_error_recorded PASSED [ 61%] tests/test_retry.py::TestRetryContextEdgeCases::test_context_with_none_policy PASSED [ 61%] tests/test_retry.py::TestRetryContextEdgeCases::test_wait_when_exhausted PASSED [ 61%] tests/test_run_catches_up.py::test_by_default_the_planner_is_asked_for_everything_missing PASSED [ 61%] tests/test_run_catches_up.py::test_newest_only_still_pins_the_plan_to_that_snapshot PASSED [ 61%] tests/test_run_catches_up.py::test_the_flag_exists_on_the_run_command PASSED [ 61%] tests/test_run_catches_up.py::test_the_flag_defaults_to_off PASSED [ 61%] tests/test_run_catches_up.py::test_both_functions_accept_the_choice[_backup_volume] PASSED [ 61%] tests/test_run_catches_up.py::test_both_functions_accept_the_choice[_transfer_to_target] PASSED [ 61%] tests/test_run_catches_up.py::test_every_transfer_path_threads_it PASSED [ 61%] tests/test_run_fate_sharing.py::TestTheSourceFateSharesWithEveryTarget::test_the_source_is_pruned_when_everything_succeeded PASSED [ 61%] tests/test_run_fate_sharing.py::TestTheSourceFateSharesWithEveryTarget::test_the_source_is_not_pruned_when_a_target_failed PASSED [ 61%] tests/test_run_fate_sharing.py::TestTheWiringItselfIsCorrect::test_a_successful_run_asks_for_the_source_to_be_pruned PASSED [ 61%] tests/test_run_fate_sharing.py::TestTheWiringItselfIsCorrect::test_a_failed_target_withholds_the_source_prune PASSED [ 61%] tests/test_run_overlap.py::TestTheRunLockPath::test_two_configs_do_not_share_a_lock PASSED [ 61%] tests/test_run_overlap.py::TestTheRunLockPath::test_same_named_configs_in_different_directories_do_not_collide PASSED [ 61%] tests/test_run_overlap.py::TestTheRunLockPath::test_the_same_config_always_resolves_to_one_lock PASSED [ 61%] tests/test_run_overlap.py::TestTheRunLockPath::test_a_string_path_is_accepted PASSED [ 61%] tests/test_run_overlap.py::TestTheRunLockPath::test_it_lives_in_a_runtime_dir_not_the_config_dir PASSED [ 61%] tests/test_run_overlap.py::TestTheRunLockPath::test_the_lock_directory_is_not_world_writable PASSED [ 61%] tests/test_run_overlap.py::TestOnlyOneRunAtATime::test_a_second_run_is_refused_while_one_is_in_progress PASSED [ 61%] tests/test_run_overlap.py::TestOnlyOneRunAtATime::test_the_lock_is_released_when_the_run_finishes PASSED [ 61%] tests/test_run_overlap.py::TestOnlyOneRunAtATime::test_a_dry_run_takes_no_lock PASSED [ 61%] tests/test_run_overlap.py::TestAnUnavailableLockIsNotAnOutage::test_a_run_still_happens_when_the_lock_dir_cannot_be_made PASSED [ 61%] tests/test_run_overlap.py::TestAnUnavailableLockIsNotAnOutage::test_the_degradation_is_announced_not_silent PASSED [ 61%] tests/test_run_prunes.py::test_run_prunes_source_and_succeeded_target PASSED [ 61%] tests/test_run_prunes.py::test_run_degenerate_policy_fails_loud_and_deletes_nothing PASSED [ 61%] tests/test_run_prunes.py::test_run_invalid_min_fails_loud_and_deletes_nothing PASSED [ 61%] tests/test_run_prunes.py::test_run_only_prunes_succeeded_targets PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-0] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-1] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-2] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-3] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-4] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-0] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-1] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-2] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-3] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-4] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-0] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-1] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-2] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-3] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-4] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-0] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-1] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-2] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-3] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-4] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-0] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-1] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-2] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-3] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-4] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-0] PASSED [ 61%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-4] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-0] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-1] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-2] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-3] PASSED [ 62%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-2] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-3] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-4] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-0] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-1] PASSED [ 63%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[40-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[40-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[40-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[40-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[40-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[41-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[41-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[41-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[41-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[41-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[42-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[42-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[42-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[42-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[42-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[43-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[43-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[43-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[43-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[43-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[44-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[44-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[44-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[44-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[44-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[45-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[45-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[45-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[45-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[45-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[46-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[46-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[46-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[46-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[46-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[47-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[47-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[47-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[47-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[47-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[48-0] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[48-1] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[48-2] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[48-3] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[48-4] PASSED [ 64%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[49-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[49-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[49-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[49-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[49-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[50-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[50-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[50-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[50-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[50-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[51-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[51-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[51-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[51-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[51-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[52-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[52-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[52-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[52-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[52-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[53-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[53-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[53-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[53-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[53-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[54-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[54-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[54-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[54-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[54-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[55-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[55-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[55-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[55-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[55-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[56-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[56-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[56-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[56-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[56-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[57-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[57-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[57-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[57-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[57-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[58-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[58-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[58-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[58-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[58-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[59-0] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[59-1] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[59-2] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[59-3] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[59-4] PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheSelector::test_a_backlog_is_cut_to_what_the_target_keeps PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheSelector::test_the_newest_missing_snapshot_is_always_sent PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheSelector::test_a_policy_the_prune_refuses_sends_everything PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheSelector::test_a_target_that_cannot_be_listed_sends_everything PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheSelector::test_colliding_names_send_everything PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheSelector::test_one_missing_snapshot_is_simply_sent PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheSelector::test_a_configured_timestamp_format_is_what_the_names_are_read_with PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheWiring::test_sync_snapshots_plans_what_select_returns PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheWiring::test_without_select_everything_is_planned PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheWiring::test_run_hands_its_selector_to_the_transfer PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheWiring::test_newest_only_ignores_the_selector PASSED [ 65%] tests/test_run_sends_what_prune_keeps.py::TestTheWiring::test_both_transfer_paths_build_the_selector PASSED [ 65%] tests/test_scheme_migration_callsites.py::TestRestoreThreadsSshOptionsToRemoteSources::test_rawssh_source_receives_ssh_sudo PASSED [ 65%] tests/test_scheme_migration_callsites.py::TestRestoreThreadsSshOptionsToRemoteSources::test_rawssh_source_receives_the_identity_file_under_the_key_it_reads PASSED [ 65%] tests/test_scheme_migration_callsites.py::TestRestoreThreadsSshOptionsToRemoteSources::test_plain_ssh_source_still_receives_its_options PASSED [ 65%] tests/test_scheme_migration_callsites.py::TestRestoreThreadsSshOptionsToRemoteSources::test_local_source_gets_a_resolved_path_and_no_ssh_options PASSED [ 65%] tests/test_scheme_migration_callsites.py::TestRestoreThreadsSshOptionsToRemoteSources::test_local_raw_source_keeps_the_path_parsed_from_its_uri PASSED [ 65%] tests/test_scheme_migration_callsites.py::TestRestoreThreadsSshOptionsToRemoteSources::test_a_raw_source_is_never_handed_a_cwd_resolved_path[raw:///mnt/store] PASSED [ 65%] tests/test_scheme_migration_callsites.py::TestRestoreThreadsSshOptionsToRemoteSources::test_a_raw_source_is_never_handed_a_cwd_resolved_path[raw+ssh://backup@nas:/mnt/store] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_raw_target_checks_the_directory_not_the_uri PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_local_target_is_checked_as_written PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_unmounted_target_aborts PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_unmounted_raw_target_aborts PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_remote_targets_are_exempt[ssh://user@host:/backups] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_remote_targets_are_exempt[raw+ssh://user@host/backups] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_undeterminable_paths_fail_closed[raw://mnt/usb/backups] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_undeterminable_paths_fail_closed[shell://cat > /dev/null] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_undeterminable_paths_fail_closed[user@host:/backups] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_run_calls_the_gate_too[_backup_volume] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_run_calls_the_gate_too[_backup_snapper_volume] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_run_does_not_gate_the_check_on_a_scheme_string[_backup_volume] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_run_does_not_gate_the_check_on_a_scheme_string[_backup_snapper_volume] PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_there_is_exactly_one_mount_gate PASSED [ 66%] tests/test_scheme_migration_callsites.py::TestRequireMountGate::test_execute_transfer_still_calls_the_gate PASSED [ 66%] tests/test_sdist_carries_what_the_tests_read.py::test_the_scan_finds_something PASSED [ 66%] tests/test_sdist_carries_what_the_tests_read.py::test_the_sdist_ships_every_directory_the_tests_read[docs] PASSED [ 66%] tests/test_sdist_carries_what_the_tests_read.py::test_the_sdist_ships_every_directory_the_tests_read[examples] PASSED [ 66%] tests/test_sdist_carries_what_the_tests_read.py::test_the_sdist_ships_every_directory_the_tests_read[src] SKIPPED [ 66%] tests/test_sdist_carries_what_the_tests_read.py::test_the_sdist_ships_every_directory_the_tests_read[tests] PASSED [ 66%] tests/test_sdist_carries_what_the_tests_read.py::test_the_manifest_names_no_path_that_does_not_exist PASSED [ 66%] tests/test_sdist_carries_what_the_tests_read.py::TestTheLicenseMetadataIsAnIdentifierNotAnEssay::test_the_license_is_an_spdx_expression PASSED [ 66%] tests/test_sdist_carries_what_the_tests_read.py::TestTheLicenseMetadataIsAnIdentifierNotAnEssay::test_the_license_file_is_still_shipped PASSED [ 66%] tests/test_sdist_carries_what_the_tests_read.py::TestTheLicenseMetadataIsAnIdentifierNotAnEssay::test_the_build_backend_is_new_enough_to_understand_it PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_chunked_operations.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_cli_e2e.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_config_flow.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_endpoints.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_retention_flow.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_btrbk_retention_ground_truth_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_btrfs_operations.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_endpoints_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_executor_verdict_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_listing_never_creates_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_pins_across_parallel_targets_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_restore_read_only_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_remembered_names_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_as_transfer_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_layout_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_source_check_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_space_checking.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_stream_identity_two_hop.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_verify_full_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_verify_structure_real.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_acceptance_matrix.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_paths.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_a_parent_pin_on_a_missing_snapshot_is_released.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_abort_errors_carry_their_reason.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_absolute_snapshot_dir.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_atomic_commit_wiring.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_atomic_persistence.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_backup_source_check.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_backup_volume_check.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_btrbk_directive_takes_rest_of_line.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_btrbk_import.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_btrbk_import_coverage.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_btrbk_import_raw.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_btrbk_import_retention_semantics.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_btrbk_import_targets.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_btrfs_debug.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_catch_up_leaves_out_only_what_it_may.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_chunked_transfer.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_cleanup_authorship.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_cleanup_recovery.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_cleanup_scavenger_authorship.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_cli.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_cli_ascii_output.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_cli_common.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_cli_exit_codes.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_cli_verify.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_collision_counter_is_the_only_tiebreak.py] PASSED [ 66%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_completions.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_completions_up_to_date.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_config_cmd.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_config_import_refuses_unloadable.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_config_loader.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_config_schema.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_config_validate_readiness.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_config_verbosity.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_configured_paths_are_not_created.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_control_lock_hardening.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_control_socket_path.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_correspondence.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_csh_login_shell.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_delete_reads_the_lock_file_again.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_deleted_snapshot_entry_removed.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_deletion_flags.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_deletion_honours_locks.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_deletion_verdict.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_detection.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_docs_commands.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_docs_cover_every_flag.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_doctor.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_doctor_counts_loader_warnings.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_doctor_earns_its_verdicts.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_doctor_reports_only_what_it_checked.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_duration_out_of_range.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_empty_listing_diagnosis.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_endpoints_drain_stderr.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_error_delivery.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_errors.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_estimate.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_estimate_exit_status.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_estimate_remote_source.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_estimate_reports_its_confidence.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_estimate_without_sudo.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_examples_use_runnable_compression.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_executor_verdict.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_exit_cleanup.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_explicit_empty_prefix.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_fatal_errors_are_not_retried.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_global_options_survive_subcommands.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_glossary.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_heartbeat_rewrites_the_record.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_hostkey_policy.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_in_place_is_refused.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_install.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_install_config_visibility.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_interrupt_stops_new_work.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_interrupted_receive_cleanup.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_legacy_cleanup_verdict.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_legacy_never_creates.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_legacy_remote_source_refused.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_listing_never_creates.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_loader_knows_every_key_it_reads.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_local_lock_directory_store.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_local_transfer_returncode.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_lock_file_records_only_the_change.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_lock_holders_beside_the_ledger.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_lock_persistence.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_log_file_captures_the_run.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_logger.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_logger_level_changes_take_effect.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_manpages.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_missing_sudo.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_mount_table_parsing.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_native_restore_lock.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_no_configured_path_is_created.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_notification_accuracy.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_notification_timeouts.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_notifications.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_optional_targets_and_inheritance.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_output_overwrite_guard.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_overwrite_is_not_silently_ignored.py] PASSED [ 67%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_packaging_data_files.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_permission_hint_targets_the_right_endpoint.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_pipeline_fd_handoff.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_planner_listing_cost.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_planner_required_chain.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_post_send_tail_is_bounded.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_prepare_failure_accounting.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_privileged_fs.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_progress.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_prune_gates.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_prune_honours_scopes.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_prune_notification_status.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_prune_prunes_snapper_destinations.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_prune_safety.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_atomic_write.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_backfill.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_checksum.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_cmd.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_compress_integrity.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_encrypt.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_encryption.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_encryption_cli_roundtrip.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_endpoint.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_endpoint_integration.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_enumeration_integrity.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_lock.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_metadata.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_openssl_cipher.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_parent_protection.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_part_file_safety.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_phantom_streams.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_pipeline_validation.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_prefix_diagnostics.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_restore_integrity.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_retention_honours_locks.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_sidecar.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_sidecar_robustness.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_sidecar_writer.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_snapshot_interface.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_snapshot_time.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_ssh_list_errors.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_ssh_restore.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_stream_identity.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_raw_verify.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_rawssh_elevates_only_when_needed.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_rawssh_is_actually_remote.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_rawssh_sudo_denial.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_readiness_is_fresh.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_receiving_locks.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_remembered_snapshot_names.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_remote_command_escaping_contract.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_remote_decompressor_probe.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_remote_destination_not_created.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_remote_locks.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_remote_shell_quoting.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_remove_locks_flag.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_rename_noreplace.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_require_mount_enforced.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_require_mount_path.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_as_transfer.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_configured_options.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_destination_prefix_parity.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_honours_config_flag.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_layout.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_list_prefix_parity.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_lock_reporting.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_says_what_it_did.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_status_reports_snapper_backups.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_uses_configured_target_options.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_restore_view_prefix_parity.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_retention.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_retention_min_all.py] PASSED [ 68%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_retention_reads_names_like_the_listing.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_retention_reads_the_collision_counter.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_retention_scopes.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_retention_timezone.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_retry.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_run_catches_up.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_run_fate_sharing.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_run_overlap.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_run_prunes.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_run_sends_what_prune_keeps.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_scheme_migration_callsites.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_sdist_carries_what_the_tests_read.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_skip_probes_are_bounded.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_backup_identity.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_cmd.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_dates_are_utc_in_info_xml.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_edges_hold.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_info_xml_placement.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_layout.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_least_privilege.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_metadata.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_remote_enumeration.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_restore_as_transfer.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_retention_breaks_same_second_ties.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_retention_plan.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_run_sends_what_prune_keeps.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_scanner.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_slot_is_complete_or_not_at_all.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapper_slot_is_created_below_the_target.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapshot_equality_contract.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_snapshot_registered_once.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_space.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_space_check_not_skipped_silently.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_space_flags.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_agent_discovery.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_endpoint.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_host_validation.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_hostkey.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_listing_failures.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_listing_scope.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_receive_command_quoting.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_remote_restore.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_restore_compress.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_stream_compression.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_ssh_sudo_elevation.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_stall_detection.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_state.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_stderr_tail.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_stream_uuid_two_hop.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_sudo_password_framing.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_sudo_pipeline_is_bounded.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_sudo_receive_scoping.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_systemd_utils.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_tail_bound_fires_in_the_loop.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_target_options_reach_the_target.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_target_scheme.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_timeout_sentinel.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_timestamp_format_enforcement.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_timestamp_offset_roundtrip.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transaction.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer_planner.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer_report_carries_receive_stderr.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer_result_consumed.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer_success_contract.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer_success_legacy_exit_code.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer_success_orchestration.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer_success_raw_chunked.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer_supervision.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfer_timeout_reporting.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_transfers_cmd.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_undated_snapshots.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_unlock_records_the_change.py] PASSED [ 69%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_util.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_uuid_identity.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_verify.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_withdrawn_options_say_so_everywhere.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_wizard_carries_over_what_it_did_not_ask.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_wizard_keeps_options.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_a_subprocess_in_a_skip_condition_has_a_timeout[test_wizard_utils.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_chunked_operations.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_cli_e2e.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_config_flow.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_endpoints.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_retention_flow.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_btrbk_retention_ground_truth_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_btrfs_operations.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_endpoints_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_executor_verdict_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_listing_never_creates_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_pins_across_parallel_targets_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_restore_read_only_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_remembered_names_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_as_transfer_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_layout_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_source_check_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_space_checking.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_stream_identity_two_hop.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_verify_full_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_verify_structure_real.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_acceptance_matrix.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_paths.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_a_parent_pin_on_a_missing_snapshot_is_released.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_abort_errors_carry_their_reason.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_absolute_snapshot_dir.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_atomic_commit_wiring.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_atomic_persistence.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_backup_source_check.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_backup_volume_check.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_btrbk_directive_takes_rest_of_line.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_btrbk_import.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_btrbk_import_coverage.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_btrbk_import_raw.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_btrbk_import_retention_semantics.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_btrbk_import_targets.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_btrfs_debug.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_catch_up_leaves_out_only_what_it_may.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_chunked_transfer.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_cleanup_authorship.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_cleanup_recovery.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_cleanup_scavenger_authorship.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_cli.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_cli_ascii_output.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_cli_common.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_cli_exit_codes.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_cli_verify.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_collision_counter_is_the_only_tiebreak.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_completions.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_completions_up_to_date.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_config_cmd.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_config_import_refuses_unloadable.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_config_loader.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_config_schema.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_config_validate_readiness.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_config_verbosity.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_configured_paths_are_not_created.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_control_lock_hardening.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_control_socket_path.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_correspondence.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_csh_login_shell.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_delete_reads_the_lock_file_again.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_deleted_snapshot_entry_removed.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_deletion_flags.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_deletion_honours_locks.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_deletion_verdict.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_detection.py] PASSED [ 70%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_docs_commands.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_docs_cover_every_flag.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_doctor.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_doctor_counts_loader_warnings.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_doctor_earns_its_verdicts.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_doctor_reports_only_what_it_checked.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_duration_out_of_range.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_empty_listing_diagnosis.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_endpoints_drain_stderr.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_error_delivery.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_errors.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_estimate.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_estimate_exit_status.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_estimate_remote_source.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_estimate_reports_its_confidence.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_estimate_without_sudo.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_examples_use_runnable_compression.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_executor_verdict.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_exit_cleanup.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_explicit_empty_prefix.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_fatal_errors_are_not_retried.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_global_options_survive_subcommands.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_glossary.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_heartbeat_rewrites_the_record.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_hostkey_policy.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_in_place_is_refused.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_install.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_install_config_visibility.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_interrupt_stops_new_work.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_interrupted_receive_cleanup.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_legacy_cleanup_verdict.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_legacy_never_creates.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_legacy_remote_source_refused.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_listing_never_creates.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_loader_knows_every_key_it_reads.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_local_lock_directory_store.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_local_transfer_returncode.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_lock_file_records_only_the_change.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_lock_holders_beside_the_ledger.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_lock_persistence.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_log_file_captures_the_run.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_logger.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_logger_level_changes_take_effect.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_manpages.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_missing_sudo.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_mount_table_parsing.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_native_restore_lock.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_no_configured_path_is_created.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_notification_accuracy.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_notification_timeouts.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_notifications.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_optional_targets_and_inheritance.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_output_overwrite_guard.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_overwrite_is_not_silently_ignored.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_packaging_data_files.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_permission_hint_targets_the_right_endpoint.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_pipeline_fd_handoff.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_planner_listing_cost.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_planner_required_chain.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_post_send_tail_is_bounded.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_prepare_failure_accounting.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_privileged_fs.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_progress.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_prune_gates.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_prune_honours_scopes.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_prune_notification_status.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_prune_prunes_snapper_destinations.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_prune_safety.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_atomic_write.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_backfill.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_checksum.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_cmd.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_compress_integrity.py] PASSED [ 71%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_encrypt.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_encryption.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_encryption_cli_roundtrip.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_endpoint.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_endpoint_integration.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_enumeration_integrity.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_lock.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_metadata.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_openssl_cipher.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_parent_protection.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_part_file_safety.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_phantom_streams.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_pipeline_validation.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_prefix_diagnostics.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_restore_integrity.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_retention_honours_locks.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_sidecar.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_sidecar_robustness.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_sidecar_writer.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_snapshot_interface.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_snapshot_time.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_ssh_list_errors.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_ssh_restore.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_stream_identity.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_raw_verify.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_rawssh_elevates_only_when_needed.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_rawssh_is_actually_remote.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_rawssh_sudo_denial.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_readiness_is_fresh.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_receiving_locks.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_remembered_snapshot_names.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_remote_command_escaping_contract.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_remote_decompressor_probe.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_remote_destination_not_created.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_remote_locks.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_remote_shell_quoting.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_remove_locks_flag.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_rename_noreplace.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_require_mount_enforced.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_require_mount_path.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_as_transfer.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_configured_options.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_destination_prefix_parity.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_honours_config_flag.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_layout.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_list_prefix_parity.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_lock_reporting.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_says_what_it_did.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_status_reports_snapper_backups.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_uses_configured_target_options.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_restore_view_prefix_parity.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_retention.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_retention_min_all.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_retention_reads_names_like_the_listing.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_retention_reads_the_collision_counter.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_retention_scopes.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_retention_timezone.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_retry.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_run_catches_up.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_run_fate_sharing.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_run_overlap.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_run_prunes.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_run_sends_what_prune_keeps.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_scheme_migration_callsites.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_sdist_carries_what_the_tests_read.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_skip_probes_are_bounded.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_backup_identity.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_cmd.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_dates_are_utc_in_info_xml.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_edges_hold.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_info_xml_placement.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_layout.py] PASSED [ 72%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_least_privilege.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_metadata.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_remote_enumeration.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_restore_as_transfer.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_retention_breaks_same_second_ties.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_retention_plan.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_run_sends_what_prune_keeps.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_scanner.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_slot_is_complete_or_not_at_all.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapper_slot_is_created_below_the_target.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapshot_equality_contract.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_snapshot_registered_once.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_space.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_space_check_not_skipped_silently.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_space_flags.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_agent_discovery.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_endpoint.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_host_validation.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_hostkey.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_listing_failures.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_listing_scope.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_receive_command_quoting.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_remote_restore.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_restore_compress.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_stream_compression.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_ssh_sudo_elevation.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_stall_detection.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_state.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_stderr_tail.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_stream_uuid_two_hop.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_sudo_password_framing.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_sudo_pipeline_is_bounded.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_sudo_receive_scoping.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_systemd_utils.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_tail_bound_fires_in_the_loop.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_target_options_reach_the_target.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_target_scheme.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_timeout_sentinel.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_timestamp_format_enforcement.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_timestamp_offset_roundtrip.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transaction.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer_planner.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer_report_carries_receive_stderr.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer_result_consumed.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer_success_contract.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer_success_legacy_exit_code.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer_success_orchestration.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer_success_raw_chunked.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer_supervision.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfer_timeout_reporting.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_transfers_cmd.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_undated_snapshots.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_unlock_records_the_change.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_util.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_uuid_identity.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_verify.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_withdrawn_options_say_so_everywhere.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_wizard_carries_over_what_it_did_not_ask.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_wizard_keeps_options.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestNoSkipConditionCanHang::test_no_skip_condition_reaches_the_network[test_wizard_utils.py] PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestTheSharedProbeIsSafe::test_it_is_bounded_and_cached PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestTheSharedProbeIsSafe::test_a_missing_ssh_is_not_an_error PASSED [ 73%] tests/test_skip_probes_are_bounded.py::TestTheSharedProbeIsSafe::test_a_stalling_ssh_is_not_an_error PASSED [ 73%] tests/test_snapper_backup_identity.py::test_btrfs_dest_view_corresponds_by_received_uuid PASSED [ 73%] tests/test_snapper_backup_identity.py::test_btrfs_dest_view_recycled_number_new_uuid_is_absent PASSED [ 73%] tests/test_snapper_backup_identity.py::test_btrfs_dest_view_empty_uuid_source_is_absent PASSED [ 73%] tests/test_snapper_backup_identity.py::test_snapper_dest_view_raw_uses_endpoint_directly PASSED [ 73%] tests/test_snapper_backup_identity.py::test_snapper_dest_view_btrfs_builds_numbered_view PASSED [ 73%] tests/test_snapper_backup_identity.py::test_raw_dest_view_name_correspondence PASSED [ 73%] tests/test_snapper_backup_identity.py::test_enumerate_parses_privileged_shell_output PASSED [ 73%] tests/test_snapper_backup_identity.py::test_a_failed_listing_is_never_no_backups[reply0] PASSED [ 73%] tests/test_snapper_backup_identity.py::test_a_failed_listing_is_never_no_backups[reply1] PASSED [ 73%] tests/test_snapper_backup_identity.py::test_a_failed_listing_is_never_no_backups[reply2] PASSED [ 74%] tests/test_snapper_backup_identity.py::test_a_failed_listing_is_never_no_backups[reply3] PASSED [ 74%] tests/test_snapper_backup_identity.py::TestTheEnumerationScriptItself::test_a_destination_without_snapper_backups_has_none PASSED [ 74%] tests/test_snapper_backup_identity.py::TestTheEnumerationScriptItself::test_a_last_slot_that_was_never_received_does_not_hide_the_others PASSED [ 74%] tests/test_snapper_backup_identity.py::TestTheEnumerationScriptItself::test_one_unreadable_slot_is_left_out_and_the_rest_listed PASSED [ 74%] tests/test_snapper_backup_identity.py::TestTheEnumerationScriptItself::test_no_readable_slot_at_all_is_a_failure PASSED [ 74%] tests/test_snapper_backup_identity.py::TestTheEnumerationScriptItself::test_a_directory_that_cannot_be_entered_is_a_failure PASSED [ 74%] tests/test_snapper_backup_identity.py::TestTheEnumerationScriptItself::test_the_script_is_safe_for_a_csh_login_shell PASSED [ 74%] tests/test_snapper_backup_identity.py::test_run_shell_remote_passes_script_as_single_raw_arg PASSED [ 74%] tests/test_snapper_backup_identity.py::test_publish_moves_stale_aside_never_rm_final PASSED [ 74%] tests/test_snapper_backup_identity.py::test_publish_raises_on_failure PASSED [ 74%] tests/test_snapper_backup_identity.py::test_publish_missing_incoming_never_disturbs_occupied_slot PASSED [ 74%] tests/test_snapper_backup_identity.py::test_publish_recovers_stranded_stale_into_empty_slot PASSED [ 74%] tests/test_snapper_backup_identity.py::test_publish_replaces_occupied_slot_end_to_end PASSED [ 74%] tests/test_snapper_backup_identity.py::test_sync_snapper_failed_in_run_parent_short_circuits_dependents PASSED [ 74%] tests/test_snapper_backup_identity.py::test_sync_snapper_skips_present_via_real_planner PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleDetect::test_snapper_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleDetect::test_snapper_not_found_json PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleDetect::test_no_configs_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleDetect::test_detect_configs PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleDetect::test_detect_configs_with_users PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleDetect::test_detect_json_output PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_snapper_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_snapper_not_found_json PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_no_configs_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_config_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_list_snapshots PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_list_specific_config PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_list_with_type_filter PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_list_no_snapshots PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_list_json_output PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleList::test_list_handles_snapshot_exception PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleStatus::test_snapper_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleStatus::test_no_configs_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleStatus::test_status_local_only PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleStatus::test_status_json_output PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleStatus::test_status_specific_config PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleStatus::test_status_config_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleStatus::test_status_with_target PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleStatus::test_status_target_access_error PASSED [ 74%] tests/test_snapper_cmd.py::TestGenerateSnapperToml::test_basic_volume PASSED [ 74%] tests/test_snapper_cmd.py::TestGenerateSnapperToml::test_volume_with_target PASSED [ 74%] tests/test_snapper_cmd.py::TestGenerateSnapperToml::test_volume_with_ssh_sudo PASSED [ 74%] tests/test_snapper_cmd.py::TestGenerateSnapperToml::test_multiple_volumes PASSED [ 74%] tests/test_snapper_cmd.py::TestGenerateSnapperToml::test_header_comments PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_snapper_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_snapper_not_found_json PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_no_configs_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_generate_all_configs PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_generate_specific_config PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_generate_with_target PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_generate_with_ssh_sudo PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_generate_with_custom_types PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_generate_json_output PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_generate_to_file PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleGenerateConfig::test_missing_config_warning PASSED [ 74%] tests/test_snapper_cmd.py::TestAppendToConfig::test_append_to_existing PASSED [ 74%] tests/test_snapper_cmd.py::TestAppendToConfig::test_append_nonexistent_file PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleBackup::test_snapper_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleBackup::test_config_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleBackup::test_dry_run_all_snapshots PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleBackup::test_dry_run_specific_snapshot PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleBackup::test_snapshot_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleBackup::test_single_backup_skips_when_already_present PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleBackup::test_single_backup_sends_with_correspondence_parent PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleRestore::test_list_mode PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleRestore::test_list_mode_json PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleRestore::test_list_mode_no_backups PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleRestore::test_list_mode_error PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleRestore::test_snapper_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleRestore::test_config_not_found PASSED [ 74%] tests/test_snapper_cmd.py::TestHandleRestore::test_no_snapshot_specified PASSED [ 74%] tests/test_snapper_cmd.py::TestExecuteSnapper::test_no_action PASSED [ 74%] tests/test_snapper_cmd.py::TestExecuteSnapper::test_unknown_action PASSED [ 75%] tests/test_snapper_cmd.py::TestExecuteSnapper::test_dispatch_generate_config PASSED [ 75%] tests/test_snapper_cmd.py::TestSnapperEndpointRouting::test_send_snapper_btrfs_receives_into_incoming_temp_slot PASSED [ 75%] tests/test_snapper_cmd.py::TestSnapperEndpointRouting::test_send_snapper_raw_forces_no_compression PASSED [ 75%] tests/test_snapper_cmd.py::TestSnapperEndpointRouting::test_handle_backup_routes_ssh_through_choose_endpoint PASSED [ 75%] tests/test_snapper_cmd.py::TestSnapperEndpointRouting::test_cleanup_targets_only_incoming_temp_never_published_backup PASSED [ 75%] tests/test_snapper_cmd.py::TestSnapperEndpointRouting::test_handle_backup_threads_ssh_options PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreSnapperdCacheHint::test_hint_printed_after_successful_restore PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreSnapperdCacheHint::test_no_hint_on_dry_run PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_backup_name_restores_exact_older PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_snapshot_collision_restores_newest_only_and_warns PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_snapshot_with_date_picks_dated_copy PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_all_restores_each_backup_once PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_backup_name_not_found_errors_without_restoring PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_date_with_no_match_errors PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_no_selection_errors PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_list_table_shows_name_column_and_tip PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_list_json_includes_backup_name PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_overlapping_selectors_restore_each_once PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_all_plus_snapshot_collision_no_false_warning PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_date_alone_errors_mentioning_date PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreNameDateSelection::test_iso_t_separator_date_matches PASSED [ 75%] tests/test_snapper_cmd.py::TestBackupSelectionHelpers::test_date_matches_prefix PASSED [ 75%] tests/test_snapper_cmd.py::TestBackupSelectionHelpers::test_date_matches_handles_missing_metadata PASSED [ 75%] tests/test_snapper_cmd.py::TestBackupSelectionHelpers::test_recency_key_orders_newest_last PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreConfigOptionalWithList::test_list_without_config_lists PASSED [ 75%] tests/test_snapper_cmd.py::TestRestoreConfigOptionalWithList::test_restore_without_config_errors PASSED [ 75%] tests/test_snapper_cmd.py::TestSnapperRestoreDecryptOptions::test_keyring_and_cipher_threaded PASSED [ 75%] tests/test_snapper_cmd.py::TestSnapperRestoreDecryptOptions::test_absent_flags_not_threaded PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::TestParsing::test_the_date_is_read_as_utc_and_returned_as_local PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::TestParsing::test_a_file_reads_the_same_as_a_string PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::TestParsing::test_the_conversion_is_a_real_shift_when_the_zone_has_an_offset PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::TestGenerating::test_a_local_date_is_written_as_utc PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::TestGenerating::test_generate_then_parse_is_the_identity PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::TestTheSourceAgreesWithItself::test_snapper_list_and_info_xml_date_the_same_snapshot_alike PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::TestTheRawSidecar::test_the_stored_xml_is_the_authority_for_the_date PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::TestTheRawSidecar::test_a_sidecar_without_xml_falls_back_to_its_string PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::TestTheRawSidecar::test_a_new_sidecar_round_trips PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::test_the_helpers_invert_each_other_in_any_zone[UTC] PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::test_the_helpers_invert_each_other_in_any_zone[Pacific/Chatham] PASSED [ 75%] tests/test_snapper_dates_are_utc_in_info_xml.py::test_the_helpers_invert_each_other_in_any_zone[America/New_York] PASSED [ 75%] tests/test_snapper_edges_hold.py::TestCleanupIsAnchoredToTheSlot::test_the_receiver_owns_its_partial_and_removes_only_that PASSED [ 75%] tests/test_snapper_edges_hold.py::TestCleanupIsAnchoredToTheSlot::test_the_receiver_answers_the_pre_existence_probe_itself PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAReadOnlySourceNeedsNoLockFile::test_a_pin_on_a_read_only_location_is_not_an_error PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAReadOnlySourceNeedsNoLockFile::test_any_other_failure_to_pin_still_refuses PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAReadOnlySourceNeedsNoLockFile::test_skip_remote_lock_covers_the_lock_file_store PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAReadOnlySourceNeedsNoLockFile::test_a_release_that_cannot_be_written_is_a_warning PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAReadOnlySourceNeedsNoLockFile::test_a_source_that_is_only_read_gets_no_bookkeeping_tree PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_the_probe_reads_the_mount_table_by_exit_status PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_the_probe_has_no_newline_and_no_case_pattern PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_record_pin_skips_the_pin_on_a_read_only_location PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_record_pin_still_refuses_elsewhere_without_a_doubled_period PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_reason_of_drops_a_final_period_only PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_a_raw_store_on_a_read_only_medium_is_pinned_without_error PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_a_raw_store_that_merely_refuses_the_write_still_aborts PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_the_manager_says_read_only_on_that_exit_status_alone[10-True] PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_the_manager_says_read_only_on_that_exit_status_alone[11-False] PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_the_manager_says_read_only_on_that_exit_status_alone[12-False] PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_the_manager_says_read_only_on_that_exit_status_alone[3-False] PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_the_manager_says_read_only_on_that_exit_status_alone[127-False] PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_a_probe_that_does_not_run_is_not_read_only PASSED [ 75%] tests/test_snapper_edges_hold.py::TestEveryPinWriterDecidesReadOnlyTheSameWay::test_the_local_rule_asks_the_kernel PASSED [ 75%] tests/test_snapper_edges_hold.py::TestOneWriterIntoALocalTarget::test_a_backup_is_refused_while_another_writer_holds_the_target PASSED [ 75%] tests/test_snapper_edges_hold.py::TestOneWriterIntoALocalTarget::test_a_sync_is_refused_while_another_writer_holds_the_target PASSED [ 75%] tests/test_snapper_edges_hold.py::TestOneWriterIntoALocalTarget::test_the_sync_holds_the_lock_for_the_whole_run PASSED [ 75%] tests/test_snapper_edges_hold.py::TestOneWriterIntoALocalTarget::test_the_writer_lock_makes_snapshots_below_an_existing_target_only PASSED [ 75%] tests/test_snapper_edges_hold.py::TestOneWriterIntoALocalTarget::test_a_remote_or_raw_destination_takes_no_local_lock PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAFileNamedLikeASlot::test_it_occupies_its_number PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAFileNamedLikeASlot::test_publish_fresh_refuses_a_number_that_stands_still PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAPinNeverOutlivesTheTransfer::test_ctrl_c_releases_a_restores_pin PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAPinNeverOutlivesTheTransfer::test_any_unexpected_exception_releases_it_too PASSED [ 75%] tests/test_snapper_edges_hold.py::TestAPinNeverOutlivesTheTransfer::test_a_backup_keeps_its_pin_as_before PASSED [ 75%] tests/test_snapper_edges_hold.py::TestPinsProtectEverywhere::test_a_raw_pin_is_seen_by_another_process PASSED [ 75%] tests/test_snapper_edges_hold.py::TestPinsProtectEverywhere::test_a_raw_pin_is_reported_by_the_lock_readers PASSED [ 76%] tests/test_snapper_edges_hold.py::TestPinsProtectEverywhere::test_a_pinned_snapper_slot_is_not_deleted PASSED [ 76%] tests/test_snapper_edges_hold.py::TestPinsProtectEverywhere::test_an_unreadable_lock_store_deletes_no_slot PASSED [ 76%] tests/test_snapper_info_xml_placement.py::TestAWritableDestinationNeedsNoSudo::test_plain_copy_is_used_and_sudo_is_never_invoked PASSED [ 76%] tests/test_snapper_info_xml_placement.py::TestAWritableDestinationNeedsNoSudo::test_the_content_is_written_as_given PASSED [ 76%] tests/test_snapper_info_xml_placement.py::TestAWritableDestinationNeedsNoSudo::test_it_works_as_a_non_root_uid PASSED [ 76%] tests/test_snapper_info_xml_placement.py::TestElevationIsAFallbackNotADefault::test_sudo_is_tried_only_when_the_plain_write_fails PASSED [ 76%] tests/test_snapper_info_xml_placement.py::TestElevationIsAFallbackNotADefault::test_the_fallback_is_non_interactive PASSED [ 76%] tests/test_snapper_info_xml_placement.py::TestElevationIsAFallbackNotADefault::test_root_does_not_shell_out_at_all PASSED [ 76%] tests/test_snapper_info_xml_placement.py::TestFailureIsReportedUsefully::test_a_total_failure_warns_and_says_what_was_lost PASSED [ 76%] tests/test_snapper_info_xml_placement.py::TestTheBackupDirectionReadsTheSourcesOwnFile::test_a_missing_source_file_is_none_not_an_error PASSED [ 76%] tests/test_snapper_info_xml_placement.py::TestTheBackupDirectionReadsTheSourcesOwnFile::test_the_file_is_read_verbatim PASSED [ 76%] tests/test_snapper_layout.py::TestOpeningASlot::test_the_incoming_slot_is_made_below_the_target_and_is_the_receive_path PASSED [ 76%] tests/test_snapper_layout.py::TestOpeningASlot::test_a_stale_incoming_from_a_crashed_run_is_cleared_first PASSED [ 76%] tests/test_snapper_layout.py::TestOpeningASlot::test_a_missing_target_is_refused_before_any_lock_is_taken PASSED [ 76%] tests/test_snapper_layout.py::TestOpeningASlot::test_the_slot_lock_names_the_slots_snapshot_under_the_target PASSED [ 76%] tests/test_snapper_layout.py::TestOpeningASlot::test_a_second_open_while_one_is_open_is_refused PASSED [ 76%] tests/test_snapper_layout.py::TestPublishing::test_publish_renames_the_slot_into_place_with_its_info_xml PASSED [ 76%] tests/test_snapper_layout.py::TestPublishing::test_the_info_xml_is_inside_the_slot_when_the_slot_appears PASSED [ 76%] tests/test_snapper_layout.py::TestPublishing::test_publish_without_info_xml_writes_none PASSED [ 76%] tests/test_snapper_layout.py::TestPublishing::test_a_publish_that_finds_no_received_copy_abandons_the_slot PASSED [ 76%] tests/test_snapper_layout.py::TestPublishing::test_publish_with_nothing_open_is_an_error PASSED [ 76%] tests/test_snapper_layout.py::TestPublishingFresh::test_lands_under_the_number_free_at_publish_with_that_numbers_info_xml PASSED [ 76%] tests/test_snapper_layout.py::TestPublishingFresh::test_an_empty_directory_made_between_the_choice_and_the_rename_is_not_replaced PASSED [ 76%] tests/test_snapper_layout.py::TestPublishingFresh::test_a_publish_that_cannot_rename_abandons_the_slot PASSED [ 76%] tests/test_snapper_layout.py::TestPublishingFresh::test_the_backup_directions_publish_still_replaces_a_recycled_number PASSED [ 76%] tests/test_snapper_layout.py::TestOneRestoreAtATime::test_the_restore_lock_refuses_a_second_holder_and_is_released_after PASSED [ 76%] tests/test_snapper_layout.py::TestOneRestoreAtATime::test_sweep_removes_only_incoming_temps PASSED [ 76%] tests/test_snapper_layout.py::TestAbandoning::test_abandon_removes_only_the_incoming_and_restores_the_path PASSED [ 76%] tests/test_snapper_layout.py::TestAbandoning::test_a_failed_receive_into_a_recycled_number_never_touches_the_published_slot PASSED [ 76%] tests/test_snapper_layout.py::TestAbandoning::test_abandon_with_nothing_open_is_a_no_op PASSED [ 76%] tests/test_snapper_layout.py::TestAbandoning::test_finish_abandons_a_slot_a_failed_receive_left_open PASSED [ 76%] tests/test_snapper_layout.py::TestTheBackupDirectionRunsTheLayout::test_a_backup_lands_in_the_slot_with_the_sources_info_xml PASSED [ 76%] tests/test_snapper_layout.py::TestTheBackupDirectionRunsTheLayout::test_a_failed_send_abandons_the_slot PASSED [ 76%] tests/test_snapper_layout.py::TestTheBackupDirectionRunsTheLayout::test_a_broken_publish_fails_the_backup PASSED [ 76%] tests/test_snapper_layout.py::TestTheBackupDirectionRunsTheLayout::test_a_broken_slot_primitive_fails_the_backup PASSED [ 76%] tests/test_snapper_layout.py::TestTheBackupDirectionRunsTheLayout::test_the_inline_lifecycle_is_gone PASSED [ 76%] tests/test_snapper_least_privilege.py::TestShellPrivilegeFollowsDestinationAccess::test_writable_destination_runs_the_shell_unprivileged PASSED [ 76%] tests/test_snapper_least_privilege.py::TestShellPrivilegeFollowsDestinationAccess::test_unwritable_destination_falls_back_to_a_privileged_shell PASSED [ 76%] tests/test_snapper_least_privilege.py::TestShellPrivilegeFollowsDestinationAccess::test_script_is_raw_in_both_modes PASSED [ 76%] tests/test_snapper_least_privilege.py::TestShellPrivilegeFollowsDestinationAccess::test_writability_is_probed_once_per_endpoint PASSED [ 76%] tests/test_snapper_least_privilege.py::TestShellPrivilegeFollowsDestinationAccess::test_unwritable_destination_advises_the_acl_grant PASSED [ 76%] tests/test_snapper_least_privilege.py::TestBtrfsVerbsCarryTheirOwnSudo::test_remote_with_ssh_sudo PASSED [ 76%] tests/test_snapper_least_privilege.py::TestBtrfsVerbsCarryTheirOwnSudo::test_remote_without_ssh_sudo PASSED [ 76%] tests/test_snapper_least_privilege.py::TestBtrfsVerbsCarryTheirOwnSudo::test_local_as_root_needs_no_sudo PASSED [ 76%] tests/test_snapper_least_privilege.py::TestBtrfsVerbsCarryTheirOwnSudo::test_local_as_user_elevates_btrfs_only PASSED [ 76%] tests/test_snapper_least_privilege.py::TestGeneratedScriptsElevateOnlyBtrfs::test_enumerate_script PASSED [ 76%] tests/test_snapper_least_privilege.py::TestGeneratedScriptsElevateOnlyBtrfs::test_cleanup_script PASSED [ 76%] tests/test_snapper_least_privilege.py::test_capability_probe_uses_btrfs_not_true PASSED [ 76%] tests/test_snapper_least_privilege.py::test_never_raises_on_transport_failure[True] PASSED [ 76%] tests/test_snapper_least_privilege.py::test_never_raises_on_transport_failure[False] PASSED [ 76%] tests/test_snapper_metadata.py::TestSnapperSnapshotBackupName::test_default_format PASSED [ 76%] tests/test_snapper_metadata.py::TestSnapperSnapshotBackupName::test_honors_configured_format PASSED [ 76%] tests/test_snapper_metadata.py::TestCreateSnapperSnapshotWrapper::test_none_endpoint_does_not_crash PASSED [ 76%] tests/test_snapper_metadata.py::TestCreateSnapperSnapshotWrapper::test_honors_endpoint_timestamp_format PASSED [ 76%] tests/test_snapper_metadata.py::TestSnapperMetadata::test_create_basic_metadata PASSED [ 76%] tests/test_snapper_metadata.py::TestSnapperMetadata::test_create_post_metadata PASSED [ 76%] tests/test_snapper_metadata.py::TestSnapperMetadata::test_to_dict PASSED [ 76%] tests/test_snapper_metadata.py::TestSnapperMetadata::test_from_dict PASSED [ 76%] tests/test_snapper_metadata.py::TestSnapperMetadata::test_roundtrip_dict PASSED [ 76%] tests/test_snapper_metadata.py::TestParseInfoXml::test_parse_single_snapshot PASSED [ 76%] tests/test_snapper_metadata.py::TestParseInfoXml::test_parse_post_snapshot PASSED [ 76%] tests/test_snapper_metadata.py::TestParseInfoXml::test_parse_with_userdata PASSED [ 76%] tests/test_snapper_metadata.py::TestParseInfoXml::test_parse_minimal_xml PASSED [ 76%] tests/test_snapper_metadata.py::TestParseInfoXml::test_parse_missing_file PASSED [ 76%] tests/test_snapper_metadata.py::TestParseInfoXml::test_parse_invalid_xml PASSED [ 76%] tests/test_snapper_metadata.py::TestParseInfoXml::test_parse_missing_type PASSED [ 76%] tests/test_snapper_metadata.py::TestParseInfoXml::test_parse_wrong_root PASSED [ 76%] tests/test_snapper_metadata.py::TestGenerateInfoXml::test_generate_basic PASSED [ 76%] tests/test_snapper_metadata.py::TestGenerateInfoXml::test_generate_with_pre_num PASSED [ 76%] tests/test_snapper_metadata.py::TestGenerateInfoXml::test_generate_with_userdata PASSED [ 76%] tests/test_snapper_metadata.py::TestGenerateInfoXml::test_generate_escapes_special_chars PASSED [ 76%] tests/test_snapper_metadata.py::TestGenerateInfoXml::test_roundtrip_xml PASSED [ 76%] tests/test_snapper_metadata.py::TestBackupMetadata::test_from_snapper_metadata PASSED [ 77%] tests/test_snapper_metadata.py::TestBackupMetadata::test_to_snapper_metadata PASSED [ 77%] tests/test_snapper_metadata.py::TestSaveLoadBackupMetadata::test_save_and_load PASSED [ 77%] tests/test_snapper_metadata.py::TestSaveLoadBackupMetadata::test_load_missing_file PASSED [ 77%] tests/test_snapper_metadata.py::TestSaveLoadBackupMetadata::test_load_invalid_json PASSED [ 77%] tests/test_snapper_metadata.py::TestSaveLoadBackupMetadata::test_saved_file_is_valid_json PASSED [ 77%] tests/test_snapper_metadata.py::TestUserdataKeyValueFormat::test_parse_string_multi_entry_userdata PASSED [ 77%] tests/test_snapper_metadata.py::TestUserdataKeyValueFormat::test_parse_single_block_multi_pair_also_supported PASSED [ 77%] tests/test_snapper_metadata.py::TestUserdataKeyValueFormat::test_parse_file_multi_entry_userdata PASSED [ 77%] tests/test_snapper_metadata.py::TestUserdataKeyValueFormat::test_generate_emits_key_value_pairs PASSED [ 77%] tests/test_snapper_metadata.py::TestUserdataKeyValueFormat::test_round_trip_preserves_multi_entry PASSED [ 77%] tests/test_snapper_metadata.py::TestUserdataKeyValueFormat::test_legacy_name_value_form_still_parses PASSED [ 77%] tests/test_snapper_metadata.py::TestUserdataKeyValueFormat::test_value_without_key_is_ignored PASSED [ 77%] tests/test_snapper_metadata.py::TestUserdataKeyValueFormat::test_parse_string_rejects_malformed_xml PASSED [ 77%] tests/test_snapper_metadata.py::TestRenumberInfoXml::test_changes_only_num_and_preserves_uid PASSED [ 77%] tests/test_snapper_metadata.py::TestRenumberInfoXml::test_reparses_to_same_metadata_with_new_num PASSED [ 77%] tests/test_snapper_metadata.py::TestRenumberInfoXml::test_rejects_missing_num PASSED [ 77%] tests/test_snapper_metadata.py::TestRenumberInfoXml::test_rejects_malformed_xml PASSED [ 77%] tests/test_snapper_metadata.py::TestUserdataEscaping::test_special_chars_round_trip PASSED [ 77%] tests/test_snapper_metadata.py::TestSaveBackupMetadataAtomic::test_saved_file_is_0600_and_no_temp_left PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestItActuallyConnects::test_a_remote_destination_enumerates PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestItActuallyConnects::test_it_issues_a_remote_find_rather_than_stat_ing_locally PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestItActuallyConnects::test_metadata_comes_from_the_remote_info_xml PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestItActuallyConnects::test_results_are_ordered_by_snapshot_number PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestItActuallyConnects::test_paths_point_at_the_remote_layout PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestPartialAndTransactionalStates::test_transactional_temp_slots_are_not_backups PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestPartialAndTransactionalStates::test_a_slot_without_a_published_snapshot_is_skipped PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestPartialAndTransactionalStates::test_a_backup_without_info_xml_still_enumerates PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestAFailedScanIsNotAnEmptyResult::test_a_failed_find_raises[find: '/remote/dest/.snapshots': Permission denied] PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestAFailedScanIsNotAnEmptyResult::test_a_failed_find_raises[find: '/remote/dest/.snapshots': No such file or directory] PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestAFailedScanIsNotAnEmptyResult::test_a_failed_find_raises[sh: find: command not found] PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestAFailedScanIsNotAnEmptyResult::test_a_failed_find_raises[] PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestAFailedScanIsNotAnEmptyResult::test_the_error_repeats_what_find_said PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestAFailedScanIsNotAnEmptyResult::test_a_missing_location_raises_rather_than_reporting_none PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestAFailedScanIsNotAnEmptyResult::test_an_empty_but_readable_location_is_genuinely_empty PASSED [ 77%] tests/test_snapper_remote_enumeration.py::TestOutputIsCaptured::test_every_remote_call_requests_pipes PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheParentComesFromTheConfig::test_one_increment_onto_an_empty_config_is_one_full_send_into_slot_one PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheParentComesFromTheConfig::test_the_selection_is_not_expanded_to_the_chain PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheParentComesFromTheConfig::test_a_parent_the_config_holds_is_used_incrementally PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheParentComesFromTheConfig::test_a_copy_under_the_same_number_with_a_different_identity_is_no_parent PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheParentComesFromTheConfig::test_all_onto_empty_media_is_a_chain_rebuilt_from_the_restored_base PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheParentComesFromTheConfig::test_every_selected_backup_lands_in_a_new_slot_even_when_present PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSlot::test_the_copy_lands_in_the_incoming_slot_and_is_published_afterwards PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSlot::test_the_verdict_judges_the_copy_in_its_slot PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSlot::test_an_invalid_copy_is_not_published_and_leaves_nothing PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSlot::test_a_failed_receive_leaves_no_numbered_slot_and_no_incoming PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSlot::test_a_failure_in_the_middle_of_all_leaves_only_the_published_slots PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSlot::test_a_broken_slot_primitive_fails_the_restore PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSlot::test_a_rename_that_cannot_proceed_fails_the_restore_and_leaves_nothing PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSlot::test_the_slot_number_is_taken_fresh_for_each_receive PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestSnapperTakesTheNumberWhileTheReceiveIsInFlight::test_a_snapshot_snapper_made_at_n_survives_and_the_copy_lands_at_n_plus_one PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestSnapperTakesTheNumberWhileTheReceiveIsInFlight::test_an_empty_directory_snapper_just_made_is_not_taken_over PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestSnapperTakesTheNumberWhileTheReceiveIsInFlight::test_the_plan_says_the_number_is_decided_at_publish PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestOneRestoreAtATimeIntoAConfig::test_a_second_restore_while_one_runs_is_refused_and_damages_nothing PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestOneRestoreAtATimeIntoAConfig::test_the_lock_is_released_when_the_restore_ends PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestOneRestoreAtATimeIntoAConfig::test_temps_of_restores_that_died_are_swept_first PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestOneRestoreAtATimeIntoAConfig::test_a_dry_run_sweeps_nothing PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestOneRestoreAtATimeIntoAConfig::test_a_dry_run_creates_nothing PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestOneRestoreAtATimeIntoAConfig::test_a_config_without_snapshots_dir_is_refused PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSourceEndpoint::test_the_source_is_prepared_before_anything_is_sent PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSourceEndpoint::test_the_source_snapshot_is_the_remote_slot_sent_by_its_own_endpoint PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestTheSourceEndpoint::test_a_dry_run_prepares_and_lists_but_sends_nothing PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestPins::test_the_backup_is_pinned_under_the_restore_session_and_released_after PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestPins::test_the_parent_is_pinned_too_while_the_increment_is_sent PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestPins::test_a_failed_restore_releases_its_pin PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestInfoXml::test_the_slots_info_xml_is_the_backups_renumbered_verbatim PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestInfoXml::test_a_remote_backups_info_xml_is_renumbered_verbatim_too PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestInfoXml::test_renumbering_changes_only_num PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestInfoXml::test_unparseable_text_falls_back_to_the_parsed_fields PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestInfoXml::test_no_text_and_no_fields_gives_a_minimal_record_naming_the_backup PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestInfoXml::test_a_backup_without_info_xml_still_restores_with_a_minimal_one PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestThePreviewIsTheRun::test_the_dry_run_prints_the_plan_the_run_executes_and_changes_nothing PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestThePreviewIsTheRun::test_each_published_slot_is_reported_with_how_it_was_received PASSED [ 77%] tests/test_snapper_restore_as_transfer.py::TestThePreviewIsTheRun::test_the_plan_says_where_the_slots_start PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestARawStoreAsTheSource::test_a_stored_increment_without_its_parent_is_refused_before_streaming PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestARawStoreAsTheSource::test_selecting_the_parent_too_is_honoured PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestARawStoreAsTheSource::test_a_parent_the_config_already_holds_satisfies_the_increment PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestARawStoreAsTheSource::test_the_slots_info_xml_comes_from_the_sidecars_stored_xml PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestARawStoreAsTheSource::test_the_plan_says_what_a_stored_stream_is PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestARawStoreAsTheSource::test_a_reused_number_restores_exactly_the_copy_selected PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestARawStoreAsTheSource::test_the_verdict_judges_the_slot_for_a_stored_stream_too PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestARawStoreAsTheSource::test_a_sidecar_whose_stream_is_gone_is_refused PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestRefusals::test_an_unknown_config PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestRefusals::test_a_config_whose_subvolume_is_not_there PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestRefusals::test_an_empty_selection PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestRefusals::test_a_selection_the_listing_does_not_hold PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestTheSlotThroughTheRealRemoteSend::test_it_yields_a_remote_btrfs_send_of_the_slots_subvolume PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestTheSlotThroughTheRealRemoteSend::test_a_parent_slot_becomes_dash_p PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestTheSlotThroughTheRealRemoteSend::test_ssh_sudo_elevates_the_remote_send_without_a_prompt_once_probed PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestTheSlotThroughTheRealRemoteSend::test_a_base_with_spaces_cannot_be_split_by_the_remote_shell PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::TestTheSlotThroughTheRealRemoteSend::test_the_slot_is_one_path_component_to_the_engine PASSED [ 78%] tests/test_snapper_restore_as_transfer.py::test_the_removed_paths_are_gone_not_neutralised PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_the_measured_case[Pacific/Honolulu] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_the_measured_case[UTC] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_the_measured_case[Pacific/Chatham] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_across_a_day_boundary[Pacific/Honolulu] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_across_a_day_boundary[UTC] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_across_a_day_boundary[Pacific/Chatham] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_input_order_does_not_decide[Pacific/Honolulu] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_input_order_does_not_decide[UTC] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_input_order_does_not_decide[Pacific/Chatham] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_held_backups_and_missing_snapshots_tie_by_number_too[Pacific/Honolulu] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_held_backups_and_missing_snapshots_tie_by_number_too[UTC] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_held_backups_and_missing_snapshots_tie_by_number_too[Pacific/Chatham] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_all_four_in_one_second[Pacific/Honolulu] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_all_four_in_one_second[UTC] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheTieGoesToTheHigherNumber::test_all_four_in_one_second[Pacific/Chatham] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestEverySnapperRetentionPathAgrees::test_the_prune_plan[Pacific/Honolulu] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestEverySnapperRetentionPathAgrees::test_the_prune_plan[UTC] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestEverySnapperRetentionPathAgrees::test_the_prune_plan[Pacific/Chatham] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestEverySnapperRetentionPathAgrees::test_runs_catch_up_selection[Pacific/Honolulu] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestEverySnapperRetentionPathAgrees::test_runs_catch_up_selection[UTC] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestEverySnapperRetentionPathAgrees::test_runs_catch_up_selection[Pacific/Chatham] PASSED [ 78%] tests/test_snapper_retention_breaks_same_second_ties.py::TestTheEngineParameter::test_get_order_breaks_a_tie_the_name_cannot PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheEngineCanTimeANumberedSlot::test_a_slot_number_alone_would_be_quarantined PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheEngineCanTimeANumberedSlot::test_with_the_callback_it_makes_a_real_decision PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheEngineCanTimeANumberedSlot::test_the_newest_is_always_kept PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheEngineCanTimeANumberedSlot::test_a_backup_with_no_date_is_never_deleted PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheEngineCanTimeANumberedSlot::test_a_non_datetime_date_is_treated_as_unknown PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheEngineCanTimeANumberedSlot::test_a_backup_with_no_metadata_is_treated_as_unknown PASSED [ 78%] tests/test_snapper_retention_plan.py::TestThePlanUsesTheSharedEnumeration::test_an_empty_destination_plans_nothing PASSED [ 78%] tests/test_snapper_retention_plan.py::TestThePlanUsesTheSharedEnumeration::test_old_backups_are_selected_for_deletion PASSED [ 78%] tests/test_snapper_retention_plan.py::TestThePlanUsesTheSharedEnumeration::test_everything_within_min_is_kept PASSED [ 78%] tests/test_snapper_retention_plan.py::TestThePlanUsesTheSharedEnumeration::test_an_enumeration_failure_propagates PASSED [ 78%] tests/test_snapper_retention_plan.py::TestThePlanUsesTheSharedEnumeration::test_the_endpoint_options_are_threaded_through PASSED [ 78%] tests/test_snapper_retention_plan.py::TestThePlanIsReadable::test_it_reports_both_sides PASSED [ 78%] tests/test_snapper_retention_plan.py::TestThePlanIsReadable::test_it_is_ordered_newest_first PASSED [ 78%] tests/test_snapper_retention_plan.py::TestThePlanIsReadable::test_an_undated_backup_still_renders PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheRunPhaseContract::test_old_backups_are_actually_deleted PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheRunPhaseContract::test_a_degenerate_policy_fails_the_run PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheRunPhaseContract::test_an_enumeration_failure_fails_the_run PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheRunPhaseContract::test_nothing_to_delete_is_a_success PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheRunPhaseContract::test_no_successful_targets_prunes_nothing PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheRunPhaseContract::test_a_delete_failure_fails_the_run PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheRunPhaseContract::test_the_source_is_never_pruned PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheDeletePrimitive::test_the_subvolume_is_deleted_before_the_slot_directory PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheDeletePrimitive::test_a_failed_subvolume_delete_leaves_the_slot_alone PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheDeletePrimitive::test_a_refused_sudo_on_a_local_destination_leaves_the_slot_alone PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheDeletePrimitive::test_a_failed_directory_removal_is_not_fatal PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheDeletePrimitive::test_it_targets_the_exact_slot_path PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheDeletePrimitive::test_a_raw_target_reuses_the_endpoint_delete PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheDeletePrimitive::test_a_raw_backup_with_no_matching_stream_is_an_error_not_a_silent_skip PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheDeletePrimitive::test_one_bad_delete_does_not_abort_the_rest PASSED [ 78%] tests/test_snapper_retention_plan.py::TestTheDeletePrimitive::test_deleting_nothing_is_a_no_op PASSED [ 78%] tests/test_snapper_retention_plan.py::TestSlotNumbersDoNotDecideAnything::test_the_same_snapshots_are_chosen_under_either_numbering PASSED [ 78%] tests/test_snapper_retention_plan.py::TestSlotNumbersDoNotDecideAnything::test_with_real_snapper_numbering_the_low_numbers_go PASSED [ 78%] tests/test_snapper_retention_plan.py::TestSlotNumbersDoNotDecideAnything::test_the_newest_slot_is_never_deleted PASSED [ 79%] tests/test_snapper_retention_plan.py::TestSlotNumbersDoNotDecideAnything::test_it_is_the_date_not_the_number_that_orders_them PASSED [ 79%] tests/test_snapper_retention_plan.py::TestTheRunPathActuallyInvokesRetention::test_the_retention_phase_is_called PASSED [ 79%] tests/test_snapper_retention_plan.py::TestTheRunPathActuallyInvokesRetention::test_it_is_given_the_targets_that_succeeded PASSED [ 79%] tests/test_snapper_retention_plan.py::TestTheRunPathActuallyInvokesRetention::test_a_successful_prune_leaves_the_run_successful PASSED [ 79%] tests/test_snapper_retention_plan.py::TestTheRunPathActuallyInvokesRetention::test_a_failed_prune_fails_the_run PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[0-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[1-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[2-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[3-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[4-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[5-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[6-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[7-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[8-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[9-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[10-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[11-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-2] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-3] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[12-4] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-0] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-1] PASSED [ 79%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[13-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[14-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[15-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[16-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[17-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[18-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[19-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[20-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[21-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[22-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[23-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[24-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[25-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[26-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-0] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-1] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-2] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-3] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[27-4] PASSED [ 80%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[28-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[29-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[30-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[31-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[32-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[33-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[34-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[35-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[36-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[37-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[38-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-0] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-1] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-2] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-3] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheTargetEndsUpTheSame::test_send_what_prune_keeps_then_prune_equals_send_all_then_prune[39-4] PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheSelector::test_it_leaves_out_what_the_prune_would_delete PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheSelector::test_a_degenerate_policy_sends_everything PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheSelector::test_fewer_than_two_missing_sends_everything PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheSelector::test_an_enumeration_failure_sends_everything PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheSelector::test_a_destination_with_no_layout_yet_holds_nothing PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheSelector::test_a_destination_whose_layout_cannot_be_read_sends_everything PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestTheSelector::test_the_endpoint_options_reach_the_enumeration PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestSyncHonoursTheSelection::test_a_selection_plans_and_sends_only_its_members PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestSyncHonoursTheSelection::test_none_plans_everything PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestSyncHonoursTheSelection::test_no_selector_is_the_old_behaviour PASSED [ 81%] tests/test_snapper_run_sends_what_prune_keeps.py::TestRunWiresIt::test_the_snapper_pipeline_passes_a_selector PASSED [ 81%] tests/test_snapper_scanner.py::TestSnapperConfig::test_create_basic_config PASSED [ 81%] tests/test_snapper_scanner.py::TestSnapperConfig::test_snapshots_dir PASSED [ 81%] tests/test_snapper_scanner.py::TestSnapperConfig::test_is_valid_with_mock_fs PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperConfig::test_is_valid_wrong_fstype PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperConfig::test_is_valid_missing_snapshots_dir PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_init_default PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_init_custom_dir PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_list_configs_no_dir PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_list_configs_empty PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_list_configs_parses_files PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_get_config_exists PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_get_config_not_exists PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_find_config_for_path PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_parse_config_with_comments PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_parse_config_allow_groups PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScanner::test_parse_config_sync_acl PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerSnapshots::test_get_snapshots_via_filesystem PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerSnapshots::test_get_snapshots_filters_by_type PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerSnapshots::test_get_snapshots_excludes_cleanup PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerSnapshots::test_get_snapshots_skips_invalid PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerSnapshots::test_get_snapshot_specific PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerSnapshots::test_get_snapshot_not_found PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerSnapshots::test_get_next_snapshot_number PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerSnapshots::test_get_next_snapshot_number_empty PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerCommand::test_is_snapper_available_not_found PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerCommand::test_is_snapper_available_found PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerCommand::test_get_snapshots_via_command PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerEdgeCases::test_list_configs_skips_directories PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerEdgeCases::test_list_configs_handles_parse_error PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerEdgeCases::test_get_config_handles_parse_error PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerEdgeCases::test_get_snapshots_invalid_config_name PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerEdgeCases::test_get_snapshots_command_fallback PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerEdgeCases::test_parse_config_invalid_space_limit PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerEdgeCases::test_parse_config_invalid_free_limit PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperScannerEdgeCases::test_find_config_for_path_no_match PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperSnapshot::test_get_backup_name PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperSnapshot::test_snapshot_ordering PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperSnapshot::test_snapshot_equality PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperSnapshot::test_snapshot_hash PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperSnapshot::test_snapshot_exists PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperSnapshot::test_snapshot_repr PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperSnapshot::test_snapshot_lt_not_implemented PASSED [ 82%] tests/test_snapper_scanner.py::TestSnapperSnapshot::test_snapshot_eq_with_non_snapshot PASSED [ 82%] tests/test_snapper_slot_is_complete_or_not_at_all.py::TestTheRestoreDirection::test_a_copy_whose_info_xml_cannot_be_written_is_not_published PASSED [ 82%] tests/test_snapper_slot_is_complete_or_not_at_all.py::TestTheBackupDirection::test_a_backup_whose_info_xml_cannot_be_written_is_not_published PASSED [ 82%] tests/test_snapper_slot_is_complete_or_not_at_all.py::TestTheBackupDirection::test_a_publish_with_no_info_xml_to_write_is_unaffected PASSED [ 82%] tests/test_snapper_slot_is_complete_or_not_at_all.py::TestTheBackupDirection::test_a_written_info_xml_publishes_with_the_slot PASSED [ 82%] tests/test_snapper_slot_is_complete_or_not_at_all.py::test_the_writer_reports_its_outcome PASSED [ 82%] tests/test_snapper_slot_is_created_below_the_target.py::TestTheSlotIsCreatedBelowAnExistingTarget::test_the_slot_appears_under_the_target PASSED [ 82%] tests/test_snapper_slot_is_created_below_the_target.py::TestTheSlotIsCreatedBelowAnExistingTarget::test_it_is_idempotent PASSED [ 82%] tests/test_snapper_slot_is_created_below_the_target.py::TestTheSlotIsCreatedBelowAnExistingTarget::test_a_missing_target_is_refused_and_nothing_is_created PASSED [ 82%] tests/test_snapper_slot_is_created_below_the_target.py::TestTheSlotIsCreatedBelowAnExistingTarget::test_the_script_never_says_mkdir_dash_p PASSED [ 82%] tests/test_snapper_slot_is_created_below_the_target.py::TestTheSlotIsCreatedBelowAnExistingTarget::test_a_target_that_cannot_be_written_is_its_own_failure PASSED [ 82%] tests/test_snapper_slot_is_created_below_the_target.py::TestTheSendUsesTheSlot::test_send_snapper_snapshot_makes_the_slot_before_sending PASSED [ 82%] tests/test_snapper_slot_is_created_below_the_target.py::TestTheSendUsesTheSlot::test_a_missing_target_is_refused_before_any_lock_is_taken PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_it_returns_false_rather_than_raising[None] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_it_returns_false_rather_than_raising[a string] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_it_returns_false_rather_than_raising[42] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_it_returns_false_rather_than_raising[3.5] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_it_returns_false_rather_than_raising[other4] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_it_returns_false_rather_than_raising[other5] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_it_returns_false_rather_than_raising[other6] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_it_returns_false_rather_than_raising[other7] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_inequality_works_too[None] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_inequality_works_too[a string] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_inequality_works_too[42] PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAForeignType::test_membership_in_a_mixed_list_does_not_crash PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAnotherSnapshot::test_same_prefix_and_time_are_equal PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAnotherSnapshot::test_a_different_prefix_is_not_equal PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAnotherSnapshot::test_a_different_time_is_not_equal PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparingAgainstAnotherSnapshot::test_a_snapshot_equals_itself PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparisonWithARawSnapshot::test_equality_is_symmetric PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparisonWithARawSnapshot::test_the_same_backup_compares_equal_from_either_side PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparisonWithARawSnapshot::test_a_different_name_is_not_equal PASSED [ 82%] tests/test_snapshot_equality_contract.py::TestComparisonWithARawSnapshot::test_an_unrelated_object_is_still_not_equal PASSED [ 82%] tests/test_snapshot_registered_once.py::TestOneSnapshotIsRegisteredOnce::test_the_cache_gains_exactly_one_entry[True] PASSED [ 83%] tests/test_snapshot_registered_once.py::TestOneSnapshotIsRegisteredOnce::test_the_cache_gains_exactly_one_entry[False] PASSED [ 83%] tests/test_snapshot_registered_once.py::TestOneSnapshotIsRegisteredOnce::test_add_snapshot_is_idempotent_by_path PASSED [ 83%] tests/test_snapshot_registered_once.py::TestCountBasedRetentionKeepsWhatItWasAsked::test_exactly_keep_snapshots_survive[1-1] PASSED [ 83%] tests/test_snapshot_registered_once.py::TestCountBasedRetentionKeepsWhatItWasAsked::test_exactly_keep_snapshots_survive[3-1] PASSED [ 83%] tests/test_snapshot_registered_once.py::TestCountBasedRetentionKeepsWhatItWasAsked::test_exactly_keep_snapshots_survive[4-2] PASSED [ 83%] tests/test_snapshot_registered_once.py::TestCountBasedRetentionKeepsWhatItWasAsked::test_exactly_keep_snapshots_survive[4-3] PASSED [ 83%] tests/test_snapshot_registered_once.py::TestCountBasedRetentionKeepsWhatItWasAsked::test_exactly_keep_snapshots_survive[5-4] PASSED [ 83%] tests/test_snapshot_registered_once.py::TestCountBasedRetentionKeepsWhatItWasAsked::test_minus_n_one_does_not_destroy_the_snapshot_just_taken PASSED [ 83%] tests/test_snapshot_registered_once.py::TestCountBasedRetentionKeepsWhatItWasAsked::test_the_extra_casualty_was_an_old_snapshot PASSED [ 83%] tests/test_snapshot_registered_once.py::test_the_registration_is_outside_the_command_loop PASSED [ 83%] tests/test_space.py::TestSpaceInfo::test_basic_space_info PASSED [ 83%] tests/test_space.py::TestSpaceInfo::test_space_info_with_quotas PASSED [ 83%] tests/test_space.py::TestSpaceInfo::test_quota_remaining PASSED [ 83%] tests/test_space.py::TestSpaceInfo::test_quota_remaining_no_quota PASSED [ 83%] tests/test_space.py::TestSpaceInfo::test_quota_remaining_no_limit PASSED [ 83%] tests/test_space.py::TestSpaceInfo::test_quota_remaining_no_usage_info PASSED [ 83%] tests/test_space.py::TestSpaceInfo::test_effective_available_no_quota PASSED [ 83%] tests/test_space.py::TestSpaceInfo::test_effective_available_quota_more_restrictive PASSED [ 83%] tests/test_space.py::TestSpaceInfo::test_effective_available_fs_more_restrictive PASSED [ 83%] tests/test_space.py::TestSpaceCheck::test_basic_space_check PASSED [ 83%] tests/test_space.py::TestSpaceCheck::test_insufficient_space_check PASSED [ 83%] tests/test_space.py::TestGetFilesystemSpace::test_local_statvfs PASSED [ 83%] tests/test_space.py::TestGetFilesystemSpace::test_local_statvfs_nonexistent_path PASSED [ 83%] tests/test_space.py::TestGetFilesystemSpace::test_remote_execution PASSED [ 83%] tests/test_space.py::TestGetFilesystemSpace::test_remote_execution_bytes_output PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_quotas_enabled_with_limit PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_quotas_enabled_no_limit PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_quotas_not_enabled PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_uses_sudo_when_not_root PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_a_refused_sudo_reads_as_no_quota_information PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_no_sudo_when_root PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_timeout_handling PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_btrfs_not_found PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_remote_execution PASSED [ 83%] tests/test_space.py::TestGetBtrfsQuotaInfo::test_remote_execution_failure PASSED [ 83%] tests/test_space.py::TestParseQgroupOutput::test_standard_output_with_limit PASSED [ 83%] tests/test_space.py::TestParseQgroupOutput::test_standard_output_no_limit PASSED [ 83%] tests/test_space.py::TestParseQgroupOutput::test_multiple_qgroups PASSED [ 83%] tests/test_space.py::TestParseQgroupOutput::test_empty_output PASSED [ 83%] tests/test_space.py::TestParseQgroupOutput::test_header_only_output PASSED [ 83%] tests/test_space.py::TestParseQgroupOutput::test_malformed_line PASSED [ 83%] tests/test_space.py::TestCheckSpaceAvailability::test_sufficient_space_no_quota PASSED [ 83%] tests/test_space.py::TestCheckSpaceAvailability::test_insufficient_space_no_quota PASSED [ 83%] tests/test_space.py::TestCheckSpaceAvailability::test_quota_more_restrictive PASSED [ 83%] tests/test_space.py::TestCheckSpaceAvailability::test_safety_margin_applied PASSED [ 83%] tests/test_space.py::TestCheckSpaceAvailability::test_minimum_safety_margin PASSED [ 83%] tests/test_space.py::TestCheckSpaceAvailability::test_custom_safety_margin PASSED [ 83%] tests/test_space.py::TestCheckSpaceAvailability::test_available_after_calculation PASSED [ 83%] tests/test_space.py::TestCheckSpaceAvailability::test_low_space_warning PASSED [ 83%] tests/test_space.py::TestCheckSpaceAvailability::test_zero_required_bytes PASSED [ 83%] tests/test_space.py::TestGetSpaceInfo::test_no_quotas PASSED [ 83%] tests/test_space.py::TestGetSpaceInfo::test_with_quotas PASSED [ 83%] tests/test_space.py::TestGetSpaceInfo::test_passes_exec_func PASSED [ 83%] tests/test_space.py::TestFormatSize::test_format_bytes PASSED [ 83%] tests/test_space.py::TestFormatSize::test_format_kibibytes PASSED [ 83%] tests/test_space.py::TestFormatSize::test_format_mebibytes PASSED [ 83%] tests/test_space.py::TestFormatSize::test_format_gibibytes PASSED [ 83%] tests/test_space.py::TestFormatSize::test_format_tebibytes PASSED [ 83%] tests/test_space.py::TestFormatSpaceCheck::test_format_sufficient_space_no_quota PASSED [ 83%] tests/test_space.py::TestFormatSpaceCheck::test_format_insufficient_space PASSED [ 83%] tests/test_space.py::TestFormatSpaceCheck::test_format_with_quota PASSED [ 83%] tests/test_space.py::TestFormatSpaceCheck::test_format_with_quota_fs_more_restrictive PASSED [ 83%] tests/test_space.py::TestFormatSpaceCheck::test_format_with_quota_no_limit PASSED [ 83%] tests/test_space.py::TestFormatSpaceCheck::test_format_with_warning PASSED [ 83%] tests/test_space.py::TestInsufficientSpaceError::test_exception_exists PASSED [ 83%] tests/test_space.py::TestInsufficientSpaceError::test_exception_can_be_raised PASSED [ 83%] tests/test_space.py::TestInsufficientSpaceError::test_exception_message PASSED [ 83%] tests/test_space_check_not_skipped_silently.py::test_an_unmeasurable_snapshot_is_not_reported_as_no_data PASSED [ 83%] tests/test_space_check_not_skipped_silently.py::test_a_genuinely_empty_plan_still_says_no_data PASSED [ 83%] tests/test_space_check_not_skipped_silently.py::test_a_measured_transfer_actually_checks_space PASSED [ 83%] tests/test_space_check_not_skipped_silently.py::test_unmeasured_count_distinguishes_unknown_from_zero[snapshot0-1] PASSED [ 83%] tests/test_space_check_not_skipped_silently.py::test_unmeasured_count_distinguishes_unknown_from_zero[snapshot1-0] PASSED [ 84%] tests/test_space_check_not_skipped_silently.py::test_unmeasured_count_distinguishes_unknown_from_zero[snapshot2-0] PASSED [ 84%] tests/test_space_check_not_skipped_silently.py::test_unmeasured_count_distinguishes_unknown_from_zero[snapshot3-1] PASSED [ 84%] tests/test_space_check_not_skipped_silently.py::test_unmeasured_count_distinguishes_unknown_from_zero[snapshot4-0] PASSED [ 84%] tests/test_space_flags.py::test_defaults_preserve_always_check PASSED [ 84%] tests/test_space_flags.py::test_no_check_space_disables_the_check PASSED [ 84%] tests/test_space_flags.py::test_force_is_threaded PASSED [ 84%] tests/test_space_flags.py::test_safety_margin_is_threaded_when_set PASSED [ 84%] tests/test_space_flags.py::test_transfer_to_target_merges_space_options PASSED [ 84%] tests/test_space_flags.py::test_backup_snapper_volume_merges_space_options PASSED [ 84%] tests/test_space_flags.py::test_execute_transfer_merges_space_options PASSED [ 84%] tests/test_space_flags.py::test_transfer_to_target_without_space_options_is_safe PASSED [ 84%] tests/test_space_flags.py::test_send_snapshot_skips_preflight_when_check_space_false PASSED [ 84%] tests/test_space_flags.py::test_send_snapshot_skips_preflight_when_forced PASSED [ 84%] tests/test_space_flags.py::test_send_snapshot_runs_preflight_by_default PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_owned_socket_true_for_owned_socket PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_owned_socket_false_for_regular_file_missing_and_none PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_owned_socket_rejects_wrong_owner PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_owned_socket_no_follow_rejects_symlink PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_explicit_override_wins_over_env PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_invalid_override_falls_back_to_env PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_preserved_env_socket_used_when_no_override PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_falls_through_to_discovery_when_nothing_explicit PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_discovery_finds_socket_in_dot_ssh_agent PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_discovery_skips_non_socket_files PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_discovery_skips_dead_socket PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_discovery_home_fallback_uses_env_not_root PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_env_var_sets_explicit_override PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_explicit_kwarg_beats_env_var PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_auth_failure_help_under_sudo_no_agent PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_auth_failure_help_when_agent_was_used PASSED [ 84%] tests/test_ssh_agent_discovery.py::test_auth_failure_help_when_agent_had_no_keys PASSED [ 84%] tests/test_ssh_endpoint.py::TestBuildReceiveCommand::test_basic_receive_no_sudo PASSED [ 84%] tests/test_ssh_endpoint.py::TestBuildReceiveCommand::test_receive_with_passwordless_sudo PASSED [ 84%] tests/test_ssh_endpoint.py::TestBuildReceiveCommand::test_receive_with_password_sudo PASSED [ 84%] tests/test_ssh_endpoint.py::TestBuildReceiveCommand::test_uses_exec_for_direct_signal_handling PASSED [ 84%] tests/test_ssh_endpoint.py::TestBuildReceiveCommand::test_traps_pipe_signal PASSED [ 84%] tests/test_ssh_endpoint.py::TestBuildReceiveCommand::test_producer_escapes_raw_path_itself PASSED [ 84%] tests/test_ssh_endpoint.py::TestBuildReceiveCommand::test_no_password_uses_sudo_n PASSED [ 84%] tests/test_ssh_endpoint.py::TestBuildReceiveCommand::test_password_mode_uses_sudo_s PASSED [ 84%] tests/test_ssh_endpoint.py::TestSSHEndpointConfigPreservation::test_username_from_url_is_preserved PASSED [ 84%] tests/test_ssh_endpoint.py::TestSSHEndpointConfigPreservation::test_ssh_sudo_and_identity_are_preserved PASSED [ 84%] tests/test_ssh_endpoint.py::TestVerifySnapshotUsesExactPath::test_exact_received_path_is_verified PASSED [ 84%] tests/test_ssh_endpoint.py::TestVerifySnapshotUsesExactPath::test_sibling_snapshot_is_not_a_false_positive PASSED [ 84%] tests/test_ssh_endpoint.py::TestVerifySnapshotUsesExactPath::test_missing_path_is_false PASSED [ 84%] tests/test_ssh_endpoint.py::TestVerifySnapshotUsesExactPath::test_native_unique_name_verified PASSED [ 84%] tests/test_ssh_host_validation.py::test_real_hosts_are_accepted[nas] PASSED [ 84%] tests/test_ssh_host_validation.py::test_real_hosts_are_accepted[nas.local] PASSED [ 84%] tests/test_ssh_host_validation.py::test_real_hosts_are_accepted[backup-01.example.com] PASSED [ 84%] tests/test_ssh_host_validation.py::test_real_hosts_are_accepted[192.168.0.70] PASSED [ 84%] tests/test_ssh_host_validation.py::test_real_hosts_are_accepted[[2001:db8::1]] PASSED [ 84%] tests/test_ssh_host_validation.py::test_real_hosts_are_accepted[h] PASSED [ 84%] tests/test_ssh_host_validation.py::test_real_hosts_are_accepted[x9] PASSED [ 84%] tests/test_ssh_host_validation.py::test_a_user_may_be_supplied PASSED [ 84%] tests/test_ssh_host_validation.py::test_shell_metacharacters_are_refused[nas; touch /tmp/pwned] PASSED [ 84%] tests/test_ssh_host_validation.py::test_shell_metacharacters_are_refused[nas && id] PASSED [ 84%] tests/test_ssh_host_validation.py::test_shell_metacharacters_are_refused[nas|id] PASSED [ 84%] tests/test_ssh_host_validation.py::test_shell_metacharacters_are_refused[$(id)] PASSED [ 84%] tests/test_ssh_host_validation.py::test_shell_metacharacters_are_refused[`id`] PASSED [ 84%] tests/test_ssh_host_validation.py::test_shell_metacharacters_are_refused[nas\nid] PASSED [ 84%] tests/test_ssh_host_validation.py::test_shell_metacharacters_are_refused[a b] PASSED [ 84%] tests/test_ssh_host_validation.py::test_shell_metacharacters_are_refused[] PASSED [ 84%] tests/test_ssh_host_validation.py::test_a_leading_dash_is_refused[-oProxyCommand=id] PASSED [ 84%] tests/test_ssh_host_validation.py::test_a_leading_dash_is_refused[-F/dev/null] PASSED [ 84%] tests/test_ssh_host_validation.py::test_a_leading_dash_is_refused[--] PASSED [ 84%] tests/test_ssh_host_validation.py::test_a_dangerous_username_is_refused_too PASSED [ 84%] tests/test_ssh_host_validation.py::TestItIsAppliedWhereEndpointsAreBuilt::test_ssh_endpoint_validates_at_construction PASSED [ 84%] tests/test_ssh_host_validation.py::TestItIsAppliedWhereEndpointsAreBuilt::test_raw_ssh_endpoint_validates_at_construction PASSED [ 84%] tests/test_ssh_host_validation.py::TestItIsAppliedWhereEndpointsAreBuilt::test_a_missing_hostname_keeps_its_own_message PASSED [ 84%] tests/test_ssh_hostkey.py::test_operator_ssh_dir_non_sudo_uses_home PASSED [ 84%] tests/test_ssh_hostkey.py::test_operator_ssh_dir_under_sudo_uses_sudo_user PASSED [ 84%] tests/test_ssh_hostkey.py::test_ensure_operator_known_hosts_creates_0600_file PASSED [ 84%] tests/test_ssh_hostkey.py::test_ensure_known_hosts_refuses_to_chown_through_symlink_under_sudo PASSED [ 84%] tests/test_ssh_hostkey.py::test_ensure_known_hosts_fchowns_only_the_fresh_file_under_sudo PASSED [ 85%] tests/test_ssh_hostkey.py::test_ssh_base_cmd_sets_user_known_hosts_file_under_sudo PASSED [ 85%] tests/test_ssh_hostkey.py::test_ssh_base_cmd_leaves_known_hosts_alone_non_sudo PASSED [ 85%] tests/test_ssh_hostkey.py::test_ssh_base_cmd_applies_operator_ssh_opts_first PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_a_nonzero_listing_raises[ERROR: can't perform the search: Operation not permitted] PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_a_nonzero_listing_raises[ERROR: not a btrfs filesystem: /backups] PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_a_nonzero_listing_raises[ERROR: cannot access '/backups': No such file or directory] PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_a_nonzero_listing_raises[sudo: a password is required] PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_a_nonzero_listing_raises[] PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_the_error_repeats_what_btrfs_said PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_an_exception_mid_listing_also_raises PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_a_refusal_meant_to_stop_the_run_is_not_diagnosed_again PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_a_successful_empty_listing_is_still_empty PASSED [ 85%] tests/test_ssh_listing_failures.py::TestAFailedListingIsNotAnEmptyLocation::test_a_successful_listing_still_parses PASSED [ 85%] tests/test_ssh_listing_failures.py::TestTheSudoPathBehavesTheSameWay::test_elevated_failure_also_raises PASSED [ 85%] tests/test_ssh_listing_failures.py::TestTheErrorIsNotReWrapped::test_the_message_is_not_nested PASSED [ 85%] tests/test_ssh_listing_failures.py::TestTheErrorIsNotReWrapped::test_diagnostics_run_once_not_twice PASSED [ 85%] tests/test_ssh_listing_scope.py::TestOnlyWhatIsAtTheDestinationCounts::test_a_never_transferred_source_snapshot_is_not_a_backup PASSED [ 85%] tests/test_ssh_listing_scope.py::TestOnlyWhatIsAtTheDestinationCounts::test_the_probe_asks_about_the_exact_destination_path PASSED [ 85%] tests/test_ssh_listing_scope.py::TestOnlyWhatIsAtTheDestinationCounts::test_a_destination_holding_nothing_lists_nothing PASSED [ 85%] tests/test_ssh_listing_scope.py::TestOnlyWhatIsAtTheDestinationCounts::test_everything_present_survives PASSED [ 85%] tests/test_ssh_listing_scope.py::TestSameNamedSubvolumesResolveToTheDestinationCopy::test_the_name_appears_once_not_once_per_filesystem_hit PASSED [ 85%] tests/test_ssh_listing_scope.py::TestSameNamedSubvolumesResolveToTheDestinationCopy::test_identity_comes_from_the_destination_line_not_the_source_line PASSED [ 85%] tests/test_ssh_listing_scope.py::TestSameNamedSubvolumesResolveToTheDestinationCopy::test_parsing_performs_no_remote_io PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheProbeUsesBtrfsSoElevationApplies::test_it_is_a_btrfs_subcommand_when_elevated_too PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheProbeUsesBtrfsSoElevationApplies::test_it_is_a_btrfs_subcommand PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheProbeUsesBtrfsSoElevationApplies::test_it_probes_the_exact_path PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheProbeUsesBtrfsSoElevationApplies::test_a_nonzero_exit_means_absent PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheProbeUsesBtrfsSoElevationApplies::test_a_zero_exit_means_present PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheListingItselfIsScoped::test_list_snapshots_excludes_a_never_transferred_snapshot PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheListingItselfIsScoped::test_list_snapshots_does_not_report_a_name_twice PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheListingItselfIsScoped::test_list_snapshots_returns_nothing_for_an_empty_destination PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheListingItselfIsScoped::test_list_snapshots_keeps_what_is_really_there PASSED [ 85%] tests/test_ssh_listing_scope.py::TestTheListingItselfIsScoped::test_the_elevated_listing_is_scoped_the_same_way PASSED [ 85%] tests/test_ssh_listing_scope.py::TestOrderingDoesNotDecideIdentity::test_destination_line_wins_when_it_comes_second PASSED [ 85%] tests/test_ssh_listing_scope.py::TestOrderingDoesNotDecideIdentity::test_destination_line_wins_when_it_comes_first PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-clean] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-space] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-single-quote] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-double-quote] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-space-quote-cmdsub] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-semicolon] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-pipe] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-dollar-var] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-backtick] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-backslash] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-ampersand] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[no-sudo-newline] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-clean] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-space] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-single-quote] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-double-quote] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-space-quote-cmdsub] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-semicolon] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-pipe] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-dollar-var] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-backtick] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-backslash] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-ampersand] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-n-newline] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-clean] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-space] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-single-quote] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-double-quote] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-space-quote-cmdsub] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-semicolon] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-pipe] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-dollar-var] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-backtick] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-backslash] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-ampersand] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_destination_reaches_btrfs_receive_unchanged[sudo-S-newline] PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_metacharacters_in_destination_cannot_inject_a_command PASSED [ 85%] tests/test_ssh_receive_command_quoting.py::test_double_escaping_is_visible_not_silent PASSED [ 86%] tests/test_ssh_receive_command_quoting.py::TestCallerContract::test_btrfs_receive_passes_raw_destination PASSED [ 86%] tests/test_ssh_receive_command_quoting.py::TestCallerContract::test_shell_pipeline_transfer_passes_raw_destination PASSED [ 86%] tests/test_ssh_receive_command_quoting.py::TestCallerContract::test_receive_chunked_passes_raw_destination PASSED [ 86%] tests/test_ssh_receive_command_quoting.py::test_signal_handling_semantics_preserved PASSED [ 86%] tests/test_ssh_remote_restore.py::test_send_runs_btrfs_send_on_the_remote_and_streams PASSED [ 86%] tests/test_ssh_remote_restore.py::test_send_incremental_threads_parent PASSED [ 86%] tests/test_ssh_remote_restore.py::test_send_quotes_remote_path PASSED [ 86%] tests/test_ssh_remote_restore.py::test_set_lock_writes_no_local_lock_file PASSED [ 86%] tests/test_ssh_remote_restore.py::test_set_lock_refuses_to_continue_when_it_cannot_record PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteCompressesAndThisHostDecompresses::test_the_send_runs_through_a_compressor_and_a_local_decompressor PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteCompressesAndThisHostDecompresses::test_the_method_is_the_one_configured PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteCompressesAndThisHostDecompresses::test_an_incremental_send_keeps_its_parent PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteCompressesAndThisHostDecompresses::test_without_compress_the_plain_path_is_untouched PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteCompressesAndThisHostDecompresses::test_a_password_remote_still_gets_its_password_first PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteCompressesAndThisHostDecompresses::test_a_missing_local_decompressor_refuses_before_connecting PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteCompressesAndThisHostDecompresses::test_it_says_so_on_the_log PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteScriptExitsWithTheSendsStatus::test_a_failing_send_fails_the_script_even_through_the_compressor[sh] PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteScriptExitsWithTheSendsStatus::test_a_failing_send_fails_the_script_even_through_the_compressor[dash] PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteScriptExitsWithTheSendsStatus::test_a_clean_send_exits_zero_with_its_bytes_on_stdout[sh] PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteScriptExitsWithTheSendsStatus::test_a_clean_send_exits_zero_with_its_bytes_on_stdout[dash] PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteScriptExitsWithTheSendsStatus::test_the_send_stage_reads_the_sessions_stdin[sh] PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteScriptExitsWithTheSendsStatus::test_the_send_stage_reads_the_sessions_stdin[dash] PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheRemoteScriptExitsWithTheSendsStatus::test_the_status_carried_is_the_sends_not_a_constant PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheTransferLayerHandsCompressToARemoteSource::test_a_remote_btrfs_source_is_handed_the_method PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheTransferLayerHandsCompressToARemoteSource::test_a_local_source_to_a_local_destination_drops_it_and_says_so PASSED [ 86%] tests/test_ssh_restore_compress.py::TestTheTransferLayerHandsCompressToARemoteSource::test_a_remote_raw_source_is_not_handed_a_wire_method PASSED [ 86%] tests/test_ssh_restore_compress.py::test_the_pipefail_runner_has_one_home PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_it_pipes_the_decompressor_into_btrfs_receive PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_every_supported_method_produces_its_own_decompressor[bzip2] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_every_supported_method_produces_its_own_decompressor[gzip] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_every_supported_method_produces_its_own_decompressor[lz4] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_every_supported_method_produces_its_own_decompressor[lzo] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_every_supported_method_produces_its_own_decompressor[lzop] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_every_supported_method_produces_its_own_decompressor[pbzip2] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_every_supported_method_produces_its_own_decompressor[pigz] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_every_supported_method_produces_its_own_decompressor[xz] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_every_supported_method_produces_its_own_decompressor[zstd] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_an_unknown_method_is_refused_not_silently_dropped PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_a_pipeline_cleans_up_the_whole_group_on_disconnect PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheRemoteCommandDecompresses::test_the_destination_is_still_quoted_exactly_once PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheUncompressedCommandIsUnchanged::test_it_matches_the_historical_form[None] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheUncompressedCommandIsUnchanged::test_it_matches_the_historical_form[none] PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheUncompressedCommandIsUnchanged::test_without_sudo_too PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheUncompressedCommandIsUnchanged::test_the_script_itself_is_untouched PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheBufferProgram::test_pv_is_preferred_and_gets_a_real_buffer PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheBufferProgram::test_progress_mode_buffers_too PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheBufferProgram::test_mbuffer_is_the_fallback_with_a_matching_footprint PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheBufferProgram::test_the_buffer_stays_within_a_sane_bound PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheBufferProgram::test_both_progress_and_quiet_modes_get_the_same_footprint PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheBufferProgram::test_neither_is_required PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheLocalSendElevates::test_the_send_is_elevated_when_not_root PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheLocalSendElevates::test_it_is_gated_on_euid_so_root_does_not_shell_out PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheLocalSendElevates::test_it_uses_passwordless_sudo PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheEndpointIsHandedTheMethodBeforeItIsZeroed::test_the_ssh_endpoint_receives_the_requested_method PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheEndpointIsHandedTheMethodBeforeItIsZeroed::test_the_transfer_layer_does_not_also_compress PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheEndpointIsHandedTheMethodBeforeItIsZeroed::test_a_local_btrfs_destination_compresses_nothing PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheEndpointIsHandedTheMethodBeforeItIsZeroed::test_no_compression_requested_leaves_the_endpoint_alone PASSED [ 86%] tests/test_ssh_stream_compression.py::TestEveryTransferStrategyIsCovered::test_the_direct_strategy_really_launches_a_compressor PASSED [ 86%] tests/test_ssh_stream_compression.py::TestEveryTransferStrategyIsCovered::test_the_direct_strategy_sends_plain_bytes_when_uncompressed PASSED [ 86%] tests/test_ssh_stream_compression.py::TestEveryTransferStrategyIsCovered::test_the_direct_strategy_tells_the_remote_what_it_compressed PASSED [ 86%] tests/test_ssh_stream_compression.py::TestEveryTransferStrategyIsCovered::test_the_password_reaches_sudo_and_not_the_decompressor PASSED [ 86%] tests/test_ssh_stream_compression.py::TestEveryTransferStrategyIsCovered::test_the_passwordless_path_keeps_the_decompressor_in_front PASSED [ 86%] tests/test_ssh_stream_compression.py::TestEveryTransferStrategyIsCovered::test_the_shared_helper_decides_for_every_path PASSED [ 86%] tests/test_ssh_stream_compression.py::TestEveryTransferStrategyIsCovered::test_an_unknown_method_degrades_instead_of_breaking_the_transfer PASSED [ 86%] tests/test_ssh_stream_compression.py::TestChunkedSaysItDoesNotCompress::test_it_warns_rather_than_quietly_sending_uncompressed PASSED [ 86%] tests/test_ssh_stream_compression.py::TestChunkedSaysItDoesNotCompress::test_it_stays_silent_when_no_compression_was_asked_for PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheShellPipelineCompresses::test_the_compressor_is_in_the_pipeline PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheShellPipelineCompresses::test_the_remote_side_decompresses_in_the_same_pipeline PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheShellPipelineCompresses::test_no_compressor_when_none_requested PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheTwoHalvesCannotDisagree::test_configured_compression_alone_does_not_add_a_decompressor PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheTwoHalvesCannotDisagree::test_the_method_the_sender_used_is_what_the_remote_undoes PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheTwoHalvesCannotDisagree::test_no_compression_means_the_command_is_unchanged PASSED [ 86%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_an_ignored_signal_at_entry_would_defeat_the_trap PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_a_signal_mid_transfer_kills_the_whole_pipeline[False-SIGHUP] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_a_signal_mid_transfer_kills_the_whole_pipeline[False-SIGTERM] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_a_signal_mid_transfer_kills_the_whole_pipeline[True-SIGHUP] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_a_signal_mid_transfer_kills_the_whole_pipeline[True-SIGTERM] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_a_failing_receive_is_still_a_failure PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_a_succeeding_receive_still_reports_success PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_the_handler_disarms_itself_before_signalling_the_group PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_the_pipeline_is_backgrounded_and_waited_on PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheCompressedRemoteCommandIsSupervised::test_the_uncompressed_form_still_uses_exec PASSED [ 87%] tests/test_ssh_stream_compression.py::TestElevationIsOnlyWhatWasAskedFor::test_no_sudo_is_added_when_none_was_requested PASSED [ 87%] tests/test_ssh_stream_compression.py::TestElevationIsOnlyWhatWasAskedFor::test_the_two_branches_agree_about_elevation PASSED [ 87%] tests/test_ssh_stream_compression.py::TestElevationIsOnlyWhatWasAskedFor::test_sudo_is_still_used_when_it_was_requested PASSED [ 87%] tests/test_ssh_stream_compression.py::TestAFailedCompressorFailsTheTransfer::test_a_compressor_that_fails_is_not_a_successful_backup PASSED [ 87%] tests/test_ssh_stream_compression.py::TestAFailedCompressorFailsTheTransfer::test_a_compressor_that_succeeds_leaves_the_result_alone PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheDestinationSurvivesBothShells::test_the_path_arrives_intact_and_nothing_is_injected[plain] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheDestinationSurvivesBothShells::test_the_path_arrives_intact_and_nothing_is_injected[compressed] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestTheDestinationSurvivesBothShells::test_the_path_arrives_intact_and_nothing_is_injected[compressed-password-sudo] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestOneMethodSetForEveryDestination::test_the_two_transports_know_the_same_methods PASSED [ 87%] tests/test_ssh_stream_compression.py::TestOneMethodSetForEveryDestination::test_the_command_line_offers_exactly_those PASSED [ 87%] tests/test_ssh_stream_compression.py::TestOneMethodSetForEveryDestination::test_a_method_that_used_to_be_raw_only_now_works_over_ssh[xz] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestOneMethodSetForEveryDestination::test_a_method_that_used_to_be_raw_only_now_works_over_ssh[lzo] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestOneMethodSetForEveryDestination::test_a_method_that_used_to_be_raw_only_now_works_over_ssh[bzip2] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestOneMethodSetForEveryDestination::test_a_method_that_used_to_be_raw_only_now_works_over_ssh[pbzip2] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestOneMethodSetForEveryDestination::test_an_unknown_method_still_degrades_with_a_warning PASSED [ 87%] tests/test_ssh_stream_compression.py::TestOneMethodSetForEveryDestination::test_the_config_loader_accepts_them_for_either_destination PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_compressed_stream_arrives_whole[sh] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_compressed_stream_arrives_whole[dash] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_compressed_stream_arrives_whole[bash] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-7-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-8-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-9-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-10-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-300-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-non-ascii] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-non-ascii-at-126] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-non-ascii-at-127] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-non-ascii-throughout] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-trailing-space] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[sh-shell-characters] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-7-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-8-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-9-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-10-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-300-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-non-ascii] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-non-ascii-at-126] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-non-ascii-at-127] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-non-ascii-throughout] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-trailing-space] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[dash-shell-characters] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-7-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-8-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-9-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-10-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-300-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-non-ascii] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-non-ascii-at-126] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-non-ascii-at-127] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-non-ascii-throughout] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-trailing-space] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_password_host_gets_the_line_then_the_stream[bash-shell-characters] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-7-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-8-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-9-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-10-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-300-bytes] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-non-ascii] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-non-ascii-at-126] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-non-ascii-at-127] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-non-ascii-throughout] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-trailing-space] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[sh-shell-characters] PASSED [ 87%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-7-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-8-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-9-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-10-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-300-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-non-ascii] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-non-ascii-at-126] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-non-ascii-at-127] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-non-ascii-throughout] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-trailing-space] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[dash-shell-characters] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-7-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-8-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-9-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-10-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-300-bytes] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-non-ascii] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-non-ascii-at-126] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-non-ascii-at-127] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-non-ascii-throughout] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-trailing-space] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_nopasswd_host_discards_the_line[bash-shell-characters] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_header_that_is_not_a_count_stops_before_sudo[sh] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_header_that_is_not_a_count_stops_before_sudo[dash] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_a_header_that_is_not_a_count_stops_before_sudo[bash] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_the_password_passes_through_no_shell_command[sh] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_the_password_passes_through_no_shell_command[dash] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_the_password_passes_through_no_shell_command[bash] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_no_shell_read_takes_the_password[sh] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_no_shell_read_takes_the_password[dash] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_no_shell_read_takes_the_password[bash] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_the_uncompressed_form_is_unaffected[sh] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_the_uncompressed_form_is_unaffected[dash] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_the_uncompressed_form_is_unaffected[bash] PASSED [ 88%] tests/test_ssh_stream_compression.py::TestThePayloadActuallyReachesTheRemote::test_stdin_is_duplicated_before_backgrounding PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[btrfs-delete] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[btrfs-show] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[btrfs-receive] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[btrfs-version] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[test-d] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[test-e] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[mkdir] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[rm] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[touch] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[cat] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_elevation_matches_the_documented_policy[find] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[btrfs-delete] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[btrfs-show] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[btrfs-receive] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[btrfs-version] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[test-d] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[test-e] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[mkdir] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[rm] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[touch] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[cat] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestOnlyBtrfsIsElevated::test_nothing_is_elevated_when_ssh_sudo_is_off[find] PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestRemoteDeleteUnderBtrfsOnlySudoers::test_snapshot_is_actually_deleted PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestRemoteDeleteUnderBtrfsOnlySudoers::test_precondition_uses_a_btrfs_subcommand PASSED [ 88%] tests/test_ssh_sudo_elevation.py::TestRemoteDeleteUnderBtrfsOnlySudoers::test_missing_subvolume_is_skipped_not_deleted PASSED [ 88%] tests/test_ssh_sudo_elevation.py::test_receive_keeps_its_dedicated_sudo_form PASSED [ 88%] tests/test_ssh_sudo_elevation.py::test_password_mode_uses_sudo_s PASSED [ 88%] tests/test_stall_detection.py::TestTheByteSignal::test_a_moving_process_reports_increasing_bytes PASSED [ 88%] tests/test_stall_detection.py::TestTheByteSignal::test_an_idle_process_reports_no_movement PASSED [ 88%] tests/test_stall_detection.py::TestTheByteSignal::test_an_unreadable_process_is_None_not_zero PASSED [ 88%] tests/test_stall_detection.py::TestTheByteSignal::test_a_process_owned_by_someone_else_is_None PASSED [ 88%] tests/test_stall_detection.py::TestTheAggregate::test_unreadable_pids_are_ignored_when_others_can_be_read PASSED [ 88%] tests/test_stall_detection.py::TestTheAggregate::test_nothing_readable_yields_None PASSED [ 88%] tests/test_stall_detection.py::TestTheAggregate::test_an_empty_set_yields_None PASSED [ 88%] tests/test_stall_detection.py::TestTheAggregate::test_the_total_moves_when_a_member_moves PASSED [ 88%] tests/test_stall_detection.py::TestTheMonitorActsOnIt::test_a_stalled_transfer_is_terminated_and_explained PASSED [ 88%] tests/test_stall_detection.py::TestTheMonitorActsOnIt::test_a_finished_send_is_not_a_stall PASSED [ 88%] tests/test_stall_detection.py::TestTheMonitorActsOnIt::test_a_moving_transfer_is_not_killed PASSED [ 88%] tests/test_stall_detection.py::TestTheWallClockIsConfigurableAndGenerous::test_the_default_imposes_no_wall_clock_at_all PASSED [ 89%] tests/test_stall_detection.py::TestTheWallClockIsConfigurableAndGenerous::test_it_can_be_set_in_the_config PASSED [ 89%] tests/test_stall_detection.py::TestTheWallClockIsConfigurableAndGenerous::test_the_loader_default_matches_the_code_default PASSED [ 89%] tests/test_stall_detection.py::TestTheWallClockIsConfigurableAndGenerous::test_no_transfer_path_still_hardcodes_an_hour PASSED [ 89%] tests/test_stall_detection.py::TestBothMonitorsAreCovered::test_the_simple_monitor_catches_a_stall PASSED [ 89%] tests/test_stall_detection.py::TestBothMonitorsAreCovered::test_the_simple_monitor_does_not_kill_a_moving_transfer PASSED [ 89%] tests/test_stall_detection.py::TestBothMonitorsAreCovered::test_the_simple_monitor_exempts_a_finished_send PASSED [ 89%] tests/test_stall_detection.py::TestTheStallWindowIsReachable::test_the_loader_accepts_it PASSED [ 89%] tests/test_stall_detection.py::TestTheStallWindowIsReachable::test_it_survives_the_endpoint_config_whitelist PASSED [ 89%] tests/test_stall_detection.py::TestTheStallWindowIsReachable::test_zero_disables_the_check PASSED [ 89%] tests/test_stall_detection.py::TestTheStallWindowIsReachable::test_a_configured_window_is_actually_used PASSED [ 89%] tests/test_stall_detection.py::TestAnUnmeasurableTransferStillHasAGuard::test_it_is_bounded_rather_than_hanging_forever PASSED [ 89%] tests/test_stall_detection.py::TestAnUnmeasurableTransferStillHasAGuard::test_an_explicit_wall_clock_still_wins PASSED [ 89%] tests/test_stall_detection.py::TestZeroMeansUnlimitedNotExpired::test_zero_does_not_instantly_fail_the_monitor PASSED [ 89%] tests/test_stall_detection.py::TestZeroMeansUnlimitedNotExpired::test_zero_does_not_instantly_fail_the_simple_monitor PASSED [ 89%] tests/test_stall_detection.py::TestZeroMeansUnlimitedNotExpired::test_the_default_reaches_the_monitor_as_unlimited PASSED [ 89%] tests/test_state.py::TestTransferCheckpoint::test_creation PASSED [ 89%] tests/test_state.py::TestTransferCheckpoint::test_serialization PASSED [ 89%] tests/test_state.py::TestTargetState::test_creation PASSED [ 89%] tests/test_state.py::TestTargetState::test_transfer_counts PASSED [ 89%] tests/test_state.py::TestTargetState::test_serialization PASSED [ 89%] tests/test_state.py::TestOperationRecord::test_creation PASSED [ 89%] tests/test_state.py::TestOperationRecord::test_is_resumable PASSED [ 89%] tests/test_state.py::TestOperationRecord::test_is_complete PASSED [ 89%] tests/test_state.py::TestOperationRecord::test_transfer_counts PASSED [ 89%] tests/test_state.py::TestOperationRecord::test_get_pending_transfers PASSED [ 89%] tests/test_state.py::TestOperationRecord::test_serialization PASSED [ 89%] tests/test_state.py::TestOperationRecord::test_save_and_load PASSED [ 89%] tests/test_state.py::TestOperationManager::test_create_operation PASSED [ 89%] tests/test_state.py::TestOperationManager::test_get_operation_not_found PASSED [ 89%] tests/test_state.py::TestOperationManager::test_update_operation PASSED [ 89%] tests/test_state.py::TestOperationManager::test_list_operations PASSED [ 89%] tests/test_state.py::TestOperationManager::test_get_resumable_operations PASSED [ 89%] tests/test_state.py::TestOperationManager::test_archive_operation PASSED [ 89%] tests/test_state.py::TestOperationManager::test_archive_incomplete_fails PASSED [ 89%] tests/test_state.py::TestOperationManager::test_delete_operation PASSED [ 89%] tests/test_state.py::TestOperationManager::test_delete_active_requires_force PASSED [ 89%] tests/test_state.py::TestOperationManager::test_detect_stale_operations PASSED [ 89%] tests/test_state.py::TestOperationManager::test_cleanup_old_operations PASSED [ 89%] tests/test_state.py::TestOperationManager::test_cleanup_old_operations_no_archive PASSED [ 89%] tests/test_state.py::TestOperationManager::test_cleanup_old_operations_keeps_recent PASSED [ 89%] tests/test_state.py::TestOperationManager::test_get_operation_from_archive PASSED [ 89%] tests/test_state.py::TestOperationManager::test_archive_nonexistent_operation PASSED [ 89%] tests/test_state.py::TestOperationManager::test_delete_nonexistent_operation PASSED [ 89%] tests/test_state.py::TestOperationContext::test_basic_usage PASSED [ 89%] tests/test_state.py::TestOperationContext::test_exception_handling PASSED [ 89%] tests/test_state.py::TestOperationContext::test_transfer_tracking PASSED [ 89%] tests/test_state.py::TestOperationContext::test_resume_operation PASSED [ 89%] tests/test_state.py::TestOperationContext::test_skip_transfer PASSED [ 89%] tests/test_stderr_tail.py::TestTheTailDrains::test_a_child_writing_far_more_than_the_pipe_buffer_finishes PASSED [ 89%] tests/test_stderr_tail.py::TestTheTailDrains::test_the_tail_is_the_end_of_the_output_not_the_start PASSED [ 89%] tests/test_stderr_tail.py::TestTheTailDrains::test_the_tail_is_exactly_the_last_bytes_whatever_the_read_boundaries PASSED [ 89%] tests/test_stderr_tail.py::TestTheTailDrains::test_a_short_message_is_kept_whole PASSED [ 89%] tests/test_stderr_tail.py::TestTheTailDrains::test_text_may_be_read_more_than_once PASSED [ 89%] tests/test_stderr_tail.py::TestTheTailOwnsThePipe::test_the_process_no_longer_exposes_the_pipe PASSED [ 89%] tests/test_stderr_tail.py::TestTheTailOwnsThePipe::test_the_pipe_is_closed_at_eof_without_anyone_asking PASSED [ 89%] tests/test_stderr_tail.py::TestTheTailOwnsThePipe::test_a_lingering_grandchild_does_not_hang_the_report PASSED [ 89%] tests/test_stderr_tail.py::TestStderrTextWithoutATail::test_reads_a_plain_pipe_and_closes_it PASSED [ 89%] tests/test_stderr_tail.py::TestStderrTextWithoutATail::test_a_process_without_stderr_reports_nothing PASSED [ 89%] tests/test_stderr_tail.py::TestStderrTextWithoutATail::test_none_reports_nothing PASSED [ 89%] tests/test_stderr_tail.py::TestStderrTextWithoutATail::test_tail_stderr_is_a_no_op_without_a_pipe PASSED [ 89%] tests/test_stderr_tail.py::TestOnlyARealPipeGetsADrain::test_a_mock_process_never_starts_a_thread PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_snapshot_stream_uuid_is_received_uuid_or_uuid PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_snapper_btrfs_backup_stream_uuid_is_its_received_uuid PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_second_hop_copy_corresponds_to_the_first_hop_copy PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_one_hop_copy_still_corresponds_to_the_original PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_a_partial_receive_does_not_correspond_at_the_second_hop PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_a_source_without_identity_corresponds_to_nothing PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_second_hop_plan_skips_the_present_copy_and_chains_off_it PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_raw_sidecar_round_trips_source_uuid PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_legacy_sidecar_without_source_uuid_reads_as_unknown_identity PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_raw_stream_uuid_does_not_fall_back_to_the_uuid_field PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_raw_receive_records_source_uuid_and_the_listing_exposes_it PASSED [ 89%] tests/test_stream_uuid_two_hop.py::test_raw_receive_without_source_uuid_writes_an_empty_field PASSED [ 90%] tests/test_stream_uuid_two_hop.py::test_raw_destination_correspondence_stays_by_name PASSED [ 90%] tests/test_stream_uuid_two_hop.py::test_remediation_carries_source_uuid_into_the_encrypted_sidecar PASSED [ 90%] tests/test_stream_uuid_two_hop.py::test_send_snapshot_hands_the_stream_uuid_to_the_receive PASSED [ 90%] tests/test_stream_uuid_two_hop.py::test_chunked_manifest_round_trips_source_uuid PASSED [ 90%] tests/test_sudo_password_framing.py::TestTheFrame::test_the_count_is_of_bytes_not_characters PASSED [ 90%] tests/test_sudo_password_framing.py::TestTheFrame::test_the_line_comes_once_with_its_newline PASSED [ 90%] tests/test_sudo_password_framing.py::TestTheFrame::test_the_largest_password_that_fits PASSED [ 90%] tests/test_sudo_password_framing.py::TestTheFrame::test_a_longer_password_is_refused_rather_than_misframed PASSED [ 90%] tests/test_sudo_password_framing.py::TestTheLocalSideSendsTheFrame::test_a_compressed_receive_gets_the_frame PASSED [ 90%] tests/test_sudo_password_framing.py::TestTheLocalSideSendsTheFrame::test_an_uncompressed_receive_gets_one_line PASSED [ 90%] tests/test_sudo_password_framing.py::TestTheLocalSideSendsTheFrame::test_the_password_is_never_in_the_command PASSED [ 90%] tests/test_sudo_password_framing.py::TestALineBreakIsRefused::test_from_the_environment[ab\ncd] PASSED [ 90%] tests/test_sudo_password_framing.py::TestALineBreakIsRefused::test_from_the_environment[ab\rcd] PASSED [ 90%] tests/test_sudo_password_framing.py::TestALineBreakIsRefused::test_from_the_environment[abcd\n] PASSED [ 90%] tests/test_sudo_password_framing.py::TestALineBreakIsRefused::test_from_the_reused_ssh_password PASSED [ 90%] tests/test_sudo_password_framing.py::TestALineBreakIsRefused::test_an_ordinary_password_is_returned_unchanged PASSED [ 90%] tests/test_sudo_password_framing.py::TestALineBreakIsRefused::test_nothing_is_started_with_such_a_password PASSED [ 90%] tests/test_sudo_password_framing.py::TestALineBreakIsRefused::test_the_chunked_receive_starts_nothing_with_such_a_password PASSED [ 90%] tests/test_sudo_pipeline_is_bounded.py::test_the_sudo_pipeline_wait_is_bounded PASSED [ 90%] tests/test_sudo_pipeline_is_bounded.py::test_a_process_that_stops_moving_is_given_up_on PASSED [ 90%] tests/test_sudo_pipeline_is_bounded.py::test_a_process_that_finishes_is_not_killed_by_the_bound PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_the_scoped_path_elevates_btrfs_not_a_shell PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_the_decompressor_never_precedes_the_password_reader PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_the_password_is_read_before_anything_consumes_the_stream PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_the_decision_is_made_inside_the_backgrounded_group PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_the_capability_probe_cannot_consume_the_stream PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_the_fallback_prefixes_the_decompressed_stream PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_no_path_ever_elevates_a_shell PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_the_password_is_never_held_by_the_shell PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_a_passwordless_host_is_untouched PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_an_unelevated_host_is_untouched PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_the_uncompressed_path_is_untouched PASSED [ 90%] tests/test_sudo_receive_scoping.py::test_orphan_protection_survives PASSED [ 90%] tests/test_systemd_utils.py::TestRunSystemctl::test_run_systemctl_success PASSED [ 90%] tests/test_systemd_utils.py::TestRunSystemctl::test_run_systemctl_not_found PASSED [ 90%] tests/test_systemd_utils.py::TestGetUnitStatus::test_get_unit_status_enabled_active PASSED [ 90%] tests/test_systemd_utils.py::TestGetUnitStatus::test_get_unit_status_not_exists PASSED [ 90%] tests/test_systemd_utils.py::TestFindBtrbkUnits::test_find_btrbk_units_none PASSED [ 90%] tests/test_systemd_utils.py::TestFindBtrbkUnits::test_find_btrbk_units_found PASSED [ 90%] tests/test_systemd_utils.py::TestDisableUnit::test_disable_unit_success PASSED [ 90%] tests/test_systemd_utils.py::TestDisableUnit::test_disable_unit_failure PASSED [ 90%] tests/test_systemd_utils.py::TestDisableUnit::test_disable_unit_stop_fails_but_disable_succeeds PASSED [ 90%] tests/test_systemd_utils.py::TestEnableUnit::test_enable_unit_success PASSED [ 90%] tests/test_systemd_utils.py::TestEnableUnit::test_enable_unit_with_start PASSED [ 90%] tests/test_systemd_utils.py::TestMigrateFromBtrbk::test_migrate_no_btrbk_units PASSED [ 90%] tests/test_systemd_utils.py::TestMigrateFromBtrbk::test_migrate_dry_run PASSED [ 90%] tests/test_systemd_utils.py::TestGetMigrationSummary::test_get_migration_summary PASSED [ 90%] tests/test_systemd_utils.py::TestConstants::test_btrbk_unit_names PASSED [ 90%] tests/test_systemd_utils.py::TestConstants::test_backup_ng_unit_names PASSED [ 90%] tests/test_systemd_utils.py::TestGetUnitStatusWithPath::test_get_unit_status_with_file_path PASSED [ 90%] tests/test_systemd_utils.py::TestFindBackupNgUnits::test_find_backup_ng_units_none PASSED [ 90%] tests/test_systemd_utils.py::TestFindBackupNgUnits::test_find_backup_ng_units_found PASSED [ 90%] tests/test_systemd_utils.py::TestMigrateWithUnits::test_migrate_with_backup_ng_timer PASSED [ 90%] tests/test_systemd_utils.py::TestMigrateWithUnits::test_migrate_disable_failure PASSED [ 90%] tests/test_systemd_utils.py::TestMigrateWithUnits::test_migrate_with_active_btrbk PASSED [ 90%] tests/test_systemd_utils.py::TestEnableUnitFailures::test_enable_unit_failure PASSED [ 90%] tests/test_systemd_utils.py::TestEnableUnitFailures::test_enable_unit_start_failure PASSED [ 90%] tests/test_systemd_utils.py::TestDisableUnitNoStop::test_disable_unit_no_stop PASSED [ 90%] tests/test_systemd_utils.py::TestFindBtrbkInstanceUnits::test_find_btrbk_instance_units PASSED [ 90%] tests/test_systemd_utils.py::TestFindBtrbkInstanceUnits::test_find_btrbk_instance_services PASSED [ 90%] tests/test_systemd_utils.py::TestFindBtrbkInstanceUnits::test_find_btrbk_skips_nonexistent_paths PASSED [ 90%] tests/test_systemd_utils.py::TestMigrateEnableFailure::test_migrate_enable_failure PASSED [ 90%] tests/test_systemd_utils.py::TestMigrateEnableFailure::test_migrate_with_already_enabled_timer PASSED [ 90%] tests/test_systemd_utils.py::TestRunSystemctlWithCheck::test_run_systemctl_with_check_true PASSED [ 90%] tests/test_systemd_utils.py::TestRunSystemctlWithCheck::test_run_systemctl_no_capture PASSED [ 90%] tests/test_tail_bound_fires_in_the_loop.py::test_a_wedged_tail_is_terminated_by_the_loop[_simple_transfer_monitor] PASSED [ 90%] tests/test_tail_bound_fires_in_the_loop.py::test_a_wedged_tail_is_terminated_by_the_loop[_monitor_transfer_progress] PASSED [ 90%] tests/test_tail_bound_fires_in_the_loop.py::test_a_completed_transfer_does_not_trip_the_bound[_simple_transfer_monitor] PASSED [ 90%] tests/test_tail_bound_fires_in_the_loop.py::test_a_completed_transfer_does_not_trip_the_bound[_monitor_transfer_progress] PASSED [ 90%] tests/test_target_options_reach_the_target.py::test_the_option_the_user_wrote_is_the_option_the_target_gets PASSED [ 90%] tests/test_target_options_reach_the_target.py::test_it_defaults_off_when_absent PASSED [ 90%] tests/test_target_options_reach_the_target.py::test_a_quoted_false_does_not_read_as_true PASSED [ 90%] tests/test_target_options_reach_the_target.py::test_an_unreadable_value_is_refused_not_guessed PASSED [ 91%] tests/test_target_options_reach_the_target.py::test_every_declared_target_field_is_parsed PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[local-abs] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[local-space] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[local-relative] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[ssh-colon] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[ssh-user] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[ssh-no-colon] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[ssh-port] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[raw-triple-slash] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[rawssh] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[rawssh-colon] PASSED [ 91%] tests/test_target_scheme.py::test_classification_and_capabilities[shell] PASSED [ 91%] tests/test_target_scheme.py::TestTheBugThisModuleExistsFor::test_rawssh_is_remote_unlike_the_naive_check PASSED [ 91%] tests/test_target_scheme.py::TestTheBugThisModuleExistsFor::test_rawssh_needs_ssh_options PASSED [ 91%] tests/test_target_scheme.py::TestTheBugThisModuleExistsFor::test_rawssh_is_not_inspectable_with_a_local_path_call PASSED [ 91%] tests/test_target_scheme.py::TestTheBugThisModuleExistsFor::test_local_raw_supports_the_mount_check PASSED [ 91%] tests/test_target_scheme.py::TestTheBugThisModuleExistsFor::test_compress_is_supported_wherever_an_endpoint_implements_it PASSED [ 91%] tests/test_target_scheme.py::TestUnsupportedIsNamed::test_bare_ssh_pattern_is_rejected_with_a_reason[user@host:/backups] PASSED [ 91%] tests/test_target_scheme.py::TestUnsupportedIsNamed::test_bare_ssh_pattern_is_rejected_with_a_reason[host.example.com:/backups] PASSED [ 91%] tests/test_target_scheme.py::TestUnsupportedIsNamed::test_missing_path_is_named[None] PASSED [ 91%] tests/test_target_scheme.py::TestUnsupportedIsNamed::test_missing_path_is_named[] PASSED [ 91%] tests/test_target_scheme.py::TestUnsupportedIsNamed::test_missing_path_is_named[ ] PASSED [ 91%] tests/test_target_scheme.py::TestPathExtraction::test_destination_path_is_extracted[/mnt/backup-/mnt/backup] PASSED [ 91%] tests/test_target_scheme.py::TestPathExtraction::test_destination_path_is_extracted[raw:///mnt/nas/x-/mnt/nas/x] PASSED [ 91%] tests/test_target_scheme.py::TestPathExtraction::test_destination_path_is_extracted[ssh://host:/backups/home-/backups/home] PASSED [ 91%] tests/test_target_scheme.py::TestPathExtraction::test_destination_path_is_extracted[ssh://user@host/backups/home-/backups/home] PASSED [ 91%] tests/test_target_scheme.py::TestPathExtraction::test_destination_path_is_extracted[ssh://user@host:2222/backups-/backups] PASSED [ 91%] tests/test_target_scheme.py::TestPathExtraction::test_destination_path_is_extracted[raw+ssh://user@host/mnt/nas-/mnt/nas] PASSED [ 91%] tests/test_target_scheme.py::TestPathExtraction::test_destination_path_is_extracted[raw+ssh://user@host:/mnt/nas-/mnt/nas] PASSED [ 91%] tests/test_target_scheme.py::TestAgreesWithChooseEndpoint::test_kind_matches_the_endpoint_actually_built[/mnt/backup-LocalEndpoint] PASSED [ 91%] tests/test_target_scheme.py::TestAgreesWithChooseEndpoint::test_kind_matches_the_endpoint_actually_built[ssh://user@host:/backups-SSHEndpoint] PASSED [ 91%] tests/test_target_scheme.py::TestAgreesWithChooseEndpoint::test_kind_matches_the_endpoint_actually_built[raw:///mnt/nas/backups-RawEndpoint] PASSED [ 91%] tests/test_target_scheme.py::TestAgreesWithChooseEndpoint::test_kind_matches_the_endpoint_actually_built[raw+ssh://user@host/backups-SSHRawEndpoint] PASSED [ 91%] tests/test_target_scheme.py::TestAgreesWithChooseEndpoint::test_bare_form_that_choose_endpoint_rejects_is_unsupported_here PASSED [ 91%] tests/test_target_scheme.py::TestFormsTheRuntimeCannotBuild::test_raw_with_a_relative_remainder_is_refused[raw://mnt/nas/x] PASSED [ 91%] tests/test_target_scheme.py::TestFormsTheRuntimeCannotBuild::test_raw_with_a_relative_remainder_is_refused[raw://backup/data] PASSED [ 91%] tests/test_target_scheme.py::TestFormsTheRuntimeCannotBuild::test_shell_is_recognised_but_not_constructible PASSED [ 91%] tests/test_target_scheme.py::TestIdentityFileKeyPerScheme::test_ssh_and_rawssh_disagree PASSED [ 91%] tests/test_target_scheme.py::TestIdentityFileKeyPerScheme::test_local_targets_take_no_identity PASSED [ 91%] tests/test_target_scheme.py::TestIdentityFileKeyPerScheme::test_the_key_each_scheme_names_is_the_one_its_endpoint_reads PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_padded_path_is_not_silently_cleaned[ ssh://user@host:/mnt/usb] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_padded_path_is_not_silently_cleaned[ raw+ssh://user@nas:/mnt/usb] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_padded_path_is_not_silently_cleaned[ raw:///mnt/usb] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_padded_path_is_not_silently_cleaned[/mnt/usb ] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_padded_path_is_not_silently_cleaned[\t/mnt/usb\n] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_padded_path_agrees_with_choose_endpoint[ ssh://user@host:/mnt/usb] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_padded_path_agrees_with_choose_endpoint[/mnt/usb ] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_padded_path_agrees_with_choose_endpoint[ raw:///mnt/usb] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_blank_path_is_still_unsupported[] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_blank_path_is_still_unsupported[ ] PASSED [ 91%] tests/test_target_scheme.py::TestWhitespaceIsNotNormalisedHere::test_a_blank_path_is_still_unsupported[\t\n] PASSED [ 91%] tests/test_target_scheme.py::TestIPv6LiteralsAreHandedToSshUnbracketed::test_brackets_are_stripped_but_the_port_still_parses[ssh://[::1]:/tmp-::1-None-::1] PASSED [ 91%] tests/test_target_scheme.py::TestIPv6LiteralsAreHandedToSshUnbracketed::test_brackets_are_stripped_but_the_port_still_parses[raw+ssh://[::1]:/tmp-::1-None-::1] PASSED [ 91%] tests/test_target_scheme.py::TestIPv6LiteralsAreHandedToSshUnbracketed::test_brackets_are_stripped_but_the_port_still_parses[ssh://[2001:db8::5]:2222/b-2001:db8::5-2222-2001:db8::5] PASSED [ 91%] tests/test_target_scheme.py::TestIPv6LiteralsAreHandedToSshUnbracketed::test_brackets_are_stripped_but_the_port_still_parses[ssh://user@[::1]/b-::1-None-user@::1] PASSED [ 91%] tests/test_target_scheme.py::TestIPv6LiteralsAreHandedToSshUnbracketed::test_brackets_are_stripped_but_the_port_still_parses[raw+ssh://user@[2001:db8::5]:2222/b-2001:db8::5-2222-user@2001:db8::5] PASSED [ 91%] tests/test_target_scheme.py::TestIPv6LiteralsAreHandedToSshUnbracketed::test_an_ipv6_path_is_still_extracted PASSED [ 91%] tests/test_target_scheme.py::TestPortIsParsedNotGuessed::test_port[ssh://host:/backups-None] PASSED [ 91%] tests/test_target_scheme.py::TestPortIsParsedNotGuessed::test_port[ssh://host/backups-None] PASSED [ 91%] tests/test_target_scheme.py::TestPortIsParsedNotGuessed::test_port[ssh://host:2222/backups-2222] PASSED [ 91%] tests/test_target_scheme.py::TestPortIsParsedNotGuessed::test_port[ssh://user@host:2222/backups-2222] PASSED [ 91%] tests/test_target_scheme.py::TestPortIsParsedNotGuessed::test_port[raw+ssh://user@host:2222/backups-2222] PASSED [ 91%] tests/test_target_scheme.py::TestPortIsParsedNotGuessed::test_port[raw+ssh://user@host:/backups-None] PASSED [ 91%] tests/test_target_scheme.py::TestPortIsParsedNotGuessed::test_the_port_does_not_leak_into_the_host[ssh://host:2222/backups-host] PASSED [ 91%] tests/test_target_scheme.py::TestPortIsParsedNotGuessed::test_the_port_does_not_leak_into_the_host[ssh://user@host:2222/backups-host] PASSED [ 91%] tests/test_target_scheme.py::TestPortIsParsedNotGuessed::test_the_port_does_not_leak_into_the_host[ssh://host:/backups-host] PASSED [ 91%] tests/test_target_scheme.py::TestCompressIsNotSilentlyDroppedAtLoad::test_a_local_target_is_told_it_will_not_be_applied PASSED [ 91%] tests/test_target_scheme.py::TestCompressIsNotSilentlyDroppedAtLoad::test_the_warning_says_where_compression_does_work PASSED [ 91%] tests/test_target_scheme.py::TestCompressIsNotSilentlyDroppedAtLoad::test_it_is_a_warning_and_not_a_rejection PASSED [ 91%] tests/test_target_scheme.py::TestCompressIsNotSilentlyDroppedAtLoad::test_a_target_that_does_compress_is_not_warned_about[ssh://nas/backup] PASSED [ 91%] tests/test_target_scheme.py::TestCompressIsNotSilentlyDroppedAtLoad::test_a_target_that_does_compress_is_not_warned_about[raw:///mnt/usb] PASSED [ 91%] tests/test_target_scheme.py::TestCompressIsNotSilentlyDroppedAtLoad::test_a_target_that_does_compress_is_not_warned_about[raw+ssh://nas/backups] PASSED [ 91%] tests/test_target_scheme.py::TestCompressIsNotSilentlyDroppedAtLoad::test_no_compression_asked_for_means_nothing_to_say PASSED [ 92%] tests/test_timeout_sentinel.py::test_the_shipped_default_is_the_no_limit_sentinel PASSED [ 92%] tests/test_timeout_sentinel.py::test_a_draining_stage_is_not_killed_on_the_default PASSED [ 92%] tests/test_timeout_sentinel.py::test_every_non_positive_value_means_unlimited[0] PASSED [ 92%] tests/test_timeout_sentinel.py::test_every_non_positive_value_means_unlimited[-1] PASSED [ 92%] tests/test_timeout_sentinel.py::test_a_real_limit_is_still_enforced PASSED [ 92%] tests/test_timeout_sentinel.py::test_a_genuinely_failing_stage_still_reports_its_code PASSED [ 92%] tests/test_timeout_sentinel.py::test_the_scoring_rule_this_protects PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestVerifyThreadsTimestampFormat::test_endpoint_kwargs_carry_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestRestoreThreadsTimestampFormat::test_backup_endpoint_config_carries_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestRestoreThreadsTimestampFormat::test_local_endpoint_receives_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestEstimateDirectThreadsTimestampFormat::test_both_endpoints_carry_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestPruneThreadsTimestampFormat::test_endpoint_and_retention_carry_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestRunThreadsTimestampFormat::test_native_volume_endpoint_carries_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestRunThreadsTimestampFormat::test_snapper_volume_endpoint_config_carries_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestConfigDrivenCommandsThreadTimestampFormat::test_snapshot_endpoint_carries_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestConfigDrivenCommandsThreadTimestampFormat::test_list_endpoint_carries_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestConfigDrivenCommandsThreadTimestampFormat::test_status_endpoint_carries_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestConfigDrivenCommandsThreadTimestampFormat::test_transfer_endpoint_carries_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestSnapperBackupThreadsTimestampFormat::test_endpoint_config_carries_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestSnapperStatusThreadsTimestampFormat::test_endpoint_config_and_backup_name_use_custom_format PASSED [ 92%] tests/test_timestamp_format_enforcement.py::TestSnapperListThreadsTimestampFormat::test_backup_name_uses_custom_format PASSED [ 92%] tests/test_timestamp_offset_roundtrip.py::test_an_offset_survives_the_round_trip[20260919T011855-0400] PASSED [ 92%] tests/test_timestamp_offset_roundtrip.py::test_an_offset_survives_the_round_trip[20260101T120000+0100] PASSED [ 92%] tests/test_timestamp_offset_roundtrip.py::test_an_offset_survives_the_round_trip[20260615T235959+0000] PASSED [ 92%] tests/test_timestamp_offset_roundtrip.py::test_the_path_a_snapshot_reports_is_the_one_it_came_from PASSED [ 92%] tests/test_timestamp_offset_roundtrip.py::test_a_new_snapshot_is_named_with_its_offset PASSED [ 92%] tests/test_timestamp_offset_roundtrip.py::test_the_default_format_is_untouched PASSED [ 92%] tests/test_timestamp_offset_roundtrip.py::test_a_leap_second_is_named_rather_than_refused PASSED [ 92%] tests/test_transaction.py::TestSetTransactionLog::test_set_log_path PASSED [ 92%] tests/test_transaction.py::TestSetTransactionLog::test_set_log_path_creates_parent_dirs PASSED [ 92%] tests/test_transaction.py::TestSetTransactionLog::test_set_log_path_to_none PASSED [ 92%] tests/test_transaction.py::TestSetTransactionLog::test_set_log_path_with_string PASSED [ 92%] tests/test_transaction.py::TestLogTransaction::test_log_when_disabled PASSED [ 92%] tests/test_transaction.py::TestLogTransaction::test_log_basic_transaction PASSED [ 92%] tests/test_transaction.py::TestLogTransaction::test_log_transaction_with_all_fields PASSED [ 92%] tests/test_transaction.py::TestLogTransaction::test_log_transaction_with_error PASSED [ 92%] tests/test_transaction.py::TestLogTransaction::test_log_multiple_transactions PASSED [ 92%] tests/test_transaction.py::TestLogTransaction::test_log_handles_write_error PASSED [ 92%] tests/test_transaction.py::TestLogTransaction::test_log_thread_safety PASSED [ 92%] tests/test_transaction.py::TestTransactionContext::test_context_basic_success PASSED [ 92%] tests/test_transaction.py::TestTransactionContext::test_context_with_exception PASSED [ 92%] tests/test_transaction.py::TestTransactionContext::test_context_set_snapshot PASSED [ 92%] tests/test_transaction.py::TestTransactionContext::test_context_set_parent PASSED [ 92%] tests/test_transaction.py::TestTransactionContext::test_context_set_size PASSED [ 92%] tests/test_transaction.py::TestTransactionContext::test_context_add_detail PASSED [ 92%] tests/test_transaction.py::TestTransactionContext::test_context_fail_method PASSED [ 92%] tests/test_transaction.py::TestTransactionContext::test_context_measures_duration PASSED [ 92%] tests/test_transaction.py::TestTransactionContext::test_context_full_parameters PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_empty_log PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_nonexistent_log PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_when_path_is_none PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_with_limit PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_with_action_filter PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_with_status_filter PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_with_both_filters PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_uses_global_path PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_handles_malformed_json PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_handles_blank_lines PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_returns_most_recent_first PASSED [ 92%] tests/test_transaction.py::TestReadTransactionLog::test_read_handles_oserror PASSED [ 92%] tests/test_transaction.py::TestGetTransactionStats::test_stats_empty_log PASSED [ 92%] tests/test_transaction.py::TestGetTransactionStats::test_stats_nonexistent_log PASSED [ 92%] tests/test_transaction.py::TestGetTransactionStats::test_stats_with_transfers PASSED [ 92%] tests/test_transaction.py::TestGetTransactionStats::test_stats_with_snapshots PASSED [ 92%] tests/test_transaction.py::TestGetTransactionStats::test_stats_with_deletes PASSED [ 92%] tests/test_transaction.py::TestGetTransactionStats::test_stats_mixed_actions PASSED [ 92%] tests/test_transaction.py::TestGetTransactionStats::test_stats_uses_global_path PASSED [ 92%] tests/test_transaction.py::TestGetTransactionStats::test_stats_ignores_started_status PASSED [ 92%] tests/test_transaction.py::TestGetTransactionStats::test_stats_handles_missing_size_bytes PASSED [ 92%] tests/test_transfer.py::TestParseRateLimit::test_parse_kilobytes PASSED [ 92%] tests/test_transfer.py::TestParseRateLimit::test_parse_megabytes PASSED [ 92%] tests/test_transfer.py::TestParseRateLimit::test_parse_gigabytes PASSED [ 92%] tests/test_transfer.py::TestParseRateLimit::test_parse_bytes PASSED [ 93%] tests/test_transfer.py::TestParseRateLimit::test_parse_none PASSED [ 93%] tests/test_transfer.py::TestParseRateLimit::test_parse_empty_string PASSED [ 93%] tests/test_transfer.py::TestParseRateLimit::test_parse_invalid PASSED [ 93%] tests/test_transfer.py::TestParseRateLimit::test_parse_whitespace PASSED [ 93%] tests/test_transfer.py::TestParseRateLimit::test_parse_float_value PASSED [ 93%] tests/test_transfer.py::TestCheckCompressionAvailable::test_none_always_available PASSED [ 93%] tests/test_transfer.py::TestCheckCompressionAvailable::test_unknown_method PASSED [ 93%] tests/test_transfer.py::TestCheckCompressionAvailable::test_gzip_available PASSED [ 93%] tests/test_transfer.py::TestCheckCompressionAvailable::test_compression_not_installed PASSED [ 93%] tests/test_transfer.py::TestCheckPvAvailable::test_pv_available PASSED [ 93%] tests/test_transfer.py::TestCheckPvAvailable::test_pv_not_available PASSED [ 93%] tests/test_transfer.py::TestGetAvailableCompressionMethods::test_always_includes_none PASSED [ 93%] tests/test_transfer.py::TestGetAvailableCompressionMethods::test_includes_available_methods PASSED [ 93%] tests/test_transfer.py::TestCompressionPrograms::test_has_required_keys PASSED [ 93%] tests/test_transfer.py::TestCompressionPrograms::test_compress_is_list PASSED [ 93%] tests/test_transfer.py::TestCompressionPrograms::test_known_methods_exist PASSED [ 93%] tests/test_transfer.py::TestCreateCompressProcess::test_none_compression_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateCompressProcess::test_empty_compression_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateCompressProcess::test_unknown_method_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateCompressProcess::test_unavailable_program_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateDecompressProcess::test_none_compression_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateDecompressProcess::test_empty_compression_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateThrottleProcess::test_no_rate_limit_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateThrottleProcess::test_pv_not_available_returns_none PASSED [ 93%] tests/test_transfer.py::TestBuildTransferPipeline::test_no_compression_no_throttle PASSED [ 93%] tests/test_transfer.py::TestBuildTransferPipeline::test_with_compression PASSED [ 93%] tests/test_transfer.py::TestCleanupPipeline::test_cleanup_empty_list PASSED [ 93%] tests/test_transfer.py::TestCleanupPipeline::test_cleanup_terminates_running PASSED [ 93%] tests/test_transfer.py::TestCleanupPipeline::test_cleanup_skips_finished PASSED [ 93%] tests/test_transfer.py::TestWaitForPipeline::test_wait_empty_list PASSED [ 93%] tests/test_transfer.py::TestWaitForPipeline::test_wait_successful_processes PASSED [ 93%] tests/test_transfer.py::TestWaitForPipeline::test_wait_failed_process PASSED [ 93%] tests/test_transfer.py::TestWaitForPipeline::test_wait_timeout PASSED [ 93%] tests/test_transfer.py::TestCreateDecompressProcessMore::test_unknown_method_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateDecompressProcessMore::test_unavailable_program_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateThrottleProcessMore::test_invalid_rate_returns_none PASSED [ 93%] tests/test_transfer.py::TestCreateThrottleProcessMore::test_creates_pv_process PASSED [ 93%] tests/test_transfer.py::TestCreateThrottleProcessMore::test_quiet_mode PASSED [ 93%] tests/test_transfer.py::TestBuildTransferPipelineMore::test_with_throttle PASSED [ 93%] tests/test_transfer.py::TestBuildTransferPipelineMore::test_with_compression_and_throttle PASSED [ 93%] tests/test_transfer.py::TestParseRateLimitMore::test_lowercase_units PASSED [ 93%] tests/test_transfer.py::TestParseRateLimitMore::test_zero_value PASSED [ 93%] tests/test_transfer.py::TestParseRateLimitMore::test_large_values PASSED [ 93%] tests/test_transfer.py::TestParseRateLimitMore::test_invalid_number_with_suffix PASSED [ 93%] tests/test_transfer.py::TestParseRateLimitMore::test_invalid_number_without_suffix PASSED [ 93%] tests/test_transfer.py::TestBuildReceivePipeline::test_no_compression PASSED [ 93%] tests/test_transfer.py::TestBuildReceivePipeline::test_empty_compression PASSED [ 93%] tests/test_transfer.py::TestBuildReceivePipeline::test_with_decompression PASSED [ 93%] tests/test_transfer.py::TestCreateDecompressProcessActual::test_creates_process_with_correct_command PASSED [ 93%] tests/test_transfer.py::TestCreateCompressProcessActual::test_creates_process_with_correct_command PASSED [ 93%] tests/test_transfer.py::TestCleanupPipelineExceptions::test_cleanup_handles_terminate_exception PASSED [ 93%] tests/test_transfer.py::TestCleanupPipelineExceptions::test_cleanup_handles_kill_exception PASSED [ 93%] tests/test_transfer.py::TestCleanupPipelineExceptions::test_cleanup_handles_wait_timeout PASSED [ 93%] tests/test_transfer.py::TestReceivePassesSnapshotName::test_process_transfer_passes_snapshot_name PASSED [ 93%] tests/test_transfer.py::TestReceivePassesSnapshotName::test_rich_progress_transfer_passes_snapshot_name PASSED [ 93%] tests/test_transfer.py::TestReceivePassesSnapshotName::test_chunked_local_passes_snapshot_name PASSED [ 93%] tests/test_transfer.py::TestReceivePassesSnapshotName::test_chunked_ssh_passes_snapshot_name PASSED [ 93%] tests/test_transfer_planner.py::test_absent_snapshot_is_planned_present_is_skipped PASSED [ 93%] tests/test_transfer_planner.py::test_parent_is_newest_older_corresponding_source PASSED [ 93%] tests/test_transfer_planner.py::test_full_send_when_no_older_corresponding_parent PASSED [ 93%] tests/test_transfer_planner.py::test_recreated_snapshot_same_name_new_uuid_full_send PASSED [ 93%] tests/test_transfer_planner.py::test_parent_skips_name_present_but_noncorresponding_older_snapshot PASSED [ 93%] tests/test_transfer_planner.py::test_within_run_chaining_over_re_sent_noncorresponding_older PASSED [ 93%] tests/test_transfer_planner.py::test_no_incremental_forces_full_sends PASSED [ 93%] tests/test_transfer_planner.py::test_empty_uuid_source_is_not_present_and_planned_full PASSED [ 93%] tests/test_transfer_planner.py::test_ordering_oldest_first_with_within_run_chaining PASSED [ 93%] tests/test_transfer_planner.py::test_within_run_chaining_off_earlier_in_run_transfer PASSED [ 93%] tests/test_transfer_planner.py::test_same_second_snapshots_chain_incrementally PASSED [ 93%] tests/test_transfer_planner.py::test_same_second_present_snapshot_is_used_as_parent PASSED [ 93%] tests/test_transfer_planner.py::test_same_second_pair_embedded_in_longer_chain PASSED [ 93%] tests/test_transfer_planner.py::test_only_single_snapshot_mode PASSED [ 93%] tests/test_transfer_planner.py::test_no_incremental_suppresses_within_run_chaining PASSED [ 93%] tests/test_transfer_planner.py::test_keep_num_backups_chain_does_not_parent_outside_window PASSED [ 94%] tests/test_transfer_planner.py::test_keep_num_backups_limits_candidates PASSED [ 94%] tests/test_transfer_planner.py::test_snapshots_present_on_is_pure_correspondence PASSED [ 94%] tests/test_transfer_planner.py::test_raw_destination_planner_uses_name_correspondence PASSED [ 94%] tests/test_transfer_planner.py::test_presence_and_plan_survive_destination_listing_failure PASSED [ 94%] tests/test_transfer_report_carries_receive_stderr.py::TestDoProcessTransferHandsTheReceiveBack::test_the_started_receive_and_its_words_are_available PASSED [ 94%] tests/test_transfer_report_carries_receive_stderr.py::TestDoProcessTransferHandsTheReceiveBack::test_without_the_out_parameter_nothing_changes PASSED [ 94%] tests/test_transfer_report_carries_receive_stderr.py::TestTheReportSaysWhy::test_log_process_errors_returns_the_tail PASSED [ 94%] tests/test_transfer_report_carries_receive_stderr.py::TestTheReportSaysWhy::test_send_snapshot_raises_with_the_receive_words PASSED [ 94%] tests/test_transfer_result_consumed.py::TestTheOutcomeSurvivesTheCall::test_a_delivery_reports_what_it_delivered PASSED [ 94%] tests/test_transfer_result_consumed.py::TestTheOutcomeSurvivesTheCall::test_an_up_to_date_destination_is_distinguishable_from_a_delivery PASSED [ 94%] tests/test_transfer_result_consumed.py::TestTheOutcomeSurvivesTheCall::test_a_failure_is_reported_as_none PASSED [ 94%] tests/test_transfer_result_consumed.py::TestTheOutcomeSurvivesTheCall::test_a_partial_failure_reports_how_far_it_got PASSED [ 94%] tests/test_transfer_result_consumed.py::TestTheOutcomeSurvivesTheCall::test_a_total_failure_does_not_claim_partial_progress PASSED [ 94%] tests/test_transfer_result_consumed.py::TestTheRunSummaryCountsSnapshotsNotTargets::test_every_snapshot_counter_adds_the_delivered_count PASSED [ 94%] tests/test_transfer_result_consumed.py::TestTheRunSummaryCountsSnapshotsNotTargets::test_no_scoring_site_reads_the_outcome_as_a_boolean PASSED [ 94%] tests/test_transfer_result_consumed.py::test_an_empty_result_is_not_falsy PASSED [ 94%] tests/test_transfer_success_contract.py::TestVerifyRejectsPlainDirectory::test_real_subvolume_verifies PASSED [ 94%] tests/test_transfer_success_contract.py::TestVerifyRejectsPlainDirectory::test_plain_directory_is_not_accepted PASSED [ 94%] tests/test_transfer_success_contract.py::TestSimpleMonitorReceiveExitAuthoritative::test_nonzero_receive_fails_even_when_subvolume_exists PASSED [ 94%] tests/test_transfer_success_contract.py::TestSimpleMonitorReceiveExitAuthoritative::test_nonzero_send_fails_even_when_subvolume_exists PASSED [ 94%] tests/test_transfer_success_contract.py::TestSimpleMonitorReceiveExitAuthoritative::test_success_requires_both_exit_zero_and_verification PASSED [ 94%] tests/test_transfer_success_contract.py::TestSimpleMonitorReceiveExitAuthoritative::test_zero_exit_but_missing_subvolume_fails PASSED [ 94%] tests/test_transfer_success_contract.py::TestSimpleMonitorReceiveExitAuthoritative::test_timeout_with_live_processes_fails PASSED [ 94%] tests/test_transfer_success_contract.py::TestEnhancedMonitorReceiveExitAuthoritative::test_nonzero_receive_fails_even_when_subvolume_exists PASSED [ 94%] tests/test_transfer_success_contract.py::TestEnhancedMonitorReceiveExitAuthoritative::test_nonzero_send_fails_even_when_subvolume_exists PASSED [ 94%] tests/test_transfer_success_contract.py::TestEnhancedMonitorReceiveExitAuthoritative::test_success_requires_both_exit_zero_and_verification PASSED [ 94%] tests/test_transfer_success_contract.py::TestEnhancedMonitorReceiveExitAuthoritative::test_zero_exit_but_missing_subvolume_fails PASSED [ 94%] tests/test_transfer_success_contract.py::TestEnhancedMonitorReceiveExitAuthoritative::test_timeout_with_live_processes_fails PASSED [ 94%] tests/test_transfer_success_contract.py::TestEnhancedMonitorReceiveExitAuthoritative::test_no_mid_flight_success_when_receive_later_fails PASSED [ 94%] tests/test_transfer_success_contract.py::TestShellPipeline::test_pipeline_launched_with_pipefail_under_bash PASSED [ 94%] tests/test_transfer_success_contract.py::TestShellPipeline::test_pipeline_failure_fails_and_cleans_up PASSED [ 94%] tests/test_transfer_success_contract.py::TestShellPipeline::test_pipeline_success_but_inconclusive_verify_keeps_artifact PASSED [ 94%] tests/test_transfer_success_contract.py::TestCleanupPartialSubvolume::test_deletes_exact_path_when_present PASSED [ 94%] tests/test_transfer_success_contract.py::TestCleanupPartialSubvolume::test_no_delete_when_nothing_present PASSED [ 94%] tests/test_transfer_success_contract.py::TestDirectTransferCleanupGating::test_receive_failure_triggers_cleanup PASSED [ 94%] tests/test_transfer_success_contract.py::TestDirectTransferCleanupGating::test_inconclusive_verify_with_good_receive_keeps_backup PASSED [ 94%] tests/test_transfer_success_contract.py::TestDirectTransferCleanupGating::test_success_returns_true_without_cleanup PASSED [ 94%] tests/test_transfer_success_contract.py::TestReceiveChunkedCleanupGating::test_nonzero_receive_cleans_up PASSED [ 94%] tests/test_transfer_success_contract.py::TestReceiveChunkedCleanupGating::test_inconclusive_verify_after_good_receive_keeps_backup PASSED [ 94%] tests/test_transfer_success_contract.py::TestReceiveChunkedCleanupGating::test_success_returns_true_without_cleanup PASSED [ 94%] tests/test_transfer_success_contract.py::TestReceiveStderrThreadedToError::test_simple_monitor_captures_receive_stderr PASSED [ 94%] tests/test_transfer_success_contract.py::TestReceiveStderrThreadedToError::test_simple_monitor_captures_send_stderr PASSED [ 94%] tests/test_transfer_success_contract.py::TestReceiveStderrThreadedToError::test_enhanced_monitor_captures_receive_stderr PASSED [ 94%] tests/test_transfer_success_contract.py::TestReceiveStderrThreadedToError::test_log_helpers_return_stderr_text PASSED [ 94%] tests/test_transfer_success_contract.py::TestReceiveStderrThreadedToError::test_direct_pipe_error_carries_captured_reason PASSED [ 94%] tests/test_transfer_success_contract.py::TestReceiveStderrThreadedToError::test_direct_pipe_error_generic_without_reason_no_double_wrap PASSED [ 94%] tests/test_transfer_success_legacy_exit_code.py::TestRunTaskSignalsFailure::test_returns_false_when_transfer_fails PASSED [ 94%] tests/test_transfer_success_legacy_exit_code.py::TestRunTaskSignalsFailure::test_returns_true_on_success PASSED [ 94%] tests/test_transfer_success_legacy_exit_code.py::TestLegacyMainExitCode::test_exit_1_when_a_task_fails PASSED [ 94%] tests/test_transfer_success_legacy_exit_code.py::TestLegacyMainExitCode::test_exit_0_when_all_tasks_succeed PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestExecuteTransfersResult::test_records_transferred_and_failed PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestExecuteTransfersResult::test_failed_in_run_parent_short_circuits_dependents PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestExecuteTransfersResult::test_parent_lock_lifecycle PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestSourceEnrichmentOrdering::test_sync_lists_source_with_flush_for_enriched_snapshots PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestSyncSnapshotsFailLoud::test_failed_transfer_raises_with_result PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestSyncSnapshotsFailLoud::test_successful_transfer_returns_ok_result PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestSyncSnapshotsFailLoud::test_nothing_to_transfer_returns_ok_result PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestSyncSnapperSnapshotsFailLoud::test_failed_snapshot_raises_with_result PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestSyncSnapperSnapshotsFailLoud::test_success_returns_transferred_count PASSED [ 94%] tests/test_transfer_success_orchestration.py::TestSyncSnapperSnapshotsFailLoud::test_partial_failure_raises_and_reports_both_counts PASSED [ 94%] tests/test_transfer_success_raw_chunked.py::TestRawPipelinePipefail::test_pipefail_surfaces_upstream_failure PASSED [ 94%] tests/test_transfer_success_raw_chunked.py::TestRawPipelinePipefail::test_successful_pipeline_returns_zero_and_writes PASSED [ 94%] tests/test_transfer_success_raw_chunked.py::TestExecutePipelineRoutesThroughPipefail::test_local_multistage_uses_pipefail_helper PASSED [ 94%] tests/test_transfer_success_raw_chunked.py::TestExecutePipelineRoutesThroughPipefail::test_ssh_multistage_uses_pipefail_helper PASSED [ 94%] tests/test_transfer_supervision.py::test_failed_receive_terminates_send_without_waiting_on_it PASSED [ 94%] tests/test_transfer_supervision.py::test_successful_transfer_returns_zero_codes PASSED [ 94%] tests/test_transfer_supervision.py::test_lingering_send_after_ok_receive_is_terminated_and_fails PASSED [ 94%] tests/test_transfer_supervision.py::test_terminate_process_is_best_effort_on_a_finished_process PASSED [ 94%] tests/test_transfer_supervision.py::test_terminate_process_kills_when_terminate_times_out PASSED [ 94%] tests/test_transfer_timeout_reporting.py::TestATimeoutSaysWhoseItWas::test_the_reason_names_the_limit_and_denies_being_ssh PASSED [ 94%] tests/test_transfer_timeout_reporting.py::TestATimeoutSaysWhoseItWas::test_the_reason_says_the_backup_is_incomplete PASSED [ 94%] tests/test_transfer_timeout_reporting.py::TestATimeoutSaysWhoseItWas::test_the_monitor_records_the_reason_not_just_a_log_line PASSED [ 94%] tests/test_transfer_timeout_reporting.py::TestATimeoutSaysWhoseItWas::test_the_simple_monitor_records_it_too PASSED [ 95%] tests/test_transfers_cmd.py::TestFormatBytes::test_bytes PASSED [ 95%] tests/test_transfers_cmd.py::TestFormatBytes::test_kilobytes PASSED [ 95%] tests/test_transfers_cmd.py::TestFormatBytes::test_megabytes PASSED [ 95%] tests/test_transfers_cmd.py::TestFormatBytes::test_gigabytes PASSED [ 95%] tests/test_transfers_cmd.py::TestFormatAge::test_just_now PASSED [ 95%] tests/test_transfers_cmd.py::TestFormatAge::test_hours_ago PASSED [ 95%] tests/test_transfers_cmd.py::TestFormatAge::test_days_ago PASSED [ 95%] tests/test_transfers_cmd.py::TestFormatAge::test_invalid_timestamp PASSED [ 95%] tests/test_transfers_cmd.py::TestGetStatusSymbol::test_completed PASSED [ 95%] tests/test_transfers_cmd.py::TestGetStatusSymbol::test_failed PASSED [ 95%] tests/test_transfers_cmd.py::TestGetStatusSymbol::test_transferring PASSED [ 95%] tests/test_transfers_cmd.py::TestGetStatusSymbol::test_paused PASSED [ 95%] tests/test_transfers_cmd.py::TestListTransfers::test_no_transfers PASSED [ 95%] tests/test_transfers_cmd.py::TestListTransfers::test_with_transfers PASSED [ 95%] tests/test_transfers_cmd.py::TestListTransfers::test_json_output PASSED [ 95%] tests/test_transfers_cmd.py::TestShowTransfer::test_transfer_not_found PASSED [ 95%] tests/test_transfers_cmd.py::TestShowTransfer::test_show_transfer_details PASSED [ 95%] tests/test_transfers_cmd.py::TestResumeTransfer::test_transfer_not_found PASSED [ 95%] tests/test_transfers_cmd.py::TestResumeTransfer::test_not_resumable PASSED [ 95%] tests/test_transfers_cmd.py::TestResumeTransfer::test_resume_success PASSED [ 95%] tests/test_transfers_cmd.py::TestCleanupTransfers::test_cleanup_specific_transfer PASSED [ 95%] tests/test_transfers_cmd.py::TestCleanupTransfers::test_cleanup_stale PASSED [ 95%] tests/test_transfers_cmd.py::TestListOperations::test_no_operations PASSED [ 95%] tests/test_transfers_cmd.py::TestListOperations::test_with_operations PASSED [ 95%] tests/test_transfers_cmd.py::TestPauseTransfer::test_no_transfer_id PASSED [ 95%] tests/test_transfers_cmd.py::TestPauseTransfer::test_transfer_not_found PASSED [ 95%] tests/test_transfers_cmd.py::TestPauseTransfer::test_not_actively_transferring PASSED [ 95%] tests/test_transfers_cmd.py::TestPauseTransfer::test_pause_success PASSED [ 95%] tests/test_transfers_cmd.py::TestShowTransferEdgeCases::test_no_transfer_id PASSED [ 95%] tests/test_transfers_cmd.py::TestShowTransferEdgeCases::test_json_output PASSED [ 95%] tests/test_transfers_cmd.py::TestShowTransferEdgeCases::test_verbose_shows_chunks PASSED [ 95%] tests/test_transfers_cmd.py::TestResumeTransferEdgeCases::test_no_transfer_id PASSED [ 95%] tests/test_transfers_cmd.py::TestResumeTransferEdgeCases::test_dry_run PASSED [ 95%] tests/test_transfers_cmd.py::TestCleanupTransfersEdgeCases::test_cleanup_not_found PASSED [ 95%] tests/test_transfers_cmd.py::TestCleanupTransfersEdgeCases::test_cleanup_specific_dry_run PASSED [ 95%] tests/test_transfers_cmd.py::TestCleanupTransfersEdgeCases::test_cleanup_stale_dry_run PASSED [ 95%] tests/test_transfers_cmd.py::TestCleanupTransfersEdgeCases::test_cleanup_no_stale PASSED [ 95%] tests/test_transfers_cmd.py::TestListOperationsEdgeCases::test_json_output PASSED [ 95%] tests/test_transfers_cmd.py::TestExecuteTransfers::test_default_action_is_list PASSED [ 95%] tests/test_transfers_cmd.py::TestExecuteTransfers::test_routes_to_show PASSED [ 95%] tests/test_transfers_cmd.py::TestExecuteTransfers::test_routes_to_cleanup PASSED [ 95%] tests/test_undated_snapshots.py::TestDeriveSnapshotTime::test_a_plain_name_parses_as_written PASSED [ 95%] tests/test_undated_snapshots.py::TestDeriveSnapshotTime::test_a_trailing_ordinal_is_stripped_for_the_time_only PASSED [ 95%] tests/test_undated_snapshots.py::TestDeriveSnapshotTime::test_btrbk_daily_counter_names_derive_their_day PASSED [ 95%] tests/test_undated_snapshots.py::TestDeriveSnapshotTime::test_a_full_parse_is_never_mistaken_for_a_counter PASSED [ 95%] tests/test_undated_snapshots.py::TestDeriveSnapshotTime::test_an_unparseable_name_yields_none_not_an_exception PASSED [ 95%] tests/test_undated_snapshots.py::TestDeriveSnapshotTime::test_a_ten_digit_tail_is_not_an_ordinal PASSED [ 95%] tests/test_undated_snapshots.py::TestUndatedOrdering::test_dated_sorts_before_undated PASSED [ 95%] tests/test_undated_snapshots.py::TestUndatedOrdering::test_two_undated_order_deterministically_by_name PASSED [ 95%] tests/test_undated_snapshots.py::TestUndatedOrdering::test_a_mixed_listing_sorts_without_raising PASSED [ 95%] tests/test_undated_snapshots.py::TestUndatedOrdering::test_an_observed_name_without_a_time_stays_timeless PASSED [ 95%] tests/test_undated_snapshots.py::TestUndatedOrdering::test_a_created_snapshot_still_defaults_to_now PASSED [ 95%] tests/test_undated_snapshots.py::TestUndatedFindParent::test_an_undated_snapshot_gets_no_parent PASSED [ 95%] tests/test_undated_snapshots.py::TestUndatedFindParent::test_undated_candidates_are_never_parents PASSED [ 95%] tests/test_undated_snapshots.py::TestUndatedFindParent::test_all_undated_presents_mean_a_full_send PASSED [ 95%] tests/test_undated_snapshots.py::TestUndatedFindParent::test_presence_by_name_still_wins_for_an_undated_snapshot PASSED [ 95%] tests/test_undated_snapshots.py::TestPlannerExclusion::test_the_plan_is_identical_with_and_without_an_undated_source PASSED [ 95%] tests/test_undated_snapshots.py::TestPlannerExclusion::test_undated_never_occupies_a_keep_num_slot PASSED [ 95%] tests/test_undated_snapshots.py::TestPlannerExclusion::test_an_explicit_undated_request_is_a_full_send PASSED [ 95%] tests/test_undated_snapshots.py::TestPlannerExclusion::test_an_explicit_undated_request_already_present_is_skipped PASSED [ 95%] tests/test_undated_snapshots.py::TestEstimateExclusion::test_the_estimate_skips_and_reports_the_undated PASSED [ 95%] tests/test_undated_snapshots.py::TestRestoreGuards::test_an_undated_restore_target_requires_no_predecessor PASSED [ 95%] tests/test_undated_snapshots.py::TestRestoreGuards::test_verify_gives_an_undated_snapshot_no_parent PASSED [ 95%] tests/test_undated_snapshots.py::TestRestoreGuards::test_a_selected_undated_base_is_planned_first PASSED [ 95%] tests/test_undated_snapshots.py::TestRestoreGuards::test_a_time_bound_reports_what_it_cannot_judge PASSED [ 95%] tests/test_unlock_records_the_change.py::TestUnlockKeepsWhatARunDoesMeanwhile::test_a_pin_taken_meanwhile_is_kept PASSED [ 95%] tests/test_unlock_records_the_change.py::TestUnlockKeepsWhatARunDoesMeanwhile::test_a_pin_released_meanwhile_does_not_come_back PASSED [ 95%] tests/test_unlock_records_the_change.py::TestUnlockKeepsWhatARunDoesMeanwhile::test_what_it_reports_is_what_it_removed PASSED [ 95%] tests/test_unlock_records_the_change.py::TestUnlockKeepsWhatARunDoesMeanwhile::test_it_waits_for_the_guard PASSED [ 95%] tests/test_unlock_records_the_change.py::TestUnlockKeepsWhatARunDoesMeanwhile::test_a_write_that_fails_part_way_says_how_far_it_got PASSED [ 95%] tests/test_unlock_records_the_change.py::TestUnlockRemovesOnlyWhatItRead::test_on_an_entry_without_a_restore_pin_when_read PASSED [ 95%] tests/test_unlock_records_the_change.py::TestUnlockRemovesOnlyWhatItRead::test_on_an_entry_with_a_restore_pin_when_read PASSED [ 95%] tests/test_unlock_records_the_change.py::TestADirectoryStoreIsReleasedPerHolder::test_one_session_is_cleared_and_nothing_else_is_written[LocalEndpoint] PASSED [ 96%] tests/test_unlock_records_the_change.py::TestADirectoryStoreIsReleasedPerHolder::test_one_session_is_cleared_and_nothing_else_is_written[RawEndpoint] PASSED [ 96%] tests/test_unlock_records_the_change.py::TestADirectoryStoreIsReleasedPerHolder::test_one_session_is_cleared_and_nothing_else_is_written[SSHEndpoint] PASSED [ 96%] tests/test_unlock_records_the_change.py::TestADirectoryStoreIsReleasedPerHolder::test_one_session_is_cleared_and_nothing_else_is_written[SSHRawEndpoint] PASSED [ 96%] tests/test_unlock_records_the_change.py::TestADirectoryStoreIsReleasedPerHolder::test_a_pin_taken_meanwhile_is_kept PASSED [ 96%] tests/test_unlock_records_the_change.py::TestADirectoryStoreIsReleasedPerHolder::test_a_pin_released_meanwhile_is_not_counted PASSED [ 96%] tests/test_unlock_records_the_change.py::TestADirectoryStoreIsReleasedPerHolder::test_a_record_that_cannot_be_read_is_cleared_by_all_only PASSED [ 96%] tests/test_unlock_records_the_change.py::TestADirectoryStoreIsReleasedPerHolder::test_a_record_that_cannot_be_listed_is_not_reported_as_released PASSED [ 96%] tests/test_unlock_records_the_change.py::TestADirectoryStoreIsReleasedPerHolder::test_a_running_operations_target_lock_is_left_alone PASSED [ 96%] tests/test_util.py::TestEncodePathForDir::test_root_path PASSED [ 96%] tests/test_util.py::TestEncodePathForDir::test_simple_path PASSED [ 96%] tests/test_util.py::TestEncodePathForDir::test_nested_path PASSED [ 96%] tests/test_util.py::TestEncodePathForDir::test_var_log_path PASSED [ 96%] tests/test_util.py::TestDateToStr::test_with_timestamp PASSED [ 96%] tests/test_util.py::TestDateToStr::test_with_custom_format PASSED [ 96%] tests/test_util.py::TestDateToStr::test_without_timestamp PASSED [ 96%] tests/test_util.py::TestDateToStr::test_returns_string PASSED [ 96%] tests/test_util.py::TestStrToDate::test_parse_valid_string PASSED [ 96%] tests/test_util.py::TestStrToDate::test_with_custom_format PASSED [ 96%] tests/test_util.py::TestStrToDate::test_without_time_string PASSED [ 96%] tests/test_util.py::TestStrToDate::test_invalid_format_raises PASSED [ 96%] tests/test_util.py::TestLogHeading::test_basic_heading PASSED [ 96%] tests/test_util.py::TestLogHeading::test_long_caption PASSED [ 96%] tests/test_util.py::TestLogHeading::test_empty_caption PASSED [ 96%] tests/test_util.py::TestReadLocks::test_read_empty_string PASSED [ 96%] tests/test_util.py::TestReadLocks::test_read_whitespace_only PASSED [ 96%] tests/test_util.py::TestReadLocks::test_read_valid_locks PASSED [ 96%] tests/test_util.py::TestReadLocks::test_read_multiple_snapshots PASSED [ 96%] tests/test_util.py::TestReadLocks::test_deduplicates_locks PASSED [ 96%] tests/test_util.py::TestReadLocks::test_invalid_json_raises PASSED [ 96%] tests/test_util.py::TestReadLocks::test_invalid_structure_raises PASSED [ 96%] tests/test_util.py::TestReadLocks::test_invalid_lock_type_raises PASSED [ 96%] tests/test_util.py::TestReadLocks::test_non_string_lock_raises PASSED [ 96%] tests/test_util.py::TestWriteLocks::test_write_empty_dict PASSED [ 96%] tests/test_util.py::TestWriteLocks::test_write_valid_locks PASSED [ 96%] tests/test_util.py::TestWriteLocks::test_roundtrip PASSED [ 96%] tests/test_util.py::TestSnapshot::test_create_snapshot PASSED [ 96%] tests/test_util.py::TestSnapshot::test_create_with_time PASSED [ 96%] tests/test_util.py::TestSnapshot::test_get_name PASSED [ 96%] tests/test_util.py::TestSnapshot::test_get_path PASSED [ 96%] tests/test_util.py::TestSnapshot::test_repr PASSED [ 96%] tests/test_util.py::TestSnapshot::test_equality PASSED [ 96%] tests/test_util.py::TestSnapshot::test_inequality PASSED [ 96%] tests/test_util.py::TestSnapshot::test_less_than PASSED [ 96%] tests/test_util.py::TestSnapshot::test_comparison_different_prefix_raises PASSED [ 96%] tests/test_util.py::TestSnapshot::test_locks_initialized_empty PASSED [ 96%] tests/test_util.py::TestSnapshot::test_find_parent_already_present PASSED [ 96%] tests/test_util.py::TestSnapshot::test_find_parent_older_exists PASSED [ 96%] tests/test_util.py::TestSnapshot::test_find_parent_no_older PASSED [ 96%] tests/test_util.py::TestSnapshot::test_find_parent_empty_list PASSED [ 96%] tests/test_util.py::TestExceptions::test_abort_error PASSED [ 96%] tests/test_util.py::TestExceptions::test_snapshot_transfer_error PASSED [ 96%] tests/test_util.py::TestExceptions::test_snapshot_transfer_error_message PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_successful_command PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_command_with_check_call PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_command_not_found PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_command_failure PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_command_with_env PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_converts_args_to_strings PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_command_with_absolute_path_not_found PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_which_fallback_on_not_found PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_which_fallback_not_found_in_path PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_which_fallback_exception PASSED [ 96%] tests/test_util.py::TestExecSubprocess::test_unexpected_exception PASSED [ 96%] tests/test_util.py::TestIsBtrfs::test_with_existing_path PASSED [ 96%] tests/test_util.py::TestIsBtrfs::test_with_root PASSED [ 96%] tests/test_util.py::TestIsBtrfs::test_parses_mounts_file PASSED [ 96%] tests/test_util.py::TestIsBtrfs::test_handles_malformed_mounts_line PASSED [ 96%] tests/test_util.py::TestIsBtrfs::test_best_match_selection PASSED [ 96%] tests/test_util.py::TestIsSubvolume::test_with_regular_dir PASSED [ 96%] tests/test_util.py::TestIsSubvolume::test_with_nonexistent_path PASSED [ 96%] tests/test_util.py::TestIsSubvolume::test_returns_false_if_not_btrfs PASSED [ 96%] tests/test_util.py::TestIsSubvolume::test_checks_inode_on_btrfs PASSED [ 96%] tests/test_util.py::TestDeleteSubvolume::test_raises_if_not_subvolume PASSED [ 97%] tests/test_util.py::TestDeleteSubvolume::test_calls_btrfs_delete PASSED [ 97%] tests/test_util.py::TestIsMounted::test_root_is_mounted PASSED [ 97%] tests/test_util.py::TestIsMounted::test_non_mount_point PASSED [ 97%] tests/test_util.py::TestIsMounted::test_handles_malformed_lines PASSED [ 97%] tests/test_util.py::TestGetMountInfo::test_get_mount_info_for_root PASSED [ 97%] tests/test_util.py::TestGetMountInfo::test_get_mount_info_for_subpath PASSED [ 97%] tests/test_util.py::TestGetMountInfo::test_get_mount_info_best_match PASSED [ 97%] tests/test_util.py::TestGetMountInfo::test_get_mount_info_handles_malformed PASSED [ 97%] tests/test_util.py::TestGetMountInfo::test_get_mount_info_not_found PASSED [ 97%] tests/test_util.py::TestInsufficientSpaceError::test_inherits_from_abort_error PASSED [ 97%] tests/test_util.py::TestInsufficientSpaceError::test_error_message PASSED [ 97%] tests/test_util.py::TestParseSnapshotTime::test_preferred_format_matches PASSED [ 97%] tests/test_util.py::TestParseSnapshotTime::test_falls_back_to_default PASSED [ 97%] tests/test_util.py::TestParseSnapshotTime::test_default_when_no_preferred PASSED [ 97%] tests/test_util.py::TestParseSnapshotTime::test_preferred_equal_to_default_not_duplicated PASSED [ 97%] tests/test_util.py::TestParseSnapshotTime::test_raises_when_nothing_matches PASSED [ 97%] tests/test_util.py::TestIndistinguishablePeriod::test_seconds_resolving_format_is_none PASSED [ 97%] tests/test_util.py::TestIndistinguishablePeriod::test_default_format_is_seconds_resolving PASSED [ 97%] tests/test_util.py::TestIndistinguishablePeriod::test_minute_coarse_format PASSED [ 97%] tests/test_util.py::TestIndistinguishablePeriod::test_hour_coarse_format PASSED [ 97%] tests/test_util.py::TestIndistinguishablePeriod::test_day_coarse_format PASSED [ 97%] tests/test_util.py::TestIndistinguishablePeriod::test_year_format_is_more_than_a_day PASSED [ 97%] tests/test_util.py::TestIndistinguishablePeriod::test_literal_text_judged_by_output_not_directives PASSED [ 97%] tests/test_util.py::TestSnapshotNaming::test_default_format_from_plain_endpoint PASSED [ 97%] tests/test_util.py::TestSnapshotNaming::test_new_snapshot_uses_configured_format PASSED [ 97%] tests/test_util.py::TestSnapshotNaming::test_an_observed_name_wins_over_the_endpoint_format PASSED [ 97%] tests/test_util.py::TestSnapshotNaming::test_legacy_name_is_remembered_not_regenerated PASSED [ 97%] tests/test_util.py::TestSnapshotNaming::test_empty_config_format_uses_default PASSED [ 97%] tests/test_util.py::TestSnapshotNaming::test_a_parse_but_no_roundtrip_name_resolves_to_its_own_path PASSED [ 97%] tests/test_util.py::TestNameIdentityAndOrdering::test_same_timestamp_different_names_are_different_snapshots PASSED [ 97%] tests/test_util.py::TestNameIdentityAndOrdering::test_same_name_is_the_same_snapshot_across_objects PASSED [ 97%] tests/test_util.py::TestNameIdentityAndOrdering::test_equality_is_duck_typed_on_get_name PASSED [ 97%] tests/test_util.py::TestNameIdentityAndOrdering::test_comparison_against_nameless_objects_falls_back PASSED [ 97%] tests/test_util.py::TestNameIdentityAndOrdering::test_same_second_ordering_is_total_and_deterministic PASSED [ 97%] tests/test_util.py::TestNameIdentityAndOrdering::test_trailing_ordinals_order_numerically PASSED [ 97%] tests/test_uuid_identity.py::test_parse_subvolume_list_extracts_uuid_and_received_uuid PASSED [ 97%] tests/test_uuid_identity.py::test_parse_subvolume_list_name_is_final_path_component PASSED [ 97%] tests/test_uuid_identity.py::test_parse_subvolume_list_tolerates_missing_uuid_columns PASSED [ 97%] tests/test_uuid_identity.py::test_parse_subvolume_list_skips_blank_and_pathless_lines PASSED [ 97%] tests/test_uuid_identity.py::test_enrichment_uses_subvolume_show_per_snapshot PASSED [ 97%] tests/test_uuid_identity.py::test_enrichment_sudo_escalates_when_not_root PASSED [ 97%] tests/test_uuid_identity.py::test_enrichment_no_sudo_when_root PASSED [ 97%] tests/test_uuid_identity.py::test_parse_subvolume_show_uuid_and_received PASSED [ 97%] tests/test_uuid_identity.py::test_parse_subvolume_show_received_not_confused_with_uuid_or_parent PASSED [ 97%] tests/test_uuid_identity.py::test_ssh_parse_snapshot_list_sets_uuids_per_line PASSED [ 97%] tests/test_uuid_identity.py::test_enrichment_graceful_on_command_failure PASSED [ 97%] tests/test_uuid_identity.py::test_enrichment_graceful_when_subprocess_raises PASSED [ 97%] tests/test_uuid_identity.py::test_a_refused_sudo_leaves_the_identities_unread PASSED [ 97%] tests/test_uuid_identity.py::test_identity_unchanged_despite_differing_uuids PASSED [ 97%] tests/test_uuid_identity.py::test_new_snapshots_default_to_empty_uuids PASSED [ 97%] tests/test_verify.py::TestVerifyResult::test_default_values PASSED [ 97%] tests/test_verify.py::TestVerifyResult::test_with_details PASSED [ 97%] tests/test_verify.py::TestVerifyReport::test_empty_report PASSED [ 97%] tests/test_verify.py::TestVerifyReport::test_report_with_results PASSED [ 97%] tests/test_verify.py::TestVerifyReport::test_duration_calculation PASSED [ 97%] tests/test_verify.py::TestFindParentSnapshot::test_finds_most_recent_older PASSED [ 97%] tests/test_verify.py::TestFindParentSnapshot::test_returns_none_for_oldest PASSED [ 97%] tests/test_verify.py::TestFindParentSnapshot::test_excludes_self PASSED [ 97%] tests/test_verify.py::TestVerifyMetadata::test_empty_backup_location PASSED [ 97%] tests/test_verify.py::TestVerifyMetadata::test_single_snapshot PASSED [ 97%] tests/test_verify.py::TestVerifyMetadata::test_all_valid_snapshots_pass PASSED [ 97%] tests/test_verify.py::TestVerifyMetadata::test_specific_snapshot PASSED [ 97%] tests/test_verify.py::TestVerifyMetadata::test_snapshot_not_found PASSED [ 97%] tests/test_verify.py::TestVerifyMetadata::test_progress_callback PASSED [ 97%] tests/test_verify.py::TestVerifyMetadata::test_source_comparison PASSED [ 97%] tests/test_verify.py::TestVerifyMetadata::test_mixed_structural_verdicts_counted_correctly PASSED [ 97%] tests/test_verify.py::TestVerifyMetadata::test_ssh_verify_structure_checks_received_uuid PASSED [ 97%] tests/test_verify.py::TestVerifyLevel::test_level_values PASSED [ 97%] tests/test_verify.py::TestVerifyLevel::test_level_from_string PASSED [ 97%] tests/test_verify.py::TestVerifyStream::test_empty_backup_location PASSED [ 97%] tests/test_verify.py::TestVerifyStream::test_snapshot_not_found PASSED [ 97%] tests/test_verify.py::TestVerifyStream::test_verify_latest_by_default PASSED [ 97%] tests/test_verify.py::TestVerifyStream::test_verify_specific_snapshot PASSED [ 98%] tests/test_verify.py::TestVerifyStream::test_stream_success PASSED [ 98%] tests/test_verify.py::TestVerifyStream::test_stream_failure PASSED [ 98%] tests/test_verify.py::TestVerifyStream::test_progress_callback PASSED [ 98%] tests/test_verify.py::TestVerifyStream::test_incremental_detection PASSED [ 98%] tests/test_verify.py::TestVerifyStream::test_exception_handling PASSED [ 98%] tests/test_verify.py::TestVerifyReportVerdictAndCounts::test_verdict_pass_when_all_ok PASSED [ 98%] tests/test_verify.py::TestVerifyReportVerdictAndCounts::test_verdict_unverifiable_when_some_unverifiable_no_fail PASSED [ 98%] tests/test_verify.py::TestVerifyReportVerdictAndCounts::test_verdict_fail_on_any_failure PASSED [ 98%] tests/test_verify.py::TestVerifyReportVerdictAndCounts::test_verdict_fail_on_run_error PASSED [ 98%] tests/test_verify.py::TestVerifyStreamSelection::test_latest_only_by_default_but_available_is_full PASSED [ 98%] tests/test_verify.py::TestVerifyStreamSelection::test_all_snapshots_checks_every_one PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_empty_backup_location PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_snapshot_not_found PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_temp_dir_not_btrfs PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_remote_without_temp_dir PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_full_verify_success PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_full_verify_restore_fails PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_restored_path_not_found PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_restored_not_subvolume PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_with_custom_temp_dir PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_creates_temp_dir_if_not_exists PASSED [ 98%] tests/test_verify.py::TestVerifyFull::test_progress_callback PASSED [ 98%] tests/test_verify.py::TestVerifyFullEnvironment::test_no_privilege_is_run_error_not_failure PASSED [ 98%] tests/test_verify.py::TestVerifyFullEnvironment::test_privilege_gate_is_root_only PASSED [ 98%] tests/test_verify.py::TestVerifyFullEnvironment::test_space_shortfall_is_unverifiable_not_failure PASSED [ 98%] tests/test_verify.py::TestVerifyFullEnvironment::test_enospc_during_restore_is_unverifiable PASSED [ 98%] tests/test_verify.py::TestVerifyFullEnvironment::test_genuine_restore_failure_is_a_failure PASSED [ 98%] tests/test_verify.py::TestVerifyFullEnvironment::test_corruption_mentioning_permission_still_fails PASSED [ 98%] tests/test_verify.py::TestVerifyFullHelpers::test_estimate_temp_shortfall_none_when_cannot_estimate PASSED [ 98%] tests/test_verify.py::TestVerifyFullHelpers::test_estimate_temp_shortfall_none_when_sufficient PASSED [ 98%] tests/test_verify.py::TestVerifyFullHelpers::test_estimate_temp_shortfall_message_when_short PASSED [ 98%] tests/test_verify.py::TestVerifyFullHelpers::test_delete_temp_subvolume_ok PASSED [ 98%] tests/test_verify.py::TestVerifyFullHelpers::test_delete_temp_subvolume_raises_with_stderr PASSED [ 98%] tests/test_verify.py::TestEndpointTestSendStream::test_local_runs_btrfs_send_locally PASSED [ 98%] tests/test_verify.py::TestEndpointTestSendStream::test_local_nonzero_raises PASSED [ 98%] tests/test_verify.py::TestEndpointTestSendStream::test_local_incremental_adds_parent_flag PASSED [ 98%] tests/test_verify.py::TestEndpointTestSendStream::test_ssh_dispatches_to_remote_exec_not_local_subprocess PASSED [ 98%] tests/test_verify.py::TestEndpointTestSendStream::test_ssh_nonzero_remote_raises PASSED [ 98%] tests/test_verify.py::TestEndpointTestSendStream::test_ssh_empty_stderr_gives_informative_message PASSED [ 98%] tests/test_verify.py::TestEndpointTestSendStream::test_ssh_transient_error_propagates_not_wrapped PASSED [ 98%] tests/test_verify.py::TestEndpointTestSendStream::test_ssh_sudo_uses_retry_variant PASSED [ 98%] tests/test_verify.py::TestEndpointTestSendStream::test_raw_rejects_as_not_a_subvolume PASSED [ 98%] tests/test_verify.py::TestVerifyError::test_verify_error_message PASSED [ 98%] tests/test_verify.py::TestVerifyError::test_verify_error_is_exception PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataExceptionHandling::test_list_snapshots_exception PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataExceptionHandling::test_source_comparison_exception PASSED [ 98%] tests/test_verify.py::TestVerifyReportDuration::test_duration_before_completion PASSED [ 98%] tests/test_verify.py::test_raw_checksums_empty_target_reports_error PASSED [ 98%] tests/test_verify.py::test_raw_checksums_snapshot_filter_selects_one PASSED [ 98%] tests/test_verify.py::test_raw_checksums_snapshot_filter_missing_reports_error PASSED [ 98%] tests/test_verify.py::test_raw_checksums_invokes_on_progress PASSED [ 98%] tests/test_verify.py::test_raw_checksums_error_status_fails_with_message PASSED [ 98%] tests/test_verify.py::test_raw_checksums_unverifiable_is_not_a_failure PASSED [ 98%] tests/test_verify.py::test_raw_checksums_remote_ok_carries_trust_caveat PASSED [ 98%] tests/test_verify.py::test_raw_checksums_list_failure_is_reported_not_raised PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataStructural::test_local_plain_directory_fails_as_invalid PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataStructural::test_local_verify_structure_direct_on_plain_dir PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataStructural::test_local_is_subvolume_permission_error_is_unverifiable_not_fail PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataStructural::test_local_verify_structure_ok_and_unverifiable_by_received_uuid PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataStructural::test_local_verify_structure_unresolvable_path_is_unverifiable PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataStructural::test_raw_authoritative_sidecar_passes PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataStructural::test_raw_filename_inferred_is_unverifiable_not_silent_pass PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataStructural::test_raw_missing_incremental_parent_fails PASSED [ 98%] tests/test_verify.py::TestVerifyMetadataStructural::test_raw_present_incremental_parent_passes PASSED [ 98%] tests/test_withdrawn_options_say_so_everywhere.py::test_help_man_and_readme_agree[--in-place-not implemented] PASSED [ 98%] tests/test_withdrawn_options_say_so_everywhere.py::test_help_man_and_readme_agree[--overwrite-not supported] PASSED [ 98%] tests/test_wizard_carries_over_what_it_did_not_ask.py::test_every_loader_key_is_exercised PASSED [ 98%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestTheDetectionWizard::test_declining_global_settings_keeps_every_global_option PASSED [ 98%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestTheDetectionWizard::test_accepting_global_settings_replaces_only_what_was_asked PASSED [ 98%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestTheInitWizard::test_the_same_answers_leave_the_configuration_unchanged PASSED [ 98%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestTheInitWizard::test_a_changed_answer_wins_and_is_reported PASSED [ 98%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestTheInitWizard::test_force_skips_the_question_not_the_carry_over PASSED [ 98%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestTheInitWizard::test_declining_a_gate_removes_the_block_and_says_so PASSED [ 99%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestCarryOverDirectly::test_two_volumes_sharing_a_path_keep_their_own_options PASSED [ 99%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestCarryOverDirectly::test_an_unasked_default_the_wizard_wrote_is_overridden PASSED [ 99%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestCarryOverDirectly::test_plain_content_is_authoritative_for_what_it_sets PASSED [ 99%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestCarryOverDirectly::test_the_record_refuses_a_key_no_wizard_asks PASSED [ 99%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestTheDiffSummaryReadsWhatWouldBeWritten::test_a_carried_retention_is_not_a_change PASSED [ 99%] tests/test_wizard_carries_over_what_it_did_not_ask.py::TestTheDiffSummaryReadsWhatWouldBeWritten::test_an_answered_retention_is PASSED [ 99%] tests/test_wizard_carries_over_what_it_did_not_ask.py::test_wizard_config_carries_its_record PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheSerializer::test_every_shipped_example_round_trips[examples/config.toml] PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheSerializer::test_every_shipped_example_round_trips[examples/minimal.toml] PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheSerializer::test_every_shipped_example_round_trips[examples/remote-backup.toml] PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheSerializer::test_every_shipped_example_round_trips[examples/server.toml] PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheSerializer::test_every_shipped_example_round_trips[examples/snapper.toml] PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheSerializer::test_strings_that_need_escaping_round_trip PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheSerializer::test_an_unwritable_value_is_refused PASSED [ 99%] tests/test_wizard_keeps_options.py::TestWhatIsKept::test_every_target_field_is_either_asked_or_carried PASSED [ 99%] tests/test_wizard_keeps_options.py::TestWhatIsKept::test_every_option_the_wizard_does_not_ask_about_survives PASSED [ 99%] tests/test_wizard_keeps_options.py::TestWhatIsKept::test_the_wizard_alone_would_have_lost_them PASSED [ 99%] tests/test_wizard_keeps_options.py::TestWhatIsKept::test_volume_and_global_options_survive PASSED [ 99%] tests/test_wizard_keeps_options.py::TestWhatIsKept::test_the_report_names_what_was_kept PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheWizardsAnswersWin::test_a_blank_log_file_is_not_brought_back PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheWizardsAnswersWin::test_an_answered_option_takes_the_new_value PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheWizardsAnswersWin::test_declined_email_is_not_brought_back PASSED [ 99%] tests/test_wizard_keeps_options.py::TestTheWizardsAnswersWin::test_a_retention_keep_does_not_override_the_answered_buckets PASSED [ 99%] tests/test_wizard_keeps_options.py::TestWhatCannotBeCarried::test_a_target_the_new_configuration_lacks_is_named_with_its_options PASSED [ 99%] tests/test_wizard_keeps_options.py::TestWhatCannotBeCarried::test_a_volume_the_new_configuration_lacks_is_named PASSED [ 99%] tests/test_wizard_keeps_options.py::TestWhatCannotBeCarried::test_a_target_whose_path_changed_takes_nothing_from_the_old_one PASSED [ 99%] tests/test_wizard_keeps_options.py::TestThroughTheSavePaths::test_config_init_interactive_over_an_existing_output PASSED [ 99%] tests/test_wizard_keeps_options.py::TestThroughTheSavePaths::test_save_wizard_config_over_an_existing_file PASSED [ 99%] tests/test_wizard_keeps_options.py::TestThroughTheSavePaths::test_declining_writes_nothing PASSED [ 99%] tests/test_wizard_keeps_options.py::TestThroughTheSavePaths::test_an_unreadable_existing_file_is_said_and_left_to_the_prompt PASSED [ 99%] tests/test_wizard_keeps_options.py::TestThroughTheSavePaths::test_every_wizard_save_asks_through_the_carry_over PASSED [ 99%] tests/test_wizard_keeps_options.py::test_the_asked_sets_name_real_schema_fields PASSED [ 99%] tests/test_wizard_utils.py::TestPrompt::test_returns_user_input PASSED [ 99%] tests/test_wizard_utils.py::TestPrompt::test_returns_default_on_empty_input PASSED [ 99%] tests/test_wizard_utils.py::TestPrompt::test_raises_keyboard_interrupt_on_eof PASSED [ 99%] tests/test_wizard_utils.py::TestPrompt::test_raises_keyboard_interrupt_on_ctrl_c PASSED [ 99%] tests/test_wizard_utils.py::TestPromptSnapshotPrefix::test_no_prefix_returns_empty PASSED [ 99%] tests/test_wizard_utils.py::TestPromptSnapshotPrefix::test_yes_accepts_default_prefix PASSED [ 99%] tests/test_wizard_utils.py::TestPromptSnapshotPrefix::test_yes_accepts_custom_prefix PASSED [ 99%] tests/test_wizard_utils.py::TestPromptBool::test_returns_true PASSED [ 99%] tests/test_wizard_utils.py::TestPromptBool::test_returns_false PASSED [ 99%] tests/test_wizard_utils.py::TestPromptBool::test_uses_default PASSED [ 99%] tests/test_wizard_utils.py::TestPromptBool::test_raises_keyboard_interrupt_on_eof PASSED [ 99%] tests/test_wizard_utils.py::TestPromptInt::test_returns_valid_int PASSED [ 99%] tests/test_wizard_utils.py::TestPromptInt::test_rejects_out_of_range_then_accepts_valid PASSED [ 99%] tests/test_wizard_utils.py::TestPromptInt::test_raises_keyboard_interrupt_on_eof PASSED [ 99%] tests/test_wizard_utils.py::TestPromptChoice::test_returns_choice_by_number PASSED [ 99%] tests/test_wizard_utils.py::TestPromptChoice::test_returns_choice_by_value PASSED [ 99%] tests/test_wizard_utils.py::TestPromptChoice::test_returns_default_on_empty PASSED [ 99%] tests/test_wizard_utils.py::TestPromptChoice::test_rejects_invalid_then_accepts_valid PASSED [ 99%] tests/test_wizard_utils.py::TestPromptChoice::test_raises_keyboard_interrupt_on_eof PASSED [ 99%] tests/test_wizard_utils.py::TestPromptSelection::test_returns_selected_indices PASSED [ 99%] tests/test_wizard_utils.py::TestPromptSelection::test_returns_all_on_all_input PASSED [ 99%] tests/test_wizard_utils.py::TestPromptSelection::test_returns_default_on_empty PASSED [ 99%] tests/test_wizard_utils.py::TestPromptSelection::test_skips_invalid_selections PASSED [ 99%] tests/test_wizard_utils.py::TestPromptSelection::test_retries_on_empty_selection PASSED [ 99%] tests/test_wizard_utils.py::TestPromptSelection::test_raises_keyboard_interrupt_on_eof PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayFunctions::test_display_wizard_header PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayFunctions::test_display_section_header PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayFunctions::test_display_next_steps PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayFunctions::test_display_config_preview PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayFunctions::test_display_snapper_configs_empty PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayFunctions::test_display_snapper_configs PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayFunctions::test_display_btrbk_import_with_warnings PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayFunctions::test_display_btrbk_import_no_targets PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayFunctions::test_display_btrbk_import_multiple_targets PASSED [ 99%] tests/test_wizard_utils.py::TestFindBtrbkConfig::test_finds_etc_btrbk_conf PASSED [ 99%] tests/test_wizard_utils.py::TestFindBtrbkConfig::test_finds_etc_btrbk_conf_fallback PASSED [ 99%] tests/test_wizard_utils.py::TestFindBtrbkConfig::test_returns_none_when_not_found PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayBtrbkDetected::test_returns_import_choice PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayBtrbkDetected::test_returns_detect_choice PASSED [ 99%] tests/test_wizard_utils.py::TestDisplayBtrbkDetected::test_returns_manual_choice PASSED [100%] =================================== FAILURES =================================== __ TestTheWizardDerivesAUsableValue.test_a_subdirectory_gets_the_mount_point ___ tests/test_require_mount_enforced.py:340: in test_a_subdirectory_gets_the_mount_point assert self._derive("/mnt/usb-drive/backup", ["/mnt/usb-drive"]) == ( E AssertionError: assert True == '/mnt/usb-drive' E + where True = ('/mnt/usb-drive/backup', ['/mnt/usb-drive']) E + where = ._derive ___ TestTheWizardDerivesAUsableValue.test_a_deep_target_finds_the_real_mount ___ tests/test_require_mount_enforced.py:348: in test_a_deep_target_finds_the_real_mount assert self._derive("/mnt/backup/box1/home", ["/mnt/backup"]) == "/mnt/backup" E AssertionError: assert True == '/mnt/backup' E + where True = ('/mnt/backup/box1/home', ['/mnt/backup']) E + where = ._derive ____ TestTheWizardDerivesAUsableValue.test_a_raw_uri_target_is_seen_through ____ tests/test_require_mount_enforced.py:377: in test_a_raw_uri_target_is_seen_through assert self._derive("raw:///mnt/usb-backup/home", ["/mnt/usb-backup"]) == ( E AssertionError: assert True == '/mnt/usb-backup' E + where True = ('raw:///mnt/usb-backup/home', ['/mnt/usb-backup']) E + where = ._derive =========================== short test summary info ============================ SKIPPED [1] tests/test_backup_volume_check.py:353: snapper is not installed SKIPPED [11] tests/test_btrbk_directive_takes_rest_of_line.py:137: btrbk is not installed SKIPPED [1] tests/test_csh_login_shell.py:159: tcsh is not installed SKIPPED [1] tests/test_csh_login_shell.py:159: csh is not installed SKIPPED [1] tests/test_docs_cover_every_flag.py:60: completions has no man page by decision; see NO_MAN_PAGE SKIPPED [1] tests/test_docs_cover_every_flag.py:60: manpages has no man page by decision; see NO_MAN_PAGE SKIPPED [1] tests/test_docs_cover_every_flag.py:60: transfers has no man page by decision; see NO_MAN_PAGE SKIPPED [1] tests/test_docs_cover_every_flag.py:60: uninstall has no man page by decision; see NO_MAN_PAGE SKIPPED [1] tests/test_estimate_without_sudo.py:237: BBNG_TEST_RIG names no directory on btrfs SKIPPED [1] tests/test_estimate_without_sudo.py:254: BBNG_TEST_RIG names no directory on btrfs SKIPPED [1] tests/test_estimate_without_sudo.py:269: BBNG_TEST_RIG names no directory on btrfs SKIPPED [1] tests/test_estimate_without_sudo.py:283: BBNG_TEST_RIG names no directory on btrfs SKIPPED [2] tests/test_packaging_data_files.py:138: btrfs_backup_ng is imported from an installed copy, not this checkout's src/ SKIPPED [1] tests/test_raw_encryption.py:406: passwordless ssh to localhost not available SKIPPED [1] tests/test_raw_endpoint_integration.py:986: passwordless ssh to localhost not available SKIPPED [1] tests/test_raw_endpoint_integration.py:1014: passwordless ssh to localhost not available SKIPPED [1] tests/test_sdist_carries_what_the_tests_read.py:68: src/ ships via the package configuration = 3 failed, 7259 passed, 28 skipped, 167 deselected, 4 xfailed in 125.97s (0:02:05) = error: Bad exit status from /var/tmp/rpm-tmp.FHEyvp (%check) Bad exit status from /var/tmp/rpm-tmp.FHEyvp (%check) RPM build errors: Finish: rpmbuild btrfs-backup-ng-0.9.16-1.fc46.src.rpm Finish: build phase for btrfs-backup-ng-0.9.16-1.fc46.src.rpm INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-x86_64-1792490956.514947/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names ERROR: Exception(/var/lib/copr-rpmbuild/results/btrfs-backup-ng-0.9.16-1.fc46.src.rpm) Config(fedora-rawhide-x86_64) 2 minutes 22 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_failure=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot ERROR: Command failed: # /usr/bin/systemd-nspawn -q -M 4985bb61c0ac4c509ea981dbd9726478 -D /var/lib/mock/fedora-rawhide-x86_64-1792490956.514947/root -a -u mockbuild --capability=cap_ipc_lock --capability=cap_ipc_lock --bind=/dev/btrfs-control --bind=/dev/mapper/control --bind=/dev/fuse --bind=/dev/loop-control --bind=/dev/loop0 --bind=/dev/loop1 --bind=/dev/loop2 --bind=/dev/loop3 --bind=/dev/loop4 --bind=/dev/loop5 --bind=/dev/loop6 --bind=/dev/loop7 --bind=/dev/loop8 --bind=/dev/loop9 --bind=/dev/loop10 --bind=/dev/loop11 --resolv-conf=off --resolv-conf=off --console=pipe --setenv=TERM=vt100 --setenv=SHELL=/bin/bash --setenv=HOME=/builddir --setenv=HOSTNAME=mock --setenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin '--setenv=PROMPT_COMMAND=printf "\033]0;\007"' '--setenv=PS1= \s-\v\$ ' --setenv=LANG=C.UTF-8 bash --login -c '/usr/bin/rpmbuild -ba --noprep --noclean --target x86_64 --nodeps /builddir/build/originals/btrfs-backup-ng.spec' Copr build error: Build failed