#!/bin/sh # # Copyright (c) 2015 Fujitsu Ltd. # Author: Zhang Jin <jy_zhangjin@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 df command with some basic options. # TST_CNT=12 TST_SETUP=setup TST_CLEANUP=cleanup 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_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 } FS_TYPE=ext2 parse_args() { FS_TYPE="$2" } setup() { local ret if [ -n "$FS_TYPE" ]; then tst_test_cmds mkfs.${FS_TYPE} fi tst_mkfs ${FS_TYPE} ${TST_DEVICE} ROD_SILENT mkdir -p mntpoint mount ${TST_DEVICE} mntpoint 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 DF_FS_TYPE=$(mount | grep "$TST_DEVICE" | awk '{print $5}') } cleanup() { tst_umount ${TST_DEVICE} } df_test() { local cmd="$1 -P" df_verify $cmd if [ $? -ne 0 ]; then return fi df_check $cmd if [ $? -ne 0 ]; then tst_res TFAIL "'$cmd' failed, not expected." return fi ROD_SILENT dd if=/dev/zero of=mntpoint/testimg bs=1024 count=1024 df_verify $cmd df_check $cmd if [ $? -eq 0 ]; then tst_res TPASS "'$cmd' passed." else tst_res TFAIL "'$cmd' failed." fi ROD_SILENT rm -rf mntpoint/testimg # flush file system buffers, then we can get the actual sizes. sync } df_verify() { $@ >output 2>&1 if [ $? -ne 0 ]; then grep -q -E "unrecognized option | invalid option" output if [ $? -eq 0 ]; then tst_res TCONF "'$1' not supported." return 32 else tst_res TFAIL "'$1' failed." cat output return 1 fi fi } df_check() { if [ "$(echo $@)" = "df -i -P" ]; then local total=$(stat -f mntpoint --printf=%c) local free=$(stat -f mntpoint --printf=%d) local used=$((total-free)) else local total=$(stat -f mntpoint --printf=%b) local free=$(stat -f mntpoint --printf=%f) local used=$((total-free)) local bsize=$(stat -f mntpoint --printf=%s) total=$(($total * $bsize / 1024)) used=$(($used * $bsize / 1024)) fi grep ${TST_DEVICE} output | grep -q "${total}.*${used}" if [ $? -ne 0 ]; then return 1 fi } test1() { df_test "df" } test2() { df_test "df -a" } test3() { df_test "df -i" } test4() { df_test "df -k" } test5() { df_test "df -t ${DF_FS_TYPE}" } test6() { df_test "df -T" } test7() { df_test "df -v ${TST_DEVICE}" } test8() { df_verify "df -h" if [ $? -eq 0 ]; then tst_res TPASS "'df -h' passed." fi } test9() { df_verify "df -H" if [ $? -eq 0 ]; then tst_res TPASS "'df -H' passed." fi } test10() { df_verify "df -m" if [ $? -eq 0 ]; then tst_res TPASS "'df -m' passed." fi } test11() { df_verify "df --version" if [ $? -eq 0 ]; then tst_res TPASS "'df --version' passed." fi } test12() { local cmd="df -x ${DF_FS_TYPE} -P" df_verify $cmd if [ $? -ne 0 ]; then return fi grep ${TST_DEVICE} output | grep -q mntpoint if [ $? -ne 0 ]; then tst_res TPASS "'$cmd' passed." else tst_res TFAIL "'$cmd' failed." fi } tst_run