The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use File::Temp;
use Test::More tests => 12;
use IPC::ConcurrencyLimit;

# TMPDIR will hopefully put it in the logical equivalent of
# a /tmp. That is important because no sane admin will mount /tmp
# via NFS and we don't want to fail tests just because we're being
# built/tested on an NFS share.
my $tmpdir = File::Temp::tempdir( CLEANUP => 1, TMPDIR => 1 );

my @shared_opt = (
  path => $tmpdir,
  max_procs => 1,
  lock_mode => 'shared',
);
my @exclusive_opt = (
  path => $tmpdir,
  max_procs => 1,
  lock_mode => 'exclusive',
);

SCOPE: {
  my $limit = IPC::ConcurrencyLimit->new(@shared_opt);
  isa_ok($limit, 'IPC::ConcurrencyLimit');

  my $id = $limit->get_lock;
  ok($id, 'Got lock');

  my $idr = $limit->get_lock;
  is($idr, $id, 'Repeated call to lock returns same id');

  my $limit2 = IPC::ConcurrencyLimit->new(@shared_opt);
  my $id2 = $limit2->get_lock();
  ok($id2, 'Got second lock');
  is($id2, $id, 'Lock ids are equal');

  INNER: {
    my $limit3 = IPC::ConcurrencyLimit->new(@shared_opt);
    my $id3 = $limit3->get_lock();
    is($id3, $id, 'Lock ids are equal') or diag("id=$id, id3=$id3");

    my $exlimit = IPC::ConcurrencyLimit->new(@exclusive_opt);
    my $exid = $exlimit->get_lock();
    ok(!defined($exid), "Could not get exclusive lock") or diag("id=$id exid=$exid");
  } # end INNER

  my $exlimit = IPC::ConcurrencyLimit->new(@exclusive_opt);
  my $exid = $exlimit->get_lock();
  ok(!defined($exid), "Could not get exclusive lock");
}

SCOPE: {
  my $limit = IPC::ConcurrencyLimit->new(@exclusive_opt);
  isa_ok($limit, 'IPC::ConcurrencyLimit');

  my $id = $limit->get_lock;
  ok($id, 'Got lock');

  my $limit2 = IPC::ConcurrencyLimit->new(@shared_opt);
  my $id2 = $limit2->get_lock();
  ok(!defined($id2), "Could not get shared lock on exclusively locked item");

  my $limit3 = IPC::ConcurrencyLimit->new(@exclusive_opt);
  my $id3 = $limit3->get_lock();
  ok(!defined($id3), "Could not get ex lock on exclusively locked item");
}