#!/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.
#
TST_CNT=5
TST_SETUP=setup
TST_TESTFUNC=test
TST_OPTS="f:"
TST_USAGE=usage
TST_PARSE_ARGS=parse_args
TST_NEEDS_ROOT=1
TST_NEEDS_TMPDIR=1
TST_NEEDS_DEVICE=1
TST_NEEDS_CMDS="blkid df"
. tst_test.sh
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.
EOF
}
parse_args()
{
FS_TYPE="$2"
}
setup()
{
if [ -n "$FS_TYPE" ]; then
tst_test_cmds mkfs.${FS_TYPE}
fi
ROD_SILENT mkdir -p mntpoint
}
mkfs_mount()
{
mount ${TST_DEVICE} mntpoint
local ret=$?
if [ $ret -eq 32 ]; then
tst_brk TCONF "Cannot mount ${FS_TYPE}, missing driver?"
fi
if [ $ret -ne 0 ]; then
tst_brk TBROK "Failed to mount device: mount exit = $ret"
fi
}
mkfs_verify_type()
{
if [ -z "$1" ]; then
blkid $2 -t TYPE="ext2" >/dev/null
else
if [ "$1" = "msdos" ]; then
blkid $2 -t TYPE="vfat" >/dev/null
else
blkid $2 -t TYPE="$1" >/dev/null
fi
fi
}
mkfs_verify_size()
{
mkfs_mount
local blocknum=`df -P -B 1k mntpoint | tail -n1 | awk '{print $2}'`
tst_umount "$TST_DEVICE"
if [ $blocknum -gt "$2" ]; then
return 1
fi
# Size argument in mkfs.ntfs denotes number-of-sectors which is 512bytes,
# 1k-block size should be devided by this argument for ntfs verification.
if [ "$1" = "ntfs" ]; then
local rate=1024/512
if [ $blocknum -lt "$(($2/$rate*9/10))" ]; then
return 1
fi
else
if [ $blocknum -lt "$(($2*9/10))" ]; then
return 1
fi
fi
return 0
}
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 $fs_type"
fi
if [ "$fs_type" = "xfs" ] || [ "$fs_type" = "btrfs" ]; then
fs_op="$fs_op -f"
fi
local mkfs_cmd="mkfs $mkfs_op $fs_op $device $size"
echo ${fs_op} | grep -q "\-c"
if [ $? -eq 0 ] && [ "$fs_type" = "ntfs" ]; then
tst_res TCONF "'${mkfs_cmd}' not supported."
return
fi
if [ -n "$size" ]; then
if [ "$fs_type" = "xfs" ] || [ "$fs_type" = "btrfs" ]; then
tst_res TCONF "'${mkfs_cmd}' not supported."
return
fi
fi
${mkfs_cmd} >temp 2>&1
if [ $? -ne 0 ]; then
grep -q -E "unknown option | invalid option" temp
if [ $? -eq 0 ]; then
tst_res TCONF "'${mkfs_cmd}' not supported."
return
else
tst_res TFAIL "'${mkfs_cmd}' failed."
cat temp
return
fi
fi
if [ -n "$device" ]; then
mkfs_verify_type "$fs_type" "$device"
if [ $? -ne 0 ]; then
tst_res TFAIL "'${mkfs_cmd}' failed, not expected."
return
fi
fi
if [ -n "$size" ]; then
mkfs_verify_size "$fs_type" "$size"
if [ $? -ne 0 ]; then
tst_res TFAIL "'${mkfs_cmd}' failed, not expected."
return
fi
fi
tst_res TPASS "'${mkfs_cmd}' passed."
}
test1()
{
mkfs_test "" "$FS_TYPE" "" "$TST_DEVICE"
}
test2()
{
mkfs_test "" "$FS_TYPE" "" "$TST_DEVICE" "16000"
}
test3()
{
mkfs_test "" "$FS_TYPE" "-c" "$TST_DEVICE"
}
test4()
{
mkfs_test "-V"
}
test5()
{
mkfs_test "-h"
}
tst_run