Re: [PATCH] xfs: test mkfs.xfs config files

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]



On Wed, Oct 28, 2020 at 07:54:50AM +1100, Dave Chinner wrote:
> From: "Darrick J. Wong" <darrick.wong@xxxxxxxxxx>
> 
> Simple tests of the upcoming mkfs.xfs config file feature.  First we
> have some simple tests of properly formatted config files, then
> improperly formatted config files, and finally we try to spot
> conflicts between config file options and the cli.
> 
> [dchinner: updated for new libinih-based implementation.]
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
> ---
>  common/xfs        |  10 +++
>  tests/xfs/716     | 219 ++++++++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/716.out |  16 ++++
>  tests/xfs/717     | 195 +++++++++++++++++++++++++++++++++++++++++
>  tests/xfs/717.out |  13 +++
>  tests/xfs/718     |  65 ++++++++++++++
>  tests/xfs/718.out |   2 +
>  tests/xfs/719     |  62 +++++++++++++
>  tests/xfs/719.out |   2 +
>  tests/xfs/720     |  64 ++++++++++++++
>  tests/xfs/720.out |   3 +
>  tests/xfs/group   |   5 ++
>  12 files changed, 656 insertions(+)
>  create mode 100755 tests/xfs/716
>  create mode 100644 tests/xfs/716.out
>  create mode 100755 tests/xfs/717
>  create mode 100644 tests/xfs/717.out
>  create mode 100755 tests/xfs/718
>  create mode 100644 tests/xfs/718.out
>  create mode 100755 tests/xfs/719
>  create mode 100644 tests/xfs/719.out
>  create mode 100755 tests/xfs/720
>  create mode 100644 tests/xfs/720.out
> 
> diff --git a/common/xfs b/common/xfs
> index 79dab058..abfd8a15 100644
> --- a/common/xfs
> +++ b/common/xfs
> @@ -700,6 +700,16 @@ _require_xfs_mkfs_ciname()
>  		|| _notrun "need case-insensitive naming support in mkfs.xfs"
>  }
>  
> +# this test requires mkfs.xfs have configuration file support
> +_require_xfs_mkfs_cfgfile()
> +{
> +	echo > /tmp/a
> +	_scratch_mkfs_xfs_supported -c options=/tmp/a >/dev/null 2>&1
> +	res=$?
> +	rm -rf /tmp/a
> +	test $res -eq 0 || _notrun "need configuration file support in mkfs.xfs"
> +}
> +
>  # XFS_DEBUG requirements
>  _require_xfs_debug()
>  {
> diff --git a/tests/xfs/716 b/tests/xfs/716
> new file mode 100755
> index 00000000..d8ee7350
> --- /dev/null
> +++ b/tests/xfs/716
> @@ -0,0 +1,219 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2020 Oracle.  All Rights Reserved.
> +#
> +# FS QA Test 716
> +#
> +# Feed valid mkfs config files to the mkfs parser to ensure that they are
> +# recognized as valid.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap '_cleanup; exit $status' 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.* $def_cfgfile $fsimg
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +# Modify as appropriate.
> +_supported_fs generic
> +_require_test
> +_require_scratch_nocheck
> +_require_xfs_mkfs_cfgfile
> +
> +def_cfgfile=$TEST_DIR/a
> +fsimg=$TEST_DIR/a.img
> +rm -rf $def_cfgfile $fsimg
> +truncate -s 20t $fsimg
> +
> +test_mkfs_config() {
> +	local cfgfile="$1"
> +	if [ -z "$cfgfile" ] || [ "$cfgfile" = "-" ]; then
> +		cfgfile=$def_cfgfile
> +		cat > $cfgfile
> +	fi
> +	$MKFS_XFS_PROG -c options=$cfgfile -f -N $fsimg >> $seqres.full 2> $tmp.err
> +	cat $tmp.err | _filter_test_dir
> +}
> +
> +echo Simplest config file
> +cat > $def_cfgfile << ENDL
> +[metadata]
> +crc = 0
> +ENDL
> +test_mkfs_config $def_cfgfile
> +
> +echo Piped-in config file
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 1
> +ENDL
> +
> +echo Full line comment
> +test_mkfs_config << ENDL
> +# This is a full line comment.
> +[metadata]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> + # This is a full line comment.
> +[metadata]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +#This is a full line comment.
> +[metadata]
> +crc = 0
> +ENDL
> +
> +echo End of line comment
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0 ; This is an eol comment.

Hey, wait a minute, the manpage didn't say I could use semicolon
comments! :)

