sbuild (Debian sbuild) 0.91.9 (05 May 2026) on carme.larted.org.uk +==============================================================================+ | libtest-mockfile-perl 0.039-1 (amd64) Mon, 29 Jun 2026 00:34:22 +0000 | +==============================================================================+ Package: libtest-mockfile-perl Version: 0.039-1 Source Version: 0.039-1 Distribution: perl-5.44-throwaway Machine Architecture: amd64 Host Architecture: amd64 Build Architecture: amd64 Build Type: full I: Setting up the chroot... I: Creating chroot session... I: Setting up log color... +------------------------------------------------------------------------------+ | Chroot Setup Commands Mon, 29 Jun 2026 00:34:23 +0000 | +------------------------------------------------------------------------------+ /usr/share/debomatic/sbuildcommands/chroot-setup-commands/dpkg-speedup libtest-mockfile-perl_0.039-1 perl-5.44-throwaway amd64 ------------------------------------------------------------------------------------------------------------------------------ I: Finished running '/usr/share/debomatic/sbuildcommands/chroot-setup-commands/dpkg-speedup libtest-mockfile-perl_0.039-1 perl-5.44-throwaway amd64'. Finished processing commands. -------------------------------------------------------------------------------- I: Setting up apt archive... +------------------------------------------------------------------------------+ | Update chroot Mon, 29 Jun 2026 00:34:23 +0000 | +------------------------------------------------------------------------------+ Get:1 file:/srv/reprepro perl-5.44 InRelease [3039 B] Get:1 file:/srv/reprepro perl-5.44 InRelease [3039 B] Hit:2 http://deb.debian.org/debian unstable InRelease Hit:3 http://deb.debian.org/debian sid InRelease Reading package lists... Reading package lists... Building dependency tree... Reading state information... Calculating upgrade... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. +------------------------------------------------------------------------------+ | Fetch source files Mon, 29 Jun 2026 00:34:24 +0000 | +------------------------------------------------------------------------------+ Local sources ------------- /srv/debomatic/incoming/libtest-mockfile-perl_0.039-1.dsc exists in /srv/debomatic/incoming; copying to chroot +------------------------------------------------------------------------------+ | Install package build dependencies Mon, 29 Jun 2026 00:34:25 +0000 | +------------------------------------------------------------------------------+ Setup apt archive ----------------- Merged Build-Depends: debhelper-compat (= 13), build-essential, libfile-slurper-perl, liboverload-filecheck-perl, libtest-mockmodule-perl, libtest-simple-perl, libtest2-harness-perl, libtest2-plugin-nowarnings-perl, libtest2-suite-perl, libtest2-tools-explain-perl, libtext-glob-perl, perl Filtered Build-Depends: debhelper-compat (= 13), build-essential, libfile-slurper-perl, liboverload-filecheck-perl, libtest-mockmodule-perl, libtest-simple-perl, libtest2-harness-perl, libtest2-plugin-nowarnings-perl, libtest2-suite-perl, libtest2-tools-explain-perl, libtext-glob-perl, perl dpkg-deb: building package 'sbuild-build-depends-main-dummy' in '/build/libtest-mockfile-perl-5wijpO/resolver-Qo9mow/apt_archive/sbuild-build-depends-main-dummy.deb'. Ign:1 copy:/build/libtest-mockfile-perl-5wijpO/resolver-Qo9mow/apt_archive ./ InRelease Get:2 copy:/build/libtest-mockfile-perl-5wijpO/resolver-Qo9mow/apt_archive ./ Release [609 B] Ign:3 copy:/build/libtest-mockfile-perl-5wijpO/resolver-Qo9mow/apt_archive ./ Release.gpg Get:4 copy:/build/libtest-mockfile-perl-5wijpO/resolver-Qo9mow/apt_archive ./ Sources [946 B] Get:5 copy:/build/libtest-mockfile-perl-5wijpO/resolver-Qo9mow/apt_archive ./ Packages [866 B] Fetched 2421 B in 0s (0 B/s) Reading package lists... Reading package lists... Install main build dependencies (apt-based resolver) ---------------------------------------------------- Installing build dependencies Reading package lists... Building dependency tree... Reading state information... Solving dependencies... The following additional packages will be installed: autoconf automake autopoint autotools-dev bsdextrautils debhelper dh-autoreconf dh-strip-nondeterminism dwz file gettext gettext-base groff-base intltool-debian libapp-yath-script-perl libarchive-zip-perl libcpanel-json-xs-perl libdata-uuid-perl libdebhelper-perl libelf1t64 libfile-slurper-perl libfile-stripnondeterminism-perl libfilter-perl libgetopt-yath-perl libgoto-file-perl libimporter-perl liblong-jump-perl libmagic-mgc libmagic1t64 liboverload-filecheck-perl libpipeline1 libscope-guard-perl libsub-identify-perl libsuper-perl libtest-mockmodule-perl libtest2-harness-perl libtest2-plugin-memusage-perl libtest2-plugin-nowarnings-perl libtest2-plugin-uuid-perl libtest2-tools-explain-perl libtext-glob-perl libtool libuchardet0 libuuid-perl libxml2-16 libyaml-tiny-perl m4 man-db po-debconf sensible-utils Suggested packages: autoconf-archive gnu-standards autoconf-doc dh-make gettext-doc libasprintf-dev libgettextpo-dev gnulib-l10n groff libtool-doc gfortran | fortran95-compiler m4-doc apparmor less www-browser libmail-box-perl Recommended packages: curl | wget | lynx python3:any libperlio-utf8-strict-perl libarchive-cpio-perl libbsd-resource-perl libltdl-dev libmail-sendmail-perl The following NEW packages will be installed: autoconf automake autopoint autotools-dev bsdextrautils debhelper dh-autoreconf dh-strip-nondeterminism dwz file gettext gettext-base groff-base intltool-debian libapp-yath-script-perl libarchive-zip-perl libcpanel-json-xs-perl libdata-uuid-perl libdebhelper-perl libelf1t64 libfile-slurper-perl libfile-stripnondeterminism-perl libfilter-perl libgetopt-yath-perl libgoto-file-perl libimporter-perl liblong-jump-perl libmagic-mgc libmagic1t64 liboverload-filecheck-perl libpipeline1 libscope-guard-perl libsub-identify-perl libsuper-perl libtest-mockmodule-perl libtest2-harness-perl libtest2-plugin-memusage-perl libtest2-plugin-nowarnings-perl libtest2-plugin-uuid-perl libtest2-tools-explain-perl libtext-glob-perl libtool libuchardet0 libuuid-perl libxml2-16 libyaml-tiny-perl m4 man-db po-debconf sbuild-build-depends-main-dummy sensible-utils 0 upgraded, 51 newly installed, 0 to remove and 0 not upgraded. Need to get 12.7 MB/13.0 MB of archives. After this operation, 57.8 MB of additional disk space will be used. Get:1 copy:/build/libtest-mockfile-perl-5wijpO/resolver-Qo9mow/apt_archive ./ sbuild-build-depends-main-dummy 0.invalid.0 [948 B] Get:2 file:/srv/reprepro perl-5.44/main amd64 libcpanel-json-xs-perl amd64 4.42-1+b1 [134 kB] Get:3 file:/srv/reprepro perl-5.44/main amd64 libfilter-perl amd64 1.65-1+b1 [64.3 kB] Get:4 file:/srv/reprepro perl-5.44/main amd64 libdata-uuid-perl amd64 1.227-2+b1 [18.4 kB] Get:5 file:/srv/reprepro perl-5.44/main amd64 liboverload-filecheck-perl amd64 0.015-1+b1 [35.4 kB] Get:6 http://deb.debian.org/debian unstable/main amd64 sensible-utils all 0.0.26 [27.0 kB] Get:7 file:/srv/reprepro perl-5.44/main amd64 libsub-identify-perl amd64 0.14-4+b1 [11.3 kB] Get:8 file:/srv/reprepro perl-5.44/main amd64 libuuid-perl amd64 0.38-1+b1 [51.1 kB] Get:9 http://deb.debian.org/debian unstable/main amd64 libmagic-mgc amd64 1:5.47-4 [345 kB] Get:10 http://deb.debian.org/debian unstable/main amd64 libmagic1t64 amd64 1:5.47-4 [111 kB] Get:11 http://deb.debian.org/debian unstable/main amd64 file amd64 1:5.47-4 [43.0 kB] Get:12 http://deb.debian.org/debian unstable/main amd64 gettext-base amd64 1.0-1 [332 kB] Get:13 http://deb.debian.org/debian unstable/main amd64 libuchardet0 amd64 0.0.8-2+b2 [69.0 kB] Get:14 http://deb.debian.org/debian unstable/main amd64 groff-base amd64 1.24.1-1 [1336 kB] Get:15 http://deb.debian.org/debian unstable/main amd64 bsdextrautils amd64 2.42.2-1 [100.0 kB] Get:16 http://deb.debian.org/debian unstable/main amd64 libpipeline1 amd64 1.5.8-3 [49.2 kB] Get:17 http://deb.debian.org/debian unstable/main amd64 man-db amd64 2.13.1-1 [1469 kB] Get:18 http://deb.debian.org/debian unstable/main amd64 m4 amd64 1.4.21-1 [332 kB] Get:19 http://deb.debian.org/debian unstable/main amd64 autoconf all 2.73-2 [516 kB] Get:20 http://deb.debian.org/debian unstable/main amd64 autotools-dev all 20240727.1+nmu1 [60.0 kB] Get:21 http://deb.debian.org/debian unstable/main amd64 automake all 1:1.18.1-4 [877 kB] Get:22 http://deb.debian.org/debian unstable/main amd64 autopoint all 1.0-1 [820 kB] Get:23 http://deb.debian.org/debian unstable/main amd64 libdebhelper-perl all 14.2 [77.1 kB] Get:24 http://deb.debian.org/debian unstable/main amd64 libtool all 2.5.4-11 [539 kB] Get:25 http://deb.debian.org/debian unstable/main amd64 dh-autoreconf all 22 [12.2 kB] Get:26 http://deb.debian.org/debian unstable/main amd64 libarchive-zip-perl all 1.68-1 [104 kB] Get:27 http://deb.debian.org/debian unstable/main amd64 libfile-stripnondeterminism-perl all 1.15.1-1 [17.1 kB] Get:28 http://deb.debian.org/debian unstable/main amd64 dh-strip-nondeterminism all 1.15.1-1 [6020 B] Get:29 http://deb.debian.org/debian unstable/main amd64 libelf1t64 amd64 0.195-1 [58.1 kB] Get:30 http://deb.debian.org/debian unstable/main amd64 dwz amd64 0.16-4 [108 kB] Get:31 http://deb.debian.org/debian unstable/main amd64 libxml2-16 amd64 2.15.3+dfsg-1 [642 kB] Get:32 http://deb.debian.org/debian unstable/main amd64 gettext amd64 1.0-1 [2660 kB] Get:33 http://deb.debian.org/debian unstable/main amd64 intltool-debian all 0.35.0+20060710.6 [22.9 kB] Get:34 http://deb.debian.org/debian unstable/main amd64 po-debconf all 1.0.22 [216 kB] Get:35 http://deb.debian.org/debian unstable/main amd64 debhelper all 14.2 [933 kB] Get:36 http://deb.debian.org/debian unstable/main amd64 libimporter-perl all 0.026-2 [25.0 kB] Get:37 http://deb.debian.org/debian unstable/main amd64 libgetopt-yath-perl all 2.000011-2 [99.9 kB] Get:38 http://deb.debian.org/debian unstable/main amd64 libgoto-file-perl all 0.005-2 [6880 B] Get:39 http://deb.debian.org/debian unstable/main amd64 libapp-yath-script-perl all 2.000016-2 [31.2 kB] Get:40 http://deb.debian.org/debian unstable/main amd64 libfile-slurper-perl all 0.014-1 [8560 B] Get:41 http://deb.debian.org/debian unstable/main amd64 liblong-jump-perl all 0.000005-1 [6992 B] Get:42 http://deb.debian.org/debian unstable/main amd64 libscope-guard-perl all 0.21-2 [8212 B] Get:43 http://deb.debian.org/debian unstable/main amd64 libsuper-perl all 1.20190531-1 [11.5 kB] Get:44 http://deb.debian.org/debian unstable/main amd64 libtest-mockmodule-perl all 0.185.3-1 [24.8 kB] Get:45 http://deb.debian.org/debian unstable/main amd64 libtest2-plugin-memusage-perl all 0.002006-1 [8892 B] Get:46 http://deb.debian.org/debian unstable/main amd64 libtest2-plugin-uuid-perl all 0.002010-1 [11.4 kB] Get:47 http://deb.debian.org/debian unstable/main amd64 libyaml-tiny-perl all 1.76-1 [29.8 kB] Get:48 http://deb.debian.org/debian unstable/main amd64 libtest2-harness-perl all 1.000172-1 [525 kB] Get:49 http://deb.debian.org/debian unstable/main amd64 libtest2-plugin-nowarnings-perl all 0.10-1 [15.8 kB] Get:50 http://deb.debian.org/debian unstable/main amd64 libtest2-tools-explain-perl all 0.02-2 [9684 B] Get:51 http://deb.debian.org/debian unstable/main amd64 libtext-glob-perl all 0.11-3 [7676 B] Preconfiguring packages ... Fetched 12.7 MB in 0s (33.1 MB/s) Selecting previously unselected package sensible-utils. (Reading database ... 14525 files and directories currently installed.) Preparing to unpack .../00-sensible-utils_0.0.26_all.deb ... Unpacking sensible-utils (0.0.26) ... Selecting previously unselected package libmagic-mgc. Preparing to unpack .../01-libmagic-mgc_1%3a5.47-4_amd64.deb ... Unpacking libmagic-mgc (1:5.47-4) ... Selecting previously unselected package libmagic1t64:amd64. Preparing to unpack .../02-libmagic1t64_1%3a5.47-4_amd64.deb ... Unpacking libmagic1t64:amd64 (1:5.47-4) ... Selecting previously unselected package file. Preparing to unpack .../03-file_1%3a5.47-4_amd64.deb ... Unpacking file (1:5.47-4) ... Selecting previously unselected package gettext-base. Preparing to unpack .../04-gettext-base_1.0-1_amd64.deb ... Unpacking gettext-base (1.0-1) ... Selecting previously unselected package libuchardet0:amd64. Preparing to unpack .../05-libuchardet0_0.0.8-2+b2_amd64.deb ... Unpacking libuchardet0:amd64 (0.0.8-2+b2) ... Selecting previously unselected package groff-base. Preparing to unpack .../06-groff-base_1.24.1-1_amd64.deb ... Unpacking groff-base (1.24.1-1) ... Selecting previously unselected package bsdextrautils. Preparing to unpack .../07-bsdextrautils_2.42.2-1_amd64.deb ... Unpacking bsdextrautils (2.42.2-1) ... Selecting previously unselected package libpipeline1:amd64. Preparing to unpack .../08-libpipeline1_1.5.8-3_amd64.deb ... Unpacking libpipeline1:amd64 (1.5.8-3) ... Selecting previously unselected package man-db. Preparing to unpack .../09-man-db_2.13.1-1_amd64.deb ... Unpacking man-db (2.13.1-1) ... Selecting previously unselected package m4. Preparing to unpack .../10-m4_1.4.21-1_amd64.deb ... Unpacking m4 (1.4.21-1) ... Selecting previously unselected package autoconf. Preparing to unpack .../11-autoconf_2.73-2_all.deb ... Unpacking autoconf (2.73-2) ... Selecting previously unselected package autotools-dev. Preparing to unpack .../12-autotools-dev_20240727.1+nmu1_all.deb ... Unpacking autotools-dev (20240727.1+nmu1) ... Selecting previously unselected package automake. Preparing to unpack .../13-automake_1%3a1.18.1-4_all.deb ... Unpacking automake (1:1.18.1-4) ... Selecting previously unselected package autopoint. Preparing to unpack .../14-autopoint_1.0-1_all.deb ... Unpacking autopoint (1.0-1) ... Selecting previously unselected package libdebhelper-perl. Preparing to unpack .../15-libdebhelper-perl_14.2_all.deb ... Unpacking libdebhelper-perl (14.2) ... Selecting previously unselected package libtool. Preparing to unpack .../16-libtool_2.5.4-11_all.deb ... Unpacking libtool (2.5.4-11) ... Selecting previously unselected package dh-autoreconf. Preparing to unpack .../17-dh-autoreconf_22_all.deb ... Unpacking dh-autoreconf (22) ... Selecting previously unselected package libarchive-zip-perl. Preparing to unpack .../18-libarchive-zip-perl_1.68-1_all.deb ... Unpacking libarchive-zip-perl (1.68-1) ... Selecting previously unselected package libfile-stripnondeterminism-perl. Preparing to unpack .../19-libfile-stripnondeterminism-perl_1.15.1-1_all.deb ... Unpacking libfile-stripnondeterminism-perl (1.15.1-1) ... Selecting previously unselected package dh-strip-nondeterminism. Preparing to unpack .../20-dh-strip-nondeterminism_1.15.1-1_all.deb ... Unpacking dh-strip-nondeterminism (1.15.1-1) ... Selecting previously unselected package libelf1t64:amd64. Preparing to unpack .../21-libelf1t64_0.195-1_amd64.deb ... Unpacking libelf1t64:amd64 (0.195-1) ... Selecting previously unselected package dwz. Preparing to unpack .../22-dwz_0.16-4_amd64.deb ... Unpacking dwz (0.16-4) ... Selecting previously unselected package libxml2-16:amd64. Preparing to unpack .../23-libxml2-16_2.15.3+dfsg-1_amd64.deb ... Unpacking libxml2-16:amd64 (2.15.3+dfsg-1) ... Selecting previously unselected package gettext. Preparing to unpack .../24-gettext_1.0-1_amd64.deb ... Unpacking gettext (1.0-1) ... Selecting previously unselected package intltool-debian. Preparing to unpack .../25-intltool-debian_0.35.0+20060710.6_all.deb ... Unpacking intltool-debian (0.35.0+20060710.6) ... Selecting previously unselected package po-debconf. Preparing to unpack .../26-po-debconf_1.0.22_all.deb ... Unpacking po-debconf (1.0.22) ... Selecting previously unselected package debhelper. Preparing to unpack .../27-debhelper_14.2_all.deb ... Unpacking debhelper (14.2) ... Selecting previously unselected package libcpanel-json-xs-perl:amd64. Preparing to unpack .../28-libcpanel-json-xs-perl_4.42-1+b1_amd64.deb ... Unpacking libcpanel-json-xs-perl:amd64 (4.42-1+b1) ... Selecting previously unselected package libimporter-perl. Preparing to unpack .../29-libimporter-perl_0.026-2_all.deb ... Unpacking libimporter-perl (0.026-2) ... Selecting previously unselected package libgetopt-yath-perl. Preparing to unpack .../30-libgetopt-yath-perl_2.000011-2_all.deb ... Unpacking libgetopt-yath-perl (2.000011-2) ... Selecting previously unselected package libfilter-perl. Preparing to unpack .../31-libfilter-perl_1.65-1+b1_amd64.deb ... Unpacking libfilter-perl (1.65-1+b1) ... Selecting previously unselected package libgoto-file-perl. Preparing to unpack .../32-libgoto-file-perl_0.005-2_all.deb ... Unpacking libgoto-file-perl (0.005-2) ... Selecting previously unselected package libapp-yath-script-perl. Preparing to unpack .../33-libapp-yath-script-perl_2.000016-2_all.deb ... Unpacking libapp-yath-script-perl (2.000016-2) ... Selecting previously unselected package libdata-uuid-perl. Preparing to unpack .../34-libdata-uuid-perl_1.227-2+b1_amd64.deb ... Unpacking libdata-uuid-perl (1.227-2+b1) ... Selecting previously unselected package libfile-slurper-perl. Preparing to unpack .../35-libfile-slurper-perl_0.014-1_all.deb ... Unpacking libfile-slurper-perl (0.014-1) ... Selecting previously unselected package liblong-jump-perl. Preparing to unpack .../36-liblong-jump-perl_0.000005-1_all.deb ... Unpacking liblong-jump-perl (0.000005-1) ... Selecting previously unselected package liboverload-filecheck-perl. Preparing to unpack .../37-liboverload-filecheck-perl_0.015-1+b1_amd64.deb ... Unpacking liboverload-filecheck-perl (0.015-1+b1) ... Selecting previously unselected package libscope-guard-perl. Preparing to unpack .../38-libscope-guard-perl_0.21-2_all.deb ... Unpacking libscope-guard-perl (0.21-2) ... Selecting previously unselected package libsub-identify-perl. Preparing to unpack .../39-libsub-identify-perl_0.14-4+b1_amd64.deb ... Unpacking libsub-identify-perl (0.14-4+b1) ... Selecting previously unselected package libsuper-perl. Preparing to unpack .../40-libsuper-perl_1.20190531-1_all.deb ... Unpacking libsuper-perl (1.20190531-1) ... Selecting previously unselected package libtest-mockmodule-perl. Preparing to unpack .../41-libtest-mockmodule-perl_0.185.3-1_all.deb ... Unpacking libtest-mockmodule-perl (0.185.3-1) ... Selecting previously unselected package libtest2-plugin-memusage-perl. Preparing to unpack .../42-libtest2-plugin-memusage-perl_0.002006-1_all.deb ... Unpacking libtest2-plugin-memusage-perl (0.002006-1) ... Selecting previously unselected package libuuid-perl. Preparing to unpack .../43-libuuid-perl_0.38-1+b1_amd64.deb ... Unpacking libuuid-perl (0.38-1+b1) ... Selecting previously unselected package libtest2-plugin-uuid-perl. Preparing to unpack .../44-libtest2-plugin-uuid-perl_0.002010-1_all.deb ... Unpacking libtest2-plugin-uuid-perl (0.002010-1) ... Selecting previously unselected package libyaml-tiny-perl. Preparing to unpack .../45-libyaml-tiny-perl_1.76-1_all.deb ... Unpacking libyaml-tiny-perl (1.76-1) ... Selecting previously unselected package libtest2-harness-perl. Preparing to unpack .../46-libtest2-harness-perl_1.000172-1_all.deb ... Unpacking libtest2-harness-perl (1.000172-1) ... Selecting previously unselected package libtest2-plugin-nowarnings-perl. Preparing to unpack .../47-libtest2-plugin-nowarnings-perl_0.10-1_all.deb ... Unpacking libtest2-plugin-nowarnings-perl (0.10-1) ... Selecting previously unselected package libtest2-tools-explain-perl. Preparing to unpack .../48-libtest2-tools-explain-perl_0.02-2_all.deb ... Unpacking libtest2-tools-explain-perl (0.02-2) ... Selecting previously unselected package libtext-glob-perl. Preparing to unpack .../49-libtext-glob-perl_0.11-3_all.deb ... Unpacking libtext-glob-perl (0.11-3) ... Selecting previously unselected package sbuild-build-depends-main-dummy. Preparing to unpack .../50-sbuild-build-depends-main-dummy_0.invalid.0_amd64.deb ... Unpacking sbuild-build-depends-main-dummy (0.invalid.0) ... Setting up libpipeline1:amd64 (1.5.8-3) ... Setting up libfile-slurper-perl (0.014-1) ... Setting up libuuid-perl (0.38-1+b1) ... Setting up bsdextrautils (2.42.2-1) ... Setting up libtext-glob-perl (0.11-3) ... Setting up libmagic-mgc (1:5.47-4) ... Setting up libtest2-tools-explain-perl (0.02-2) ... Setting up libtest2-plugin-nowarnings-perl (0.10-1) ... Setting up libarchive-zip-perl (1.68-1) ... Setting up libsub-identify-perl (0.14-4+b1) ... Setting up libcpanel-json-xs-perl:amd64 (4.42-1+b1) ... Setting up libxml2-16:amd64 (2.15.3+dfsg-1) ... Setting up libdebhelper-perl (14.2) ... Setting up libmagic1t64:amd64 (1:5.47-4) ... Setting up gettext-base (1.0-1) ... Setting up m4 (1.4.21-1) ... Setting up file (1:5.47-4) ... Setting up libyaml-tiny-perl (1.76-1) ... Setting up libelf1t64:amd64 (0.195-1) ... Setting up libscope-guard-perl (0.21-2) ... Setting up autotools-dev (20240727.1+nmu1) ... Setting up libdata-uuid-perl (1.227-2+b1) ... Setting up libimporter-perl (0.026-2) ... Setting up autopoint (1.0-1) ... Setting up autoconf (2.73-2) ... Setting up dwz (0.16-4) ... Setting up sensible-utils (0.0.26) ... Setting up libuchardet0:amd64 (0.0.8-2+b2) ... Setting up libfilter-perl (1.65-1+b1) ... Setting up libtest2-plugin-memusage-perl (0.002006-1) ... Setting up liboverload-filecheck-perl (0.015-1+b1) ... Setting up automake (1:1.18.1-4) ... update-alternatives: using /usr/bin/automake-1.18 to provide /usr/bin/automake (automake) in auto mode Setting up libfile-stripnondeterminism-perl (1.15.1-1) ... Setting up libtest2-plugin-uuid-perl (0.002010-1) ... Setting up liblong-jump-perl (0.000005-1) ... Setting up libsuper-perl (1.20190531-1) ... Setting up gettext (1.0-1) ... Setting up libgetopt-yath-perl (2.000011-2) ... Setting up libtest-mockmodule-perl (0.185.3-1) ... Setting up libgoto-file-perl (0.005-2) ... Setting up libapp-yath-script-perl (2.000016-2) ... Setting up libtool (2.5.4-11) ... Setting up intltool-debian (0.35.0+20060710.6) ... Setting up dh-autoreconf (22) ... Setting up dh-strip-nondeterminism (1.15.1-1) ... Setting up groff-base (1.24.1-1) ... Setting up libtest2-harness-perl (1.000172-1) ... Setting up po-debconf (1.0.22) ... Setting up man-db (2.13.1-1) ... Not building database; man-db/auto-update is not 'true'. Setting up debhelper (14.2) ... Setting up sbuild-build-depends-main-dummy (0.invalid.0) ... Processing triggers for libc-bin (2.42-17) ... +------------------------------------------------------------------------------+ | Check architectures Mon, 29 Jun 2026 00:34:30 +0000 | +------------------------------------------------------------------------------+ Arch check ok (amd64 included in all) +------------------------------------------------------------------------------+ | Build environment Mon, 29 Jun 2026 00:34:30 +0000 | +------------------------------------------------------------------------------+ Kernel: Linux 7.0.10+deb14-amd64 #1 SMP PREEMPT_DYNAMIC Debian 7.0.10-1 (2026-05-27) amd64 (x86_64) Toolchain package versions: binutils_2.46.50.20260617-1 dpkg-dev_1.23.7 g++-15_15.3.0-1 gcc-15_15.3.0-1 libc6-dev_2.42-17 libstdc++-15-dev_15.3.0-1 libstdc++6_16.1.0-2 linux-libc-dev_7.0.13-1 Package versions: apt_3.3.1 autoconf_2.73-2 automake_1:1.18.1-4 autopoint_1.0-1 autotools-dev_20240727.1+nmu1 base-files_14.2 base-passwd_3.6.8 bash_5.3-3 binutils_2.46.50.20260617-1 binutils-common_2.46.50.20260617-1 binutils-x86-64-linux-gnu_2.46.50.20260617-1 bsdextrautils_2.42.2-1 build-essential_12.12 bzip2_1.0.8-6+b2 coreutils_9.10-1 cpp_4:15.2.0-5+b1 cpp-15_15.3.0-1 cpp-15-x86-64-linux-gnu_15.3.0-1 cpp-x86-64-linux-gnu_4:15.2.0-5+b1 dash_0.5.12-12 debconf_1.5.92 debhelper_14.2 debian-archive-keyring_2025.1 debianutils_5.23.2 dh-autoreconf_22 dh-strip-nondeterminism_1.15.1-1 diffutils_1:3.12-1 dirmngr_2.4.9-5 dpkg_1.23.7 dpkg-dev_1.23.7 dwz_0.16-4 eatmydata_131-2 file_1:5.47-4 findutils_4.10.0-4 g++_4:15.2.0-5+b1 g++-15_15.3.0-1 g++-15-x86-64-linux-gnu_15.3.0-1 g++-x86-64-linux-gnu_4:15.2.0-5+b1 gcc_4:15.2.0-5+b1 gcc-15_15.3.0-1 gcc-15-base_15.3.0-1 gcc-15-x86-64-linux-gnu_15.3.0-1 gcc-16-base_16.1.0-2 gcc-x86-64-linux-gnu_4:15.2.0-5+b1 gettext_1.0-1 gettext-base_1.0-1 gnupg_2.4.9-5 gnupg-l10n_2.4.9-5 gpg_2.4.9-5 gpg-agent_2.4.9-5 gpgconf_2.4.9-5 gpgsm_2.4.9-5 grep_3.12-1 groff-base_1.24.1-1 gzip_1.13-1 hostname_3.25 init-system-helpers_1.69 intltool-debian_0.35.0+20060710.6 libacl1_2.3.2-3 libapp-yath-script-perl_2.000016-2 libapt-pkg7.0_3.3.1 libarchive-zip-perl_1.68-1 libasan8_16.1.0-2 libassuan9_3.0.2-2+b2 libatomic1_16.1.0-2 libattr1_1:2.5.2-4 libaudit-common_1:4.1.2-1 libaudit1_1:4.1.2-1+b1 libbinutils_2.46.50.20260617-1 libblkid1_2.42.2-1 libbz2-1.0_1.0.8-6+b2 libc-bin_2.42-17 libc-dev-bin_2.42-17 libc-gconv-modules-extra_2.42-17 libc6_2.42-17 libc6-dev_2.42-17 libcap-ng0_0.9.3-1 libcc1-0_16.1.0-2 libcpanel-json-xs-perl_4.42-1+b1 libcrypt1_1:4.5.1-1+b1 libctf-nobfd0_2.46.50.20260617-1 libctf0_2.46.50.20260617-1 libdata-uuid-perl_1.227-2+b1 libdb5.3t64_5.3.28+dfsg2-11+b1 libdebconfclient0_0.283 libdebhelper-perl_14.2 libdpkg-perl_1.23.7 libeatmydata1_131-2+b2 libelf1t64_0.195-1 libffi8_3.5.2-4 libfile-slurper-perl_0.014-1 libfile-stripnondeterminism-perl_1.15.1-1 libfilter-perl_1.65-1+b1 libgcc-15-dev_15.3.0-1 libgcc-s1_16.1.0-2 libgcrypt20_1.12.2-1 libgdbm-compat4t64_1.26-1+b2 libgdbm6t64_1.26-1+b2 libgetopt-yath-perl_2.000011-2 libgmp10_2:6.3.0+dfsg-5+b2 libgnutls30t64_3.8.13-1 libgomp1_16.1.0-2 libgoto-file-perl_0.005-2 libgpg-error0_1.61-3 libgprofng0_2.46.50.20260617-1 libhogweed6t64_3.10.2-1+b1 libhwasan0_16.1.0-2 libidn2-0_2.3.8-5 libimporter-perl_0.026-2 libisl23_0.27-2 libitm1_16.1.0-2 libjansson4_2.15.0-1 libksba8_1.8.0-3 libldap2_2.6.13+dfsg-1+b1 liblong-jump-perl_0.000005-1 liblsan0_16.1.0-2 liblz4-1_1.10.0-10 liblzma5_5.8.3-1 libmagic-mgc_1:5.47-4 libmagic1t64_1:5.47-4 libmd0_1.2.0-2 libmount1_2.42.2-1 libmpc3_1.3.1-3 libmpfr6_4.2.2-3 libncursesw6_6.6+20251231-1+b1 libnettle8t64_3.10.2-1+b1 libnpth0t64_1.8-3+b2 liboverload-filecheck-perl_0.015-1+b1 libp11-kit0_0.26.2-3 libpam-modules_1.7.0-6 libpam-modules-bin_1.7.0-6 libpam-runtime_1.7.0-6 libpam0g_1.7.0-6 libpcre2-8-0_10.46-1+b2 libperl5.40_5.40.1-8 libperl5.44_5.44.0~rc1-1 libpipeline1_1.5.8-3 libquadmath0_16.1.0-2 libreadline8t64_8.3-4 libsasl2-2_2.1.28+dfsg1-11 libsasl2-modules-db_2.1.28+dfsg1-11 libscope-guard-perl_0.21-2 libseccomp2_2.6.0-2+b1 libselinux1_3.10-1 libsframe3_2.46.50.20260617-1 libsmartcols1_2.42.2-1 libsqlite3-0_3.53.3-1 libssl3t64_3.6.3-1 libstdc++-15-dev_15.3.0-1 libstdc++6_16.1.0-2 libsub-identify-perl_0.14-4+b1 libsuper-perl_1.20190531-1 libsystemd0_261.1-2 libtasn1-6_4.21.0-2+b1 libtest-mockmodule-perl_0.185.3-1 libtest2-harness-perl_1.000172-1 libtest2-plugin-memusage-perl_0.002006-1 libtest2-plugin-nowarnings-perl_0.10-1 libtest2-plugin-uuid-perl_0.002010-1 libtest2-tools-explain-perl_0.02-2 libtext-glob-perl_0.11-3 libtinfo6_6.6+20251231-1+b1 libtool_2.5.4-11 libtsan2_16.1.0-2 libubsan1_16.1.0-2 libuchardet0_0.0.8-2+b2 libudev1_261.1-2 libunistring5_1.4.2-1 libuuid-perl_0.38-1+b1 libuuid1_2.42.2-1 libxml2-16_2.15.3+dfsg-1 libxxhash0_0.8.3-2+b2 libyaml-tiny-perl_1.76-1 libzstd1_1.5.7+dfsg-3+b2 linux-libc-dev_7.0.13-1 m4_1.4.21-1 make_4.4.1-3 man-db_2.13.1-1 mawk_1.3.4.20260302-1 ncurses-base_6.6+20251231-1 ncurses-bin_6.6+20251231-1+b1 openssl-provider-legacy_3.6.3-1 patch_2.8-2 perl_5.44.0~rc1-1 perl-base_5.44.0~rc1-1 perl-modules-5.40_5.40.1-8 perl-modules-5.44_5.44.0~rc1-1 pinentry-curses_1.3.2-4 po-debconf_1.0.22 readline-common_8.3-4 rpcsvc-proto_1.4.4-1 sbuild-build-depends-main-dummy_0.invalid.0 sed_4.9-3 sensible-utils_0.0.26 sqv_1.4.0-1 sysvinit-utils_3.18-1 tar_1.35+dfsg-4 util-linux_2.42.2-1 xz-utils_5.8.3-1 zlib1g_1:1.3.dfsg+really1.3.2-3 +------------------------------------------------------------------------------+ | Build Mon, 29 Jun 2026 00:34:30 +0000 | +------------------------------------------------------------------------------+ Unpack source ------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Format: 3.0 (quilt) Source: libtest-mockfile-perl Binary: libtest-mockfile-perl Architecture: all Version: 0.039-1 Maintainer: Debian Perl Group Uploaders: Mason James Homepage: https://metacpan.org/release/Test-MockFile Standards-Version: 4.7.3 Vcs-Browser: https://salsa.debian.org/perl-team/modules/packages/libtest-mockfile-perl Vcs-Git: https://salsa.debian.org/perl-team/modules/packages/libtest-mockfile-perl.git Testsuite: autopkgtest-pkg-perl Build-Depends: debhelper-compat (= 13) Build-Depends-Indep: libfile-slurper-perl , liboverload-filecheck-perl , libtest-mockmodule-perl , libtest-simple-perl , libtest2-harness-perl , libtest2-plugin-nowarnings-perl , libtest2-suite-perl , libtest2-tools-explain-perl , libtext-glob-perl , perl Package-List: libtest-mockfile-perl deb perl optional arch=all Checksums-Sha1: 1667fef8ca85c6b2d5d2ea7f2e8e01efdb6ab58f 137424 libtest-mockfile-perl_0.039.orig.tar.gz 998a8ae84c22c642d34597ff3a6c2359190d58a6 2192 libtest-mockfile-perl_0.039-1.debian.tar.xz Checksums-Sha256: e1dc3e4f0144b5681ae624edebcfb28798ab2e8d7a2881faf7f16a694bd4c36e 137424 libtest-mockfile-perl_0.039.orig.tar.gz e0e32f7c7ad39386a4e686b323866acd57c7f9042380a77ff6d8f06a383f3643 2192 libtest-mockfile-perl_0.039-1.debian.tar.xz Files: 6dff8f16cc995bc6ae6f92638332ded5 137424 libtest-mockfile-perl_0.039.orig.tar.gz d72aafb89796103e5ce541ccf14eebbe 2192 libtest-mockfile-perl_0.039-1.debian.tar.xz Dgit: 4c97c0e8f716838975e74815c5b8d8192cf4f23d debian archive/debian/0.039-1 https://git.dgit.debian.org/libtest-mockfile-perl -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEE0eExbpOnYKgQTYX6uzpoAYZJqgYFAmnG3ehfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEQx RTEzMTZFOTNBNzYwQTgxMDREODVGQUJCM0E2ODAxODY0OUFBMDYACgkQuzpoAYZJ qgYuBA//VVcgl9PUErhA4mttOVpsULtX42CEH68KEBCTohPr9xRB5otzkn0L2OZ+ sxVemcRzYArydIonRT+HVIDN58bpEXhsaq5q8QZkzoXdbZqstX36HIjdY89LMiyl fYXd2QGmR4h+xBKB31RWx2GstqvOT/4hin38e8KtlfJexnxAOEHIZPNACli1BQ7v HT+q06vMdcWljeWbRDg9S0XFTVlVk8BimS52QW+YxetGD9p1TKaGyNdoXiDEuGDF be1h8W53QmPtZ/XcUm7AHDBGBtmhfl0OSSiwrE/rmOo1yLoSH6xoQ0iilRZPEMXV Ns/1QzwrDCwn8R7uKx87wYHowrT8jSna78gHdnT9bZFWmCsbRMh8EPnIbz2prmtb JK+F8aMQk6hvOdPSBRR0r26kuEH8NxPV/Vpk5krzsksJMs3ZE8cnEUzLYgJLaPrG /9363KTTUsrluAHBE2mhOT4GMAFOvNZfySi3zmKs8BcSINRdOA06QkwNKghmQIAq s21WZQ8BISmHU30RRoWNMMTf7OfCGJ1fP4/ygmT8jVBqqp1ad2hDz/371VuBSCPr /YUXaakohtFqHJDsjcQ7iyH0TgI9hf5YF+9ss1k+HQMDbVXfwzTL/c2suJrAYUPV bGn4v0cR35VQbK+nbKlSaDxPsuTc7VfwwvHVyTL5YrR9xqmXUS4= =CHLY -----END PGP SIGNATURE----- dpkg-source: warning: cannot verify inline signature for ./libtest-mockfile-perl_0.039-1.dsc: missing OpenPGP keyrings dpkg-source: info: verifying ./libtest-mockfile-perl_0.039-1.dsc dpkg-source: info: skipping absent keyring /usr/share/keyrings/debian-keyring.pgp dpkg-source: info: skipping absent keyring /usr/share/keyrings/debian-tag2upload.pgp dpkg-source: info: skipping absent keyring /usr/share/keyrings/debian-nonupload.pgp dpkg-source: info: skipping absent keyring /usr/share/keyrings/debian-maintainers.pgp dpkg-source: info: extracting libtest-mockfile-perl in /build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039 dpkg-source: info: unpacking libtest-mockfile-perl_0.039.orig.tar.gz dpkg-source: info: unpacking libtest-mockfile-perl_0.039-1.debian.tar.xz clean up apt cache ------------------ Check disk space ---------------- Sufficient free space for build +------------------------------------------------------------------------------+ | Starting Time Build Commands Mon, 29 Jun 2026 00:34:30 +0000 | +------------------------------------------------------------------------------+ /usr/share/debomatic/sbuildcommands/starting-build-commands/no-network libtest-mockfile-perl_0.039-1 perl-5.44-throwaway amd64 ------------------------------------------------------------------------------------------------------------------------------ I: Finished running '/usr/share/debomatic/sbuildcommands/starting-build-commands/no-network libtest-mockfile-perl_0.039-1 perl-5.44-throwaway amd64'. Finished processing commands. -------------------------------------------------------------------------------- User Environment ---------------- APT_CONFIG=/var/lib/sbuild/apt.conf HOME=/sbuild-nonexistent LANGUAGE=en_GB:en LC_ALL=C.UTF-8 LD_LIBRARY_PATH=/usr/lib/libeatmydata LD_PRELOAD=libeatmydata.so LOGNAME=debomatic PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PWD=/build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039 SCHROOT_ALIAS_NAME=perl-5.44-throwaway-amd64-debomatic SCHROOT_CHROOT_NAME=perl-5.44-amd64-debomatic SCHROOT_COMMAND=env SCHROOT_GID=110 SCHROOT_GROUP=sbuild SCHROOT_SESSION_ID=perl-5.44-amd64-debomatic-2e881553-ddd3-4a44-8aac-4091cc5b51b8 SCHROOT_UID=1002 SCHROOT_USER=debomatic SHELL=/bin/sh USER=debomatic dpkg-buildpackage ----------------- Command: dpkg-buildpackage --sanitize-env -us -uc -Zxz dpkg-buildpackage: info: source package libtest-mockfile-perl dpkg-buildpackage: info: source version 0.039-1 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by gregor herrmann dpkg-source -Zxz --before-build . dpkg-buildpackage: info: host architecture amd64 debian/rules clean dh clean dh_clean dpkg-source -Zxz -b . dpkg-source: info: using source format '3.0 (quilt)' dpkg-source: info: building libtest-mockfile-perl using existing ../libtest-mockfile-perl_0.039.orig.tar.gz dpkg-source: info: building libtest-mockfile-perl in ../libtest-mockfile-perl_0.039-1.debian.tar.xz dpkg-source: info: building libtest-mockfile-perl in ../libtest-mockfile-perl_0.039-1.dsc debian/rules binary dh binary dh_update_autotools_config dh_autoreconf dh_auto_configure /usr/bin/perl Makefile.PL INSTALLDIRS=vendor OPTIMIZE="-g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -Wdate-time -D_FORTIFY_SOURCE=2" LD="x86_64-linux-gnu-gcc -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -Wl,-z,relro" Checking if your kit is complete... Looks good Generating a Unix-style Makefile Writing Makefile for Test::MockFile Writing MYMETA.yml and MYMETA.json dh_auto_build make -j2 make[1]: Entering directory '/build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039' cp lib/Test/MockFile/Plugin.pm blib/lib/Test/MockFile/Plugin.pm cp lib/Test/MockFile/FileHandle.pm blib/lib/Test/MockFile/FileHandle.pm cp lib/Test/MockFile/DirHandle.pm blib/lib/Test/MockFile/DirHandle.pm cp lib/Test/MockFile/Plugin/FileTemp.pm blib/lib/Test/MockFile/Plugin/FileTemp.pm cp lib/Test/MockFile/Plugins.pm blib/lib/Test/MockFile/Plugins.pm cp lib/Test/MockFile.pm blib/lib/Test/MockFile.pm Manifying 6 pod documents make[1]: Leaving directory '/build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039' dh_auto_test make -j2 test TEST_VERBOSE=1 make[1]: Entering directory '/build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039' PERL_DL_NONLAZY=1 "/usr/bin/perl" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(1, 'blib/lib', 'blib/arch')" t/*.t # Testing Test::MockFile 0.039 with Overload::FileCheck 0.015 and File::Temp 0.2312 # Perl 5.044000, /usr/bin/perl t/00-load.t ......................... ok 1 - use Test::MockFile; ok 2 - use Overload::FileCheck; ok 3 - use File::Temp; 1..3 ok t/autodie_all_functions.t ........... # Subtest: opendir dies on non-existent mocked dir ok 1 - opendir dies on non-existent dir ok 2 - opendir ENOENT: exception thrown ok 3 - 'opendir ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - opendir ENOENT: function is opendir 1..4 ok 1 - opendir dies on non-existent mocked dir # Subtest: opendir dies on ENOTDIR ok 1 - opendir dies on regular file (ENOTDIR) ok 2 - opendir ENOTDIR: exception thrown ok 3 - 'opendir ENOTDIR: is autodie::exception' isa 'autodie::exception' ok 4 - opendir ENOTDIR: function is opendir 1..4 ok 2 - opendir dies on ENOTDIR # Subtest: closedir dies on double-close ok 1 - closedir dies on already-closed handle ok 2 - closedir EBADF: exception thrown ok 3 - 'closedir EBADF: is autodie::exception' isa 'autodie::exception' ok 4 - closedir EBADF: function is closedir 1..4 ok 3 - closedir dies on double-close # Subtest: unlink dies on non-existent mocked file ok 1 - unlink dies on non-existent mocked file ok 2 - unlink ENOENT: exception thrown ok 3 - 'unlink ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - unlink ENOENT: function is unlink 1..4 ok 4 - unlink dies on non-existent mocked file # Subtest: readlink dies on non-existent mocked path ok 1 - readlink dies on non-existent mock ok 2 - readlink ENOENT: exception thrown ok 3 - 'readlink ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - readlink ENOENT: function is readlink 1..4 ok 5 - readlink dies on non-existent mocked path # Subtest: readlink dies on regular file (EINVAL) ok 1 - readlink dies on non-symlink ok 2 - readlink EINVAL: exception thrown ok 3 - 'readlink EINVAL: is autodie::exception' isa 'autodie::exception' ok 4 - readlink EINVAL: function is readlink 1..4 ok 6 - readlink dies on regular file (EINVAL) # Subtest: symlink dies when target exists (EEXIST) ok 1 - symlink dies when link already exists ok 2 - symlink EEXIST: exception thrown ok 3 - 'symlink EEXIST: is autodie::exception' isa 'autodie::exception' ok 4 - symlink EEXIST: function is symlink 1..4 ok 7 - symlink dies when target exists (EEXIST) # Subtest: link dies when source does not exist (ENOENT) ok 1 - link dies when source doesn't exist ok 2 - link ENOENT: exception thrown ok 3 - 'link ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - link ENOENT: function is link 1..4 ok 8 - link dies when source does not exist (ENOENT) # Subtest: link dies when destination exists (EEXIST) ok 1 - link dies when dest already exists ok 2 - link EEXIST: exception thrown ok 3 - 'link EEXIST: is autodie::exception' isa 'autodie::exception' ok 4 - link EEXIST: function is link 1..4 ok 9 - link dies when destination exists (EEXIST) # Subtest: mkdir dies when dir already exists (EEXIST) ok 1 - mkdir dies on existing dir ok 2 - mkdir EEXIST: exception thrown ok 3 - 'mkdir EEXIST: is autodie::exception' isa 'autodie::exception' ok 4 - mkdir EEXIST: function is mkdir 1..4 ok 10 - mkdir dies when dir already exists (EEXIST) # Subtest: rmdir dies on non-existent dir (ENOENT) ok 1 - rmdir dies on non-existent dir ok 2 - rmdir ENOENT: exception thrown ok 3 - 'rmdir ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - rmdir ENOENT: function is rmdir 1..4 ok 11 - rmdir dies on non-existent dir (ENOENT) # Subtest: rmdir dies on regular file (ENOTDIR) ok 1 - rmdir dies on file (ENOTDIR) ok 2 - rmdir ENOTDIR: exception thrown ok 3 - 'rmdir ENOTDIR: is autodie::exception' isa 'autodie::exception' ok 4 - rmdir ENOTDIR: function is rmdir 1..4 ok 12 - rmdir dies on regular file (ENOTDIR) # Subtest: rename dies when source does not exist (ENOENT) ok 1 - rename dies when source doesn't exist ok 2 - rename ENOENT: exception thrown ok 3 - 'rename ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - rename ENOENT: function is rename 1..4 ok 13 - rename dies when source does not exist (ENOENT) # Subtest: truncate dies on non-existent file (ENOENT) ok 1 - truncate dies on non-existent file ok 2 - truncate ENOENT: exception thrown ok 3 - 'truncate ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - truncate ENOENT: function is truncate 1..4 ok 14 - truncate dies on non-existent file (ENOENT) # Subtest: truncate dies on directory (EISDIR) ok 1 - truncate dies on directory ok 2 - truncate EISDIR: exception thrown ok 3 - 'truncate EISDIR: is autodie::exception' isa 'autodie::exception' ok 4 - truncate EISDIR: function is truncate 1..4 ok 15 - truncate dies on directory (EISDIR) # Subtest: chmod dies on non-existent file ok 1 - chmod dies on non-existent mocked file ok 2 - chmod ENOENT: exception thrown ok 3 - 'chmod ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - chmod ENOENT: function is chmod 1..4 ok 16 - chmod dies on non-existent file # Subtest: chown dies on non-existent file ok 1 - chown dies on non-existent mocked file ok 2 - chown ENOENT: exception thrown ok 3 - 'chown ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - chown ENOENT: function is chown 1..4 ok 17 - chown dies on non-existent file # Subtest: utime dies on non-existent file ok 1 - utime dies on non-existent mocked file ok 2 - utime ENOENT: exception thrown ok 3 - 'utime ENOENT: is autodie::exception' isa 'autodie::exception' ok 4 - utime ENOENT: function is utime 1..4 ok 18 - utime dies on non-existent file # Subtest: successful operations do not throw under autodie ok 1 - all successful operations work under autodie 1..1 ok 19 - successful operations do not throw under autodie 1..19 ok t/autodie_compat.t .................. # Subtest: open mocked file succeeds with autodie active ok 1 - first line from mocked file ok 2 - open on mocked file does not die with autodie 1..2 ok 1 - open mocked file succeeds with autodie active # Subtest: write to mocked file succeeds with autodie active ok 1 - open for writing does not die with autodie ok 2 - mocked file has correct contents 1..2 ok 2 - write to mocked file succeeds with autodie active # Subtest: append to mocked file succeeds with autodie active ok 1 - open for append does not die with autodie ok 2 - appended content is correct 1..2 ok 3 - append to mocked file succeeds with autodie active # Subtest: autodie dies on non-existent mocked file ok 1 - autodie dies when opening non-existent mocked file ok 2 - exception is set 1..2 ok 4 - autodie dies on non-existent mocked file # Subtest: autodie exception is autodie::exception when possible ok 1 - 'exception is autodie::exception object' isa 'autodie::exception' 1..1 ok 5 - autodie exception is autodie::exception when possible # Subtest: +< mode on non-existent mocked file dies with autodie ok 1 - autodie dies on +< open of non-existent mocked file 1..1 ok 6 - +< mode on non-existent mocked file dies with autodie # Subtest: mocked file read-write works with autodie ok 1 - read from +< opened file ok 2 - read-write open succeeds with autodie 1..2 ok 7 - mocked file read-write works with autodie 1..7 ok t/autodie_compat_reverse.t .......... # Subtest: mocking works when T::MF loaded before autodie ok 1 - read from mocked file ok 2 - mocked file open works when T::MF loaded before autodie 1..2 ok 1 - mocking works when T::MF loaded before autodie # Subtest: autodie still dies on failure ok 1 - autodie dies on non-existent mocked file (reverse load order) 1..1 ok 2 - autodie still dies on failure # Subtest: write works in reverse load order ok 1 - write to mocked file works ok 2 - content is correct 1..2 ok 3 - write works in reverse load order 1..3 ok t/autodie_eisdir.t .................. # Subtest: autodie dies on open("<") of directory (EISDIR) ok 1 - autodie dies when opening directory for reading ok 2 - exception is set 1..2 ok 1 - autodie dies on open("<") of directory (EISDIR) # Subtest: autodie dies on open(">") of directory (EISDIR) ok 1 - autodie dies when opening directory for writing ok 2 - exception is set 1..2 ok 2 - autodie dies on open(">") of directory (EISDIR) # Subtest: EISDIR autodie exception is autodie::exception object ok 1 - 'EISDIR exception is autodie::exception' isa 'autodie::exception' 1..1 ok 3 - EISDIR autodie exception is autodie::exception object # Subtest: autodie dies on open("+<") of directory (EISDIR) ok 1 - autodie dies on +< open of directory 1..1 ok 4 - autodie dies on open("+<") of directory (EISDIR) 1..4 ok t/autodie_filesys.t ................. # Subtest: rename works on mocked files under autodie ok 1 - rename does not die with autodie on mocked files ok 2 - destination has source contents after rename 1..2 ok 1 - rename works on mocked files under autodie # Subtest: link works on mocked files under autodie ok 1 - link does not die with autodie on mocked files ok 2 - destination has source contents after link 1..2 ok 2 - link works on mocked files under autodie # Subtest: symlink works on mocked files under autodie ok 1 - symlink does not die with autodie on mocked files ok 2 - symlink points to correct target 1..2 ok 3 - symlink works on mocked files under autodie # Subtest: truncate works on mocked files under autodie ok 1 - truncate does not die with autodie on mocked files ok 2 - file truncated to 5 bytes 1..2 ok 4 - truncate works on mocked files under autodie # Subtest: flock succeeds on mocked file handle under autodie ok 1 - flock does not die with autodie on mocked file handle 1..1 ok 5 - flock succeeds on mocked file handle under autodie 1..5 ok t/autodie_sysopen.t ................. # Subtest: sysopen mocked file succeeds with autodie active ok 1 - filehandle defined ok 2 - sysopen O_RDONLY on existing mocked file does not die 1..2 ok 1 - sysopen mocked file succeeds with autodie active # Subtest: sysopen O_CREAT creates file with autodie active ok 1 - filehandle defined after O_CREAT ok 2 - sysopen O_CREAT on non-existent mocked file does not die ok 3 - file created with empty contents 1..3 ok 2 - sysopen O_CREAT creates file with autodie active # Subtest: sysopen O_RDWR on existing file with autodie active ok 1 - filehandle defined for O_RDWR ok 2 - sysopen O_RDWR on existing mocked file does not die 1..2 ok 3 - sysopen O_RDWR on existing file with autodie active # Subtest: autodie dies on sysopen O_RDONLY non-existent file ok 1 - autodie dies when sysopen O_RDONLY on non-existent mocked file ok 2 - exception is set 1..2 ok 4 - autodie dies on sysopen O_RDONLY non-existent file # Subtest: autodie exception is autodie::exception for sysopen ok 1 - 'exception is autodie::exception object' isa 'autodie::exception' ok 2 - exception function is CORE::sysopen 1..2 ok 5 - autodie exception is autodie::exception for sysopen # Subtest: autodie dies on sysopen O_EXCL existing file ok 1 - autodie dies on O_EXCL when file exists ok 2 - 'O_EXCL exception type' isa 'autodie::exception' 1..2 ok 6 - autodie dies on sysopen O_EXCL existing file # Subtest: autodie dies on sysopen directory ok 1 - autodie dies on sysopen of directory (EISDIR) ok 2 - 'EISDIR exception type' isa 'autodie::exception' 1..2 ok 7 - autodie dies on sysopen directory # Subtest: autodie dies on sysopen broken symlink ok 1 - autodie dies on sysopen of broken symlink (ENOENT) ok 2 - 'broken symlink exception type' isa 'autodie::exception' 1..2 ok 8 - autodie dies on sysopen broken symlink # Subtest: sysopen succeeds through valid symlink with autodie ok 1 - filehandle defined through symlink ok 2 - sysopen through valid symlink does not die with autodie 1..2 ok 9 - sysopen succeeds through valid symlink with autodie 1..9 ok t/autodie_sysopen_reverse.t ......... # Subtest: sysopen mocking works when T::MF loaded before autodie ok 1 - filehandle defined ok 2 - mocked sysopen works when T::MF loaded before autodie 1..2 ok 1 - sysopen mocking works when T::MF loaded before autodie # Subtest: autodie still dies on sysopen failure (reverse load order) ok 1 - autodie dies on sysopen of non-existent mocked file (reverse load order) 1..1 ok 2 - autodie still dies on sysopen failure (reverse load order) # Subtest: sysopen O_CREAT works in reverse load order ok 1 - filehandle defined after O_CREAT ok 2 - sysopen O_CREAT on mocked file works (reverse load order) ok 3 - file created with empty contents 1..3 ok 3 - sysopen O_CREAT works in reverse load order 1..3 ok t/autovivify.t ...................... # Seeded srand with seed '20260629' from local date. # -------------- autovivify: basic file creation via open -------------- ok 1 - auto-vivified file does not exist before open ok 2 - open for write under autovivify dir ok 3 - file exists after write ok 4 - file is a regular file ok 5 - open for read ok 6 - content matches what was written # -------------- autovivify: temp file then rename pattern -------------- ok 7 - open temp file for write ok 8 - rename temp file into place ok 9 - renamed file exists ok 10 - temp file no longer exists ok 11 - can read renamed file ok 12 - renamed file has correct content # -------------- autovivify: stat on non-existent file -------------- ok 13 - non-existent file under autovivify dir returns false for -e ok 14 - non-existent file returns false for -f ok 15 - non-existent file returns false for -d # -------------- autovivify: mkdir subdirectory -------------- ok 16 - mkdir under autovivify dir works ok 17 - subdirectory exists after mkdir ok 18 - can opendir the autovivify dir ok 19 - subdirectory appears in readdir # -------------- autovivify: unlink auto-vivified file -------------- ok 20 - create file ok 21 - file exists ok 22 - unlink succeeds ok 23 - file is gone after unlink # -------------- autovivify: sysopen with O_CREAT -------------- ok 24 - sysopen with O_CREAT under autovivify ok 25 - sysopen-created file exists # -------------- autovivify: cleanup on scope exit -------------- ok 26 - create file in scoped dir ok 27 - file exists in scope ok 28 - auto-vivified file cleaned up on scope exit # -------------- autovivify: readdir shows created files -------------- ok 29 - create alpha ok 30 - create beta ok 31 - opendir on autovivify dir ok 32 - readdir shows auto-vivified files # -------------- autovivify: glob works -------------- ok 33 - create foo.txt ok 34 - create bar.txt ok 35 - glob finds auto-vivified files # -------------- autovivify: works with dir() + mkdir pattern -------------- ok 36 - dir with autovivify does not exist yet ok 37 - mkdir materializes autovivify dir ok 38 - dir exists after mkdir ok 39 - open file under materialized dir ok 40 - file exists # -------------- autovivify: file permissions respect umask correctly -------------- ok 41 - create file with umask 0077 ok 42 - autovivified file perms are 0600 with umask 0077 (not 0611) 1..42 ok t/blocks.t .......................... # Seeded srand with seed '20260629' from local date. # blocks() calculation # empty file has 0 blocks ok 1 - non-existent file: blocks is 0 ok 2 - empty string content: blocks is 0 # small file has 1 block ok 3 - 1-byte file: 1 block ok 4 - 100-byte file: 1 block # file exactly at blksize boundary ok 5 - 4096-byte file with 4096 blksize: exactly 1 block # file one byte over blksize boundary ok 6 - 4097-byte file: 2 blocks # file at exactly 2x blksize ok 7 - 8192-byte file with 4096 blksize: exactly 2 blocks # custom blksize ok 8 - 1024-byte file with 512 blksize: 2 blocks ok 9 - 513-byte file with 512 blksize: 2 blocks (ceiling) ok 10 - 512-byte file with 512 blksize: exactly 1 block # blocks from stat() ok 11 - stat[12] (blocks) is 1 for a 5-byte file ok 12 - stat[12] (blocks) is 0 for an empty file # directory blocks ok 13 - stat[12] defined for directory 1..13 ok t/chmod-chown-passthrough.t ......... # Seeded srand with seed '20260629' from local date. ok 1 - chmod passthrough to real filesystem { ok 1 - chmod returned 1 (one file changed) ok 2 - chmod passthrough correctly applied mode 0644 ok 3 - chmod returned 1 for mode change to 0600 ok 4 - chmod passthrough correctly applied mode 0600 ok 5 - chmod returned 2 (two files changed) ok 6 - chmod passthrough correctly applied mode 0755 to /tmp/tmf_passthrough_1734026/chmod_test ok 7 - chmod passthrough correctly applied mode 0755 to /tmp/tmf_passthrough_1734026/chmod_test2 1..7 } ok 2 - chown passthrough to real filesystem { ok 1 - chown -1, -1 passthrough returned 1 ok 2 - File UID unchanged after chown -1, -1 ok 3 - chown to current user/group passthrough returned 1 ok 4 - File UID correct after chown ok 5 - File GID correct after chown 1..5 } 1..2 ok t/chmod-filetemp.t .................. # Seeded srand with seed '20260629' from local date. ok 1 1..1 ok t/chmod.t ........................... # Seeded srand with seed '20260629' from local date. ok 1 - Defaults { ok 1 - Directory /foo exists ok 2 - File /foo/bar exists ok 3 - Directory /foo is set to 0755 ok 4 - File /foo/bar is set to 0644 (umask: 0022, perms before: 0666, perms after 1: 0644, perms after 2: 100644) 1..4 } ok 2 - Changing mode (real vs. mocked) { ok 1 - Successfully created real directory ok 2 - Successfully chmod'ed real directory ok 3 - CORE::chmod() set the perms correctly ok 4 - Successfully deleted real directory ok 5 - Directory /foo exists ok 6 - File /foo/bar exists ok 7 - Directory /foo is now set to 0600 ok 8 - File /foo/bar is now set to 0600 ok 9 - Directory /foo is now set to 0600 ok 10 - File /foo/bar is now set to 0600 1..10 } ok 3 - Changing mode filehandle { # -------------- REAL MODE -------------- ok 1 - chmod on file ok 2 - chmod on filehandle # -------------- MOCK MODE -------------- ok 3 - chmod on file ok 4 - chmod on filehandle 1..4 } ok 4 - Providing a string as mode mask { ok 1 - Successfully created real directory ok 2 - CORE::chmod() threw a warning when trying to numify ok 3 - Successfully chmod'ed real directory ok 4 - No observed error ok 5 - CORE::chmod() set the perms correctly ok 6 - Successfully deleted real directory ok 7 - Directory /foo does not exist ok 8 - Successfully created mocked directory ok 9 - Directory /foo now exists ok 10 - chmod() threw a warning when trying to numify ok 11 - Successfully chmod'ed real directory ok 12 - No observed error ok 13 - chmod() set the perms correctly ok 14 - Successfully deleted real directory ok 15 - Directory /foo no longer exist 1..15 } ok 5 - File creation with non-default mode applies umask correctly { ok 1 - File with explicit mode 0644 gets 0644 after umask 1..1 } ok 6 - chmod method ignores umask { ok 1 - chmod(0755) gives exactly 0755 (umask not applied) ok 2 - chmod(0644) gives exactly 0644 (umask not applied) 1..2 } ok 7 - mkdir with non-default mode applies umask correctly { ok 1 - mkdir with mode 0700 ok 2 - mkdir(0700) gives 0700 after umask 1..2 } ok 8 - chmod masks mode to S_IFPERMS (high bits do not corrupt file type) { ok 1 - chmod with S_IFREG bits gives 0755, not corrupted mode ok 2 - File type preserved after chmod with high bits ok 3 - chmod on dir with high bits gives 0700 ok 4 - Directory type preserved after chmod with high bits 1..4 } ok 9 - chmod with broken symlink in multi-file list does not confess { ok 1 - chmod with broken symlink + regular file does not confess ok 2 - chmod returns 1 (one file changed) ok 3 - errno set to ENOENT for the broken symlink 1..3 } ok 10 - chmod with only broken symlink { ok 1 - chmod with only a broken symlink does not confess ok 2 - chmod returns 0 (no files changed) ok 3 - errno set to ENOENT 1..3 } 1..10 ok t/chown-chmod-nostrict.t ............ # Seeded srand with seed '20260629' from local date. ok 1 - Unmocked files and mixing unmocked and mocked files { ok 1 - Even without strict mode, you cannot mix mocked and unmocked files (chown) ok 2 - Even without strict mode, you cannot mix mocked and unmocked files (chmod) 1..2 } 1..1 ok t/chown.t ........................... # Seeded srand with seed '20260629' from local date. ok 1 - Default ownership { ok 1 - Directory /foo exists ok 2 - File /foo/bar exists ok 3 - /foo set UID correctly to 1002 ok 4 - /foo set GID correctly to 110 ok 5 - /foo/bar set UID correctly to 1002 ok 6 - /foo/bar set GID correctly to 110 1..6 } ok 2 - Change ownership of file to someone else { # $>: 1002, $): 110 110 ok 1 - chown file to some high, probably unavailable, UID/GID ok 2 - chown failed (EPERM): $>:1002, $):110 110 ok 3 - chown file to some high, probably unavailable, GID ok 4 - chown failed (EPERM): $>:1002, $):110 110 ok 5 - chown file to some high, probably unavailable, UID ok 6 - chown failed (EPERM): $>:1002, $):110 110 ok 7 - chown file to root ok 8 - chown failed (EPERM): $>:1002, $):110 110 ok 9 - chown file to root GID ok 10 - chown failed (EPERM): $>:1002, $):110 110 ok 11 - chown file to root UID ok 12 - chown failed (EPERM): $>:1002, $):110 110 1..12 } ok 3 - chown with bareword (nonexistent file) { ok 1 - $! starts clean ok 2 - Using bareword treats it as string ok 3 - Correct ENOENT error 1..3 } ok 4 - chown only user, only group, both { ok 1 - $! starts clean ok 2 - chown'ing file to only UID ok 3 - $! still clean ok 4 - chown'ing file to only GID ok 5 - $! still clean ok 6 - chown'ing file to both UID and GID ok 7 - $! still clean 1..7 } ok 5 - chown to different group of same user { 1..0 # SKIP This user only has one group } ok 6 - chown on typeglob / filehandle { ok 1 - $! starts clean ok 2 - Non-root chown on a file handle works ok 3 - $! stays clean ok 4 - Owner of the file is now there ok 5 - Group of the file is now there 1..5 } ok 7 - chown does not reset $! { ok 1 - $! is set to 3 for our test ok 2 - Successfully run chown ok 3 - $! is still 3 (not reset by chown) 1..3 } ok 8 - chown -1 preserves per-file ownership, not process identity { ok 1 - chown(-1, -1) succeeds ok 2 - uid preserved (not replaced with process uid) ok 3 - gid preserved (not replaced with process gid) ok 4 - chown(99, -1) succeeds ok 5 - uid changed to 99 ok 6 - gid still preserved after uid-only change ok 7 - chown(-1, 42) succeeds ok 8 - uid still preserved after gid-only change ok 9 - gid changed to 42 1..9 } ok 9 - chown uid-only and gid-only permission checks { ok 1 - non-root cannot chown uid-only to different user ok 2 - errno is EPERM for uid-only chown ok 3 - non-root cannot chown gid-only to foreign group ok 4 - errno is EPERM for gid-only chown ok 5 - non-root can chown gid to own group ok 6 - no error for allowed gid change ok 7 - non-root can chown uid to self ok 8 - no error for uid self-chown 1..8 } ok 10 - chown with broken symlink in multi-file list does not confess { ok 1 - chown with broken symlink + regular file does not confess ok 2 - chown returns 1 (one file changed) ok 3 - errno set to ENOENT for the broken symlink 1..3 } ok 11 - chown with only broken symlink { ok 1 - chown with only a broken symlink does not confess ok 2 - chown returns 0 (no files changed) ok 3 - errno set to ENOENT 1..3 } 1..11 ok t/creation_timestamps.t ............. # Seeded srand with seed '20260629' from local date. ok 1 - open > creates file: timestamps reset to now { ok 1 - open > succeeds ok 2 - atime >= operation time ok 3 - mtime >= operation time ok 4 - ctime >= operation time ok 5 - atime updated from past value 1..5 } ok 2 - open >> creates file: timestamps reset to now { ok 1 - open >> succeeds ok 2 - atime >= operation time ok 3 - mtime >= operation time ok 4 - ctime >= operation time ok 5 - atime updated from past value 1..5 } ok 3 - open +> creates file: timestamps reset to now { ok 1 - open +> succeeds ok 2 - atime >= operation time ok 3 - mtime >= operation time ok 4 - ctime >= operation time ok 5 - atime updated from past value 1..5 } ok 4 - open +>> creates file: timestamps reset to now { ok 1 - open +>> succeeds ok 2 - atime >= operation time ok 3 - mtime >= operation time ok 4 - ctime >= operation time ok 5 - atime updated from past value 1..5 } ok 5 - open > truncating existing file: mtime/ctime updated, atime unchanged { ok 1 - open > succeeds on existing file ok 2 - atime unchanged on truncation ok 3 - mtime updated on truncation ok 4 - ctime updated on truncation 1..4 } ok 6 - sysopen O_CREAT creates file: timestamps reset to now { ok 1 - sysopen O_CREAT succeeds ok 2 - atime >= operation time ok 3 - mtime >= operation time ok 4 - ctime >= operation time ok 5 - atime updated from past value 1..5 } ok 7 - sysopen O_CREAT|O_APPEND creates file: timestamps reset to now { ok 1 - sysopen O_CREAT|O_APPEND succeeds ok 2 - atime >= operation time ok 3 - mtime >= operation time ok 4 - ctime >= operation time ok 5 - atime updated from past value 1..5 } ok 8 - mkdir creates directory: timestamps reset to now { ok 1 - mkdir succeeds ok 2 - atime >= operation time ok 3 - mtime >= operation time ok 4 - ctime >= operation time ok 5 - atime updated from past value 1..5 } ok 9 - mkdir with perms creates directory: timestamps reset to now { ok 1 - mkdir with perms succeeds ok 2 - atime >= operation time ok 3 - mtime >= operation time ok 4 - ctime >= operation time 1..4 } 1..9 ok t/cwd_abs_path.t .................... # Seeded srand with seed '20260629' from local date. ok 1 - readlink returns mocked target ok 2 - Cwd::abs_path resolves mocked symlink ok 3 - Cwd::realpath resolves mocked symlink ok 4 - Cwd::fast_abs_path resolves mocked symlink ok 5 - abs_path(.) returns cwd when nothing is mocked ok 6 - abs_path follows chained symlinks ok 7 - abs_path resolves intermediate symlink in path ok 8 - abs_path resolves relative symlink target ok 9 - abs_path resolves .. in path with mocked file ok 10 - abs_path returns undef for circular symlinks ok 11 - $! is ELOOP for circular symlinks ok 12 - abs_path returns path for mocked regular file ok 13 - abs_path() with no args returns cwd ok 14 - abs_path follows symlink into deeper target path ok 15 - imported abs_path() resolves mocked symlink ok 16 - imported realpath() resolves mocked symlink ok 17 - GH \#139: readlink sees mocked target ok 18 - GH \#139: Cwd::abs_path sees mocked target ok 19 - abs_path resolves relative symlink with .. in target ok 20 - abs_path works while mock is in scope ok 21 - abs_path does not return mocked target after mock goes out of scope 1..21 ok t/detect-common-mistakes.t .......... # Seeded srand with seed '20260629' from local date. ok 1 - Removing trailing forward slash for directories { ok 1 - Create /foo/ ok 2 - Test::MockFile=HASH->isa('Test::MockFile') ok 3 - Trailing / is removed 1..3 } ok 2 - Checking for multiple forward slash in paths { ok 1 - dir() successful ok 2 - Double trailing forward slash ok 3 - dir() succesful ok 4 - Multiple trailing forward slash ok 5 - dir() succesful ok 6 - Double leading forward slash for dir ok 7 - dir() succesful ok 8 - Double leading forward slash for file ok 9 - dir() succesful ok 10 - Double forward slash in the middle for dir ok 11 - dir() succesful ok 12 - Double forward slash in the middle for file 1..12 } ok 3 - Relative paths { ok 1 - Success with ./ for dir ok 2 - Success with ./ for file ok 3 - Failure with ../ for dir ok 4 - Failure with ../ for file ok 5 - Failure with /../ for dir ok 6 - Success with /. for file ok 7 - Failure with /.. for file ok 8 - Failure with /../ for file ok 9 - Success with /./ for dir ok 10 - Success with /./ for file ok 11 - No problem with current directory paths (file with trailing forward slash) ok 12 - No problem with current directory paths (dir with trailing forward slash) ok 13 - No problem with current directory paths (dir with no trailing forward slash) 1..13 } 1..3 ok t/dir_interface.t ................... # Seeded srand with seed '20260629' from local date. ok 1 - ->dir() checks { ok 1 - Cannot do TMF->dir( "/etc", [@content], { 1 => 2 } ) ok 2 - Cannot do TMF->dir( "/etc", [@content] ) 1..2 } ok 2 - Scenario 1: ->dir() does not create dir, keywords do { ok 1 - Directory /foo1 does not exist yet ok 2 - Directory /foo1 got created ok 3 - Directory /foo1 now exists ok 4 - Correct contents of directory through ->contents() ok 5 - opendir() /foo1 successful ok 6 - readdir() on /foo1 successful ok 7 - Correct directory content through Perl core keywords ok 8 - closedir() on /foo1 successful 1..8 } ok 3 - Scenario 2: ->dir() on an already existing dir fails made with ->dir() { ok 1 - -d /foo2 succeeds, dir exists ok 2 - mkdir /foo2 fails, dir already exists ok 3 - opendir() /foo2 successful ok 4 - readdir() on /foo2 successful ok 5 - Correct directory content through Perl core keywords ok 6 - closedir() on /foo2 successful 1..6 } ok 4 - Scneario 3: Undef files with ->file() do not create dirs, adding content changes dir { ok 1 - -d /foo3 fails, does not exist yet ok 2 - -d /foo3 still fails after mocking file with no content ok 3 - mkdir /foo3 works ok 4 - -d /foo3 now succeeds ok 5 - Correct contents to /foo3 ok 6 - opendir() /foo3 successful ok 7 - readdir() on /foo3 successful ok 8 - Correct directory content through Perl core keywords ok 9 - closedir() on /foo3 successful ok 10 - /foo3/foo does not exist, even if /foo3 does ok 11 - After file->contents(), /foo3/foo exists ok 12 - Correct updated contents to /foo3 ok 13 - opendir() /foo3 successful ok 14 - readdir() on /foo3 successful ok 15 - Correct directory content through Perl core keywords ok 16 - closedir() on /foo3 successful 1..16 } ok 5 - Scenario 4: Creating ->file() with content creates dir { ok 1 - /foo4 does not exist yet ok 2 - /foo4 now exists, after creating file with content ok 3 - mkdir /foo4 fails, since dir already exists ok 4 - Correct contents to /foo4 ok 5 - opendir() /foo4 successful ok 6 - readdir() on /foo4 successful ok 7 - Correct directory content through Perl core keywords ok 8 - closedir() on /foo4 successful 1..8 } ok 6 - Scenario 5: Non-existent dir placeholders excluded from contents { ok 1 - Non-existent dir placeholder excluded from contents() ok 2 - opendir() /foo5 successful ok 3 - readdir() on /foo5 successful ok 4 - Correct directory content through Perl core keywords ok 5 - closedir() on /foo5 successful ok 6 - Existing subdirectory included in contents() 1..6 } ok 7 - Scenario 6: Non-existent file mock before dir() does not make dir exist { ok 1 - dir does not exist when only child is a non-existent file mock ok 2 - mkdir succeeds on the placeholder dir ok 3 - dir exists after mkdir 1..3 } ok 8 - Scenario 7: Existing file before dir() makes dir exist (regression) { ok 1 - dir exists when child file has content ok 2 - Correct contents with existing child file 1..2 } 1..8 ok t/dir_mtime.t ....................... # Seeded srand with seed '20260629' from local date. ok 1 - file creation updates parent dir mtime { ok 1 - directory has mtime ok 2 - dir mtime updated after file creation 1..2 } ok 2 - file creation without content does not update parent dir mtime { ok 1 - dir mtime NOT updated for file with undef contents 1..1 } ok 3 - unlink updates parent dir mtime { ok 1 - dir mtime updated after unlink 1..1 } ok 4 - mkdir updates parent dir mtime { ok 1 - parent dir mtime updated after mkdir 1..1 } ok 5 - rmdir updates parent dir mtime { ok 1 - parent dir mtime updated after rmdir 1..1 } ok 6 - open for write creates file and updates parent dir mtime { ok 1 - dir mtime updated when open creates new file 1..1 } ok 7 - open existing file for write does NOT update parent dir mtime { ok 1 - dir mtime NOT updated when opening existing file for write 1..1 } ok 8 - symlink creation updates parent dir mtime { ok 1 - dir mtime updated after symlink creation 1..1 } ok 9 - ctime also updates alongside mtime { ok 1 - directory has ctime ok 2 - dir ctime also updated 1..2 } ok 10 - no parent dir mocked means no crash { ok 1 - file created without mocked parent dir (no crash) 1..1 } 1..10 ok t/enoent_on_nonexistent.t ........... # Seeded srand with seed '20260629' from local date. ok 1 - -e on non-existent mock sets ENOENT { ok 1 - -e returns false for file mocked with undef contents ok 2 - $! is ENOENT (not EBADF) after -e on non-existent mock 1..2 } ok 2 - -e on non-existent mock (no content arg) { ok 1 - -e returns false for file mocked without content ok 2 - $! is ENOENT after -e on file mocked without content 1..2 } ok 3 - -f on non-existent mock sets ENOENT { ok 1 - -f returns false for file mocked with undef contents ok 2 - $! is ENOENT after -f on non-existent mock 1..2 } ok 4 - -d on non-existent mock sets ENOENT { ok 1 - -d returns false for non-existent dir mock ok 2 - $! is ENOENT after -d on non-existent dir mock 1..2 } ok 5 - stat on non-existent mock fails cleanly { ok 1 - stat returns empty list for non-existent mock not ok 2 - $! is ENOENT after stat on non-existent mock # TODO Overload::FileCheck XS clobbers errno on stat failure path # Failed test (with amnesty) '$! is ENOENT after stat on non-existent mock' # at t/enoent_on_nonexistent.t line 77. # +-----+----+-------+ # | GOT | OP | CHECK | # +-----+----+-------+ # | 0 | eq | 2 | # +-----+----+-------+ (If this table is too small, you can use the TABLE_TERM_SIZE=### env var to set a larger size, detected size is '74') 1..2 } ok 6 - lstat on non-existent mock fails cleanly { ok 1 - lstat returns empty list for non-existent mock ok 2 - $! is ENOENT after lstat on non-existent mock # TODO Overload::FileCheck XS clobbers errno on stat failure path 1..2 } ok 7 - -e succeeds for existing mock { ok 1 - -e returns true for file mocked with content ok 2 - $! is not set after successful -e 1..2 } ok 8 - -e on broken symlink sets ENOENT (not ELOOP) { ok 1 - -e returns false for broken symlink ok 2 - $! is ENOENT (not ELOOP) for broken symlink 1..2 } ok 9 - stat on broken symlink sets ENOENT { ok 1 - stat returns empty list for broken symlink ok 2 - $! is ENOENT after stat on broken symlink # TODO Overload::FileCheck XS clobbers errno on stat failure path 1..2 } ok 10 - -e on circular symlink sets ELOOP { ok 1 - -e returns false for circular symlink ok 2 - $! is ELOOP for circular symlink 1..2 } ok 11 - lstat on broken symlink succeeds (reports the link itself) { ok 1 - lstat returns stats for broken symlink (the link itself) ok 2 - $! is not set after successful lstat on broken symlink 1..2 } 1..11 ok t/fh-ref-leak.t ..................... # Seeded srand with seed '20260629' from local date. ok 1 - weak ref is defined before scope exit ok 2 - filehandle is garbage collected after -f (GH \#179) ok 3 - filehandle is garbage collected after -S (GH \#179) ok 4 - socketpair read does not hang after -S on dup'd filehandle (GH \#179) 1..4 ok t/file_access_hooks.t ............... # Seeded srand with seed '20260629' from local date. # -------------- REAL MODE -------------- ok 1 - Using open on an unmocked file throws a croak ok 2 - Using a 2 arg open on an unmocked file throws a croak ok 3 - Using sysopen on an unmocked file throws a croak ok 4 - Using opendir on an unmocked directory throws a croak ok 5 - -e on an unmocked file throws a croak ok 6 - -e on an unmocked empty file name throws a croak ok 7 - -d on an unmocked dir throws a croak ok 8 - -l on an unmocked dir throws a croak # -------------- MOCK MODE -------------- ok 9 - -s t/data/example_email.csv ok 10 - Testing from a different source scope (DynaLoader) ok 11 - -d is allowed in certain packages without a die (DynaLoader) ok 12 - open STDIN isn't an error ok 13 - Stat on a file handle which didn't get filtered through MockFile works without a die 1..13 ok t/file_from_disk.t .................. ok 1 - open fake file for read ok 2 - Read line 1. ok 3 - Read line 2. ok 4 - open fake file for write ok 5 - file is written to ok 6 - The original file was unmodified 1..6 ok t/file_passthrough.t ................ # Seeded srand with seed '20260629' from local date. ok 1 - file_passthrough returns a mock object { ok 1 - returns a Test::MockFile object 1..1 } ok 2 - file_passthrough delegates to real filesystem { ok 1 - file does not exist yet on real FS ok 2 - can open file for writing via override ok 3 - -e sees the real file ok 4 - -f sees the real file ok 5 - -d correctly returns false ok 6 - -s returns correct size ok 7 - can open file for reading via override ok 8 - content matches what was written ok 9 - stat returns data ok 10 - stat size is correct ok 11 - can unlink via override ok 12 - file is gone after unlink 1..12 } ok 3 - file_passthrough coexists with regular mocks { ok 1 - regular mock file exists in mock world ok 2 - can open regular mock ok 3 - regular mock has mocked content ok 4 - passthrough file does not exist on disk yet ok 5 - can write to passthrough path ok 6 - passthrough file now exists on disk 1..6 } ok 4 - file_passthrough strict rule cleanup on scope exit { ok 1 - file does not exist (no strict violation) ok 2 - can create file in passthrough scope ok 3 - file exists while passthrough is alive ok 4 - strict mode violation after passthrough goes out of scope 1..4 } ok 5 - file_passthrough with glob pattern matches multiple files { ok 1 - main db file visible via -f ok 2 - wal file visible via -f ok 3 - shm file visible via -f ok 4 - stat works on main db file 1..4 } ok 6 - file_passthrough rejects undefined path { ok 1 - dies with undef path ok 2 - dies with empty path 1..2 } 1..6 ok t/filehandle_cleanup.t .............. # Seeded srand with seed '20260629' from local date. # --- Handle outlives its mock (reversed scope exit) --- ok 1 - open mocked file ok 2 - read from mocked file ok 3 - close() on orphaned handle does not crash # --- DESTROY on orphaned handle (scope exit without close) --- ok 4 - open mocked file ok 5 - DESTROY on orphaned handle does not crash # --- sysread on write-only handle returns EBADF --- ok 6 - open for write-only ok 7 - sysread on write-only handle returns undef ok 8 - errno is EBADF # --- syswrite with negative offset --- ok 9 - open for write ok 10 - syswrite with negative offset writes correct bytes ok 11 - negative offset selected from end of string ok 12 - open for write ok 13 - syswrite with out-of-bounds negative offset returns 0 ok 14 - warning emitted for out-of-bounds offset ok 15 - warning mentions offset # --- syswrite with positive offset --- ok 16 - open for write ok 17 - syswrite with positive offset writes correct bytes ok 18 - positive offset skipped beginning of buffer ok 19 - open for write ok 20 - syswrite with len > strlen writes available bytes ok 21 - file contains truncated write 1..21 ok t/filehandle_weakref.t .............. # Seeded srand with seed '20260629' from local date. # -------------- FILEHANDLE AFTER MOCK DESTRUCTION -------------- # When a mock goes out of scope, the weakened data ref in the tied # filehandle becomes undef. Operations must not crash. ok 1 - readline after mock destruction returns undef { ok 1 - readline does not crash after mock destruction ok 2 - readline returns undef 1..2 } ok 2 - getc after mock destruction returns undef { ok 1 - getc does not crash after mock destruction ok 2 - getc returns undef 1..2 } ok 3 - sysread after mock destruction returns 0 { ok 1 - sysread does not crash after mock destruction ok 2 - sysread returns 0 bytes ok 3 - errno is EBADF after sysread on destroyed mock 1..3 } ok 4 - print after mock destruction returns false { ok 1 - print does not crash after mock destruction ok 2 - print returns false when mock is destroyed ok 3 - errno is EBADF after print on destroyed mock 1..3 } ok 5 - printf after mock destruction returns false { ok 1 - printf does not crash after mock destruction ok 2 - printf returns false when mock is destroyed ok 3 - errno is EBADF after printf on destroyed mock 1..3 } ok 6 - syswrite after mock destruction returns 0 { ok 1 - syswrite does not crash after mock destruction ok 2 - syswrite returns 0 bytes ok 3 - errno is EBADF after syswrite on destroyed mock 1..3 } ok 7 - eof after mock destruction returns true { ok 1 - eof does not crash after mock destruction ok 2 - eof returns true (handle is dead) 1..2 } ok 8 - seek after mock destruction fails gracefully { ok 1 - seek does not crash after mock destruction ok 2 - seek returns 0 (failure) ok 3 - errno is EBADF after seek on destroyed mock 1..3 } ok 9 - tell after mock destruction still works { ok 1 - tell does not crash after mock destruction ok 2 - tell returns the last known position 1..2 } ok 10 - readline list context after mock destruction returns empty { ok 1 - readline (list) does not crash after mock destruction ok 2 - readline (list) returns empty list 1..2 } ok 11 - close after mock destruction succeeds { ok 1 - close does not crash after mock destruction ok 2 - close returns true 1..2 } 1..11 ok t/fileno.t .......................... # Seeded srand with seed '20260629' from local date. ok 1 - Opened file ok 2 - Refuse to support fileno ok 3 - Opened file 1..3 ok t/flock.t ........................... # Seeded srand with seed '20260629' from local date. ok 1 - flock LOCK_EX on mocked file succeeds { ok 1 - LOCK_EX succeeds on mocked file 1..1 } ok 2 - flock LOCK_SH on mocked file succeeds { ok 1 - LOCK_SH succeeds on mocked file 1..1 } ok 3 - flock LOCK_UN on mocked file succeeds { ok 1 - LOCK_EX succeeds ok 2 - LOCK_UN succeeds 1..2 } ok 4 - flock LOCK_EX|LOCK_NB on mocked file succeeds { ok 1 - LOCK_EX|LOCK_NB succeeds 1..1 } ok 5 - flock with sysopen on mocked file succeeds { ok 1 - LOCK_EX|LOCK_NB via sysopen ok 2 - LOCK_UN via sysopen 1..2 } ok 6 - flock on real file falls through to CORE::flock { ok 1 - LOCK_EX|LOCK_NB on real file succeeds ok 2 - LOCK_UN on real file succeeds 1..2 } ok 7 - reproducer from issue \#112 { ok 1 - flock succeeds (issue \#112 reproducer) 1..1 } 1..7 ok t/glob_real_files.t ................. # Seeded srand with seed '20260629' from local date. ok 1 - glob finds real .log file on disk ok 2 - glob finds all real files on disk ok 3 - glob returns empty for non-matching pattern ok 4 - angle bracket glob finds real .log file on disk ok 5 - glob returns both real and mocked files in sorted order ok 6 - glob returns mocked files that shadow real files without duplicates 1..6 ok t/globbing.t ........................ # Seeded srand with seed '20260629' from local date. ok 1 - glob(/*.txt) ok 2 - ok 3 - glob(/*.txt) ok 4 - ok 5 - glob(/*.{txt,jp{g}}) ok 6 - ok 7 - ok 8 - glob(/*.txt /*.jpg) ok 9 - ok 10 - Directory now exists ok 11 - Directory does not exist ok 12 - Created directory successfully ok 13 - Directory now exists ok 14 - 1..14 ok t/goto_is_available.t ............... # Seeded srand with seed '20260629' from local date. ok 1 - goto was first available on 5.016000 ok 2 - goto was available on 5.018000 ok 3 - goto was available on 5.020000 ok 4 - goto was broken on 5.022001 (7bdb4ff0943cf93297712faf504cdd425426e57f) ok 5 - goto was broken on 5.024000 (7bdb4ff0943cf93297712faf504cdd425426e57f) ok 6 - goto was broken on 5.026000 (7bdb4ff0943cf93297712faf504cdd425426e57f) ok 7 - goto works again for 5.028000 ok 8 - goto works on 5.030000 1..8 ok t/handle-corruption.t ............... # Seeded srand with seed '20260629' from local date. ok 1 - IO::Handle=GLOB->isa('IO::Handle') ok 2 - Succesfully opened file ok 3 - No error (string) ok 4 - No error (code) ok 5 - IO::File=GLOB->isa('IO::File') ok 6 - Successfully closed handle ok 7 - No error (string) ok 8 - No error (code) 1..8 ok t/import.t .......................... # Seeded srand with seed '20260629' from local date. # Happy Imports ok 1 - default mode is STRICT_MODE_DEFAULT { ok 1 - Exit Value Check 1..1 } ok 2 - import enable STRICT_MODE_ENABLED { ok 1 - Exit Value Check 1..1 } ok 3 - use Test::MockFile qw< strict > { ok 1 - Exit Value Check 1..1 } ok 4 - use Test::MockFile qw< nostrict > { ok 1 - Exit Value Check 1..1 } ok 5 - multiple - use Test::MockFile qw< strict > { ok 1 - Exit Value Check 1..1 } # Failed Imports ok 6 - use Test::MockFile qw< strict > + qw< nostrict > { ok 1 - Exit Value Check 1..1 } ok 7 - use Test::MockFile + qw< nostrict > { ok 1 - Exit Value Check 1..1 } 1..7 ok t/io_file_compat.t .................. # -------------- IO::File->new with mocked file -------------- ok 1 - IO::File->new opens a mocked file ok 2 - ... reads correct content ok 3 - ... EOF # -------------- IO::File->new read mode (default) -------------- ok 4 - IO::File->new with bare filename opens mocked file ok 5 - ... reads all lines # -------------- IO::File->new with explicit read mode '<' -------------- ok 6 - IO::File->new with '<' mode opens mocked file ok 7 - ... reads correct content # -------------- IO::File->new with write mode 'w' -------------- ok 8 - IO::File->new with 'w' mode opens mocked file ok 9 - ... content was written to mock # -------------- IO::File->new with append mode 'a' -------------- ok 10 - IO::File->new with 'a' mode opens mocked file ok 11 - ... content was appended # -------------- IO::File->new with read-write mode 'r+' -------------- ok 12 - IO::File->new with 'r+' mode opens mocked file ok 13 - ... reads existing content # -------------- IO::File->new on non-existent mock -------------- ok 14 - IO::File->new returns undef for non-existent mock # -------------- IO::File->new with numeric sysopen mode -------------- ok 15 - IO::File->new with O_RDONLY opens mocked file ok 16 - ... reads correct content via sysopen # -------------- IO::File->open method on existing object -------------- ok 17 - IO::File->new creates empty handle ok 18 - ... open method succeeds on mocked file ok 19 - ... reads correct content # -------------- IO::File with 2-arg embedded mode -------------- ok 20 - IO::File->new with '>/path' opens mocked file for write ok 21 - ... content was written # -------------- IO::File with write+truncate via sysopen mode -------------- ok 22 - IO::File->new with O_WRONLY|O_TRUNC opens mocked file ok 23 - ... old content was truncated # -------------- IO::File getline method on mocked file -------------- ok 24 - IO::File->new opens for getline test ok 25 - ... getline returns first line ok 26 - ... getline returns second line ok 27 - ... getline returns third line ok 28 - ... getline returns undef at EOF # -------------- IO::File->new on directory mock returns EISDIR -------------- ok 29 - IO::File->new on a directory returns undef ok 30 - ... errno is EISDIR # -------------- IO::File->new on directory mock via sysopen returns EISDIR -------------- ok 31 - IO::File->new with O_RDONLY on a directory returns undef ok 32 - ... errno is EISDIR # -------------- IO::File append mode preserves append semantics after seek -------------- ok 33 - IO::File->new with 'a' mode opens mocked file ok 34 - ... first append works ok 35 - ... append after seek still appends 1..35 ok t/manifest.t ........................ skipped: Test::CheckManifest is broken - https://github.com/reneeb/Test-CheckManifest/issues/20 t/mkdir.t ........................... # Seeded srand with seed '20260629' from local date. ok 1 - basic mkdir { ok 1 - REAL mkdir when dir is missing. ok 2 - - $! is unset. ok 3 - REAL rmdir when dir is there ok 4 - MOCK mkdir when dir is missing. ok 5 - - $! is unset. ok 6 - Perms are 0755 ok 7 - -d ok 8 - - $! is unset. ok 9 - MOCK rmdir when dir is there ok 10 - - $! is unset. ok 11 - Directory is not there with -d ok 12 - Directory is not there with -e 1..12 } ok 2 - undef dir name { ok 1 - REAL mkdir when undef is passed as the file name. ok 2 - - $! is ENOENT. ok 3 - - Returns 0 ok 4 - MOCK mkdir when undef is passed as the file name. ok 5 - - $! is ENOENT. ok 6 - - Returns 0 1..6 } ok 3 - REAL mkdir { ok 1 - put the real tempdir back ok 2 - A real mkdir through the shim ok 3 - - $! is unset. ok 4 - A real mkdir through the shim when it exists already ok 5 - - $! is EEXIST. 1..5 } ok 4 - mkdir when file exists { ok 1 - A real mkdir when the dir is already a file. ok 2 - - $! is EEXIST. ok 3 - A mock mkdir when the dir is already a file. ok 4 - - $! is EEXIST. ok 5 - A mock mkdir when the path is a mocked file but not on disk becomes a directory mock. ok 6 - $mock is now a directory 1..6 } ok 5 - mkdir when symlink exists { ok 1 - A real mkdir when the dir is already a symlink. ok 2 - - $! is EEXIST. ok 3 - A mock mkdir when the dir is already a symlink. ok 4 - - $! is EEXIST. ok 5 - A mock mkdir when the path is a mocked symlink but not on disk turns the mock object into a dir. ok 6 - $mock is now a directory 1..6 } ok 6 - mkdir with file perms { ok 1 - A real mkdir with 0770 perms. ok 2 - - $! is unset. ok 3 - permissions are the real file's permissions ok 4 - A mock mkdir with 0700 perms. ok 5 - - $! is unset. ok 6 - Permissions are the mock permissions of 0700 ok 7 - Remove the fake dir ok 8 - A mock mkdir with 0700 perms. ok 9 - - $! is unset. ok 10 - Permissions get umask applied. 1..10 } 1..6 ok t/mock_stat.t ....................... # Seeded srand with seed '20260629' from local date. # _abs_path_to_file ok 1 - no / prefix makes prepends path on it ok 2 - undef is undef ok 3 - _abs_path_to_file( '/lib' ) = '/lib' ok 4 - _abs_path_to_file( '/lib/' ) = '/lib' ok 5 - _abs_path_to_file( '/abc/.' ) = '/abc' ok 6 - _abs_path_to_file( '/abc/./' ) = '/abc' ok 7 - _abs_path_to_file( '/abc/./././.' ) = '/abc' ok 8 - _abs_path_to_file( '/from/here/or-not/..' ) = '/from/here' ok 9 - _abs_path_to_file( '/../../..' ) = '/' ok 10 - _abs_path_to_file( '/one/two/three/four/../../..' ) = '/one' ok 11 - _abs_path_to_file( '/a.b.c.d' ) = '/a.b.c.d' ok 12 - _abs_path_to_file( '/there/./xyz' ) = '/there/xyz' ok 13 - _abs_path_to_file( '/./foo' ) = '/foo' ok 14 - _abs_path_to_file( '/a/./b/./c' ) = '/a/b/c' ok 15 - _abs_path_to_file( '/there/..' ) = '/' ok 16 - _abs_path_to_file( '/..' ) = '/' ok 17 - _abs_path_to_file( '/../foo' ) = '/foo' ok 18 - _abs_path_to_file( '/there/sub/../file' ) = '/there/file' ok 19 - _abs_path_to_file( '/a/b/c/../../d' ) = '/a/d' ok 20 - _abs_path_to_file( '/' ) = '/' ok 21 - _abs_path_to_file( '/foo//bar' ) = '/foo/bar' ok 22 - _abs_path_to_file( '///foo///bar///' ) = '/foo/bar' # _fh_to_file ok 23 - _fh_to_file() ok 24 - _fh_to_file(0) ok 25 - _fh_to_file('') ok 26 - _fh_to_file(' ') ok 27 - _fh_to_file('/etc/passwd') ok 28 - _fh_to_file($fh) ok 29 - _fh_to_file($fh2) ok 30 - _fh_to_file($fh) when closed. # _find_file_or_fh ok 31 - _find_file_or_fh('/abc') ok 32 - _find_file_or_fh('/abc', 1) - follow ok 33 - _find_file_or_fh('/broken_link', 1) is undef when /broken_link is mocked. ok 34 - _find_file_or_fh('/aaaa', 1) - with circular links ok 35 - $! is ELOOP # _mock_stat ok 36 - An unmocked file will return FALLBACK_TO_REAL_OP() to tell XS to handle it ok 37 - no args fails cause we should have gotten a stat type. ok 38 - An unknown stat type fails cause this should never happen. ok 39 - empty string passes to XS ok 40 - A space string passes to XS ok 41 - /foo/bar mock stat ok 42 - /aaa mock stat when looped. ok 43 - Throws an ELOOP error ok 44 - /foo/baz mock stat when missing. ok 45 - Throws an ENOENT error for missing file ok 46 - lstat on /broken_link returns the stat on the symlink itself. ok 47 - stat on /broken_link returns 0 since what it points to doesn't exist. ok 48 - mocked file is executable ok 49 - default uid is current UID # GID 110 ok 50 - default fid is current GID ok 51 - Directory /quux exists ok 52 - Directory /quux/ also exists # path canonicalization — stat resolves . and .. components (GH #108) ok 53 - -d "/there/." resolves to mocked /there ok 54 - -e "/there/./xyz" resolves to mocked /there/xyz ok 55 - -f "/there/./xyz" resolves to mocked /there/xyz ok 56 - stat("/there/./xyz") returns stat data ok 57 - -d "/up/down/.." resolves to mocked /up # directory stat size returns blksize, not stringified arrayref length ok 58 - directory stat size is blksize (4096), not stringified ref length ok 59 - -s on directory returns blksize 1..59 ok t/multi_handle.t .................... # Seeded srand with seed '20260629' from local date. # -------------- Two read handles to the same file (#27) -------------- ok 1 - open first read handle ok 2 - open second read handle ok 3 - fh1 reads line 1 ok 4 - fh1 reads line 2 ok 5 - fh2 reads line 1 independently ok 6 - fh1 reads line 3 ok 7 - fh2 reads line 2 independently ok 8 - fh2 reads line 3 after fh1 is closed ok 9 - fh2 is at EOF # -------------- Read + write handles to the same file (#27) -------------- ok 10 - open read handle ok 11 - open append handle ok 12 - read handle sees original content ok 13 - read handle sees appended content ok 14 - file contents after both handles closed # -------------- fhs tracking cleanup (#27) -------------- ok 15 ok 16 - one handle tracked after first open ok 17 - two handles tracked after second open ok 18 - one handle tracked after closing first ok 19 - zero handles tracked after closing both # -------------- Sysopen multiple handles (#27) -------------- ok 20 - sysopen first handle ok 21 - sysopen second handle ok 22 - sysread from first handle ok 23 - sysread from second handle (independent position) 1..23 ok t/new_dir_interface.t ............... # Seeded srand with seed '20260629' from local date. ok 1 - ->dir() checks when going through ->new_dir() { ok 1 - Cannot do TMF->dir( "/etc", { 1 => 2 } ) ok 2 - Cannot do TMF->dir( "/etc", [@content], { 1 => 2 } ) ok 3 - Cannot do TMF->dir( "/etc", [@content] ) 1..3 } ok 2 - Scenario 1: ->new_dir() can create dir { ok 1 - Directory /foo1 exists ok 2 - Correct contents of directory through ->contents() ok 3 - opendir() /foo1 successful ok 4 - readdir() on /foo1 successful ok 5 - Correct directory content through Perl core keywords ok 6 - closedir() on /foo1 successful 1..6 } ok 3 - Scenario 2: ->new_dir() with mode sets the mode { ok 1 - /foo2 exists ok 2 - /foo2 exists ok 3 - We picked perms (0300) that are not the default (0755) ok 4 - Mode was set correctly ok 5 - Correct contents to /foo2 ok 6 - opendir() /foo2 successful ok 7 - readdir() on /foo2 successful ok 8 - Correct directory content through Perl core keywords ok 9 - closedir() on /foo2 successful 1..9 } ok 4 - Scenario 3: ->new_dir() after mkdir() has an error { ok 1 - /foo3 exists ok 2 - mkdir /foo3 fails, since dir already exists ok 3 - $! is set to an error: 17 (File exists) ok 4 - Correct contents to /foo3 ok 5 - opendir() /foo3 successful ok 6 - readdir() on /foo3 successful ok 7 - Correct directory content through Perl core keywords ok 8 - closedir() on /foo3 successful 1..8 } 1..4 ok t/open-noclose.t .................... # Seeded srand with seed '20260629' from local date. ok 1 - missing file argument ok 2 - missing file # empty file ok 3 - empty file ok 4 - file is not empty ok 5 ok 6 - /tmp/somewhere file should not be empty (on second read) 1..6 ok t/open.t ............................ # -------------- REAL MODE -------------- ok 1 - Open a real file bypassing PERLIO ok 2 - ... line 1 ok 3 - ... line 2 ok 4 - ... EOF # -------------- MOCK MODE -------------- ok 5 - Open a mocked file bypassing PERLIO ok 6 - ... line 1 ok 7 - ... line 2 ok 8 - ... EOF ok 9 - Real file is there ok 10 - Real file is not there # Following symlinks for open ok 11 - Open a mocked file via its symlink ok 12 - ... line 1 ok 13 - ... line 2 ok 14 - ... EOF ok 15 - Open a mocked file via its symlink when the file is missing fails. ok 16 - $! is ENOENT # Subtest: open modes ok 1 - Two-arg > open works ok 2 - No error ok 3 - Successfully closed open handle ok 4 - No error ok 5 - Two-arg >> open works ok 6 - No error ok 7 - Successfully closed open handle ok 8 - No error ok 9 - Two-arg < open works ok 10 - arg not changed ok 11 - No error ok 12 - Successfully closed open handle ok 13 - No error ok 14 - Two-arg open works ok 15 - arg not changed ok 16 - No error ok 17 - Successfully closed open handle ok 18 - No error ok 19 - Two-arg +< open fails ok 20 - No error ok 21 - Three-arg +< open fails ok 22 - No error ok 23 - Two-arg +> open fails ok 24 - No error ok 25 - Three-arg +> open fails ok 26 - No error ok 27 - Succesful three-arg pipe open write ok 28 - Successfully closed pipe ok 29 - No error ok 30 - Succesful two-arg pipe open write ok 31 - Successfully closed pipe ok 32 - No error ok 33 - Succesful three-arg pipe open read ok 34 - Succesfully read from pipe with three-arg ok 35 - Successfully closed pipe ok 36 - Succesful two-arg pipe open read ok 37 - Succesfully read from pipe with two-arg ok 38 - Successfully closed pipe ok 39 - No error 1..39 ok 17 - open modes # -------------- BROKEN SYMLINK OPEN -------------- ok 18 - open on broken symlink returns false ok 19 - open on broken symlink sets $! to ENOENT 1..19 ok t/open_broken_symlink_create.t ...... # Seeded srand with seed '20260629' from local date. # --- open('>') through broken symlink creates target file --- ok 1 - Symlink exists ok 2 - Target does not exist yet ok 3 - open('>') through broken symlink succeeds ok 4 - Target file now exists ok 5 - Re-open for reading through symlink ok 6 - Content written through broken symlink # --- open('>>') through broken symlink creates target file --- ok 7 - Target does not exist ok 8 - open('>>') through broken symlink succeeds ok 9 - Target file created by append # --- open('+>') through broken symlink creates target file --- ok 10 - Target does not exist ok 11 - open('+>') through broken symlink succeeds ok 12 - Target file created by +> # --- open('+>>') through broken symlink creates target file --- ok 13 - Target does not exist ok 14 - open('+>>') through broken symlink succeeds ok 15 - Target file created by +>> # --- open('<') through broken symlink returns ENOENT --- ok 16 - open('<') through broken symlink fails ok 17 - errno is ENOENT for read-only open through broken symlink # --- open('+<') through broken symlink returns ENOENT --- ok 18 - open('+<') through broken symlink fails ok 19 - errno is ENOENT for +< open through broken symlink # --- sysopen(O_CREAT) through broken symlink creates target file --- ok 20 - Target does not exist ok 21 - sysopen(O_WRONLY|O_CREAT) through broken symlink succeeds ok 22 - Target file created by sysopen O_CREAT ok 23 - Read back through symlink ok 24 - Content matches what was written # --- sysopen(O_RDWR|O_CREAT) through broken symlink creates target --- ok 25 - sysopen(O_RDWR|O_CREAT) through broken symlink succeeds ok 26 - Target file created by sysopen O_RDWR|O_CREAT # --- sysopen without O_CREAT through broken symlink returns ENOENT --- ok 27 - sysopen(O_RDONLY) through broken symlink fails ok 28 - errno is ENOENT for O_RDONLY through broken symlink ok 29 - sysopen(O_WRONLY) without O_CREAT fails ok 30 - errno is ENOENT for O_WRONLY without O_CREAT # --- open through chained broken symlink creates target --- ok 31 - First symlink exists ok 32 - Second symlink exists ok 33 - Target does not exist ok 34 - open('>') through double symlink succeeds ok 35 - Target file created through symlink chain # --- open('>') through circular symlink still returns ELOOP --- ok 36 - open('>') through circular symlink fails ok 37 - errno is ELOOP for circular symlink even with write mode 1..37 ok t/open_dir_symlink.t ................ # Seeded srand with seed '20260629' from local date. # --- open() on directory mocks returns EISDIR --- ok 1 - Directory mock exists ok 2 - open('<') on dir fails ok 3 - errno is EISDIR for read open on dir ok 4 - open('>') on dir fails ok 5 - errno is EISDIR for write open on dir ok 6 - open('>>') on dir fails ok 7 - errno is EISDIR for append open on dir ok 8 - open('+<') on dir fails ok 9 - errno is EISDIR for read-write open on dir ok 10 - open('+>') on dir fails ok 11 - errno is EISDIR for write-read open on dir # --- sysopen() on directory mocks returns EISDIR --- ok 12 - Directory mock exists ok 13 - sysopen(O_RDONLY) on dir fails ok 14 - errno is EISDIR for O_RDONLY sysopen on dir ok 15 - sysopen(O_WRONLY) on dir fails ok 16 - errno is EISDIR for O_WRONLY sysopen on dir ok 17 - sysopen(O_RDWR) on dir fails ok 18 - errno is EISDIR for O_RDWR sysopen on dir ok 19 - sysopen(O_WRONLY|O_CREAT) on dir fails ok 20 - errno is EISDIR even with O_CREAT on dir # --- sysopen() follows symlinks --- ok 21 - Symlink mock exists ok 22 - Target file exists ok 23 - sysopen(O_RDONLY) through symlink succeeds ok 24 - Read through symlink returns target contents ok 25 - sysopen(O_WRONLY|O_TRUNC) through symlink succeeds ok 26 - Write through symlink updates target file # --- sysopen() O_NOFOLLOW rejects symlinks --- ok 27 - sysopen(O_NOFOLLOW) on symlink fails ok 28 - errno is ELOOP for O_NOFOLLOW on symlink ok 29 - sysopen(O_NOFOLLOW) on regular file succeeds # --- sysopen() through broken symlink returns ENOENT --- ok 30 - Broken symlink mock exists ok 31 - sysopen(O_RDONLY) through broken symlink fails ok 32 - errno is ENOENT for broken symlink ok 33 - sysopen(O_WRONLY) through broken symlink fails ok 34 - errno is ENOENT for broken symlink write # --- sysopen() through circular symlink returns ELOOP --- ok 35 - sysopen through circular symlink fails ok 36 - errno is ELOOP for circular symlink # --- sysopen() O_TRUNC applied correctly --- ok 37 - sysopen(O_WRONLY|O_TRUNC) succeeds ok 38 - O_TRUNC clears file contents ok 39 - Contents after O_TRUNC write ok 40 - sysopen(O_RDONLY|O_TRUNC) on non-existent fails ok 41 - errno is ENOENT for O_TRUNC on non-existent ok 42 - Contents still undef (file not created) # --- directory mock state preserved after failed open --- ok 43 - Dir is still a directory after failed open ok 44 - Dir contents still returns arrayref 1..44 ok t/open_edge_cases.t ................. # Seeded srand with seed '20260629' from local date. ok 1 - +>> two-arg open mode parsing { ok 1 - open with +>> two-arg succeeds ok 2 - +>> appends to existing content 1..2 } ok 2 - +>> on new file creates it { ok 1 - +>> creates non-existent file ok 2 - +>> on new file writes correctly 1..2 } ok 3 - existing >> mode still works { ok 1 - >> two-arg still works ok 2 - >> appends correctly 1..2 } ok 4 - +> two-arg still works { ok 1 - +> two-arg works ok 2 - +> truncates on open ok 3 - +> write works 1..3 } ok 5 - opendir follows symlink to directory { ok 1 - opendir on symlink to dir succeeds ok 2 - readdir through symlink finds child file 1..2 } ok 6 - opendir on broken symlink fails with ENOENT { ok 1 - opendir on broken symlink fails ok 2 - errno is ENOENT for broken symlink 1..2 } ok 7 - opendir on symlink to file fails with ENOTDIR { ok 1 - opendir on symlink to file fails ok 2 - errno is ENOTDIR 1..2 } 1..7 ok t/open_return_undef.t ............... # Seeded srand with seed '20260629' from local date. ok 1 - open on non-existent file returns undef in scalar and list context { ok 1 - open returns undef in scalar context for non-existent file ok 2 - errno is ENOENT ok 3 - open returns 1-element list in list context (not empty) ok 4 - the single element is undef 1..4 } ok 2 - open on directory returns undef (EISDIR) { ok 1 - open on directory returns undef in scalar context ok 2 - errno is EISDIR ok 3 - open on directory returns 1-element list in list context ok 4 - the single element is undef 1..4 } ok 3 - open on broken symlink returns undef (ENOENT) { ok 1 - open on broken symlink returns undef in scalar context ok 2 - errno is ENOENT for broken symlink ok 3 - open on broken symlink returns 1-element list in list context ok 4 - the single element is undef 1..4 } ok 4 - open on circular symlink returns undef (ELOOP) { ok 1 - open on circular symlink returns undef in scalar context ok 2 - errno is ELOOP for circular symlink ok 3 - open on circular symlink returns 1-element list in list context ok 4 - the single element is undef 1..4 } 1..4 ok t/open_strict.t ..................... # Seeded srand with seed '20260629' from local date. ok 1 - open() to read a filehandle fails ok 2 - open() to dup a file descriptor works ok 3 - open() to re-perlify a file descriptor works 1..3 ok t/open_two_arg_special_chars.t ...... # Seeded srand with seed '20260629' from local date. ok 1 - 2-arg open with spaces in filename { ok 1 - open succeeds ok 2 - no die on filename with spaces ok 3 - read content correctly 1..3 } ok 2 - 2-arg open with @ in filename { ok 1 - open succeeds ok 2 - no die on filename with @ ok 3 - read content correctly 1..3 } ok 3 - 2-arg open with parentheses in filename { ok 1 - open succeeds ok 2 - no die on filename with parens ok 3 - read content correctly 1..3 } ok 4 - 2-arg open with hash in filename { ok 1 - open succeeds ok 2 - no die on filename with \# ok 3 - read content correctly 1..3 } ok 5 - 2-arg open with equals and comma in filename { ok 1 - open succeeds ok 2 - no die on = and , in filename ok 3 - read content correctly 1..3 } ok 6 - 2-arg write mode with special chars still works { ok 1 - 2-arg write open with spaces works ok 2 - content was written 1..2 } ok 7 - 2-arg append mode with special chars still works { ok 1 - 2-arg append open with special chars works ok 2 - content was appended 1..2 } ok 8 - 2-arg open still passes through for unmocked files { ok 1 - 2-arg open on unmocked special-char path returns false 1..1 } 1..8 ok t/opendir.t ......................... # Seeded srand with seed '20260629' from local date. # -------------- REAL MODE -------------- ok 1 - Temp is created on disk. ok 2 - /tmp/073m2Gty6S can be read ok 3 - We read 3 entries in some order. Not predictable, but sort fixes that! ok 4 - undef when nothing left from readdir. ok 5 - close the fake dir handle ok 6 - warn on readdir when file handle is closed. ok 7 - opendir on a bad path returns false ok 8 - $! numeric is right. ok 9 - opendir on a file returns false ok 10 - $! numeric is right. ok 11 - We only warn if the file handle or glob is invalid. # -------------- MOCK MODE -------------- ok 12 - Mocked temp dir opens and returns true ok 13 - Read . from fake readdir ok 14 - Read .. from fake readdir ok 15 - tell dir in the middle of fake readdir is right. ok 16 - Read abc from fake readdir ok 17 - Read def from fake readdir ok 18 - tell dir at the end of fake readdir is right. ok 19 - Read from fake readdir but no more in the list. ok 20 - Read from fake readdir but no more in the list. ok 21 - Read from fake readdir but no more in the list. ok 22 - Read from fake readdir but no more in the list. ok 23 - rewinddir returns true. ok 24 - telldir afer rewinddir is right. ok 25 - Read the whole dir from fake readdir after rewinddir ok 26 - tell dir at the end of fake readdir is right. ok 27 - seekdir returns where it sought. ok 28 - Read the whole dir from fake readdir after seekdir ok 29 - opendir on a mocked file returns false ok 30 - $! numeric is right. ok 31 - Symlink and directories appears in directory content ok 32 - Did not get confused by internal files ok 33 - dir() detects mocked child file via keys %files_being_mocked ok 34 - readdir returns correct entries for dir with mocked children ok 35 - readdir in list context at EOF returns empty list, not (undef) ok 36 - while(@e = readdir $dh) collects all entries and terminates ok 37 - loop terminated without hitting safety limit # -------------- BAREWORD GUARD REGRESSION -------------- ok 38 - opendir with ref filehandle works ok 39 - readdir with ref fh reads . ok 40 - readdir with ref fh reads .. ok 41 - telldir with ref fh returns correct position ok 42 - readdir with ref fh reads aaa ok 43 - rewinddir with ref fh returns 1 ok 44 - telldir after rewinddir is 0 ok 45 - telldir is 2 after seekdir(2) ok 46 - readdir after seekdir(2) returns remaining entries ok 47 - closedir with ref fh returns 1 # opendir failure returns undef in list context (single-element list) ok 48 - opendir failure returns one element in list context ok 49 - opendir failure element is false ok 50 - opendir failure element is undef # -------------- closedir double-close returns EBADF -------------- ok 51 - first closedir succeeds ok 52 - second closedir warns about invalid dirhandle ok 53 - second closedir returns undef ok 54 - second closedir sets EBADF # -------------- seekdir with negative position clamps to 0 -------------- ok 55 - readdir returns first entry before seekdir ok 56 - seekdir(-1) clamps tell to 0 ok 57 - readdir after seekdir(-1) returns first entry ok 58 - readdir list after seekdir(-99) returns all entries # -------------- readdir on closed mock dirhandle warns -------------- ok 59 - closedir succeeds ok 60 - readdir on closed mock dh warns ok 61 - readdir on closed mock dh returns undef in scalar context ok 62 - readdir on closed mock dh warns in list context ok 63 - readdir on closed mock dh returns empty list in list context # -------------- telldir on closed mock dirhandle warns -------------- ok 64 - closedir succeeds ok 65 - telldir on closed mock dh warns ok 66 - telldir on closed mock dh returns undef # -------------- seekdir on closed mock dirhandle warns -------------- ok 67 - closedir succeeds ok 68 - seekdir on closed mock dh warns # -------------- rewinddir on closed mock dirhandle warns -------------- ok 69 - closedir succeeds ok 70 - rewinddir on closed mock dh warns 1..70 ok t/path.t ............................ # Seeded srand with seed '20260629' from local date. ok 1 - /some/nonexistant/path is set when the file isn't there. ok 2 - /some/nonexistant/path is set when the file is there. 1..2 ok t/perms.t ........................... # Seeded srand with seed '20260629' from local date. ok 1 - set_user and clear_user { ok 1 - open succeeds with 0000 mode when no mock user set ok 2 - open fails with 0000 mode when mock user is non-owner ok 3 - errno is EACCES ok 4 - open succeeds again after clear_user 1..4 } ok 2 - open read-only with owner read permission { ok 1 - owner can read 0400 file ok 2 - other user cannot read 0400 file 1..2 } ok 3 - open write-only with owner write permission { ok 1 - owner can write 0200 file ok 2 - other user cannot write 0200 file 1..2 } ok 4 - open read-write with owner rw permission { ok 1 - owner can rw 0600 file ok 2 - other user cannot rw 0600 file 1..2 } ok 5 - open with group permissions { 1..0 # SKIP umask strips group bits } ok 6 - open with other permissions { 1..0 # SKIP umask strips other bits } ok 7 - root can read/write any file { ok 1 - root can read 0000 file ok 2 - root can write 0000 file 1..2 } ok 8 - sysopen permission checks { ok 1 - owner can sysopen O_RDONLY on 0400 ok 2 - non-owner cannot sysopen O_RDONLY on 0400 ok 3 - sysopen errno is EACCES ok 4 - owner cannot sysopen O_WRONLY on 0400 (no write bit) ok 5 - sysopen errno is EACCES for write 1..5 } ok 9 - opendir permission checks { ok 1 - owner can opendir 0700 dir ok 2 - non-owner cannot opendir 0700 dir ok 3 - opendir errno is EACCES 1..3 } ok 10 - opendir group read permission { 1..0 # SKIP umask strips group bits } ok 11 - unlink permission checks on parent directory { ok 1 - parent owner can unlink child ok 2 - non-owner cannot unlink in 0755 dir (no write) ok 3 - unlink errno is EACCES 1..3 } ok 12 - mkdir permission checks on parent directory { ok 1 - parent owner can mkdir ok 2 - cannot mkdir in 0555 dir (no write) ok 3 - mkdir errno is EACCES 1..3 } ok 13 - rmdir permission checks on parent directory { ok 1 - parent owner can rmdir empty dir ok 2 - cannot rmdir in 0555 dir (no write) ok 3 - rmdir errno is EACCES 1..3 } ok 14 - chmod permission checks { ok 1 - owner can chmod ok 2 - non-owner cannot chmod ok 3 - chmod errno is EPERM ok 4 - root can chmod any file 1..4 } ok 15 - chown uses mock user identity { ok 1 - non-root mock user cannot chown to different user ok 2 - chown errno is EPERM ok 3 - root mock user can chown 1..3 } ok 16 - non-existent file returns ENOENT not EACCES { ok 1 - cannot open non-existent file 1..1 } ok 17 - user with multiple groups { 1..0 # SKIP umask strips group bits } ok 18 - open > on new file checks parent directory perms { ok 1 - cannot create file in read-only parent dir ok 2 - errno is EACCES ok 3 - can create file in writable parent dir 1..3 } 1..18 ok t/plugin-filetemp.t ................. # Seeded srand with seed '20260629' from local date. ok 1 - File::Temp is not loaded before Test::MockFile ok 2 - File::Temp is loaded ok 3 - we can open a tempfile ok 4 - Can open directory from tempdir ok 5 - we can open a tempfile under a tempdir ok 6 - print to a tempfile - scalar context ok 7 - opendir - newdir ok 8 - open a file created under newdir ok 9 - tempfile in scalar context 1..9 ok # Failed test 'Cannot find a Test::MockFile plugin for Unknown' # at t/plugin.t line 35. # +-----+----+------------------------------------------------------+ # | GOT | OP | CHECK | # +-----+----+------------------------------------------------------+ # | | =~ | (?^:Cannot find a Test::MockFile plugin for Unknown) | # +-----+----+------------------------------------------------------+ (If this table is too small, you can use the TABLE_TERM_SIZE=### env var to set a larger size, detected size is '74') # Command = /usr/bin/perl -I/build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039/t/../lib/ /tmp/78EeRqAz4c/u0437oj3O_ # Exit = 512 # ==== Output ==== # # ======== # Failed test 'Cannot find a Test::MockFile plugin for Unknown' # at /build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039/t/./lib/Test/TMF.pm line 87. t/plugin.t .......................... # Seeded srand with seed '20260629' from local date. not ok 1 - Cannot find a Test::MockFile plugin for Unknown { ok 1 - Exit Value Check not ok 2 - Cannot find a Test::MockFile plugin for Unknown 1..2 } ok 2 - create Test/MockFile/Plugin dir for testing ok 3 - Loading a plugin from default namespace { ok 1 - Exit Value Check ok 2 - load and register plugin 1..2 } ok 4 - use Test::MockFile ( plugin => [ 'MyPlugin' ] ) { ok 1 - Exit Value Check ok 2 - load and register plugin 1..2 } # Testing a custom namespace ok 5 - create Test/MockFile/Plugin dir for testing ok 6 - Loading a plugin from default namespace { ok 1 - Exit Value Check ok 2 - load and register plugin from a custom namespace 1..2 } 1..6 Dubious, test returned 1 (wstat 256, 0x100) Failed 1/6 subtests t/pod-coverage.t .................... skipped: Author tests not required for installation t/pod.t ............................. skipped: Author tests not required for installation t/portability_errno.t ............... # Seeded srand with seed '20260629' from local date. ok 1 - sysopen O_NOFOLLOW on symlink sets ELOOP { ok 1 - sysopen O_NOFOLLOW on regular file succeeds ok 2 - sysopen O_NOFOLLOW on symlink fails ok 3 - $! is ELOOP (not hardcoded 40) 1..3 } ok 2 - rmdir non-empty directory sets ENOTEMPTY { ok 1 - rmdir on non-empty directory fails ok 2 - $! is ENOTEMPTY (not hardcoded 39) 1..2 } ok 3 - syswrite with non-numeric length warns { ok 1 - syswrite with non-numeric len returns 0 ok 2 - $! is set to EINVAL ok 3 - got a warning ok 4 - warning mentions non-numeric argument 1..4 } ok 4 - syswrite with negative length warns { ok 1 - syswrite with negative length returns 0 ok 2 - $! is set to EINVAL ok 3 - got a warning ok 4 - warning mentions negative length 1..4 } ok 5 - syswrite with offset outside string warns { ok 1 - syswrite with offset beyond string returns 0 ok 2 - $! is set to EINVAL ok 3 - got a warning ok 4 - warning mentions offset 1..4 } ok 6 - syswrite with valid negative offset works { ok 1 - syswrite with negative offset returns correct byte count ok 2 - correct substring written with negative offset 1..2 } ok 7 - syswrite with too-negative offset warns { ok 1 - syswrite with offset before start of string returns 0 ok 2 - $! is set to EINVAL ok 3 - got a warning ok 4 - warning mentions offset 1..4 } ok 8 - sysread with non-numeric length warns and returns undef { ok 1 - sysread with non-numeric len returns undef ok 2 - $! is set to EINVAL ok 3 - got a warning ok 4 - warning mentions non-numeric argument ok 5 - buffer is unchanged after failed sysread 1..5 } ok 9 - sysread with negative length warns and returns undef { ok 1 - sysread with negative length returns undef ok 2 - $! is set to EINVAL ok 3 - got a warning ok 4 - warning mentions negative length ok 5 - buffer is unchanged after failed sysread 1..5 } ok 10 - sysread with undef buffer initializes it { ok 1 - sysread with undef buffer returns 5 bytes ok 2 - buffer contains the read data 1..2 } ok 11 - sysread with zero length returns 0 { ok 1 - sysread with len=0 returns 0 ok 2 - buffer is empty after zero-length read 1..2 } 1..11 ok t/print_separators.t ................ # Seeded srand with seed '20260629' from local date. # --- output field separator ($,) --- ok 1 - print with $, = "," joins args with comma ok 2 - print with $, = "\t" joins args with tab ok 3 - print without $, concatenates directly ok 4 - print with $, and single arg has no separator ok 5 - print with multi-char $, works # --- verify printf is unaffected by $, --- ok 6 - printf ignores $, (format handles args) 1..6 ok t/read_write_helpers.t .............. # Seeded srand with seed '20260629' from local date. # -------------- read() tests -------------- ok 1 - read returns file contents in scalar context ok 2 - read returns lines in list context ok 3 - read handles missing trailing newline ok 4 - read on empty file returns empty string ok 5 - read on empty file returns empty list ok 6 - read on non-existent file returns undef in scalar context ok 7 - read on non-existent file returns empty list ok 8 - read with no newline gives single element list ok 9 - read respects custom $/ separator ok 10 - read with undef $/ returns single element in list context ok 11 - read dies on directory ok 12 - read dies on symlink # -------------- write() tests -------------- ok 13 - write sets file contents ok 14 - write returns the object ok 15 - file does not exist before write ok 16 - write brings non-existent file into existence ok 17 - contents are correct after write-create ok 18 - write concatenates multiple args ok 19 - write overwrites existing contents ok 20 - write with empty string empties the file ok 21 - write updates mtime ok 22 - write updates ctime ok 23 - write dies on directory ok 24 - write dies on symlink # -------------- append() tests -------------- ok 25 - append adds to existing contents ok 26 - append returns the object ok 27 - file does not exist before append ok 28 - append brings non-existent file into existence ok 29 - contents are correct after append-create ok 30 - append concatenates multiple args ok 31 - append updates mtime ok 32 - append updates ctime ok 33 - appending empty string is a no-op on contents ok 34 - append dies on directory ok 35 - append dies on symlink # -------------- chaining tests -------------- ok 36 - write->append chaining works 1..36 ok t/read_write_perms.t ................ # Seeded srand with seed '20260629' from local date. ok 1 - open write-only succeeds ok 2 - sysread on write-only handle returns undef ok 3 - sysread on write-only handle sets EBADF ok 4 - open read-only succeeds ok 5 - sysread on read-only handle returns byte count ok 6 - sysread on read-only handle reads data ok 7 - open read-write succeeds ok 8 - sysread on read-write handle returns byte count ok 9 - sysread on read-write handle reads data ok 10 - symlink lstat size = length of target path ok 11 - symlink to /x has size 2 ok 12 - symlink size matches long target path length ok 13 - stat on symlink returns target file size (follows symlink) ok 14 - lstat size of symlink = length of target path 1..14 ok t/readline.t ........................ # Seeded srand with seed '20260629' from local date. # -------------- REAL MODE -------------- ok 1 - Temp file is on disk and right size ok 2 - Open a real file written by File::Temp ok 3 - $fh2 stringifies to a GLOB ok 4 - ... line 1 ok 5 - ... line 2 ok 6 - Fails to write to a read handle in mock mode. ok 7 - $! when the file is written to and it's a read file handle. ok 8 - Warns about writing to a read file handle # -------------- MOCK MODE -------------- ok 9 - Mocked temp file opens and returns true ok 10 - $fh is a IO::File ok 11 - $fh stringifies to a IO::File GLOB ok 12 - 1st read on $fh is "abc\n" ok 13 - 2nd read on $fh is "def\n" ok 14 - 3rd read on $fh via readline is "ghi\n" ok 15 - 4th read on $fh undef at EOF ok 16 - 5th read on $fh undef at EOF ok 17 - 6th read on $fh undef at EOF ok 18 - $foo->contents ok 19 - 7th read on $fh is "mno\n" ok 20 - 7th read on $fh is "pqr" ok 21 - 8th read on $fh undef at EOF ok 22 - 9th read on $fh undef at EOF ok 23 - Fails to write to a read handle in mock mode. ok 24 - $! when the file is written to and it's a read file handle. ok 25 - Warns about writing to a read file handle ok 26 - file handle clears from files_being_mocked hash on close ok 27 - files_being_mocked empties when $bar is cleared # -------------- REAL MODE -------------- ok 28 - Once the mock file object is cleared, the next open reverts to the file on disk. ok 29 - $fh2 stringifies to a GLOB ok 30 - ... line 1 ok 31 - ... line 1 ok 32 - Can't open a missing file "/tmp/78EeRqAz4c" ok 33 - What $! looks like when failing to open the missing file. # -------------- MOCK MODE -------------- ok 34 - Can't open a missing file "/tmp/78EeRqAz4c" ok 35 - What $! looks like when failing to open the missing file. # --------------------------------------- ok 36 - REAL multiline do slurp works ok 37 - MOCK multiline do slurp works # readline array. ok 38 - readline reads in an array of stuff. # -------------- readline on write-only handle -------------- ok 39 - readline on write-only handle returns undef ok 40 - readline on write-only handle warns ok 41 - readline in list context on write-only handle returns empty list ok 42 - readline list context on write-only handle warns # -------------- getc on write-only handle -------------- ok 43 - getc on write-only handle returns undef ok 44 - getc on write-only handle warns 1..44 ok t/readline_modes.t .................. # Seeded srand with seed '20260629' from local date. # -------------- SLURP MODE ($/ = undef) -------------- # Slurp from beginning of file ok 1 - Slurp from tell=0 returns entire contents ok 2 - EOF after slurp # Slurp from non-zero tell position ok 3 - Read first 4 bytes ok 4 - Slurp from tell=4 returns remainder ok 5 - EOF after partial slurp # Slurp empty file ok 6 - Slurp on empty file returns undef # Slurp in list context ok 7 - Slurp in list context returns single element # -------------- FIXED-RECORD MODE ($/ = \N) -------------- # Read in 5-byte records ok 8 - First 5-byte record ok 9 - Second 5-byte record ok 10 - Third record (partial, 3 bytes left) ok 11 - Fourth read returns undef (EOF) # Fixed-record in list context ok 12 - List context returns all fixed-size records # Fixed-record with 1-byte records ok 13 - 1-byte records return individual characters # Fixed-record larger than file ok 14 - Record larger than file returns all contents ok 15 - Second read returns undef # -------------- PARAGRAPH MODE ($/ = '') -------------- # Two paragraphs separated by blank line ok 16 - First paragraph with collapsed \n\n ok 17 - Second paragraph (last, no trailing blank) ok 18 - Third read returns undef (EOF) # Multiple blank lines between paragraphs (collapsed) ok 19 - First paragraph with collapsed separator ok 20 - Second paragraph after multiple blank lines # Leading blank lines are skipped ok 21 - First paragraph (leading blanks skipped) ok 22 - Second paragraph ok 23 - EOF # Single paragraph, no blank lines ok 24 - Single paragraph returned whole ok 25 - EOF # Paragraph mode in list context ok 26 - List context returns all paragraphs # File is only blank lines ok 27 - File with only newlines returns undef in paragraph mode # Paragraph without trailing newline ok 28 - First paragraph ends with collapsed \n\n ok 29 - Last paragraph without trailing newline # -------------- CUSTOM SEPARATOR ($/ = multi-char) -------------- # Multi-character record separator ok 30 - First record with :: separator ok 31 - Second record ok 32 - Third record (no trailing separator) ok 33 - EOF # Custom single-char separator (not newline) ok 34 - Comma-separated reading # -------------- GETC -------------- # getc reads one character at a time ok 35 - getc 1st char ok 36 - getc 2nd char ok 37 - getc 3rd char ok 38 - getc 4th char ok 39 - getc 5th char ok 40 - getc at EOF returns undef # getc after partial read ok 41 - Read first 3 bytes ok 42 - getc after read returns next char ok 43 - getc continues # getc on empty file ok 44 - getc on empty file returns undef # -------------- SEEK + READLINE INTERACTIONS -------------- # Seek then slurp ok 45 - Slurp after seek(5) returns remainder # Seek then fixed-record ok 46 - Fixed record after seek ok 47 - Partial record at end 1..47 ok t/readlink.t ........................ # Seeded srand with seed '20260629' from local date. # -------------- REAL MODE -------------- ok 1 - readlink on missing file ok 2 - $! is ENOENT for a missing file readlink. ok 3 - readlink on a working symlink works. ok 4 - $! is 0 for a missing file readlink. ok 5 - readlink on a broken symlink still works. ok 6 - $! is 0 for a missing file readlink. ok 7 - readlink on a file is undef. ok 8 - $! is EINVAL for a readlink on a file. ok 9 - readlink on a dir is undef. ok 10 - $! is EINVAL for a readlink on a dir. ok 11 - Got expected warning for passing no value to readlink ok 12 - readlink without args is undef. ok 13 - $! is EINVAL or ENOENT for a readlink(undef) (got: 2) ok 14 - Got expected warning for passing no value to readlink ok 15 - readlink without args is undef. ok 16 - $! is EINVAL or ENOENT for a readlink() (got: 2) # Cleaning up... # -------------- MOCK MODE -------------- ok 17 - readlink on missing file ok 18 - $! is ENOENT for a missing file readlink. ok 19 - readlink on a working symlink works. ok 20 - $! is 0 for a missing file readlink. ok 21 - readlink on a broken symlink still works. ok 22 - $! is 0 for a missing file readlink. ok 23 - readlink on a file is undef. ok 24 - $! is EINVAL for a readlink on a file. ok 25 - readlink on a dir is undef. ok 26 - $! is EINVAL for a readlink on a dir. ok 27 - Got expected warning for passing no value to readlink ok 28 - readlink without args is undef. ok 29 - $! is EINVAL or ENOENT for a readlink(undef) (got: 2) not ok 30 - Got expected warning for passing no value to readlink # TODO Something's wrong with readlink's prototype and the warning is incorrect no matter what we do in the code. # Failed test (with amnesty) 'Got expected warning for passing no value to readlink' # at t/readlink.t line 106. # +---------------------------------+----+---------------------------------+ # | GOT | OP | CHECK | # +---------------------------------+----+---------------------------------+ # | Use of uninitialized value in r | =~ | (?^:^Use of uninitialized value | # | eadlink at t/readlink.t line 10 | | \$_ in readlink at ) | # | 6.\n | | | # +---------------------------------+----+---------------------------------+ (If this table is too small, you can use the TABLE_TERM_SIZE=### env var to set a larger size, detected size is '78') ok 31 - readlink without args is undef. ok 32 - $! is EINVAL or ENOENT for a readlink() (got: 2) # --- readlink on non-existent mocks returns ENOENT --- ok 33 - readlink on non-existent file mock is undef ok 34 - $! is ENOENT for readlink on non-existent file mock ok 35 - readlink on non-existent dir mock is undef ok 36 - $! is ENOENT for readlink on non-existent dir mock # --- readlink failure returns undef (not empty list) in list context --- ok 37 - readlink on non-link returns one element in list context ok 38 - readlink failure element is undef ok 39 - readlink on non-existent mock returns one element in list context ok 40 - readlink non-existent failure element is undef 1..40 ok t/relative_paths.t .................. # Seeded srand with seed '20260629' from local date. # -------------- rmdir: relative path still enforces ENOTEMPTY -------------- ok 1 - rmdir with relative path fails on non-empty dir ok 2 - errno is ENOTEMPTY for relative rmdir ok 3 - directory still exists after failed rmdir ok 4 - child still exists after failed rmdir # -------------- rmdir: relative path succeeds on empty dir -------------- ok 5 - rmdir with relative path succeeds on empty dir ok 6 - directory removed after rmdir # -------------- rmdir: relative path updates parent dir timestamps -------------- ok 7 - rmdir with relative path succeeds ok 8 - parent mtime updated after relative rmdir ok 9 - parent ctime updated after relative rmdir # -------------- mkdir: relative path updates parent dir timestamps -------------- ok 10 - mkdir with relative path succeeds ok 11 - parent mtime updated after relative mkdir ok 12 - parent ctime updated after relative mkdir # -------------- rename: relative paths update parent dir timestamps -------------- ok 13 - rename with relative paths succeeds ok 14 - parent mtime updated after relative rename ok 15 - parent ctime updated after relative rename ok 16 - renamed file has correct contents 1..16 ok t/rename.t .......................... # Seeded srand with seed '20260629' from local date. # -------------- rename: basic file rename -------------- ok 1 - rename returns true ok 2 - old file contents cleared ok 3 - new file has old contents # -------------- rename: non-existent source -------------- ok 4 - rename fails for non-existent source ok 5 - errno is ENOENT # -------------- rename: overwrite existing file -------------- ok 6 - rename overwrites existing file ok 7 - destination has new contents ok 8 - source is gone # -------------- rename: file to existing directory fails -------------- ok 9 - cannot rename file over directory ok 10 - errno is EISDIR # -------------- rename: preserves file mode -------------- ok 11 - rename preserves mode ok 12 - destination has source mode # -------------- rename: empty directory rename -------------- ok 13 - rename empty directory works ok 14 - old dir no longer exists ok 15 - new dir exists # -------------- rename: symlink rename -------------- ok 16 - rename symlink works ok 17 - old symlink is gone # -------------- rename: dir over existing file fails -------------- ok 18 - cannot rename dir over file ok 19 - errno is ENOTDIR # -------------- rename: file to self is no-op (POSIX) -------------- ok 20 - rename to self returns true ok 21 - file contents preserved after rename to self ok 22 - file still exists after rename to self # -------------- rename: directory to self is no-op (POSIX) -------------- ok 23 - rename dir to self returns true ok 24 - directory still exists after rename to self # -------------- rename: symlink to self is no-op (POSIX) -------------- ok 25 - rename symlink to self returns true ok 26 - symlink still a link after rename to self ok 27 - symlink target preserved after rename to self # -------------- rename: dir over non-empty dir fails (ENOTEMPTY) -------------- ok 28 - cannot rename dir over non-empty dir ok 29 - errno is ENOTEMPTY ok 30 - source dir still exists after failed rename ok 31 - dest dir still exists after failed rename ok 32 - child file still exists after failed rename # -------------- rename: dir over empty dir succeeds (POSIX) -------------- ok 33 - rename dir over empty dir succeeds ok 34 - source dir no longer exists ok 35 - dest dir exists after rename # -------------- rename: directory with child file re-keys children -------------- ok 36 - rename directory with child succeeds ok 37 - old directory no longer exists ok 38 - new directory exists ok 39 - child file exists under new directory path ok 40 - child file contents preserved after directory rename ok 41 - child file not accessible under old path # -------------- rename: directory with nested subdirectory -------------- ok 42 - rename directory with nested subdirectory succeeds ok 43 - nested subdirectory exists under new path ok 44 - deeply nested file exists under new path ok 45 - deeply nested file contents preserved ok 46 - deep file not accessible under old path ok 47 - nested subdir not accessible under old path # -------------- rename: directory readdir shows re-keyed children -------------- ok 48 - rename directory for readdir test ok 49 - readdir on renamed directory shows re-keyed children # -------------- rename: child mock object path updated after rename -------------- ok 50 - rename for path update test ok 51 - child mock object path updated to new prefix # -------------- rename: directory DESTROY cleanup works after rename -------------- ok 52 - rename for DESTROY test ok 53 - child accessible before DESTROY # -------------- rename: preserves inode and nlink -------------- ok 54 - rename preserves inode metadata ok 55 - inode preserved after rename ok 56 - nlink preserved after rename 1..56 ok t/rmdir.t ........................... # Seeded srand with seed '20260629' from local date. ok 1 - basic rmdir { ok 1 - REAL mkdir when dir is missing. ok 2 - - $! is unset. ok 3 - REAL rmdir when dir is there ok 4 - MOCK mkdir when dir is missing. ok 5 - - $! is unset. ok 6 - Perms are 0755 ok 7 - -d ok 8 - - $! is unset. ok 9 - MOCK rmdir when dir is there ok 10 - - $! is unset. ok 11 - Directory is not there with -d ok 12 - Directory is not there with -e 1..12 } ok 2 - undef rmdir { ok 1 - REAL mkdir when nothing is passed as the directory. ok 2 - - returns 0 ok 3 - REAL mkdir when undef is passed as the directory. ok 4 - - returns 0 ok 5 - MOCK rmdir when undef is passed as the directory. ok 6 - - returns 0 ok 7 - - $! is ENOENT (matches CORE::rmdir behavior) 1..7 } ok 3 - rmdir existing file { ok 1 - real rmdir on existing file. ok 2 - - $! is ENOTDIR. ok 3 - mock rmdir on existing file. ok 4 - - $! is ENOTDIR. 1..4 } ok 4 - rmdir existing symlink { ok 1 - real rmdir on existing file. ok 2 - - $! is ENOTDIR. ok 3 - mock rmdir on existing file. ok 4 - - $! is ENOTDIR. 1..4 } ok 5 - rmdir when nothing is there. { ok 1 - real rmdir on existing file. ok 2 - - $! is ENOENT. ok 3 - mock rmdir on existing file. ok 4 - - $! is ENOENT. 1..4 } ok 6 - rmdir non-empty directory fails { ok 1 - File exists ok 2 - Directory exists ok 3 - No errors yet ok 4 - rmdir failed because directory has files ok 5 - $! is ENOTEMPTY 1..5 } ok 7 - rmdir succeeds when only non-existent mocks exist in directory { ok 1 - Directory exists ok 2 - Ghost file does not exist ok 3 - rmdir succeeds on dir with only non-existent child mocks ok 4 - $! is not set ok 5 - Directory no longer exists after rmdir 1..5 } ok 8 - rmdir fails when at least one existing file is in directory { ok 1 - Directory exists ok 2 - Ghost file does not exist ok 3 - Real file exists ok 4 - rmdir fails when existing file is present ok 5 - $! is set ok 6 - Directory still exists 1..6 } 1..8 ok t/runtime-bareword-filehandles.t .... # Seeded srand with seed '20260629' from local date. ok 1 - Successfully handled bareword filehandles during runtime ok 2 - No observed error 1..2 ok t/seek.t ............................ # Seeded srand with seed '20260629' from local date. # --- SEEK_SET (whence=0) --- ok 1 - SEEK_SET to 0 returns '0 but true' ok 2 - SEEK_SET to 5 returns 5 ok 3 - Reading 3 bytes from position 5 gives FGH ok 4 - SEEK_SET to 10 (EOF) returns 10 ok 5 - SEEK_SET beyond EOF succeeds (POSIX allows seeking past end) ok 6 - SEEK_SET to negative returns 0 (failure) # --- SEEK_CUR (whence=1) --- ok 7 - Start at position 3 ok 8 - SEEK_CUR +4 from 3 gives 7 ok 9 - Reading from position 7 gives HI ok 10 - SEEK_CUR -3 from 9 gives 6 ok 11 - SEEK_CUR 0 returns current position (6) ok 12 - SEEK_CUR before start of file returns 0 ok 13 - SEEK_CUR beyond EOF succeeds (position 6 + 100 = 106) # --- SEEK_END (whence=2) --- ok 14 - SEEK_END with offset 0 = EOF position (10) ok 15 - SEEK_END -3 gives position 7 ok 16 - Reading 3 bytes from position 7 gives HIJ ok 17 - SEEK_END -10 gives position 0 ('0 but true') ok 18 - SEEK_END before start returns 0 (failure) ok 19 - SEEK_END +1 beyond file succeeds (10 + 1 = 11) # --- Invalid whence --- ok 20 - whence=3 returns false ok 21 - whence=3 sets $! to EINVAL ok 22 - whence=-1 returns false ok 23 - whence=-1 sets $! to EINVAL ok 24 - whence=99 returns false ok 25 - whence=99 sets $! to EINVAL # --- seek() via Perl builtin (not sysseek) --- ok 26 - seek() with SEEK_SET returns true ok 27 - tell position is 5 after seek() ok 28 - seek() with SEEK_CUR returns true ok 29 - tell position is 7 after relative seek() ok 30 - seek() with SEEK_END returns true ok 31 - tell position is 8 after SEEK_END -2 # --- Empty file --- ok 32 - SEEK_SET 0 on empty file returns '0 but true' ok 33 - SEEK_END 0 on empty file returns '0 but true' ok 34 - SEEK_CUR 0 on empty file returns '0 but true' ok 35 - SEEK_SET 1 on empty file succeeds (past EOF allowed) # --- Seek after write --- ok 36 - Seek back to start after write ok 37 - Read back what was written after seek ok 38 - SEEK_END -5 on written data gives position 6 ok 39 - Read 'World' from position 6 # --- Seek past EOF then read (should get EOF) --- ok 40 - SEEK_SET to 50 (past 10-byte file) succeeds ok 41 - sysread after seek past EOF returns 0 bytes ok 42 - buffer is empty after seek-past-EOF read ok 43 - eof() is true after seek past EOF # --- Seek past EOF then seek back and read --- ok 44 - Seek to position 100 (past EOF) ok 45 - eof() is true at position 100 ok 46 - Seek back to position 5 ok 47 - eof() is false at position 5 ok 48 - Can read normally after seeking back from past-EOF position ok 49 - eof() is true after reading to end # --- Seek past EOF with SEEK_CUR and SEEK_END --- ok 50 - SEEK_END +5 = 10 + 5 = 15 ok 51 - eof() is true at position 15 ok 52 - SEEK_CUR +10 from 15 = 25 ok 53 - eof() is true at position 25 ok 54 - Seek back to 0 ok 55 - eof() is false at position 0 # --- tell() on regular file handles --- ok 56 - tell() returns 0 at start of file ok 57 - tell() returns 10 after reading all content ok 58 - tell() returns 3 after seek to position 3 ok 59 - tell() returns 50 after seek past EOF # --- EOF warning mentions file path (not STDOUT) --- ok 60 - eof() on write-only handle emits one warning ok 61 - warning mentions the file path, not STDOUT ok 62 - warning does not mention STDOUT ok 63 - No mock files are in cache 1..63 ok t/stat-x.t .......................... # Seeded srand with seed '20260629' from local date. ok 1 - -x after unlink { ok 1 - File should exist ok 2 - File should be executable ok 3 - File should not exist ok 4 - File should not be executable 1..4 } ok 2 - -x with multiple files { ok 1 - First filename should not be executable ok 2 - Second filename should not be executable ok 3 - First filename should now exist ok 4 - First filename should now be executable ok 5 - Second filename should still not exist ok 6 - Second filename should still not be executable 1..6 } ok 3 - rmdir works for mocked directories { ok 1 - Created directory successfully ok 2 - Directory now exists ok 3 - No errors yet ok 4 - Successfully rmdir directory ok 5 - Still no errors ok 6 - Directory no longer exists 1..6 } 1..3 ok t/stat_defaults.t ................... # Seeded srand with seed '20260629' from local date. # --- nlink defaults --- ok 1 - regular file has nlink=1 { ok 1 - nlink is 1 for regular file 1..1 } ok 2 - directory has nlink=2 { ok 1 - nlink is 2 for directory 1..1 } ok 3 - symlink has nlink=1 { ok 1 - nlink is 1 for symlink 1..1 } ok 4 - mkdir sets nlink=2 { ok 1 - nlink is 2 after mkdir 1..1 } ok 5 - link increments nlink correctly from 1 { ok 1 - nlink starts at 1 before linking ok 2 - source nlink is 2 after link ok 3 - destination nlink is 2 after link 1..3 } ok 6 - user-specified nlink overrides default { ok 1 - user-specified nlink=5 is preserved 1..1 } # --- inode defaults --- ok 7 - each mock gets a unique inode { ok 1 - inode is non-zero ok 2 - inode is non-zero ok 3 - inode is non-zero ok 4 - file A and B have different inodes ok 5 - file B and C have different inodes ok 6 - file A and C have different inodes 1..6 } ok 8 - directory gets a unique inode { ok 1 - directory inode is non-zero ok 2 - file and directory have different inodes 1..2 } ok 9 - symlink gets a unique inode { ok 1 - symlink inode is non-zero ok 2 - symlink and target have different inodes 1..2 } ok 10 - hard links share the same inode { ok 1 - hard link has same inode as source 1..1 } ok 11 - user-specified inode overrides default { ok 1 - user-specified inode=42 is preserved 1..1 } 1..11 ok t/stat_timestamps.t ................. # Seeded srand with seed '20260629' from local date. # -------------- WRITE UPDATES mtime/ctime -------------- ok 1 - print updates mtime ok 2 - print updates ctime # -------------- SYSWRITE UPDATES mtime/ctime -------------- ok 3 - syswrite updates mtime ok 4 - syswrite updates ctime # -------------- READ (sysread) UPDATES atime -------------- ok 5 - sysread updates atime ok 6 - sysread does not update mtime ok 7 - sysread does not update ctime # -------------- READLINE UPDATES atime -------------- ok 8 - readline updates atime ok 9 - readline does not update mtime ok 10 - readline does not update ctime # -------------- READLINE (list context) UPDATES atime -------------- ok 11 - readline in list context updates atime ok 12 - read all three lines # -------------- GETC UPDATES atime -------------- ok 13 - getc returns first character ok 14 - getc updates atime # -------------- CHMOD UPDATES ctime -------------- ok 15 - chmod updates ctime ok 16 - chmod does not update mtime # -------------- CHOWN UPDATES ctime -------------- ok 17 - chown updates ctime ok 18 - chown does not update mtime # -------------- OPEN > UPDATES mtime/ctime (truncate) -------------- ok 19 - open > updates mtime ok 20 - open > updates ctime ok 21 - open > truncated contents # -------------- SYSOPEN O_TRUNC UPDATES mtime/ctime -------------- ok 22 - sysopen O_TRUNC updates mtime ok 23 - sysopen O_TRUNC updates ctime # -------------- SYSOPEN O_CREAT UPDATES mtime/ctime -------------- ok 24 - sysopen O_CREAT on new file updates mtime ok 25 - sysopen O_CREAT on new file updates ctime # -------------- OPEN >> does NOT update until write -------------- ok 26 - open >> alone does not update mtime ok 27 - open >> alone does not update ctime ok 28 - writing in append mode updates mtime ok 29 - writing in append mode updates ctime # -------------- READ+WRITE updates both atime and mtime -------------- ok 30 - read in +< mode updates atime ok 31 - write in +< mode updates mtime ok 32 - write in +< mode updates ctime # -------------- PRINTF UPDATES mtime/ctime -------------- ok 33 - printf updates mtime ok 34 - printf updates ctime ok 35 - printf wrote correctly # -------------- TRUNCATE UPDATES mtime/ctime -------------- ok 36 - truncate by path updates mtime ok 37 - truncate by path updates ctime ok 38 - truncate shortened contents # -------------- TRUNCATE via FH UPDATES mtime/ctime -------------- ok 39 - truncate via fh updates mtime ok 40 - truncate via fh updates ctime ok 41 - truncate via fh shortened contents # -------------- TRUNCATE extend UPDATES mtime/ctime -------------- ok 42 - truncate extend updates mtime ok 43 - truncate extend updates ctime ok 44 - truncate extended to 5 bytes # -------------- TRUNCATE same length still UPDATES mtime/ctime -------------- ok 45 - truncate to same length updates mtime ok 46 - truncate to same length updates ctime # -------------- LINK UPDATES parent dir mtime/ctime -------------- ok 47 - link updates parent dir mtime ok 48 - link updates parent dir ctime # -------------- SYMLINK UPDATES parent dir mtime/ctime -------------- ok 49 - symlink updates parent dir mtime ok 50 - symlink updates parent dir ctime # -------------- RENAME UPDATES both parent dirs mtime/ctime -------------- ok 51 - rename updates old parent dir mtime ok 52 - rename updates old parent dir ctime ok 53 - rename updates new parent dir mtime ok 54 - rename updates new parent dir ctime # -------------- RENAME same dir UPDATES parent dir mtime/ctime -------------- ok 55 - rename within same dir updates parent mtime ok 56 - rename within same dir updates parent ctime 1..56 ok t/strict-rules.t .................... # Seeded srand with seed '20260629' from local date. ok 1 - Cannot open an unmocked file in strict mode # add_strict_rule_for_filename ok 2 - can open a file with a custom rule ok 3 - cannot open a file under the directory ok 4 - open /cherry with multiple rules ok 5 - open /another with multiple rules ok 6 - clear_strict_rules removes all previous rules ok 7 - can open a file with a custom rule - regexp ok 8 - can open a file with a custom rule - regexp ok 9 - add_strict_rule_for_filename multiple rules ok 10 - add_strict_rule_for_filename multiple rules # add_strict_rule_for_command ok 11 - opendir fails without add_strict_rule_for_command ok 12 - add_strict_rule_for_command ok 13 - add_strict_rule_for_command - regexp ok 14 - add_strict_rule_for_command - list # add_strict_rule_generic ok 15 - no rules setup ok 16 - add_strict_rule_generic ok 17 - context set for open ok 18 - add_strict_rule_generic ok 19 - context uses normalized path ok 20 - add_strict_rule_generic - no exception ok 21 - add_strict_rule_generic - exception 1..21 ok t/strict-rules_file-temp-example.t .. # Seeded srand with seed '20260629' from local date. ok 1 - Cannot open an unmocked file in strict mode ok 2 - Cannot open directory from tempdir ok 3 - _setup_strict_rules_for_file_temp ok 4 - we can open a tempfile ok 5 - Can open directory from tempdir 1..5 ok t/strict-rules_scalar.t ............. # Seeded srand with seed '20260629' from local date. ok 1 - -e "/no/mocked" ok 2 - -l "/no/mocked" # add_strict_rule_for_command for stat / lstat ok 3 - command not supported ok 4 - -e "/no/mocked" ok 5 - -l "/no/mocked" ok 6 - -l "/this/path" mocked ok 7 - -l "/another/mocked" ok 8 - -e "/no/mocked" ok 9 - -l "/no/mocked" ok 10 - -l "/this/path" mocked ok 11 - -l "/another/path" mocked 1..11 ok t/symlink.t ......................... # Seeded srand with seed '20260629' from local date. ok 1 - Directory does not exist yet ok 2 - Directory now exists ok 3 - Directory with symlink content are correct ok 4 - Directory no longer has symlink ok 5 - lstat on live symlink returns stat data ok 6 - unlink symlink succeeds ok 7 - lstat on unlinked symlink returns empty list ok 8 - lstat on unlinked symlink sets ENOENT ok 9 - stat on unlinked symlink returns empty list # symlink() sets atime, mtime, ctime on the new symlink ok 10 - lstat on new symlink succeeds ok 11 - symlink atime set to current time ok 12 - symlink mtime set to current time ok 13 - symlink ctime set to current time # symlink() on existing path returns EEXIST ok 14 - symlink on existing file returns 0 ok 15 - symlink on existing file sets EEXIST 1..15 ok t/symlink_follow_ops.t .............. # Seeded srand with seed '20260629' from local date. ok 1 - chmod follows symlinks { ok 1 - chmod via symlink returns 1 ok 2 - target file permissions changed through symlink 1..2 } ok 2 - chmod on broken symlink fails with ENOENT { ok 1 - chmod on broken symlink returns 0 ok 2 - $! is ENOENT for broken symlink 1..2 } ok 3 - chmod follows chain of symlinks { ok 1 - chmod through symlink chain returns 1 ok 2 - target file permissions changed through symlink chain 1..2 } ok 4 - chown follows symlinks { ok 1 - chown via symlink returns 1 ok 2 - target uid set through symlink 1..2 } ok 5 - chown on broken symlink fails with ENOENT { ok 1 - chown on broken symlink returns 0 ok 2 - $! is ENOENT for broken symlink 1..2 } ok 6 - utime follows symlinks { ok 1 - utime via symlink returns 1 ok 2 - target atime set through symlink ok 3 - target mtime set through symlink 1..3 } ok 7 - utime on broken symlink fails with ENOENT { ok 1 - utime on broken symlink returns 0 ok 2 - $! is ENOENT for broken symlink 1..2 } ok 8 - utime follows chain of symlinks { ok 1 - utime through chain returns 1 ok 2 - target atime set through symlink chain ok 3 - target mtime set through symlink chain 1..3 } ok 9 - truncate follows symlinks (by path) { ok 1 - truncate via symlink returns true ok 2 - target file truncated through symlink 1..2 } ok 10 - truncate on broken symlink fails with ENOENT { ok 1 - truncate on broken symlink returns false ok 2 - $! is ENOENT for broken symlink 1..2 } ok 11 - truncate follows symlink to directory fails with EISDIR { ok 1 - truncate on symlink-to-dir returns false ok 2 - $! is EISDIR 1..2 } ok 12 - multiple files with symlinks in chmod { ok 1 - chmod on file + symlink returns 2 ok 2 - first file permissions changed ok 3 - second file (via symlink) permissions changed 1..3 } 1..12 ok t/symlink_link.t .................... # Seeded srand with seed '20260629' from local date. # -------------- symlink() builtin on mocked paths -------------- # symlink() on a non-existent file mock converts it to a symlink ok 1 - link path does not exist yet ok 2 - link path is not a symlink yet ok 3 - symlink() returns true on success ok 4 - -l detects the new symlink ok 5 - readlink returns the target # symlink() fails with EEXIST when destination already exists (file) ok 6 - symlink() returns 0 when destination exists ok 7 - $! is EEXIST # symlink() fails with EEXIST when destination is an existing dir ok 8 - symlink() returns 0 when destination is a dir ok 9 - $! is EEXIST # symlink() fails with EEXIST when destination is an existing symlink ok 10 - symlink() returns 0 when destination is already a symlink ok 11 - $! is EEXIST # symlink() updates parent directory content ok 12 - parent dir does not exist yet ok 13 - parent dir now exists (has_content set) ok 14 - parent dir lists the new symlink # symlink() can create a dangling symlink (target not mocked) ok 15 - symlink() succeeds even if target is not mocked ok 16 - the symlink exists ok 17 - readlink returns the dangling target # symlink() on a non-existent dir mock converts it to a symlink ok 18 - dir mock does not exist initially ok 19 - now it is a symlink ok 20 - it is NOT a directory anymore # symlink() on a non-existent symlink mock converts it to an existing symlink ok 21 - undef symlink mock does not exist ok 22 - now it is an existing symlink ok 23 - readlink returns new target # -------------- link() builtin on mocked paths -------------- # link() creates a hard link between two mocked files ok 24 - hardlink does not exist yet ok 25 - link() returns true on success ok 26 - hardlink now exists ok 27 - hardlink is a regular file ok 28 - hardlink has same contents as source # link() increments nlink on both source and destination ok 29 - source nlink incremented ok 30 - destination nlink matches source # link() preserves mode, uid, gid from source ok 31 - mode matches ok 32 - uid matches ok 33 - gid matches # link() fails with ENOENT when source does not exist ok 34 - link() returns 0 when source does not exist ok 35 - $! is ENOENT # link() fails with EEXIST when destination already exists ok 36 - link() returns 0 when destination exists ok 37 - $! is EEXIST # link() fails with EPERM when source is a directory ok 38 - link() returns 0 for directory source ok 39 - $! is EPERM # link() fails with EXDEV when destination is not mocked ok 40 - link() returns 0 when destination is not mocked ok 41 - $! is EXDEV (cannot cross mock/real boundary) # link() follows symlinks on source ok 42 - link() through symlink succeeds ok 43 - destination is a regular file (not symlink) ok 44 - destination has the symlink target contents # link() fails when symlink source is broken ok 45 - link() fails for broken symlink source ok 46 - $! is ENOENT # link() updates parent directory content ok 47 - parent dir does not exist yet ok 48 - parent dir now exists ok 49 - parent dir lists the new hard link # link() fails with ELOOP when symlink source is circular ok 50 - link() fails for circular symlink source ok 51 - $! is ELOOP (not ENOENT) # unlink() decrements nlink on the unlinked file ok 52 - source nlink is 2 after link ok 53 - stat on unlinked file returns undef (no longer exists) ok 54 - remaining hard link nlink decremented after unlink # unlink() on a file with nlink=1 decrements to 0 ok 55 - nlink is 1 before unlink ok 56 - file no longer exists after unlink # link() propagates nlink to all same-inode mocks (3+ hard links) ok 57 - link A to B succeeds ok 58 - A nlink=2 after first link ok 59 - B nlink=2 after first link ok 60 - link A to C succeeds ok 61 - A nlink=3 after second link ok 62 - B nlink=3 after second link (propagated) ok 63 - C nlink=3 after second link ok 64 - B has same inode as A ok 65 - C has same inode as A 1..65 ok t/sysopen.t ......................... # Seeded srand with seed '20260629' from local date. # -------------- REAL MODE -------------- ok 1 - Sysopen for write ok 2 - 2 arg syswrite ok 3 - 3 arg syswrite ok 4 - 4 arg syswrite ok 5 - sysclose $fh ok 6 - file contents match what was written # -------------- MOCK MODE -------------- ok 7 - Sysopen for write ok 8 - 2 arg syswrite ok 9 - 3 arg syswrite ok 10 - 4 arg syswrite ok 11 - sysclose $fh ok 12 - Fake file contents match what was written ok 13 - mocked /tmp/NJjQDypYSV is not present after mock file goes offline ok 14 - No mock files are in cache # -------------- REAL MODE -------------- ok 15 - Sysopen for read ok 16 - Read 2 into buf at EOL ok 17 - Confirm 2 line read ok 18 - Read into buf at pos 0 truncates the buffer. ok 19 - Confirm 2 line read ok 20 - Read 0 into buf at pos 0 truncates the buffer completely. ok 21 - Buffer is clear ok 22 - Read 2 into buf at pos 5 truncates after the buffer. ok 23 - Line is as expected. ok 24 - Read 3 into buf after EOL for the buffer fills in zeroes. ok 25 - Buffer has null bytes in the middle of it. ok 26 - Seek to near EOF ok 27 - Read 2 into buf since we're at EOF ok 28 - Buffer is clear ok 29 - 0 ok 30 - sysseek to start of file returns '0 but true' to make it so. ok 31 - sysseek to start of file returns true when checked with ok() ok 32 - sysseek to position 5 returns true. ok 33 - Seek 10 bytes forward from the current position. ok 34 - Current position is 15 bytes from start. ok 35 - Read 2 bytes from current position (15). ok 36 - Line is as expected. ok 37 - Seek 5 bytes back from end of file. ok 38 - Current position is 46 bytes from start. ok 39 - Read 3 bytes from current position (46). ok 40 - Line is as expected. # -------------- MOCK MODE -------------- ok 41 - Sysopen for read ok 42 - $fh stringifies to a IO::File GLOB ok 43 - Read 2 into buf at EOL ok 44 - Confirm 2 line read ok 45 - Read into buf at pos 0 truncates the buffer. ok 46 - Confirm 2 line read ok 47 - Read 0 into buf at pos 0 truncates the buffer completely. ok 48 - Buffer is clear ok 49 - Read 2 into buf at pos 5 truncates after the buffer. ok 50 - Line is as expected. ok 51 - Read 3 into buf after EOL for the buffer fills in zeroes. ok 52 - Buffer has null bytes in the middle of it. ok 53 - Seek to near EOF ok 54 - Read 2 into buf since we're at EOF ok 55 - Buffer is clear ok 56 - 0 ok 57 - sysseek to start of file returns '0 but true' to make it so. ok 58 - sysseek to start of file returns true when checked with ok() ok 59 - sysseek to position 5 returns true. ok 60 - Seek 10 bytes forward from the current position. ok 61 - Current position is 15 bytes from start. ok 62 - Read 2 bytes from current position (15). ok 63 - Line is as expected. ok 64 - Seek 5 bytes back from end of file. ok 65 - Current position is 46 bytes from start. ok 66 - Read 3 bytes from current position (46). ok 67 - Line is as expected. ok 68 - sysseek with invalid whence returns false ok 69 - sysseek with invalid whence sets EINVAL # -------------- REAL MODE -------------- ok 70 - Sysopen for read ok 71 - Read 2 into buf when buf is undef. ok 72 - Confirm 2 char is read # -------------- MOCK MODE -------------- ok 73 - Sysopen for read ok 74 - Read 2 into buf when buf is undef. ok 75 - Confirm 2 char is read ok 76 - No mock files are in cache # -------------- sysopen O_CREAT applies permissions from 4th arg -------------- ok 77 - Mock file does not exist before sysopen ok 78 - sysopen with O_CREAT and explicit perms ok 79 - Mock file exists after sysopen O_CREAT ok 80 - File permissions set from sysopen arg: got 0600, expected 0600 ok 81 - No mock files are in cache after perms test # -------------- sysopen O_CREAT without perms arg keeps default -------------- ok 82 - sysopen O_CREAT without 4th arg ok 83 - File permissions remain default: got 0644, expected 0644 ok 84 - No mock files are in cache after default perms test # -------------- sysopen O_CREAT on existing file does not change perms -------------- ok 85 - sysopen O_CREAT on existing file ok 86 - Permissions unchanged when O_CREAT on existing file ok 87 - No mock files are in cache after existing file test # O_NOFOLLOW on a symlink returns ELOOP ok 88 - sysopen with O_NOFOLLOW on symlink returns false ok 89 - sysopen with O_NOFOLLOW on symlink sets $! to ELOOP # sysopen on non-existent file without O_CREAT returns ENOENT for all modes ok 90 - mock file does not exist ok 91 - sysopen O_RDONLY on non-existent file returns false ok 92 - sysopen O_RDONLY on non-existent file sets ENOENT ok 93 - sysopen O_WRONLY on non-existent file returns false ok 94 - sysopen O_WRONLY on non-existent file sets ENOENT ok 95 - sysopen O_RDWR on non-existent file returns false ok 96 - sysopen O_RDWR on non-existent file sets ENOENT # sysopen O_WRONLY|O_CREAT on non-existent file succeeds (O_CREAT creates the file) ok 97 - mock file does not exist before O_CREAT ok 98 - sysopen O_WRONLY|O_CREAT succeeds ok 99 - file exists after O_CREAT # sysopen failure returns undef in list context (single-element list) ok 100 - sysopen failure returns one element in list context ok 101 - sysopen failure element is false ok 102 - sysopen failure element is undef (not "undef" string) 1..102 ok t/sysopen_strict.t .................. # Seeded srand with seed '20260629' from local date. ok 1 - sysopen() to read a filehandle fails 1..1 ok t/sysreadwrite_edge_cases.t ......... # Seeded srand with seed '20260629' from local date. # --- syswrite zero-length write returns 0 and writes nothing --- ok 1 - syswrite with len=0 returns 0 ok 2 - file contents unchanged after zero-length write # --- syswrite zero-length write on empty file --- ok 3 - syswrite len=0 on empty file returns 0 ok 4 - tell unchanged after zero-length write ok 5 - file still empty after zero-length write # --- syswrite with O_APPEND always appends regardless of seek --- ok 6 - syswrite with O_APPEND appends even after seek to 0 # --- syswrite with O_APPEND via open >> --- ok 7 - syswrite via open >> appends to file # --- seek past EOF then syswrite creates null-byte gap --- ok 8 - syswrite after seek past EOF fills gap with null bytes ok 9 - file is 12 bytes (2 + 8 null + 2) # --- seek past EOF then syswrite on file with existing content --- ok 10 - syswrite past existing content fills gap with nulls ok 11 - file is 9 bytes (5 + 3 null + 1) # --- syswrite with float len is truncated to int --- ok 12 - syswrite with float len 2.9 writes 2 bytes (truncated) ok 13 - only 2 bytes written with float len 2.9 # --- syswrite with non-numeric len warns and returns 0 --- ok 14 - syswrite with non-numeric len returns 0 ok 15 - errno is EINVAL for non-numeric len ok 16 - warning emitted for non-numeric len ok 17 - warning mentions non-numeric argument ok 18 - no data written with non-numeric len # --- syswrite with negative len warns and returns 0 --- ok 19 - syswrite with negative len returns 0 ok 20 - errno is EINVAL for negative len ok 21 - warning emitted for negative len ok 22 - warning mentions negative length ok 23 - no data written with negative len # --- syswrite offset 0 on empty buffer writes nothing --- ok 24 - syswrite with empty buffer and len=0 returns 0 ok 25 - tell unchanged ok 26 - file still empty # --- sysread with non-numeric len warns and returns undef --- ok 27 - sysread with non-numeric len returns undef ok 28 - errno is EINVAL for non-numeric len ok 29 - warning emitted for non-numeric len ok 30 - warning mentions non-numeric argument # --- sysread with negative len warns and returns undef --- ok 31 - sysread with negative len returns undef ok 32 - errno is EINVAL for negative len ok 33 - warning emitted for negative len ok 34 - warning mentions negative length # --- sysread with float len truncates to int --- ok 35 - sysread with float len 3.7 reads 3 bytes ok 36 - correct 3 bytes read with float len # --- sysread zero-length returns 0 and does not modify buffer --- ok 37 - sysread with len=0 returns 0 ok 38 - buffer truncated to empty by zero-length read at offset 0 ok 39 - tell unchanged after zero-length read # --- sysread with undef buffer initializes it to empty string --- ok 40 - sysread with undef buffer reads 3 bytes ok 41 - buffer correctly filled from undef # --- sysread with undef buffer and offset pads with null bytes --- ok 42 - sysread with undef buffer and offset reads 2 bytes ok 43 - buffer is null-padded then data at offset # --- sysread on write-only handle returns undef with EBADF --- ok 44 - sysread on write-only handle returns undef ok 45 - errno is EBADF for sysread on write-only handle # --- sysread at EOF returns 0 --- ok 46 - first read gets all content ok 47 - sysread at EOF returns 0 # --- syswrite then sysread in O_RDWR mode --- ok 48 - tell is 11 after syswrite ok 49 - sysread returns 5 ok 50 - read back what was written ok 51 - sysread returns 6 ok 52 - second read continues from tell position # --- syswrite multiple times accumulates content --- ok 53 - multiple syswrite calls accumulate correctly ok 54 - total length is 6 ok 55 - No mock files are in cache 1..55 ok t/Test-MockFile_file.t .............. # Seeded srand with seed '20260629' from local date. ok 1 - file() constructor — basic creation { ok 1 - file() returns a truthy object ok 2 - object is a Test::MockFile instance ok 3 - path() returns the mocked path 1..3 } ok 2 - file() with contents — existing file { ok 1 - contents() returns the file body ok 2 - exists() is true for file with contents ok 3 - is_file() returns 1 ok 4 - is_dir() returns 0 ok 5 - is_link() returns 0 1..5 } ok 3 - file() without contents — non-existent placeholder { ok 1 - contents() is undef for non-existent file ok 2 - exists() is false for non-existent file ok 3 - size() is undef for non-existent file 1..3 } ok 4 - file() with empty string — exists but empty { ok 1 - contents() is empty string ok 2 - exists() is true — empty file still exists ok 3 - size() is 0 for empty file 1..3 } ok 5 - size() and blocks() { ok 1 - size() matches content length ok 2 - blocks() computes correctly from size and blksize 1..2 } ok 6 - stat() returns 13-element list { ok 1 - stat() returns 13 elements ok 2 - mode has S_IFREG set ok 3 - stat[7] (size) is 3 ok 4 - atime is non-zero ok 5 - mtime is non-zero ok 6 - ctime is non-zero 1..6 } ok 7 - permissions() and chmod() { ok 1 - permissions() returns a value ok 2 - chmod(0644) sets permissions correctly ok 3 - chmod(0755) updates permissions ok 4 - mode still has S_IFREG after chmod ok 5 - permission bits match after chmod 1..5 } ok 8 - mtime(), ctime(), atime() — read and write { ok 1 - mtime() returns a positive epoch ok 2 - atime() returns a positive epoch ok 3 - ctime() returns a positive epoch ok 4 - mtime(epoch) sets the value ok 5 - atime(epoch) sets the value ok 6 - ctime(epoch) sets the value 1..6 } ok 9 - touch() — creates and updates times { ok 1 - file does not exist before touch ok 2 - file exists after touch() ok 3 - touch() creates empty file ok 4 - touch(epoch) sets mtime ok 5 - touch(epoch) sets atime 1..5 } ok 10 - write() — replaces contents { ok 1 - write() replaces contents ok 2 - write() returns $self for chaining 1..2 } ok 11 - write() — creates non-existent file { ok 1 - file does not exist before write() ok 2 - file exists after write() ok 3 - contents are correct 1..3 } ok 12 - append() — adds to contents { ok 1 - append() adds to contents ok 2 - append() returns $self for chaining 1..2 } ok 13 - append() — creates non-existent file { ok 1 - file does not exist before append() ok 2 - file exists after append() ok 3 - contents are correct 1..3 } ok 14 - read() — scalar context returns entire contents { ok 1 - read() in scalar returns all contents 1..1 } ok 15 - read() — list context returns lines { ok 1 - read() in list context splits on $/ 1..1 } ok 16 - unlink() — removes the file { ok 1 - file exists before unlink ok 2 - unlink() returns 1 on success ok 3 - file does not exist after unlink() ok 4 - contents() is undef after unlink() 1..4 } ok 17 - unlink() on non-existent file fails with ENOENT { ok 1 - file does not exist ok 2 - unlink() returns 0 for non-existent file ok 3 - errno is ENOENT 1..3 } ok 18 - chained write and append { ok 1 - write/append chaining works 1..1 } ok 19 - file() with custom stat attributes { ok 1 - uid from constructor ok 2 - gid from constructor ok 3 - mtime from constructor 1..3 } ok 20 - file() — filesystem ops work on mocked file { ok 1 - stat() on mocked path returns 13 elements ok 2 - stat[7] (size) is 12 ok 3 - -e returns true for mocked file ok 4 - -f returns true for mocked file ok 5 - -d returns false for file ok 6 - -s returns file size ok 7 - open succeeds on mocked file ok 8 - reading from mocked file handle works 1..8 } ok 21 - file() — open for write creates content { ok 1 - open > succeeds ok 2 - content written through handle appears in mock 1..2 } ok 22 - file() — multiple mock objects are independent { ok 1 - mock_a has correct contents ok 2 - mock_b has correct contents ok 3 - mock_a updated ok 4 - mock_b unchanged 1..4 } 1..22 ok t/touch.t ........................... # Seeded srand with seed '20260629' from local date. # -------------- REAL MODE -------------- ok 1 - /tmp/NJjQDypYSV is there ok 2 - unlink on a dir fails ok 3 - unlink /dir is non-zero (21) # -------------- MOCK MODE -------------- ok 4 - Directory does not exist yet ok 5 - Successfully created /dir ok 6 - Directory now exists ok 7 - unlink /link works. ok 8 - /link is now gone ok 9 - unlink /dir doesn't work. ok 10 - ... and throws a $! ok 11 - touch /dir doesn't work. ok 12 - touch /link doesn't work. ok 13 - Set mtime to 1970 ok 14 - Set ctime to 1970 ok 15 - Set atime to 1970 ok 16 - Touch a missing file. ok 17 - mtime is set. ok 18 - ctime is set. ok 19 - atime is set. ok 20 - /file exists with -e ok 21 - /file is removed via unlink method ok 22 - /file is missing via contents check ok 23 - /file is missing via size method ok 24 - /file is removed via -e check ok 25 - Set file to have stuff in it. ok 26 - Touch an existing file. ok 27 - mtime is set to 1234. ok 28 - ctime is set to 1234. ok 29 - atime is set to 1234. 1..29 ok t/trace.t ........................... # Seeded srand with seed '20260629' from local date. # --- :trace import tag --- ok 1 - use Test::MockFile qw< :trace > enables trace with strict { ok 1 - Exit Value Check ok 2 - trace output includes stat access 1..2 } # --- :trace with :nostrict --- ok 2 - use Test::MockFile qw< :trace :nostrict > { ok 1 - Exit Value Check ok 2 - trace output for unmocked -e access 1..2 } # --- trace without colon --- ok 3 - use Test::MockFile qw< trace nostrict > also works { ok 1 - Exit Value Check ok 2 - trace output works without colon prefix 1..2 } # --- :nostrict alias --- ok 4 - use Test::MockFile qw< :nostrict > alias works { ok 1 - Exit Value Check 1..1 } # --- trace includes caller location --- ok 5 - trace output includes caller location { ok 1 - Exit Value Check ok 2 - trace output includes 'at FILE line N' 1..2 } # --- trace does not fire for mocked files --- ok 6 - trace does not fire for mocked files { ok 1 - Exit Value Check ok 2 - no trace output for mocked file access 1..2 } # --- trace fires for open on unmocked files --- ok 7 - trace fires for open on unmocked files { ok 1 - Exit Value Check ok 2 - trace output for unmocked open 1..2 } 1..7 ok t/truncate.t ........................ # Seeded srand with seed '20260629' from local date. ok 1 - truncate by path — shorten contents { ok 1 - truncate returns true ok 2 - contents shortened to 5 bytes 1..2 } ok 2 - truncate by path — extend with null bytes { ok 1 - truncate returns true ok 2 - contents extended to 6 bytes ok 3 - padded with null bytes 1..3 } ok 3 - truncate by path — same length is no-op { ok 1 - truncate returns true ok 2 - contents unchanged 1..2 } ok 4 - truncate to zero { ok 1 - truncate to 0 returns true ok 2 - contents now empty 1..2 } ok 5 - truncate via filehandle { ok 1 - truncate via fh returns true ok 2 - contents shortened via fh 1..2 } ok 6 - truncate via sysopen filehandle { ok 1 - truncate via sysopen fh returns true ok 2 - contents shortened via sysopen fh 1..2 } ok 7 - truncate on non-existent mock file fails with ENOENT { ok 1 - truncate returns false ok 2 - $! is ENOENT 1..2 } ok 8 - truncate on directory fails with EISDIR { ok 1 - truncate returns false ok 2 - $! is EISDIR 1..2 } ok 9 - truncate with negative length fails with EINVAL { ok 1 - truncate returns false ok 2 - $! is EINVAL 1..2 } ok 10 - truncate on real file falls through to CORE::truncate { ok 1 - truncate real file returns true ok 2 - real file truncated to 5 bytes 1..2 } ok 11 - truncate on file with undef contents (created by open) { ok 1 - truncate returns false for non-existent ok 2 - $! is ENOENT ok 3 - truncate after open returns true ok 4 - contents shortened 1..4 } ok 12 - truncate via read-only filehandle fails with EINVAL { ok 1 - truncate on read-only fh returns false ok 2 - $! is EINVAL for read-only fh ok 3 - contents unchanged 1..3 } ok 13 - truncate via write-only filehandle succeeds { ok 1 - truncate on write-only fh succeeds ok 2 - contents truncated 1..2 } ok 14 - truncate via append filehandle succeeds { ok 1 - truncate on append fh succeeds ok 2 - contents shortened via append fh 1..2 } 1..14 ok t/unlink.t .......................... # Seeded srand with seed '20260629' from local date. ok 1 - unlink on a missing file { ok 1 - REAL CORE::unlink returns 0 files deleted. ok 2 - $! is set to ENOENT ok 3 - MOCKED unlink returns 0 files deleted. ok 4 - $! is set to ENOENT 1..4 } ok 2 - unlink on an existing directory { ok 1 - REAL CORE::unlink returns 0 files deleted. ok 2 - Directory does not exist yet ok 3 - Created directory successfully ok 4 - Directory now exists ok 5 - MOCKED unlink returns 0 files deleted. ok 6 - $! is set to EISDIR 1..6 } ok 3 - unlink on an existing file { ok 1 - REAL CORE::unlink returns 1 files deleted. ok 2 - $! remains 0 ok 3 - MOCKED unlink returns 1 files deleted. ok 4 - $! remains 0 1..4 } ok 4 - unlink on an unmocked file { ok 1 - MOCKED unlink returns 1 files deleted. ok 2 - $! remains 0 ok 3 - CORE::open fails since the file is removed from disk ok 4 - $! becomes ENOENT 1..4 } ok 5 - unlink with no args uses $_ { ok 1 - file exists before unlink ok 2 - unlink() with no args uses $_ and returns 1 ok 3 - file no longer exists after unlink() 1..3 } 1..5 ok t/utime.t ........................... # Seeded srand with seed '20260629' from local date. ok 1 - utime on mocked file { ok 1 - File exists ok 2 - utime returns 1 for success ok 3 - atime was updated ok 4 - mtime was updated 1..4 } ok 2 - utime updates ctime to current time { ok 1 - ctime was updated to current time 1..1 } ok 3 - utime with undef uses current time { ok 1 - utime with undef returns 1 ok 2 - atime set to current time when undef ok 3 - mtime set to current time when undef 1..3 } ok 4 - utime on multiple mocked files { ok 1 - utime returns 2 for two files ok 2 - file a atime updated ok 3 - file a mtime updated ok 4 - file b atime updated ok 5 - file b mtime updated 1..5 } ok 5 - utime on nonexistent mocked file { ok 1 - File does not exist ok 2 - utime returns 0 for nonexistent file ok 3 - $! is set to ENOENT 1..3 } ok 6 - utime on mocked directory { ok 1 - Created directory ok 2 - Directory exists ok 3 - utime on directory returns 1 ok 4 - dir atime updated ok 5 - dir mtime updated 1..5 } ok 7 - utime with no files returns 0 { ok 1 - utime with no files returns 0 1..1 } ok 8 - utime on mix of mocked and unmocked files { ok 1 - utime returns 2 for mixed mocked/unmocked ok 2 - mocked file atime updated ok 3 - mocked file mtime updated ok 4 - unmocked file atime updated ok 5 - unmocked file mtime updated 1..5 } ok 9 - utime on unmocked file passes through { ok 1 - utime on real file returns 1 ok 2 - real file atime was updated ok 3 - real file mtime was updated 1..3 } ok 10 - utime on unmocked file while mocked files exist { ok 1 - utime on unmocked file returns 1 ok 2 - unmocked file atime was updated ok 3 - unmocked file mtime was updated 1..3 } ok 11 - real utime with mixed existing/non-existing files sets ENOENT { ok 1 - non-existent file does not exist ok 2 - CORE::utime returns 1 (only the existing file succeeded) ok 3 - CORE::utime sets $! to ENOENT for the missing file ok 4 - existing file atime was updated ok 5 - existing file mtime was updated 1..5 } ok 12 - mocked utime on mix of existing and non-existing mocked files { ok 1 - existing mock is a file ok 2 - non-existing mock does not exist ok 3 - utime returns 1 (only existing file succeeded) ok 4 - $! is ENOENT for the non-existing mocked file ok 5 - existing mock atime was updated ok 6 - existing mock mtime was updated 1..6 } 1..12 ok t/utime_strict.t .................... # Seeded srand with seed '20260629' from local date. ok 1 - utime on unmocked file in strict mode dies { ok 1 - utime on unmocked file in strict mode triggers violation 1..1 } ok 2 - utime on mocked file in strict mode succeeds { ok 1 - utime on mocked file in strict mode works ok 2 - atime set correctly in strict mode ok 3 - mtime set correctly in strict mode 1..3 } 1..2 ok t/warnstrict.t ...................... # Seeded srand with seed '20260629' from local date. ok 1 - is_strict_mode returns true in warnstrict mode { ok 1 - is_strict_mode() is true 1..1 } ok 2 - is_warn_mode returns true in warnstrict mode { ok 1 - is_warn_mode() is true 1..1 } ok 3 - accessing unmocked file warns instead of dying { ok 1 - got one warning ok 2 - got warning about unmocked file access 1..2 } ok 4 - accessing mocked file does not warn { ok 1 - no warnings for mocked file access 1..1 } ok 5 - open on unmocked file warns instead of dying { ok 1 - got one warning ok 2 - got warning about unmocked open 1..2 } ok 6 - open on mocked file works normally { ok 1 - no warnings for mocked file open ok 2 - open succeeded 1..2 } ok 7 - multiple unmocked accesses all produce warnings { ok 1 - got 3 warnings for 3 unmocked accesses 1..1 } 1..7 ok t/write_tell.t ...................... # Seeded srand with seed '20260629' from local date. # --- tell() advances after print --- ok 1 - tell is 0 before any writes ok 2 - tell is 5 after printing 'Hello' ok 3 - tell is 11 after printing ' World' ok 4 - Contents are correct # --- tell() advances after printf --- ok 5 - tell is 4 after printf '%04d' ok 6 - tell is 10 after second printf ok 7 - Contents are correct # --- tell() advances after syswrite --- ok 8 - tell is 5 after syswrite of 5 bytes ok 9 - tell is 8 after syswrite of 3 more bytes ok 10 - Contents are correct # --- tell() after write then read (read+write mode) --- ok 11 - tell is 11 after writing 'Hello World' ok 12 - tell is 0 after seeking to start ok 13 - Read back 'Hello' ok 14 - tell is 5 after reading 5 bytes # --- tell() after append mode --- ok 15 - tell is 13 after appending to 'existing' ok 16 - Contents are correct # --- printing undef does not change tell --- ok 17 - tell is 3 after printing 'ABC' ok 18 - tell unchanged after printing undef ok 19 - Contents are correct # --- print with explicit output record separator --- ok 20 - tell is 6 after print with ORS (5 chars + newline) ok 21 - Contents include newline from output record separator # --- +< mode: seek + print overwrites at tell position --- ok 22 - tell is 6 after seek ok 23 - tell is 11 after printing 5 bytes at position 6 ok 24 - Overwrite at position 6 replaces 'World' with 'Perl!' # --- +< mode: seek + print does not extend past original when write fits --- ok 25 - Overwrite at position 3 replaces 2 bytes # --- +< mode: print at tell 0 overwrites from start --- ok 26 - Print at position 0 overwrites first 3 bytes # --- +< mode: print extending past end grows the file --- ok 27 - Print past end extends the file ok 28 - File length is 9 # --- >> mode: seek then print still appends --- ok 29 - Append mode ignores seek position # --- +< mode: interleaved read and write --- ok 30 - Read 'Hello' ok 31 - tell is 5 after read ok 32 - tell is 11 after write ok 33 - Interleaved read+write produces correct output # --- > mode: print writes at tell position (not append) --- ok 34 - tell is 8 after initial write ok 35 - tell is 4 after overwrite ok 36 - Overwrite in > mode at seek position # --- syswrite must NOT inherit output record separator ($\) --- ok 37 - tell is 5 after syswrite (no ORS added) ok 38 - syswrite ignores $\ — no newline appended # --- syswrite must NOT inherit output field separator ($,) --- ok 39 - tell is 5 after syswrite with $, set ok 40 - syswrite ignores $, — no separator # --- syswrite returns byte count, not boolean --- ok 41 - syswrite returns 5 for 5 bytes written ok 42 - syswrite returns 2 for 2 bytes written ok 43 - syswrite returns 3 even with $\ set (not 4) ok 44 - All syswrite data correct, no ORS # --- contrast: print DOES use $\ while syswrite does NOT --- ok 45 - print appends ORS, syswrite does not # --- syswrite on read-only handle returns EBADF --- ok 46 - syswrite on read-only handle returns 0 ok 47 - errno is EBADF for syswrite on read-only handle # --- syswrite with negative offset (counts from end of buffer) --- ok 48 - syswrite with negative offset returns bytes written ok 49 - syswrite with offset -2 writes last 2 bytes of buffer # --- syswrite with negative offset past buffer start → error --- ok 50 - syswrite with offset past buffer start returns 0 ok 51 - errno is EINVAL for out-of-bounds negative offset ok 52 - warning emitted for out-of-bounds negative offset ok 53 - no data written on out-of-bounds negative offset # --- syswrite with positive offset past buffer end → error --- ok 54 - syswrite with offset past buffer end returns 0 ok 55 - errno is EINVAL for out-of-bounds positive offset ok 56 - warning emitted for out-of-bounds positive offset ok 57 - no data written on out-of-bounds positive offset # --- syswrite with len exceeding available data (truncates silently) --- ok 58 - syswrite returns actual bytes written when len exceeds buffer ok 59 - syswrite truncates to available data # --- printf must NOT inherit output record separator ($\) --- ok 60 - tell is 8 after printf (no ORS added) ok 61 - printf ignores $\ — no newline appended # --- contrast: print uses $\, printf and syswrite do not --- ok 62 - print appends ORS; printf and syswrite do not ok 63 - No mock files are in cache 1..63 ok t/writeline.t ....................... # Seeded srand with seed '20260629' from local date. # -------------- REAL MODE -------------- ok 1 - tempfile originally writes out 16 bytes ok 2 - Open file for overwrite ok 3 - $real_fh stringifies to a GLOB ok 4 - Close $real_fh ok 5 - $! hasn't been cleared ok 6 - Temp file is on disk and right size assuming a re-write happened. # -------------- MOCK MODE -------------- ok 7 - Mocked temp file opens for write and returns true ok 8 - $fh is a IO::File ok 9 - $fh stringifies to a IO::File GLOB ok 10 - overwrite the contents ok 11 - $foo->contents reflects an overwrite ok 12 - Close $fh ok 13 - $! hasn't been cleared ok 14 - Re-open $fh for append ok 15 - Append line ok 16 - printf returns 1 (success) ok 17 - $foo->contents reflects an append ok 18 - Printing undef returns 1 (success) and is not a warning. ok 19 - Printing empty string returns 1 (success), not 0 ok 20 - print empty string is truthy (print or die pattern works) ok 21 - Close $fh ok 22 - $! hasn't been cleared # -------------- REAL MODE -------------- ok 23 - Temp file on disk is unaltered once $bar is clear. 1..23 ok Test Summary Report ------------------- t/plugin.t (Wstat: 256 (exited 1) Tests: 6 Failed: 1) Failed test: 1 Non-zero exit status: 1 Files=89, Tests=1553, 27 wallclock secs ( 0.22 usr 0.13 sys + 10.01 cusr 2.81 csys = 13.17 CPU) Result: FAIL Failed 1/89 test programs. 1/1553 subtests failed. make[1]: *** [Makefile:886: test_dynamic] Error 255 make[1]: Leaving directory '/build/libtest-mockfile-perl-5wijpO/libtest-mockfile-perl-0.039' dh_auto_test: error: make -j2 test TEST_VERBOSE=1 returned exit code 2 make: *** [debian/rules:7: binary] Error 25 dpkg-buildpackage: error: debian/rules binary subprocess failed with exit status 2 -------------------------------------------------------------------------------- Build finished at 2026-06-29T00:34:59Z Finished -------- +------------------------------------------------------------------------------+ | Cleanup Mon, 29 Jun 2026 00:34:59 +0000 | +------------------------------------------------------------------------------+ Purging /build/libtest-mockfile-perl-5wijpO Not cleaning session: cloned chroot in use E: Build failure (dpkg-buildpackage died with exit 2) +------------------------------------------------------------------------------+ | Summary Mon, 29 Jun 2026 00:35:00 +0000 | +------------------------------------------------------------------------------+ Build Architecture: amd64 Build Type: full Build-Space: 1284 Build-Time: 29 Distribution: perl-5.44-throwaway Fail-Stage: build Host Architecture: amd64 Install-Time: 5 Job: /srv/debomatic/incoming/libtest-mockfile-perl_0.039-1.dsc Machine Architecture: amd64 Package: libtest-mockfile-perl Package-Time: 37 Source-Version: 0.039-1 Space: 1284 Status: attempted Version: 0.039-1 -------------------------------------------------------------------------------- Finished at 2026-06-29T00:34:59Z Build needed 00:00:37, 1284k disk space