From 903d285751b427c737f4b9c304b2d2f74852e81f Mon Sep 17 00:00:00 2001 From: Fiona Ebner Date: Thu, 14 Nov 2024 16:07:34 +0100 Subject: [PATCH] test: have lock file test use run_fork() helper There are differences for error handling in the old and new helper, in particular when the child is signaled. But the test here does not explicitly check for specific error conditions or messages and is therefore still correct with the new helper. Signed-off-by: Fiona Ebner --- test/lock_file.pl | 110 +++++++++++++++------------------------------- 1 file changed, 35 insertions(+), 75 deletions(-) diff --git a/test/lock_file.pl b/test/lock_file.pl index 4cb8b15..cd3f433 100755 --- a/test/lock_file.pl +++ b/test/lock_file.pl @@ -11,50 +11,6 @@ use PVE::Tools 'lock_file_full'; my $name = "test.lockfile.$$-"; -# Utilities: - -sub forked($$) { - my ($code1, $code2) = @_; - - pipe(my $except_r, my $except_w) or die "pipe: $!\n"; - - my $pid = fork(); - die "fork failed: $!\n" if !defined($pid); - - if ($pid == 0) { - close($except_r); - eval { $code1->() }; - if ($@) { - print {$except_w} $@; - $except_w->flush(); - POSIX::_exit(1); - } - POSIX::_exit(0); - } - close($except_w); - - eval { $code2->() }; - my $err = $@; - if ($err) { - kill(15, $pid); - } else { - my $err = do { local $/ = undef; <$except_r> }; - } - die "interrupted\n" if waitpid($pid, 0) != $pid; - die $err if $err; - - # Check exit code: - my $status = POSIX::WEXITSTATUS($?); - if ($? == -1) { - die "failed to execute\n"; - } elsif (POSIX::WIFSIGNALED($?)) { - my $sig = POSIX::WTERMSIG($?); - die "got signal $sig\n"; - } elsif ($status != 0) { - die "exit code $status\n"; - } -} - # Book-keeping: my %_ran; @@ -82,38 +38,42 @@ sub forktest1($) { # socket pair for synchronization socketpair(my $fmain, my $fother, AF_UNIX, SOCK_STREAM, PF_UNSPEC) or die "socketpair(): $!\n"; - forked sub { - # other side - close($fmain); - my $line; - lock_file_full($name, 60, $shared, sub { - ran('other side'); - # tell parent we've acquired the lock - print {$fother} "1\n"; - $fother->flush(); - # wait for parent to be done trying to lock - $line = <$fother>; - }); - die $@ if $@; - die "parent failed\n" if !$line || $line ne "2\n"; - assert('other side'); - }, sub { - # main process - # Wait for our child to lock: - close($fother); - my $line = <$fmain>; - die "child failed to acquire a lock\n" if !$line || $line ne "1\n"; - lock_file_full($name, 1, $shared, sub { - ran('local side'); - }); - if ($shared) { - assert('local side'); - } else { - assert_not('local side'); - } - print {$fmain} "2\n"; - $fmain->flush(); + my $other = sub { + # other side + close($fmain); + my $line; + lock_file_full($name, 60, $shared, sub { + ran('other side'); + # tell parent we've acquired the lock + print {$fother} "1\n"; + $fother->flush(); + # wait for parent to be done trying to lock + $line = <$fother>; + }); + die $@ if $@; + die "parent failed\n" if !$line || $line ne "2\n"; + assert('other side'); + return; }; + my $main = sub { + # main process + # Wait for our child to lock: + close($fother); + my $line = <$fmain>; + die "child failed to acquire a lock\n" if !$line || $line ne "1\n"; + lock_file_full($name, 1, $shared, sub { + ran('local side'); + }); + if ($shared) { + assert('local side'); + } else { + assert_not('local side'); + } + print {$fmain} "2\n"; + $fmain->flush(); + }; + + PVE::Tools::run_fork($other, { afterfork => $main }); close($fmain); }