#!/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