summaryrefslogtreecommitdiff
path: root/t/locking.t
diff options
context:
space:
mode:
Diffstat (limited to 't/locking.t')
-rw-r--r--t/locking.t45
1 files changed, 45 insertions, 0 deletions
diff --git a/t/locking.t b/t/locking.t
new file mode 100644
index 0000000..0c56f29
--- /dev/null
+++ b/t/locking.t
@@ -0,0 +1,45 @@
+use 5.008001;
+use strict;
+use warnings;
+use Test::More 0.96;
+use File::Spec;
+use Cwd;
+
+use lib 't/lib';
+use TestUtils qw/exception/;
+
+use Fcntl ':flock';
+use Path::Tiny;
+
+my $IS_BSD = $^O =~ /bsd$/;
+
+if ($IS_BSD) {
+ # is temp partition lockable?
+ my $file = Path::Tiny->tempfile;
+ open my $fh, ">>", $file;
+ flock $fh, LOCK_EX
+ or plan skip_all => "Can't lock tempfiles on this OS/filesystem";
+}
+
+subtest 'write locks blocks read lock' => sub {
+ my $file = Path::Tiny->tempfile;
+ ok $file, "Got a tempfile";
+ my $fh = $file->openw( { locked => 1 } );
+ ok $fh, "Opened file for writing with lock";
+ $fh->autoflush(1);
+ print {$fh} "hello";
+ # check if a different process can get a lock; use RW mode for AIX
+ my $locktester = Path::Tiny->tempfile;
+ $locktester->spew(<<"HERE");
+use strict;
+use warnings;
+use Fcntl ':flock';
+open my \$fh, "+<", "$file";
+exit flock( \$fh, LOCK_SH|LOCK_NB );
+HERE
+ my $rc = system( $^X, $locktester );
+ isnt( $rc, -1, "ran process to try to get lock" );
+ is( $rc >> 8, 0, "process failed to get lock" );
+};
+
+done_testing;