#!/usr/bin/perl -w use strict; use warnings; use Test2::Bundle::Extended; use Test2::Tools::Explain; use Test2::Plugin::NoWarnings; use Errno qw/ENOENT EISDIR/; use File::Temp qw/tempfile tempdir/; my $temp_dir_name = tempdir( CLEANUP => 1 ); my ( undef, $missing_file_name ) = tempfile(); CORE::unlink($missing_file_name); my ( $fh, $existing_file_name ) = tempfile(); print $fh "This is the real file\n"; close $fh; use Test::MockFile (); subtest 'unlink on a missing file' => sub { $! = 0; is( CORE::unlink($missing_file_name), 0, "REAL CORE::unlink returns 0 files deleted." ); is( $! + 0, ENOENT, '$! is set to ENOENT' ); my $mock = Test::MockFile->file($missing_file_name); $! = 0; is( unlink($missing_file_name), 0, "MOCKED unlink returns 0 files deleted." ); is( $! + 0, ENOENT, '$! is set to ENOENT' ); }; subtest 'unlink on an existing directory' => sub { $! = 0; is( CORE::unlink($temp_dir_name), 0, "REAL CORE::unlink returns 0 files deleted." ); my $real_dir_unlink_error = $! + 0; my $mock = Test::MockFile->dir($temp_dir_name); ok( !-d $temp_dir_name, 'Directory does not exist yet' ); ok( mkdir($temp_dir_name), 'Created directory successfully' ); ok( -d $temp_dir_name, 'Directory now exists' ); $! = 0; is( unlink($temp_dir_name), 0, "MOCKED unlink returns 0 files deleted." ); SKIP: { skip q{This docker container doesn't emit $! failures reliably.}, 1 if on_broken_docker(); is( $! + 0, $real_dir_unlink_error, '$! is set to EISDIR' ); } }; subtest 'unlink on an existing file' => sub { $! = 0; is( CORE::unlink($existing_file_name), 1, "REAL CORE::unlink returns 1 files deleted." ); is( $! + 0, 0, '$! remains 0' ); my $mock = Test::MockFile->file( $existing_file_name, "abc" ); $! = 0; is( unlink($existing_file_name), 1, "MOCKED unlink returns 1 files deleted." ); is( $! + 0, 0, '$! remains 0' ); }; subtest 'unlink on an unmocked file' => sub { CORE::open( $fh, '>', $existing_file_name ) or die; print $fh "This is the real file\n"; close $fh; $! = 0; is( unlink($existing_file_name), 1, "MOCKED unlink returns 1 files deleted." ); is( $! + 0, 0, '$! remains 0' ); is( CORE::open( $fh, '<', $existing_file_name ), undef, "CORE::open fails since the file is removed from disk" ); is( $! + 0, ENOENT, '$! becomes ENOENT' ); }; done_testing(); sub on_broken_docker { return 0 if $] > 5.019; return 0 unless -f '/.dockerenv'; return 1; }