The libinih page https://github.com/benhoyt/inih says you can though.

Would you mind making a note of that in patch 5 above, please?

--D

> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0 ;This is an eol comment.
> +ENDL
> +
> +echo Multiple directives
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0
> +finobt = 0
> +ENDL
> +
> +echo Multiple sections
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0
> +
> +[inode]
> +sparse = 0
> +ENDL
> +
> +echo No directives at all
> +test_mkfs_config << ENDL
> +[metadata]
> +ENDL
> +
> +echo Space around the section name
> +test_mkfs_config << ENDL
> + [metadata]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata] 
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> + [metadata] 
> +crc = 0
> +ENDL
> +
> +echo Single space around the key/value directive
> +test_mkfs_config << ENDL
> +[metadata]
> + crc=0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc =0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc= 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc=0 
> +ENDL
> +
> +echo Two spaces around the key/value directive
> +test_mkfs_config << ENDL
> +[metadata]
> + crc =0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> + crc= 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> + crc=0 
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc =0 
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc= 0 
> +ENDL
> +
> +echo Three spaces around the key/value directive
> +test_mkfs_config << ENDL
> +[metadata]
> + crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> + crc= 0 
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0 
> +ENDL
> +
> +echo Four spaces around the key/value directive
> +test_mkfs_config << ENDL
> +[metadata]
> + crc = 0 
> +ENDL
> +
> +echo Arbitrary spaces and tabs
> +test_mkfs_config << ENDL
> +[metadata]
> +	  crc 	  	=   	  	 0	  	 	  
> +ENDL
> +
> +echo ambiguous comment/section names
> +test_mkfs_config << ENDL
> +[metadata]
> +#[data]
> +crc = 0
> +ENDL
> +
> +echo ambiguous comment/variable names
> +test_mkfs_config << ENDL
> +[metadata]
> +#foo = 0 ; is this a comment or a key '#foo' ?
> +ENDL
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/716.out b/tests/xfs/716.out
> new file mode 100644
> index 00000000..4c6e9fad
> --- /dev/null
> +++ b/tests/xfs/716.out
> @@ -0,0 +1,16 @@
> +QA output created by 716
> +Simplest config file
> +Piped-in config file
> +Full line comment
> +End of line comment
> +Multiple directives
> +Multiple sections
> +No directives at all
> +Space around the section name
> +Single space around the key/value directive
> +Two spaces around the key/value directive
> +Three spaces around the key/value directive
> +Four spaces around the key/value directive
> +Arbitrary spaces and tabs
> +ambiguous comment/section names
> +ambiguous comment/variable names
> diff --git a/tests/xfs/717 b/tests/xfs/717
> new file mode 100755
> index 00000000..031d59f1
> --- /dev/null
> +++ b/tests/xfs/717
> @@ -0,0 +1,195 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2020 Oracle.  All Rights Reserved.
> +#
> +# FS QA Test 717
> +#
> +# Feed invalid mkfs config files to the mkfs parser to ensure that they are
> +# recognized as invalid.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap '_cleanup; exit $status' 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.* $def_cfgfile $fsimg
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +# Modify as appropriate.
> +_supported_fs generic
> +_require_test
> +_require_scratch_nocheck
> +_require_xfs_mkfs_cfgfile
> +
> +def_cfgfile=$TEST_DIR/a
> +fsimg=$TEST_DIR/a.img
> +rm -rf $def_cfgfile $fsimg
> +truncate -s 20t $fsimg
> +
> +test_mkfs_config() {
> +	local cfgfile="$1"
> +	if [ -z "$cfgfile" ] || [ "$cfgfile" = "-" ]; then
> +		cfgfile=$def_cfgfile
> +		cat > $cfgfile
> +	fi
> +	$MKFS_XFS_PROG -c options=$cfgfile -f -N $fsimg >> $seqres.full 2> $tmp.err
> +	if [ $? -eq 0 ]; then
> +		echo "Test passed, should have failed! Config file parameters:"
> +		cat $cfgfile
> +	fi
> +}
> +
> +echo Spaces in a section name
> +test_mkfs_config << ENDL
> +[meta data]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[meta	data]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[ metadata]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata ]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[ metadata ]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[ metadata] 
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata ] 
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> + [ metadata]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> + [metadata ]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> + [ metadata ]
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> + [metadata ] 
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> + [ metadata ] 
> +crc = 0
> +ENDL
> +test_mkfs_config << ENDL
> +   	 		 	 [	  	 		metadata		  	  	    	  ] 	 	 	    	
> +crc = 0
> +ENDL
> +
> +echo Spaces in the middle of a key name
> +test_mkfs_config << ENDL
> +[metadata]
> +c rc = 0
> +ENDL
> +
> +echo Invalid value
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = waffles
> +ENDL
> +
> +echo Nonexistent sections
> +test_mkfs_config << ENDL
> +[goober]
> +crc = 0
> +ENDL
> +
> +echo Nonexistent keys
> +test_mkfs_config << ENDL
> +[metadata]
> +goober = 0
> +ENDL
> +
> +echo Only zero or one
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 50
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = -1
> +ENDL
> +
> +echo sysctl style files
> +test_mkfs_config << ENDL
> +metadata.crc = 1
> +ENDL
> +
> +echo binaries
> +test_mkfs_config $MKFS_XFS_PROG 2>&1 | sed -e "s#$MKFS_XFS_PROG#MKFS_XFS_PROG#g"
> +
> +echo respecified options
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0
> +crc = 1
> +ENDL
> +
> +echo respecified sections
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0
> +[metadata]
> +crc = 1
> +ENDL
> +
> +echo ambiguous comment/section names
> +test_mkfs_config << ENDL
> +[meta#data]
> +crc = 0
> +ENDL
> +
> +echo ambiguous comment/variable names
> +test_mkfs_config << ENDL
> +[metadata]
> +fo#o = 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +foo#=# 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +foo =# 0
> +ENDL
> +test_mkfs_config << ENDL
> +[metadata]
> +crc = 0;This is an eol comment.
> +ENDL
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/717.out b/tests/xfs/717.out
> new file mode 100644
> index 00000000..61fff561
> --- /dev/null
> +++ b/tests/xfs/717.out
> @@ -0,0 +1,13 @@
> +QA output created by 717
> +Spaces in a section name
> +Spaces in the middle of a key name
> +Invalid value
> +Nonexistent sections
> +Nonexistent keys
> +Only zero or one
> +sysctl style files
> +binaries
> +respecified options
> +respecified sections
> +ambiguous comment/section names
> +ambiguous comment/variable names
> diff --git a/tests/xfs/718 b/tests/xfs/718
> new file mode 100755
> index 00000000..e2beca41
> --- /dev/null
> +++ b/tests/xfs/718
> @@ -0,0 +1,65 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2020 Oracle.  All Rights Reserved.
> +#
> +# FS QA Test 718
> +#
> +# Test formatting with a well known config file.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap '_cleanup; exit $status' 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.* $def_cfgfile $fsimg
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +# Modify as appropriate.
> +_supported_fs generic
> +_require_test
> +_require_scratch_nocheck
> +_require_xfs_mkfs_cfgfile
> +
> +echo "Silence is golden"
> +
> +def_cfgfile=$TEST_DIR/a
> +fsimg=$TEST_DIR/a.img
> +rm -rf $def_cfgfile $fsimg
> +truncate -s 20t $fsimg
> +
> +cat > $def_cfgfile << ENDL
> +[metadata]
> +crc = 1
> +rmapbt = 1
> +reflink = 1
> +
> +[inode]
> +sparse = 1
> +ENDL
> +
> +$MKFS_XFS_PROG -c options=$def_cfgfile -f $SCRATCH_DEV > $tmp.mkfs
> +cat $tmp.mkfs >> $seqres.full
> +grep -q 'crc=1' $tmp.mkfs || echo 'v5 not enabled'
> +grep -q 'rmapbt=1' $tmp.mkfs || echo 'rmap not enabled'
> +grep -q 'reflink=1' $tmp.mkfs || echo 'reflink not enabled'
> +grep -q 'sparse=1' $tmp.mkfs || echo 'sparse inodes not enabled'
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/718.out b/tests/xfs/718.out
> new file mode 100644
> index 00000000..1dad5ab3
> --- /dev/null
> +++ b/tests/xfs/718.out
> @@ -0,0 +1,2 @@
> +QA output created by 718
> +Silence is golden
> diff --git a/tests/xfs/719 b/tests/xfs/719
> new file mode 100755
> index 00000000..15ff3f27
> --- /dev/null
> +++ b/tests/xfs/719
> @@ -0,0 +1,62 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2020 Oracle.  All Rights Reserved.
> +#
> +# FS QA Test 719
> +#
> +# Test formatting with a config file that contains conflicting options.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap '_cleanup; exit $status' 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.* $def_cfgfile
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +# Modify as appropriate.
> +_supported_fs generic
> +_require_test
> +_require_scratch_nocheck
> +_require_xfs_mkfs_cfgfile
> +
> +echo "Silence is golden"
> +
> +def_cfgfile=$TEST_DIR/a
> +rm -rf $def_cfgfile
> +
> +cat > $def_cfgfile << ENDL
> +[metadata]
> +crc = 0
> +rmapbt = 1
> +reflink = 1
> +
> +[inode]
> +sparse = 1
> +ENDL
> +
> +$MKFS_XFS_PROG -c options=$def_cfgfile -f $SCRATCH_DEV > $tmp.mkfs 2>&1
> +if [ $? -eq 0 ]; then
> +	echo "mkfs.xfs did not fail!"
> +	cat $tmp.mkfs
> +fi
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/719.out b/tests/xfs/719.out
> new file mode 100644
> index 00000000..25585fa0
> --- /dev/null
> +++ b/tests/xfs/719.out
> @@ -0,0 +1,2 @@
> +QA output created by 719
> +Silence is golden
> diff --git a/tests/xfs/720 b/tests/xfs/720
> new file mode 100755
> index 00000000..a917e9a6
> --- /dev/null
> +++ b/tests/xfs/720
> @@ -0,0 +1,64 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +# Copyright (c) 2020 Oracle.  All Rights Reserved.
> +#
> +# FS QA Test 720
> +#
> +# Test formatting with conflicts between the config file and the cli.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap '_cleanup; exit $status' 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.* $def_cfgfile
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +
> +# Modify as appropriate.
> +_supported_fs generic
> +_require_test
> +_require_scratch_nocheck
> +_require_xfs_mkfs_cfgfile
> +
> +cfgfile=$TEST_DIR/a
> +rm -rf $cfgfile
> +
> +# disable crc in config file, enable rmapbt (which requires crc=1) in cli
> +cat > $cfgfile << ENDL
> +[metadata]
> +crc = 0
> +ENDL
> +
> +$MKFS_XFS_PROG -c options=$cfgfile -f -m rmapbt=1 $SCRATCH_DEV > $tmp.mkfs 2>&1
> +cat $tmp.mkfs >> $seqres.full
> +grep 'rmapbt not supported without CRC support' $tmp.mkfs
> +
> +# enable rmapbt (which requires crc=1) in config file, disable crc in cli
> +cat > $cfgfile << ENDL
> +[metadata]
> +rmapbt = 1
> +ENDL
> +
> +$MKFS_XFS_PROG -c options=$cfgfile -f -m crc=0 $SCRATCH_DEV > $tmp.mkfs 2>&1
> +cat $tmp.mkfs >> $seqres.full
> +grep 'rmapbt not supported without CRC support' $tmp.mkfs
> +
> +# success, all done
> +status=0
> +exit
> diff --git a/tests/xfs/720.out b/tests/xfs/720.out
> new file mode 100644
> index 00000000..1d2cf2ef
> --- /dev/null
> +++ b/tests/xfs/720.out
> @@ -0,0 +1,3 @@
> +QA output created by 720
> +rmapbt not supported without CRC support
> +rmapbt not supported without CRC support
> diff --git a/tests/xfs/group b/tests/xfs/group
> index b89c0a4e..4d558e22 100644
> --- a/tests/xfs/group
> +++ b/tests/xfs/group
> @@ -519,3 +519,8 @@
>  519 auto quick reflink
>  520 auto quick reflink
>  521 auto quick realtime growfs
> +716 auto quick mkfs
> +717 auto quick mkfs
> +718 auto quick mkfs
> +719 auto quick mkfs
> +720 auto quick mkfs
> -- 
> 2.28.0
> 



[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux