1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
my $I = 4; # number for forks
my $N = 100; # number of uuids / fork
use strict;
use warnings;
use Test::More;
use MyNote;
use File::Temp;
use vars qw($tmpdir $dat $sem);
BEGIN {
$tmpdir = File::Temp->newdir(CLEANUP => 0);
$dat = File::Temp::tempnam($tmpdir, 'UUID.test.');
$sem = File::Temp::tempnam($tmpdir, 'UUID.test.');
pass 'began';
}
use UUID 'uuid4';
my $seen = {};
# Comment this to simulate a prefork process that
# doesnt actually use UUID in the parent.
#++$seen->{uuid4()} for 1 .. $N;
for my $i ( 1 .. $I ) {
my $kid = fork;
if (!defined($kid)) {
fail "fork$i";
}
else {
if (!$kid) {
open my $fh, '>', $dat or err("open: $dat: $!");
print $fh uuid4()."\n"
for 1 .. $N;
open $fh, '>', $sem or err("open: $sem: $!");
exit 0;
}
pass "fork$i";
my $timer = 200;
while (!-e $sem) {
select undef, undef, undef, 0.01;
last unless --$timer > 0;
}
cmp_ok $timer, '>', 0, "timer$i";
if ($timer > 0) {
open my $fh, '<', $dat or err("open: $dat: $!");
++$seen->{$_} for map{chomp;$_} <$fh>;
#ok !exists($seen->{uuid4()}), "unique$i $_"
# for 1 .. $N;
}
waitpid $kid, 0;
unlink $sem;
}
}
#use Data::Dumper;
#note "$_\n" for split /\n/, Dumper($seen);
is scalar(keys %$seen), $I*$N, 'seen';
cleanup();
done_testing;
sub err {
my $error = shift;
my (undef, $F, $L) = caller;
cleanup();
die "$error at $F line $L\n";
}
sub cleanup {
unlink $dat if defined $dat;
unlink $sem if defined $sem;
rmdir $tmpdir if defined $tmpdir;
}
|