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