#! /bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (c) 2020 Oracle.  All Rights Reserved.
#
# FS QA Test No. 522
#
# Feed valid mkfs config files to the mkfs parser to ensure that they are
# recognized as valid.
#
. ./common/preamble
_begin_fstest auto quick mkfs

# Override the default cleanup function.
_cleanup()
{
	cd /
	rm -f $tmp.* $def_cfgfile $fsimg
}

# Import common functions.
. ./common/filter

# real QA test starts here

# Modify as appropriate.
_supported_fs xfs
_require_test
_require_scratch_nocheck
_require_xfs_mkfs_cfgfile

def_cfgfile=$TEST_DIR/a
fsimg=$TEST_DIR/a.img
rm -f $def_cfgfile $fsimg
$XFS_IO_PROG -c "truncate 20t" -f $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.
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
