On Mon, Mar 18, 2002 at 03:57:55AM -0500, Mark-Jason Dominus wrote: > Actually that reminds me of another puzzle I have. My module provides > an interface to 'flock'. What is an easy way to check that the file > is actually being locked? I put off writing the tests because i did > not want to fork.
I just thought of a clever way to do it without alarm! Just use non-blocking mode. lock_file($foo); open(FH, $foo); ok( !flock(FH, LOCK_NB | LOCK_EX) ); if the flock fails the file is already locked. The traditional approaches require causing a deadlock and breaking it with alarm. my $start = time; lock_file($foo); eval { local $SIG{ALRM} = sub { die "ALARM!\n" }; alarm 5; lock_file($foo); alarm 0; }; is( $@, "ALARM\n" ); can_ok( time, '>', $start + 3, 'Locking works' ); I check both the time and the alarm for thoroughness. I have had a few issues with this on 5.6.0 where, for some odd reason, everything dies correctly but the "ALARM!\n" message goes to STDERR and not to $@. I can't duplicate it outside the context of a single program, so you might be safe. So here's the other way. We cause a deadlock using another process which kills itself after a certain amount of time. my $start = time; lock_file($foo); system($^X, '-e', 'use Whatever; alarm 5; lock_file($foo)'); cmp_ok( time, '>', $start + 3, 'Locking works' ); again, these all rely on alarm(). > Is this mailing list the right place to ask "how do I test for X" > questions? Or would the module-authors list be more appropriate? This is the right place. I'm keeping track of the questions & answers, someday there will be a FAQ. -- Michael G. Schwern <[EMAIL PROTECTED]> http://www.pobox.com/~schwern/ Perl Quality Assurance <[EMAIL PROTECTED]> Kwalitee Is Job One My lips, your breast and a whole lotta strange arguing.