diff mbox series

[testsuite,3/3] tests/[fs_]filesystem: test all filesystems

Message ID 20201031115601.157591-4-omosnace@redhat.com (mailing list archive)
State Superseded
Headers show
Series Test all filesystems by default | expand

Commit Message

Ondrej Mosnacek Oct. 31, 2020, 11:56 a.m. UTC
Run [fs_]filesystem tests always for all common filesystems (xfs, ext4,
jfs, vfat). Use symlinks to achieve this without changing much code
while still allowing to run the test script directly (optionally
specifying the filesystem type).

Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
---
 tests/Makefile           |  8 ++++++--
 tests/filesystem/ext4    |  1 +
 tests/filesystem/jfs     |  1 +
 tests/filesystem/test    | 14 ++++++++++++--
 tests/filesystem/vfat    |  1 +
 tests/filesystem/xfs     |  1 +
 tests/fs_filesystem/ext4 |  1 +
 tests/fs_filesystem/jfs  |  1 +
 tests/fs_filesystem/test | 14 ++++++++++++--
 tests/fs_filesystem/vfat |  1 +
 tests/fs_filesystem/xfs  |  1 +
 11 files changed, 38 insertions(+), 6 deletions(-)
 create mode 120000 tests/filesystem/ext4
 create mode 120000 tests/filesystem/jfs
 create mode 120000 tests/filesystem/vfat
 create mode 120000 tests/filesystem/xfs
 create mode 120000 tests/fs_filesystem/ext4
 create mode 120000 tests/fs_filesystem/jfs
 create mode 120000 tests/fs_filesystem/vfat
 create mode 120000 tests/fs_filesystem/xfs

Comments

Richard Haines Oct. 31, 2020, 6:05 p.m. UTC | #1
On Sat, 2020-10-31 at 12:56 +0100, Ondrej Mosnacek wrote:
> Run [fs_]filesystem tests always for all common filesystems (xfs,
> ext4,
> jfs, vfat). Use symlinks to achieve this without changing much code
> while still allowing to run the test script directly (optionally
> specifying the filesystem type).

These ran okay using 'make test', however when I moved to
tests/filesystem and ran ./test the fs_type was .. Also when I moved to
filesystems/xfs and ran ./test, the move mount failed because mount
does not like sym links and resolves to realpath.

