diff mbox series

[07/13] fstests: automatically generate group files

Message ID 162317280046.653489.3322406175723320960.stgit@locust (mailing list archive)
State New, archived
Headers show
Series fstests: move test group lists into test files | expand

Commit Message

Darrick J. Wong June 8, 2021, 5:20 p.m. UTC
From: Darrick J. Wong <djwong@kernel.org>

Now that we've moved the group membership details into the test case
files themselves, automatically generate the group files during build.
The autogenerated files are named "group.list" instead of "group" to
avoid conflicts between generated and (stale) SCM files as everyone
rebases.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 .gitignore             |    3 +++
 common/preamble        |    8 ++++++++
 include/buildgrouplist |    8 ++++++++
 tests/Makefile         |    4 ++++
 tests/btrfs/Makefile   |    4 ++++
 tests/ceph/Makefile    |    4 ++++
 tests/cifs/Makefile    |    4 ++++
 tests/ext4/Makefile    |    4 ++++
 tests/f2fs/Makefile    |    4 ++++
 tests/generic/Makefile |    4 ++++
 tests/nfs/Makefile     |    4 ++++
 tests/ocfs2/Makefile   |    4 ++++
 tests/overlay/Makefile |    4 ++++
 tests/perf/Makefile    |    4 ++++
 tests/shared/Makefile  |    4 ++++
 tests/udf/Makefile     |    4 ++++
 tests/xfs/Makefile     |    4 ++++
 tools/mkgroupfile      |   42 ++++++++++++++++++++++++++++++++++++++++++
 18 files changed, 117 insertions(+)
 create mode 100644 include/buildgrouplist
 create mode 100755 tools/mkgroupfile

Comments

Chandan Babu R June 11, 2021, 5:39 a.m. UTC | #1
On 08 Jun 2021 at 22:50, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
>
> Now that we've moved the group membership details into the test case
> files themselves, automatically generate the group files during build.
> The autogenerated files are named "group.list" instead of "group" to
> avoid conflicts between generated and (stale) SCM files as everyone
> rebases.

Looks good to me.

Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>

>
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
>  .gitignore             |    3 +++
>  common/preamble        |    8 ++++++++
>  include/buildgrouplist |    8 ++++++++
>  tests/Makefile         |    4 ++++
>  tests/btrfs/Makefile   |    4 ++++
>  tests/ceph/Makefile    |    4 ++++
>  tests/cifs/Makefile    |    4 ++++
>  tests/ext4/Makefile    |    4 ++++
>  tests/f2fs/Makefile    |    4 ++++
>  tests/generic/Makefile |    4 ++++
>  tests/nfs/Makefile     |    4 ++++
>  tests/ocfs2/Makefile   |    4 ++++
>  tests/overlay/Makefile |    4 ++++
>  tests/perf/Makefile    |    4 ++++
>  tests/shared/Makefile  |    4 ++++
>  tests/udf/Makefile     |    4 ++++
>  tests/xfs/Makefile     |    4 ++++
>  tools/mkgroupfile      |   42 ++++++++++++++++++++++++++++++++++++++++++
>  18 files changed, 117 insertions(+)
>  create mode 100644 include/buildgrouplist
>  create mode 100755 tools/mkgroupfile
>
>
> diff --git a/.gitignore b/.gitignore
> index c62c1556..ab366961 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -11,6 +11,9 @@ tags
>  /local.config
>  /results
>  
> +# autogenerated group files
> +/tests/*/group.list
> +
>  # autoconf generated files
>  /aclocal.m4
>  /autom4te.cache
> diff --git a/common/preamble b/common/preamble
> index 63f66957..4fe8fd3f 100644
> --- a/common/preamble
> +++ b/common/preamble
> @@ -32,6 +32,14 @@ _begin_fstest()
>  	fi
>  
>  	seq=`basename $0`
> +
> +	# If we're only running the test to generate a group.list file,
> +	# spit out the group data and exit.
> +	if [ -n "$GENERATE_GROUPS" ]; then
> +		echo "$seq $@"
> +		exit 0
> +	fi
> +
>  	seqres=$RESULT_DIR/$seq
>  	echo "QA output created by $seq"
>  
> diff --git a/include/buildgrouplist b/include/buildgrouplist
> new file mode 100644
> index 00000000..d898efa3
> --- /dev/null
> +++ b/include/buildgrouplist
> @@ -0,0 +1,8 @@
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2021 Oracle, Inc.  All Rights Reserved.
> +#
> +.PHONY: group.list
> +
> +group.list:
> +	@echo " [GROUP] $$PWD/$@"
> +	$(Q)$(TOPDIR)/tools/mkgroupfile $@
> diff --git a/tests/Makefile b/tests/Makefile
> index 8ce8f209..5c8f0b10 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -7,6 +7,10 @@ include $(TOPDIR)/include/builddefs
>  
>  TESTS_SUBDIRS = $(sort $(dir $(wildcard $(CURDIR)/[[:lower:]]*/)))
>  
> +SUBDIRS = $(wildcard [[:lower:]]*)
> +
> +default: $(SUBDIRS)
> +
>  include $(BUILDRULES)
>  
>  install: $(addsuffix -install,$(TESTS_SUBDIRS))
> diff --git a/tests/btrfs/Makefile b/tests/btrfs/Makefile
> index 2d936421..cc2b2fc9 100644
> --- a/tests/btrfs/Makefile
> +++ b/tests/btrfs/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  BTRFS_DIR = btrfs
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(BTRFS_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/ceph/Makefile b/tests/ceph/Makefile
> index 55e35d77..61ab01d4 100644
> --- a/tests/ceph/Makefile
> +++ b/tests/ceph/Makefile
> @@ -2,9 +2,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  CEPH_DIR = ceph
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(CEPH_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/cifs/Makefile b/tests/cifs/Makefile
> index 0c5cf3be..5356a682 100644
> --- a/tests/cifs/Makefile
> +++ b/tests/cifs/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  CIFS_DIR = cifs
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(CIFS_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/ext4/Makefile b/tests/ext4/Makefile
> index beb1541f..9c765497 100644
> --- a/tests/ext4/Makefile
> +++ b/tests/ext4/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  EXT4_DIR = ext4
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(EXT4_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/f2fs/Makefile b/tests/f2fs/Makefile
> index d13bca3f..d2374018 100644
> --- a/tests/f2fs/Makefile
> +++ b/tests/f2fs/Makefile
> @@ -5,9 +5,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  F2FS_DIR = f2fs
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(F2FS_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/generic/Makefile b/tests/generic/Makefile
> index 3878d05c..95cd403c 100644
> --- a/tests/generic/Makefile
> +++ b/tests/generic/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  GENERIC_DIR = generic
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(GENERIC_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/nfs/Makefile b/tests/nfs/Makefile
> index 754f2b25..e372b305 100644
> --- a/tests/nfs/Makefile
> +++ b/tests/nfs/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  NFS_DIR = nfs
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(NFS_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/ocfs2/Makefile b/tests/ocfs2/Makefile
> index e1337908..d85c4fd3 100644
> --- a/tests/ocfs2/Makefile
> +++ b/tests/ocfs2/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  OCFS2_DIR = ocfs2
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(OCFS2_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/overlay/Makefile b/tests/overlay/Makefile
> index b07f8925..b995a6ec 100644
> --- a/tests/overlay/Makefile
> +++ b/tests/overlay/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  TEST_DIR = overlay
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(TEST_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/perf/Makefile b/tests/perf/Makefile
> index 620f1dbf..5d82cccc 100644
> --- a/tests/perf/Makefile
> +++ b/tests/perf/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  PERF_DIR = perf
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(PERF_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/shared/Makefile b/tests/shared/Makefile
> index 8a832782..6c6533c8 100644
> --- a/tests/shared/Makefile
> +++ b/tests/shared/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  SHARED_DIR = shared
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(SHARED_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/udf/Makefile b/tests/udf/Makefile
> index c9c9f1bd..bfaa1b0e 100644
> --- a/tests/udf/Makefile
> +++ b/tests/udf/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  UDF_DIR = udf
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(UDF_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tests/xfs/Makefile b/tests/xfs/Makefile
> index d64800ea..c2f0ba48 100644
> --- a/tests/xfs/Makefile
> +++ b/tests/xfs/Makefile
> @@ -4,9 +4,13 @@
>  
>  TOPDIR = ../..
>  include $(TOPDIR)/include/builddefs
> +include $(TOPDIR)/include/buildgrouplist
>  
>  XFS_DIR = xfs
>  TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(XFS_DIR)
> +DIRT = group.list
> +
> +default: $(DIRT)
>  
>  include $(BUILDRULES)
>  
> diff --git a/tools/mkgroupfile b/tools/mkgroupfile
> new file mode 100755
> index 00000000..0681e5d2
> --- /dev/null
> +++ b/tools/mkgroupfile
> @@ -0,0 +1,42 @@
> +#!/bin/bash
> +
> +# Generate a group file from the _begin_fstest call in each test.
> +
> +if [ "$1" = "--help" ]; then
> +	echo "Usage: (cd tests/XXX/ ; ../../tools/mkgroupfile [output])"
> +	exit 1
> +fi
> +
> +test_dir="$PWD"
> +groupfile="$1"
> +
> +if [ ! -x ../../check ]; then
> +	echo "$0: Run this from tests/XXX/."
> +	exit 1
> +fi
> +
> +generate_groupfile() {
> +	cat << ENDL
> +# QA groups control file, automatically generated.
> +# See _begin_fstest in each test for details.
> +
> +ENDL
> +	cd ../../
> +	export GENERATE_GROUPS=yes
> +	grep -R -l "^_begin_fstest" "$test_dir/" 2>/dev/null | while read testfile; do
> +		test -x "$testfile" && "$testfile"
> +	done | sort -g
> +	cd "$test_dir"
> +}
> +
> +if [ -z "$groupfile" ] || [ "$groupfile" = "-" ]; then
> +	# Dump the group file to stdout and exit
> +	generate_groupfile
> +	exit 0
> +fi
> +
> +# Otherwise, write the group file to disk somewhere.
> +ngroupfile="${groupfile}.new"
> +rm -f "$ngroupfile"
> +generate_groupfile >> "$ngroupfile"
> +mv "$ngroupfile" "$groupfile"
diff mbox series

Patch

diff --git a/.gitignore b/.gitignore
index c62c1556..ab366961 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,6 +11,9 @@  tags
 /local.config
 /results
 
+# autogenerated group files
+/tests/*/group.list
+
 # autoconf generated files
 /aclocal.m4
 /autom4te.cache
diff --git a/common/preamble b/common/preamble
index 63f66957..4fe8fd3f 100644
--- a/common/preamble
+++ b/common/preamble
@@ -32,6 +32,14 @@  _begin_fstest()
 	fi
 
 	seq=`basename $0`
+
+	# If we're only running the test to generate a group.list file,
+	# spit out the group data and exit.
+	if [ -n "$GENERATE_GROUPS" ]; then
+		echo "$seq $@"
+		exit 0
+	fi
+
 	seqres=$RESULT_DIR/$seq
 	echo "QA output created by $seq"
 
diff --git a/include/buildgrouplist b/include/buildgrouplist
new file mode 100644
index 00000000..d898efa3
--- /dev/null
+++ b/include/buildgrouplist
@@ -0,0 +1,8 @@ 
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2021 Oracle, Inc.  All Rights Reserved.
+#
+.PHONY: group.list
+
+group.list:
+	@echo " [GROUP] $$PWD/$@"
+	$(Q)$(TOPDIR)/tools/mkgroupfile $@
diff --git a/tests/Makefile b/tests/Makefile
index 8ce8f209..5c8f0b10 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -7,6 +7,10 @@  include $(TOPDIR)/include/builddefs
 
 TESTS_SUBDIRS = $(sort $(dir $(wildcard $(CURDIR)/[[:lower:]]*/)))
 
+SUBDIRS = $(wildcard [[:lower:]]*)
+
+default: $(SUBDIRS)
+
 include $(BUILDRULES)
 
 install: $(addsuffix -install,$(TESTS_SUBDIRS))
diff --git a/tests/btrfs/Makefile b/tests/btrfs/Makefile
index 2d936421..cc2b2fc9 100644
--- a/tests/btrfs/Makefile
+++ b/tests/btrfs/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 BTRFS_DIR = btrfs
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(BTRFS_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/ceph/Makefile b/tests/ceph/Makefile
index 55e35d77..61ab01d4 100644
--- a/tests/ceph/Makefile
+++ b/tests/ceph/Makefile
@@ -2,9 +2,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 CEPH_DIR = ceph
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(CEPH_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/cifs/Makefile b/tests/cifs/Makefile
index 0c5cf3be..5356a682 100644
--- a/tests/cifs/Makefile
+++ b/tests/cifs/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 CIFS_DIR = cifs
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(CIFS_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/ext4/Makefile b/tests/ext4/Makefile
index beb1541f..9c765497 100644
--- a/tests/ext4/Makefile
+++ b/tests/ext4/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 EXT4_DIR = ext4
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(EXT4_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/f2fs/Makefile b/tests/f2fs/Makefile
index d13bca3f..d2374018 100644
--- a/tests/f2fs/Makefile
+++ b/tests/f2fs/Makefile
@@ -5,9 +5,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 F2FS_DIR = f2fs
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(F2FS_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/generic/Makefile b/tests/generic/Makefile
index 3878d05c..95cd403c 100644
--- a/tests/generic/Makefile
+++ b/tests/generic/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 GENERIC_DIR = generic
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(GENERIC_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/nfs/Makefile b/tests/nfs/Makefile
index 754f2b25..e372b305 100644
--- a/tests/nfs/Makefile
+++ b/tests/nfs/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 NFS_DIR = nfs
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(NFS_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/ocfs2/Makefile b/tests/ocfs2/Makefile
index e1337908..d85c4fd3 100644
--- a/tests/ocfs2/Makefile
+++ b/tests/ocfs2/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 OCFS2_DIR = ocfs2
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(OCFS2_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/overlay/Makefile b/tests/overlay/Makefile
index b07f8925..b995a6ec 100644
--- a/tests/overlay/Makefile
+++ b/tests/overlay/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 TEST_DIR = overlay
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(TEST_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/perf/Makefile b/tests/perf/Makefile
index 620f1dbf..5d82cccc 100644
--- a/tests/perf/Makefile
+++ b/tests/perf/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 PERF_DIR = perf
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(PERF_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/shared/Makefile b/tests/shared/Makefile
index 8a832782..6c6533c8 100644
--- a/tests/shared/Makefile
+++ b/tests/shared/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 SHARED_DIR = shared
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(SHARED_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/udf/Makefile b/tests/udf/Makefile
index c9c9f1bd..bfaa1b0e 100644
--- a/tests/udf/Makefile
+++ b/tests/udf/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 UDF_DIR = udf
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(UDF_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tests/xfs/Makefile b/tests/xfs/Makefile
index d64800ea..c2f0ba48 100644
--- a/tests/xfs/Makefile
+++ b/tests/xfs/Makefile
@@ -4,9 +4,13 @@ 
 
 TOPDIR = ../..
 include $(TOPDIR)/include/builddefs
+include $(TOPDIR)/include/buildgrouplist
 
 XFS_DIR = xfs
 TARGET_DIR = $(PKG_LIB_DIR)/$(TESTS_DIR)/$(XFS_DIR)
+DIRT = group.list
+
+default: $(DIRT)
 
 include $(BUILDRULES)
 
diff --git a/tools/mkgroupfile b/tools/mkgroupfile
new file mode 100755
index 00000000..0681e5d2
--- /dev/null
+++ b/tools/mkgroupfile
@@ -0,0 +1,42 @@ 
+#!/bin/bash
+
+# Generate a group file from the _begin_fstest call in each test.
+
+if [ "$1" = "--help" ]; then
+	echo "Usage: (cd tests/XXX/ ; ../../tools/mkgroupfile [output])"
+	exit 1
+fi
+
+test_dir="$PWD"
+groupfile="$1"
+
+if [ ! -x ../../check ]; then
+	echo "$0: Run this from tests/XXX/."
+	exit 1
+fi
+
+generate_groupfile() {
+	cat << ENDL
+# QA groups control file, automatically generated.
+# See _begin_fstest in each test for details.
+
+ENDL
+	cd ../../
+	export GENERATE_GROUPS=yes
+	grep -R -l "^_begin_fstest" "$test_dir/" 2>/dev/null | while read testfile; do
+		test -x "$testfile" && "$testfile"
+	done | sort -g
+	cd "$test_dir"
+}
+
+if [ -z "$groupfile" ] || [ "$groupfile" = "-" ]; then
+	# Dump the group file to stdout and exit
+	generate_groupfile
+	exit 0
+fi
+
+# Otherwise, write the group file to disk somewhere.
+ngroupfile="${groupfile}.new"
+rm -f "$ngroupfile"
+generate_groupfile >> "$ngroupfile"
+mv "$ngroupfile" "$groupfile"