#!/usr/bin/perl -w
use strict;
use Test::More;
use Fcntl qw(:flock);
use POSIX qw(EWOULDBLOCK EAGAIN);
use Config;
require Fatal;
my $EWOULDBLOCK = eval { EWOULDBLOCK() }
|| $Fatal::_EWOULDBLOCK{$^O}
|| plan skip_all => "EWOULDBLOCK not defined on this system";
my $try_EAGAIN = ($^O eq 'linux' and $Config{archname} =~ /hppa|parisc/) ? 1 : 0;
my $EAGAIN = eval { EAGAIN() };
my ($self_fh, $self_fh2);
eval {
use autodie;
open($self_fh, '<', $0);
open($self_fh2, '<', $0);
open(SELF, '<', $0);
};
if ($@) {
plan skip_all => "Cannot lock this test on this system.";
}
my $flock_return = eval { flock($self_fh, LOCK_EX | LOCK_NB); };
if (not $flock_return) {
plan skip_all => "flock on my own test not supported on this system.";
}
my $flock_return2 = flock($self_fh2, LOCK_EX | LOCK_NB);
if ($flock_return2) {
plan skip_all => "this test requires locking a file twice with ".
"different filehandles to fail";
}
$flock_return = flock($self_fh, LOCK_UN);
if (not $flock_return) {
plan skip_all => "Odd, I can't unlock a file with flock on this system.";
}
# If we're here, then we can lock and unlock our own file.
plan 'no_plan';
ok( flock($self_fh, LOCK_EX | LOCK_NB), "Test file locked");
my $return;
eval {
use autodie qw(flock);
$return = flock($self_fh2, LOCK_EX | LOCK_NB);
};
if (!$try_EAGAIN) {
is($!+0, $EWOULDBLOCK, "Double-flocking should be EWOULDBLOCK");
} else {
ok($!+0 == $EWOULDBLOCK || $!+0 == $EAGAIN, "Double-flocking should be EWOULDBLOCK or EAGAIN");
}
ok(!$return, "flocking a file twice should fail");
is($@, "", "Non-blocking flock should not fail on EWOULDBLOCK");
__END__
# These are old tests which I'd love to resurrect, but they need
# a reliable way of getting flock to throw exceptions but with
# minimal blocking. They may turn into author tests.
eval {
use autodie;
flock($self_fh2, LOCK_EX | LOCK_NB);
};
ok($@, "Locking a file twice throws an exception with vanilla autodie");
isa_ok($@, "autodie::exception", "Exception is from autodie::exception");
like($@, qr/LOCK_EX/, "error message contains LOCK_EX switch");
like($@, qr/LOCK_NB/, "error message contains LOCK_NB switch");
unlike($@, qr/GLOB/ , "error doesn't include ugly GLOB mention");
eval {
use autodie;
flock(SELF, LOCK_EX | LOCK_NB);
};
ok($@, "Locking a package filehanlde twice throws exception with vanilla autodie");
isa_ok($@, "autodie::exception", "Exception is from autodie::exception");
like($@, qr/LOCK_EX/, "error message contains LOCK_EX switch");
like($@, qr/LOCK_NB/, "error message contains LOCK_NB switch");
like($@, qr/SELF/ , "error mentions actual filehandle name.");