I've had a go at fixing these and I've noted the changes below (please
feel free to rework). The fs_filesystem also has the same issues.
> 
> Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
> ---
>  tests/Makefile           |  8 ++++++--
>  tests/filesystem/ext4    |  1 +
>  tests/filesystem/jfs     |  1 +
>  tests/filesystem/test    | 14 ++++++++++++--
>  tests/filesystem/vfat    |  1 +
>  tests/filesystem/xfs     |  1 +
>  tests/fs_filesystem/ext4 |  1 +
>  tests/fs_filesystem/jfs  |  1 +
>  tests/fs_filesystem/test | 14 ++++++++++++--
>  tests/fs_filesystem/vfat |  1 +
>  tests/fs_filesystem/xfs  |  1 +
>  11 files changed, 38 insertions(+), 6 deletions(-)
>  create mode 120000 tests/filesystem/ext4
>  create mode 120000 tests/filesystem/jfs
>  create mode 120000 tests/filesystem/vfat
>  create mode 120000 tests/filesystem/xfs
>  create mode 120000 tests/fs_filesystem/ext4
>  create mode 120000 tests/fs_filesystem/jfs
>  create mode 120000 tests/fs_filesystem/vfat
>  create mode 120000 tests/fs_filesystem/xfs
> 
> diff --git a/tests/Makefile b/tests/Makefile
> index 001639b..b441031 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -4,6 +4,7 @@ SBINDIR ?= $(PREFIX)/sbin
>  POLDEV ?= $(PREFIX)/share/selinux/devel
>  INCLUDEDIR ?= $(PREFIX)/include
>  SELINUXFS ?= /sys/fs/selinux
> +FILESYSTEMS ?= ext4 xfs jfs vfat
>  
>  export CFLAGS+=-g -O0 -Wall -D_GNU_SOURCE
>  
> @@ -17,6 +18,9 @@ MOD_POL_VERS := $(shell $(CHECKMODULE) -V |cut -f 2
> -d '-')
>  MAX_KERNEL_POLICY := $(shell cat $(SELINUXFS)/policyvers)
>  POL_TYPE := $(shell ./pol_detect $(SELINUXFS))
>  
> +# Filter out unavailable filesystems
> +FILESYSTEMS := $(foreach fs,$(FILESYSTEMS),$(shell modprobe $(fs) &&
> echo $(fs)))
> +
>  SUBDIRS:= domain_trans entrypoint execshare exectrace
> execute_no_trans \
>  	fdreceive inherit link mkdir msg open ptrace readlink relabel
> rename \
>  	rxdir sem setattr setnice shm sigkill stat sysctl task_create \
> @@ -111,7 +115,7 @@ SUBDIRS += lockdown
>  endif
>  
>  ifeq ($(shell grep -q filesystem
> $(POLDEV)/include/support/all_perms.spt && echo true),true)
> -SUBDIRS += filesystem
> +SUBDIRS += $(addprefix filesystem/,$(FILESYSTEMS))
>  ifeq ($(shell grep -q all_filesystem_perms.*watch
> $(POLDEV)/include/support/all_perms.spt && echo true),true)
>  export CFLAGS += -DHAVE_FS_WATCH_PERM
>  endif
> @@ -119,7 +123,7 @@ endif
>  
>  ifeq ($(shell grep -q filesystem
> $(POLDEV)/include/support/all_perms.spt && echo true),true)
>  ifneq ($(shell ./kvercmp $$(uname -r) 5.2),-1)
> -SUBDIRS += fs_filesystem
> +SUBDIRS += $(addprefix fs_filesystem/,$(FILESYSTEMS))
>  endif
>  endif
>  
> diff --git a/tests/filesystem/ext4 b/tests/filesystem/ext4
> new file mode 120000
> index 0000000..945c9b4
> --- /dev/null
> +++ b/tests/filesystem/ext4
> @@ -0,0 +1 @@
> +.
> \ No newline at end of file
> diff --git a/tests/filesystem/jfs b/tests/filesystem/jfs
> new file mode 120000
> index 0000000..945c9b4
> --- /dev/null
> +++ b/tests/filesystem/jfs
> @@ -0,0 +1 @@
> +.
> \ No newline at end of file
> diff --git a/tests/filesystem/test b/tests/filesystem/test
> index 7d4654d..6b37b76 100755
> --- a/tests/filesystem/test
> +++ b/tests/filesystem/test
> @@ -12,6 +12,17 @@ BEGIN {
>      $basedir = $0;
>      $basedir =~ s|(.*)/[^/]*|$1|;
>  
> +    # extract test_name and move up one dir if started from a subdir
> +    $test_name = $basedir;
> +    $test_name =~ s|.*/([^/]*)|$1|;
> +    if ( $test_name eq "fs_filesystem" ) {
> +        $fs_type = " ";
> +    }
> +    else {
> +        $fs_type = $test_name;
> +        $basedir =~ s|(.*)/[^/]*|$1|;
> +    }
> +

I changed the above to this:

    # extract test_name and move up one dir if started from a subdir
    $test_name = $basedir;
    $test_name =~ s|.*/([^/]*)|$1|;
    if ( $test_name eq "." ) {
        $cwd = `pwd 2>/dev/null`;
        chomp($cwd);
        my($d_name) = ($cwd =~ m#/([^/]+)$#);
        if ( $d_name eq "filesystem" ) {
            $fs_type = " ";
        }
        else {
            $fs_type = $d_name;
        }
    }
    else {
        $fs_type = $test_name;
        $basedir =~ s|(.*)/[^/]*|$1|;
    }

>      # Options: -v Verbose, -e enable udisks(8) daemon, -f filesystem
> type
>      $v              = " ";
>      $disable_udisks = 1;
> @@ -20,8 +31,7 @@ BEGIN {
>      $nfs_enabled    = 0;
>      $vfat_enabled   = 0;
>  
> -    $i       = 0;
> -    $fs_type = " ";
> +    $i = 0;
>      foreach $arg (@ARGV) {
>          if ( $arg eq "-v" ) {
>              $v = $arg;



Also to fix the move mount sym link problem I changed:

# mount(2) MS_BIND | MS_PRIVATE requires an absolute path to a private
mount
# point before MS_MOVE
$cwd = `pwd 2>/dev/null`;
chomp($cwd);
if ( $basedir eq "." ) {
    $target = `realpath -e $cwd`;
    chomp($target);
    $private_path = "$target/mntpoint";
}
else {
    $private_path = "$cwd/$basedir/mntpoint";
}

The reason the move mount check failed was because I was passing the
original sym link paths such as: ..../tests/filesystem/vfat to mount.c
that had a compare to check if moved. However it was mounted on the
real path (..../tests/filesystem/..) not the sym link.

> diff --git a/tests/filesystem/vfat b/tests/filesystem/vfat
> new file mode 120000
> index 0000000..945c9b4
> --- /dev/null
> +++ b/tests/filesystem/vfat
> @@ -0,0 +1 @@
> +.
> \ No newline at end of file
> diff --git a/tests/filesystem/xfs b/tests/filesystem/xfs
> new file mode 120000
> index 0000000..945c9b4
> --- /dev/null
> +++ b/tests/filesystem/xfs
> @@ -0,0 +1 @@
> +.
> \ No newline at end of file
> diff --git a/tests/fs_filesystem/ext4 b/tests/fs_filesystem/ext4
> new file mode 120000
> index 0000000..945c9b4
> --- /dev/null
> +++ b/tests/fs_filesystem/ext4
> @@ -0,0 +1 @@
> +.
> \ No newline at end of file
> diff --git a/tests/fs_filesystem/jfs b/tests/fs_filesystem/jfs
> new file mode 120000
> index 0000000..945c9b4
> --- /dev/null
> +++ b/tests/fs_filesystem/jfs
> @@ -0,0 +1 @@
> +.
> \ No newline at end of file
> diff --git a/tests/fs_filesystem/test b/tests/fs_filesystem/test
> index 5dedf83..ec71d92 100755
> --- a/tests/fs_filesystem/test
> +++ b/tests/fs_filesystem/test
> @@ -12,6 +12,17 @@ BEGIN {
>      $basedir = $0;
>      $basedir =~ s|(.*)/[^/]*|$1|;
>  
> +    # extract test_name and move up one dir if started from a subdir
> +    $test_name = $basedir;
> +    $test_name =~ s|.*/([^/]*)|$1|;
> +    if ( $test_name eq "fs_filesystem" ) {
> +        $fs_type = " ";
> +    }
> +    else {
> +        $fs_type = $test_name;
> +        $basedir =~ s|(.*)/[^/]*|$1|;
> +    }
> +
>      # Some code in tests/filesystem is reused
>      $filesystem_dir = "$basedir/../filesystem";
>  
> @@ -23,8 +34,7 @@ BEGIN {
>      $nfs_enabled    = 0;
>      $vfat_enabled   = 0;
>  
> -    $i       = 0;
> -    $fs_type = " ";
> +    $i = 0;
>      foreach $arg (@ARGV) {
>          if ( $arg eq "-v" ) {
>              $v = $arg;
> diff --git a/tests/fs_filesystem/vfat b/tests/fs_filesystem/vfat
> new file mode 120000
> index 0000000..945c9b4
> --- /dev/null
> +++ b/tests/fs_filesystem/vfat
> @@ -0,0 +1 @@
> +.
> \ No newline at end of file
> diff --git a/tests/fs_filesystem/xfs b/tests/fs_filesystem/xfs
> new file mode 120000
> index 0000000..945c9b4
> --- /dev/null
> +++ b/tests/fs_filesystem/xfs
> @@ -0,0 +1 @@
> +.
> \ No newline at end of file
Ondrej Mosnacek Oct. 31, 2020, 8:43 p.m. UTC | #2
On Sat, Oct 31, 2020 at 7:05 PM Richard Haines
<richard_c_haines@btinternet.com> wrote:
> On Sat, 2020-10-31 at 12:56 +0100, Ondrej Mosnacek wrote:
> > Run [fs_]filesystem tests always for all common filesystems (xfs,
> > ext4,
> > jfs, vfat). Use symlinks to achieve this without changing much code
> > while still allowing to run the test script directly (optionally
> > specifying the filesystem type).
>
> These ran okay using 'make test', however when I moved to
> tests/filesystem and ran ./test the fs_type was .. Also when I moved to
> filesystems/xfs and ran ./test, the move mount failed because mount
> does not like sym links and resolves to realpath.
>
> I've had a go at fixing these and I've noted the changes below (please
> feel free to rework). The fs_filesystem also has the same issues.

Heh, I should've tried it before making that claim :)

> >
> > Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
> > ---
> >  tests/Makefile           |  8 ++++++--
> >  tests/filesystem/ext4    |  1 +
> >  tests/filesystem/jfs     |  1 +
> >  tests/filesystem/test    | 14 ++++++++++++--
> >  tests/filesystem/vfat    |  1 +
> >  tests/filesystem/xfs     |  1 +
> >  tests/fs_filesystem/ext4 |  1 +
> >  tests/fs_filesystem/jfs  |  1 +
> >  tests/fs_filesystem/test | 14 ++++++++++++--
> >  tests/fs_filesystem/vfat |  1 +
> >  tests/fs_filesystem/xfs  |  1 +
> >  11 files changed, 38 insertions(+), 6 deletions(-)
> >  create mode 120000 tests/filesystem/ext4
> >  create mode 120000 tests/filesystem/jfs
> >  create mode 120000 tests/filesystem/vfat
> >  create mode 120000 tests/filesystem/xfs
> >  create mode 120000 tests/fs_filesystem/ext4
> >  create mode 120000 tests/fs_filesystem/jfs
> >  create mode 120000 tests/fs_filesystem/vfat
> >  create mode 120000 tests/fs_filesystem/xfs
> >
[...]
> > diff --git a/tests/filesystem/test b/tests/filesystem/test
> > index 7d4654d..6b37b76 100755
> > --- a/tests/filesystem/test
> > +++ b/tests/filesystem/test
> > @@ -12,6 +12,17 @@ BEGIN {
> >      $basedir = $0;
> >      $basedir =~ s|(.*)/[^/]*|$1|;
> >
> > +    # extract test_name and move up one dir if started from a subdir
> > +    $test_name = $basedir;
> > +    $test_name =~ s|.*/([^/]*)|$1|;
> > +    if ( $test_name eq "fs_filesystem" ) {
> > +        $fs_type = " ";
> > +    }
> > +    else {
> > +        $fs_type = $test_name;
> > +        $basedir =~ s|(.*)/[^/]*|$1|;
> > +    }
> > +
>
> I changed the above to this:
>
>     # extract test_name and move up one dir if started from a subdir
>     $test_name = $basedir;
>     $test_name =~ s|.*/([^/]*)|$1|;
>     if ( $test_name eq "." ) {
>         $cwd = `pwd 2>/dev/null`;
>         chomp($cwd);
>         my($d_name) = ($cwd =~ m#/([^/]+)$#);
>         if ( $d_name eq "filesystem" ) {
>             $fs_type = " ";
>         }
>         else {
>             $fs_type = $d_name;
>         }
>     }
>     else {
>         $fs_type = $test_name;
>         $basedir =~ s|(.*)/[^/]*|$1|;
>     }

Yes, I'll need to use something similar. Thanks!

>
> >      # Options: -v Verbose, -e enable udisks(8) daemon, -f filesystem
> > type
> >      $v              = " ";
> >      $disable_udisks = 1;
> > @@ -20,8 +31,7 @@ BEGIN {
> >      $nfs_enabled    = 0;
> >      $vfat_enabled   = 0;
> >
> > -    $i       = 0;
> > -    $fs_type = " ";
> > +    $i = 0;
> >      foreach $arg (@ARGV) {
> >          if ( $arg eq "-v" ) {
> >              $v = $arg;
>
>
>
> Also to fix the move mount sym link problem I changed:
>
> # mount(2) MS_BIND | MS_PRIVATE requires an absolute path to a private
> mount
> # point before MS_MOVE
> $cwd = `pwd 2>/dev/null`;
> chomp($cwd);
> if ( $basedir eq "." ) {
>     $target = `realpath -e $cwd`;
>     chomp($target);
>     $private_path = "$target/mntpoint";
> }
> else {
>     $private_path = "$cwd/$basedir/mntpoint";
> }
>
> The reason the move mount check failed was because I was passing the
> original sym link paths such as: ..../tests/filesystem/vfat to mount.c
> that had a compare to check if moved. However it was mounted on the
> real path (..../tests/filesystem/..) not the sym link.

I think I might have a simpler way to solve this... I'll have to try it.
diff mbox series

Patch

diff --git a/tests/Makefile b/tests/Makefile
index 001639b..b441031 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -4,6 +4,7 @@  SBINDIR ?= $(PREFIX)/sbin
 POLDEV ?= $(PREFIX)/share/selinux/devel
 INCLUDEDIR ?= $(PREFIX)/include
 SELINUXFS ?= /sys/fs/selinux
+FILESYSTEMS ?= ext4 xfs jfs vfat
 
 export CFLAGS+=-g -O0 -Wall -D_GNU_SOURCE
 
@@ -17,6 +18,9 @@  MOD_POL_VERS := $(shell $(CHECKMODULE) -V |cut -f 2 -d '-')
 MAX_KERNEL_POLICY := $(shell cat $(SELINUXFS)/policyvers)
 POL_TYPE := $(shell ./pol_detect $(SELINUXFS))
 
+# Filter out unavailable filesystems
+FILESYSTEMS := $(foreach fs,$(FILESYSTEMS),$(shell modprobe $(fs) && echo $(fs)))
+
 SUBDIRS:= domain_trans entrypoint execshare exectrace execute_no_trans \
 	fdreceive inherit link mkdir msg open ptrace readlink relabel rename \
 	rxdir sem setattr setnice shm sigkill stat sysctl task_create \
@@ -111,7 +115,7 @@  SUBDIRS += lockdown
 endif
 
 ifeq ($(shell grep -q filesystem $(POLDEV)/include/support/all_perms.spt && echo true),true)
-SUBDIRS += filesystem
+SUBDIRS += $(addprefix filesystem/,$(FILESYSTEMS))
 ifeq ($(shell grep -q all_filesystem_perms.*watch $(POLDEV)/include/support/all_perms.spt && echo true),true)
 export CFLAGS += -DHAVE_FS_WATCH_PERM
 endif
@@ -119,7 +123,7 @@  endif
 
 ifeq ($(shell grep -q filesystem $(POLDEV)/include/support/all_perms.spt && echo true),true)
 ifneq ($(shell ./kvercmp $$(uname -r) 5.2),-1)
-SUBDIRS += fs_filesystem
+SUBDIRS += $(addprefix fs_filesystem/,$(FILESYSTEMS))
 endif
 endif
 
diff --git a/tests/filesystem/ext4 b/tests/filesystem/ext4
new file mode 120000
index 0000000..945c9b4
--- /dev/null
+++ b/tests/filesystem/ext4
@@ -0,0 +1 @@ 
+.
\ No newline at end of file
diff --git a/tests/filesystem/jfs b/tests/filesystem/jfs
new file mode 120000
index 0000000..945c9b4
--- /dev/null
+++ b/tests/filesystem/jfs
@@ -0,0 +1 @@ 
+.
\ No newline at end of file
diff --git a/tests/filesystem/test b/tests/filesystem/test
index 7d4654d..6b37b76 100755
--- a/tests/filesystem/test
+++ b/tests/filesystem/test
@@ -12,6 +12,17 @@  BEGIN {
     $basedir = $0;
     $basedir =~ s|(.*)/[^/]*|$1|;
 
+    # extract test_name and move up one dir if started from a subdir
+    $test_name = $basedir;
+    $test_name =~ s|.*/([^/]*)|$1|;
+    if ( $test_name eq "fs_filesystem" ) {
+        $fs_type = " ";
+    }
+    else {
+        $fs_type = $test_name;
+        $basedir =~ s|(.*)/[^/]*|$1|;
+    }
+
     # Options: -v Verbose, -e enable udisks(8) daemon, -f filesystem type
     $v              = " ";
     $disable_udisks = 1;
@@ -20,8 +31,7 @@  BEGIN {
     $nfs_enabled    = 0;
     $vfat_enabled   = 0;
 
-    $i       = 0;
-    $fs_type = " ";
+    $i = 0;
     foreach $arg (@ARGV) {
         if ( $arg eq "-v" ) {
             $v = $arg;
diff --git a/tests/filesystem/vfat b/tests/filesystem/vfat
new file mode 120000
index 0000000..945c9b4
--- /dev/null
+++ b/tests/filesystem/vfat
@@ -0,0 +1 @@ 
+.
\ No newline at end of file
diff --git a/tests/filesystem/xfs b/tests/filesystem/xfs
new file mode 120000
index 0000000..945c9b4
--- /dev/null
+++ b/tests/filesystem/xfs
@@ -0,0 +1 @@ 
+.
\ No newline at end of file
diff --git a/tests/fs_filesystem/ext4 b/tests/fs_filesystem/ext4
new file mode 120000
index 0000000..945c9b4
--- /dev/null
+++ b/tests/fs_filesystem/ext4
@@ -0,0 +1 @@ 
+.
\ No newline at end of file
diff --git a/tests/fs_filesystem/jfs b/tests/fs_filesystem/jfs
new file mode 120000
index 0000000..945c9b4
--- /dev/null
+++ b/tests/fs_filesystem/jfs
@@ -0,0 +1 @@ 
+.
\ No newline at end of file
diff --git a/tests/fs_filesystem/test b/tests/fs_filesystem/test
index 5dedf83..ec71d92 100755
--- a/tests/fs_filesystem/test
+++ b/tests/fs_filesystem/test
@@ -12,6 +12,17 @@  BEGIN {
     $basedir = $0;
     $basedir =~ s|(.*)/[^/]*|$1|;
 
+    # extract test_name and move up one dir if started from a subdir
+    $test_name = $basedir;
+    $test_name =~ s|.*/([^/]*)|$1|;
+    if ( $test_name eq "fs_filesystem" ) {
+        $fs_type = " ";
+    }
+    else {
+        $fs_type = $test_name;
+        $basedir =~ s|(.*)/[^/]*|$1|;
+    }
+
     # Some code in tests/filesystem is reused
     $filesystem_dir = "$basedir/../filesystem";
 
@@ -23,8 +34,7 @@  BEGIN {
     $nfs_enabled    = 0;
     $vfat_enabled   = 0;
 
-    $i       = 0;
-    $fs_type = " ";
+    $i = 0;
     foreach $arg (@ARGV) {
         if ( $arg eq "-v" ) {
             $v = $arg;
diff --git a/tests/fs_filesystem/vfat b/tests/fs_filesystem/vfat
new file mode 120000
index 0000000..945c9b4
--- /dev/null
+++ b/tests/fs_filesystem/vfat
@@ -0,0 +1 @@ 
+.
\ No newline at end of file
diff --git a/tests/fs_filesystem/xfs b/tests/fs_filesystem/xfs
new file mode 120000
index 0000000..945c9b4
--- /dev/null
+++ b/tests/fs_filesystem/xfs
@@ -0,0 +1 @@ 
+.
\ No newline at end of file