You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.3 KiB
163 lines
5.3 KiB
From bbb2a0de816f0cb506a0bdb34c9ca7ba94e53f9a Mon Sep 17 00:00:00 2001
|
|
From: Kent Fredric <kentnl@gentoo.org>
|
|
Date: Fri, 18 Sep 2020 04:53:23 +1200
|
|
Subject: Enable overriding tempdir used for base of fuse mounts
|
|
|
|
- Add 5 new external variables to control locations for mountpoints,
|
|
scratch directories, pid files and logs:
|
|
- FUSE_TEMPDIR (weak support) : Change the base directory for various
|
|
path defaults
|
|
- FUSE_MOUNTPOINT : Change where the test filesystem is mounted
|
|
- FUSE_TESTMOUNT : Change the path to the "fusetest-" directory used
|
|
in various tests
|
|
- FUSE_PIDFILE : Change the path to the PID file for the fuse daemon
|
|
- FUSE_LOGFILE : Change the path to the log file for the fuse daemon
|
|
- Convert stringy $_opts into a proper array to avoid path escaping
|
|
headaches.
|
|
- Use `opendir` to check existence/traversability of the mountpoint
|
|
instead of a cruddy stringy system($string) call, avoiding need for
|
|
stdout redirection and dangerous path handling, as well as removing
|
|
the need for POSIX module hacks to check the exit status of "ls"
|
|
- Use array based invocation of the $_loop script to avoid problems with
|
|
path handling/escaping
|
|
- Use list-mode system(@args) for `rm` call to avoid dangerous
|
|
nightmares in path handling/escaping.
|
|
- Use native perl file IO for reading pid files instead of consuming the
|
|
output of a system("cat"), both avoiding a lot of silly shenanigans
|
|
with IPC and path handling/escaping
|
|
|
|
Signed-off-by: Kent Fredric <kentnl@gentoo.org>
|
|
---
|
|
examples/loopback.pl | 7 ++++++-
|
|
test/helper.pm | 40 ++++++++++++++++++++++++++++++----------
|
|
test/s/mount.t | 24 +++++++++++++++++-------
|
|
3 files changed, 53 insertions(+), 18 deletions(-)
|
|
|
|
diff --git a/examples/loopback.pl b/examples/loopback.pl
|
|
index ef53e9d..c1ddfc2 100755
|
|
--- a/examples/loopback.pl
|
|
+++ b/examples/loopback.pl
|
|
@@ -65,7 +65,12 @@ GetOptions(
|
|
'logfile=s' => \$logfile,
|
|
) || die('Error parsing options');
|
|
|
|
-sub fixup { return "/tmp/fusetest-" . $ENV{LOGNAME} . shift }
|
|
+sub fixup {
|
|
+ my $tempdir = $ENV{FUSE_TESTMOUNT};
|
|
+ $tempdir = "/tmp/fusetest-" . $ENV{LOGNAME}
|
|
+ unless defined $tempdir and length $tempdir;
|
|
+ return $tempdir . shift;
|
|
+}
|
|
|
|
sub x_getattr {
|
|
my ($file) = fixup(shift);
|
|
diff --git a/test/helper.pm b/test/helper.pm
|
|
index f210105..f24f2a4 100644
|
|
--- a/test/helper.pm
|
|
+++ b/test/helper.pm
|
|
@@ -4,15 +4,37 @@ package # avoid cpan indexing
|
|
use strict;
|
|
use Exporter;
|
|
use Config;
|
|
-use POSIX qw(WEXITSTATUS);
|
|
our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
|
|
@ISA = "Exporter";
|
|
-@EXPORT_OK = qw($_loop $_opts $_point $_pidfile $_real);
|
|
-my $tmp = -d '/private' ? '/private/tmp' : '/tmp';
|
|
-our($_loop, $_point, $_pidfile, $_real, $_opts) = ('examples/loopback.pl',"$tmp/fusemnt-".$ENV{LOGNAME},$ENV{'PWD'} . "/test/s/mounted.pid","$tmp/fusetest-".$ENV{LOGNAME}, '');
|
|
-$_opts = ' --pidfile ' . $_pidfile;
|
|
-$_opts .= ' --logfile /tmp/fusemnt.log';
|
|
-$_opts .= $Config{useithreads} ? ' --use-threads' : '';
|
|
+@EXPORT_OK = qw($_loop @_opts $_point $_pidfile $_real);
|
|
+
|
|
+our $_loop = 'examples/loopback.pl';
|
|
+my $tmp = $ENV{FUSE_TEMPDIR};
|
|
+$tmp = -d '/private' ? '/private/tmp' : '/tmp'
|
|
+ unless defined $tmp and length $tmp;
|
|
+
|
|
+our $_point = $ENV{FUSE_MOUNTPOINT};
|
|
+$_point = "$tmp/fusemnt-$ENV{LOGNAME}"
|
|
+ unless defined $_point and length $_point;
|
|
+
|
|
+our $_pidfile = $ENV{FUSE_PIDFILE};
|
|
+$_pidfile = "$ENV{PWD}/test/s/mounted.pid"
|
|
+ unless defined $_pidfile and length $_pidfile;
|
|
+
|
|
+our $_real = $ENV{FUSE_TESTMOUNT};
|
|
+$_real = "$tmp/fusetest-$ENV{LOGNAME}"
|
|
+ unless defined $_real and length $_real;
|
|
+
|
|
+our $_logfile = $ENV{FUSE_LOGFILE};
|
|
+$_logfile = "/tmp/fusemnt.log"
|
|
+ unless defined $_logfile and length $_logfile;
|
|
+
|
|
+our @_opts = (
|
|
+ '--pidfile' => $_pidfile,
|
|
+ '--logfile' => $_logfile,
|
|
+ ( $Config{useithreads} ? '--use-threads' : () ),
|
|
+);
|
|
+
|
|
if($0 !~ qr|s/u?mount\.t$|) {
|
|
my ($reject) = 1;
|
|
if(open my $fh, '<', $_pidfile) {
|
|
@@ -27,8 +49,6 @@ if($0 !~ qr|s/u?mount\.t$|) {
|
|
}
|
|
}
|
|
}
|
|
- system("ls $_point >/dev/null");
|
|
- $reject = 1 if (POSIX::WEXITSTATUS($?));
|
|
- die "not properly mounted\n" if $reject;
|
|
+ opendir my $dfh, $_point or die "$_point not properly mounted: $!";
|
|
}
|
|
1;
|
|
diff --git a/test/s/mount.t b/test/s/mount.t
|
|
index 0f545b7..3bf65c6 100644
|
|
--- a/test/s/mount.t
|
|
+++ b/test/s/mount.t
|
|
@@ -1,6 +1,6 @@
|
|
#!/usr/bin/perl -w
|
|
use lib './test/';
|
|
-use helper qw($_point $_loop $_opts $_real $_pidfile);
|
|
+use helper qw($_point $_loop @_opts $_real $_pidfile);
|
|
use strict;
|
|
use Errno qw(:POSIX);
|
|
use Test::More tests => 3;
|
|
@@ -21,7 +21,7 @@ open REALSTDOUT, '>&STDOUT';
|
|
open REALSTDERR, '>&STDERR';
|
|
open STDOUT, '>', '/dev/null';
|
|
open STDERR, '>&', \*STDOUT;
|
|
-system("perl -Iblib/lib -Iblib/arch $_loop $_opts $_point");
|
|
+system('perl','-Iblib/lib','-Iblib/arch',$_loop, @_opts, $_point);
|
|
open STDOUT, '>&', \*REALSTDOUT;
|
|
open STDERR, '>&', \*REALSTDERR;
|
|
|
|
@@ -33,10 +33,20 @@ while ($count++ < 50 && !$success) {
|
|
diag "Mounted in ", $count/10, " secs";
|
|
|
|
ok($success,"mount succeeded");
|
|
-system("rm -rf $_real");
|
|
-unless($success) {
|
|
- kill('INT',`cat $_pidfile`);
|
|
- unlink($_pidfile);
|
|
-} else {
|
|
+
|
|
+system("rm","-vrf",$_real);
|
|
+if ($success) {
|
|
mkdir($_real);
|
|
+} else {
|
|
+ my $pid;
|
|
+ if ( open my $fh, '<', "$_pidfile" ) {
|
|
+ local $/ = undef;
|
|
+ $pid = scalar <$fh>;
|
|
+ } else {
|
|
+ warn "Can't read pidfile $_pidfile, $!"
|
|
+ }
|
|
+ if ( $pid ) {
|
|
+ kill('INT',$pid);
|
|
+ }
|
|
+ unlink($_pidfile);
|
|
}
|
|
--
|
|
2.28.0
|
|
|