[LTP] [PATCH] commands/mkfs: Added new testcase to test mkfs(8) command.
Guangwen Feng
fenggw-fnst@cn.fujitsu.com
Tue Nov 3 12:20:25 CET 2015
On 2015/11/02 23:28, Cyril Hrubis wrote:
>> +#!/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?
>
Indeed, "$blocknum" here is equal to struct statfs'f_blocks, which denotes total
data blocks in filesystem(df uses statfs(2) to get this info) and does not contain
some metadata in filesytem, e.g. ext3's journal space size.
Best Regards,
Guangwen Feng
>> +}
>> +
>> +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
>
More information about the Ltp
mailing list