#!perl

use strict;
use warnings (FATAL => 'all');
use Test::More;
use Test::Exception;
use File::Temp qw(tmpnam);
use File::Lock::Multi;
use Time::HiRes qw(time sleep);
use Test::Fork;

sub inner;
sub outer;

eval 'use Linux::Fuser 1.5';

if($@) {
  plan skip_all => "Linux::Fuser is not installed";
} else {
  eval 'use File::Lock::Multi::Fuser; 1' or die $@;
  plan tests => 7;
}

my $file = tmpnam;

if(my $kid = fork_ok(2, \&inner)) {
  outer;
} else {
  die "fork() failed!";
}

sub outer {
  my $l = File::Lock::Multi::Fuser->new(file => $file);
  ok($l->lock, "outer proc got a lock");
  diag("parent hanging onto lock to help child's test");
  sleep(2);
  ok($l->release, "released");
  diag("parent waiting for lock to not be lockable");
  sleep(0.2) until !$l->lockable;
  diag("no longer lockable -- waiting for release");
  my $st = time;
  ok($l->lock, "outer proc (eventually) got a lock");
  my $et = time;
  my $dt = $et - $st;
  TODO: {
    local $TODO = "This fails on Centos 5.2 in some circumstances.";
    ok($dt > 1, "blocked until our child exited");
  }
}

sub inner {
  my $l = File::Lock::Multi::Fuser->new(file => $file);
  sleep 1;
  diag("child waiting for lock to not be lockable");
  sleep(0.2) until !$l->lockable;
  diag("child attempting to lock");
  my $st = time;
  ok($l->lock, "inner proc (eventually) got a lock");
  my $et = time;
  my $dt = $et - $st;
  ok($dt > 1, "blocked until our parent released");
  diag("child hanging onto lock to help parent's test");
  sleep(2);
}