[LTP] [PATCH] commands/mkfs: Added new testcase to test mkfs(8) command.

Cyril Hrubis chrubis@suse.cz
Mon Nov 2 16:28:07 CET 2015


> +#!/bin/sh
> +#
> +# Copyright (c) 2015 Fujitsu Ltd.
> +# Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
> +# the GNU General Public License for more details.
> +#
> +# Test mkfs command with some basic options.
> +#
> +
> +TCID=mkfs01
> +TST_TOTAL=5
> +. test.sh
> +
> +setup()
> +{
> +	tst_require_root
> +
> +	tst_check_cmds blkid df
> +
> +	if [ -n "$FS_TYPE" ]; then
> +		tst_check_cmds mkfs.${FS_TYPE}
> +	fi
> +
> +	tst_tmpdir
> +
> +	TST_CLEANUP="cleanup"
> +
> +	ROD_SILENT mkdir -p mntpoint
> +}
> +
> +cleanup()
> +{
> +	tst_release_device
> +
> +	tst_rmdir
> +}
> +
> +mkfs_mount()
> +{
> +	mount ${TST_DEVICE} mntpoint
> +	local ret=$?
> +	if [ $ret -eq 32 ]; then
> +		tst_brkm TCONF "Cannot mount ${FS_TYPE}, missing driver?"
> +	fi
> +
> +	if [ $ret -ne 0 ]; then
> +		tst_brkm TBROK "Failed to mount device: mount exit = $ret"
> +	fi
> +}
> +
> +mkfs_umount()
> +{
> +	grep -q ${TST_DEVICE} /proc/self/mounts
                                 ^
                            Why not just /proc/mounts?

> +	if [ $? -eq 0 ]; then
> +		umount ${TST_DEVICE}
> +		if [ $? -ne 0 ];then
> +			tst_resm TWARN "'umount ${TST_DEVICE}' failed"
> +		fi
> +	else
> +		tst_resm TINFO "${TST_DEVICE} is not mounted"
> +	fi
> +}
> +
> +usage()
> +{
> +	cat << EOF
> +	usage: $0 [-f <ext2|ext3|ext4|vfat|...>]
> +
> +	OPTIONS
> +		-f	Specify the type of filesystem to be built. If not
> +			specified, the default filesystem type (currently ext2)
> +			is used.
> +		-h	Display help text and exit.
> +
> +EOF
> +	tst_brkm TCONF "Display help text or unknown options"
                 ^
		I would rather make this TWARN, because when runtest entries
                became corrupted somehow the test would start reporting TCONF
                And that may end up being undetected for quite some time.

> +}
> +
> +mkfs_verify()
> +{
> +	if [ -z "$1" ]; then
> +		blkid | grep "$2" | grep -q "ext2"
> +	else
> +		blkid | grep "$2" | grep -q "$1"
> +	fi

You can actually pass the device to blkid as a parameter instead of grepping it
in the output.

> +}
> +
> +mkfs_check()
> +{
> +	mkfs_mount
> +	local blocknum=`df -aT | grep "$1" | awk '{print $3}'`

You can pass the mount point to the df instead of greping the device.

> +	mkfs_umount
> +
> +	if [ $blocknum -gt "$2" ]; then
> +		return 1
> +	fi

So the size we get as $2 is in kB and df -T reports 1k blocks shouldn't these
be equal, or are there any reserved block in play?

> +}
> +
> +mkfs_test()
> +{
> +	local mkfs_op=$1
> +	local fs_type=$2
> +	local fs_op=$3
> +	local device=$4
> +	local size=$5
> +
> +	if [ -n "$fs_type" ]; then
> +		mkfs_op="-t"

Why are you adding the flags by the tiniest bits?

Why don't you rather do:

	mkfs_op="-t $fs_type"

Which is far more logical.

> +	fi
> +
> +	if [ "$fs_type" = "xfs" ] || [ "$fs_type" = "btrfs" ]; then
> +		fs_op+=" -f"

This is bashism. You have to do fs_op="$fs_op -f" instead.

> +	fi
> +
> +	local mkfs_cmd="mkfs $mkfs_op $fs_type $fs_op $device $size"
> +	mkfs_cmd=`echo "$mkfs_cmd" | sed 's/\s\+/ /g'`

This is just cosmetic, isn't it? I would just omit it.

> +	echo ${fs_op} | grep -q "\-c"
> +	if [ $? -eq 0 ] && [ "$fs_type" = "ntfs" ]; then
> +		tst_resm TCONF "'${mkfs_cmd}' not supported."
> +		return 32

		This is fairly misleading. It would be better to use return 0
                in case when you just need to exit the function. Because returning
                different values and ingoring them later is misleading.

> +	fi
> +
> +	if [ -n "$size" ]; then
> +		if [ "$fs_type" = "xfs" ] || [ "$fs_type" = "btrfs" ]; then
> +			tst_resm TCONF "'${mkfs_cmd}' not supported."
> +			return 32

                        Here as well.

> +		fi
> +	fi
> +
> +	${mkfs_cmd} >temp 2>&1
> +	if [ $? -ne 0 ]; then
> +		grep -q -E "unknown option | invalid option" temp
> +		if [ $? -eq 0 ]; then
> +			tst_resm TCONF "'${mkfs_cmd}' not supported."
> +			return 32
> +		else
> +			tst_resm TFAIL "'${mkfs_cmd}' failed."
> +			cat temp
> +			return 1
> +		fi
> +	fi
> +
> +	if [ -n "$device" ]; then
> +		mkfs_verify "$fs_type" "$device"
> +		if [ $? -ne 0 ]; then
> +			tst_resm TFAIL "'${mkfs_cmd}' failed, not expected."
> +			return 1
> +		fi

We should name the function better, mkfs_verify_type() comes to mind.

> +	fi
> +
> +	if [ -n "$size" ]; then
> +		mkfs_check "$device" "$size"
> +		if [ $? -ne 0 ]; then
> +			tst_resm TFAIL "'${mkfs_cmd}' failed, not expected."
> +			return 1
> +		fi
> +	fi

Here as well, mkfs_verify_size would be better.

> +	tst_resm TPASS "'${mkfs_cmd}' passed."
> +}
> +
> +test1()
> +{
> +	tst_acquire_device
> +
> +	mkfs_test "$MKFS_OP" "$FS_TYPE" "$FS_OP" "$TST_DEVICE"
> +
> +	tst_release_device
> +}
> +
> +test2()
> +{
> +	tst_acquire_device
> +
> +	mkfs_test "$MKFS_OP" "$FS_TYPE" "$FS_OP" "$TST_DEVICE" "10000"

Can you just pass empty string when it should be empty instead of passing empty
global variable?

It's more confusing than it could be this way.

> +	tst_release_device
> +}
> +
> +test3()
> +{
> +	tst_acquire_device
> +
> +	mkfs_test "$MKFS_OP" "$FS_TYPE" "-c" "$TST_DEVICE"
> +
> +	tst_release_device
> +}

Why don't we acquire device once in the setup and release it in the cleanup?

> +test4()
> +{
> +	mkfs_test "-V"
> +}
> +
> +test5()
> +{
> +	mkfs_test "-h"
> +}
> +
> +MKFS_OP=""
> +FS_TYPE=""
> +FS_OP=""
> +
> +if [ $# -ne 0 ]; then
> +	while getopts f:h OPTION; do
> +		case $OPTION in
> +		f)
> +			FS_TYPE=$OPTARG;;
> +		h)
> +			usage;;
> +		?)
> +			usage;;
> +		esac
> +	done
> +
> +	if [ -z "$FS_TYPE" ]; then
> +		usage
> +	fi
> +fi

Eh, why just not:

while getopts f:h OPTION; do
        case $OPTION in
        f)
                FS_TYPE=$OPTARG;;
        h)
                usage;;
        ?)
                usage;;
        esac
done

> +setup
> +for i in $(seq 1 ${TST_TOTAL})
> +do
> +	test$i
> +done
> +
> +tst_exit
> -- 
> 1.8.4.2
> 
> 
> -- 
> Mailing list info: http://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the Ltp mailing list