android13/external/ltp/testcases/kernel/fs/fs_di/fs_di

280 lines
8.0 KiB
Bash
Executable File

#! /bin/sh
#
# Copyright (c) International Business Machines Corp., 2005
#
# 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 implie; warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
# the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
#
#
# FILE : fs_di
#
# PURPOSE: FileSystem Data Integrity
# 1. Creates a data file of specified or random size and copies
# the file to a random directory depth on a specified filesystem
# The two files are compared and checked for differences.
# If the files differ, then the test fails. By default, this
# test creates a 30Mb file and runs for ten loops.
# 2. Creates a datafile of size half of the partition size. Creates
# two fragmented files on the specified partition and copies datafile
# to them. Then compares both the fragmented files with datafile. If
# files differ, then test fails.
#
# SETUP: None
#
#
# HISTORY:
# 28/07/09 Jyoti Vantagodi (jyotiv@linux.vnet.ibm.com)
# Added point two of above PURPOSE
# 04/11/05 Robbie Williamson (robbiew@us.ibm.com)
# -Written
#
#***********************************************************************
#Uncomment line below for debug output.
#trace_logic=${trace_logic:-"set -x"}
$trace_logic
#-----------------------------------------------------------------------
# Initialize local variables
#-----------------------------------------------------------------------
TC=${TC:=fs_di}
TCbin=${TCbin:=`pwd`}
TCtmp=${TCtmp:=$TMPDIR/$TC$$}
export PATH=$PATH:$TCbin:../../../bin
export TCID=$TC
export TST_TOTAL=1
export TST_COUNT=1
# If CLEANUP is not set; set it to "ON"
CLEANUP=${CLEANUP:="ON"}
usage()
{
cat <<-EOF >&2
usage: ./${0##*/} -d TMPDIR [-h] [-l # of LOOPS ] [-s SIZE in Mb][-S partition SIZE in Mb]
-d TMPDIR Directory where temporary files will be created.
-h Help. Prints all available options.
-l # of LOOPS The number of times to run the test. Default=10.
-s SIZE in Mb The size of the data file to create. Default=30Mb. A "0" means random sizes from 10-500Mb.
-S SIZE in Mb Size of usable partition (in MBs) on which the testing is carried out (needs to be passed
for fragmented file test)
-v Verbose output.
example: ./${0##*/} -d /mnt/cifsmount -l 20 -s 100 -S 200
example: ./${0##*/} -d /mnt/cifsmount -l 20 -s 100
EOF
exit 0
}
#=============================================================================
# FUNCTION NAME: end_testcase
#
# FUNCTION DESCRIPTION: Clean up
#
# PARAMETERS: None.
#
# RETURNS: None.
#=============================================================================
end_testcase()
{
$trace_logic
if [ "$CLEANUP" = "ON" ]; then
rm -rf $TCtmp
rm -rf ${TESTFS}
rm -f $TCtmp/testfile*
fi
[ $# = 0 ] && { tst_resm TPASS "Test Successful"; exit 0; }
tst_resm TFAIL "Test Failed: $@"
exit 1
}
#=============================================================================
# FUNCTION NAME: setup_testcase
#
# FUNCTION DESCRIPTION: Perform the setup function for the testcase.
#
# PARAMETERS: None.
#
# RETURNS: None.
#=============================================================================
$trace_logic
TMPBASE=0
LOOPS=10
SIZE=30
RANDOM_SIZE=0
DISK_SIZE=0
while getopts d:hl:s:S:v arg
do
case $arg in
d) # append $$ to TMP, as it is recursively
# removed at end of script.
export TMPBASE=$OPTARG
TMP="${TMPBASE}/fs_di-$$"
export TESTFS="$TMP";;
h) usage
exit 0;;
l) # Execute user defined number of loops.
LOOPS=$OPTARG;;
s) # Size of data file to create
SIZE=$OPTARG
if [ $SIZE -eq 0 ]; then
RANDOM_SIZE=1
fi;;
v) # Verbose
trace_logic=${trace_logic:-"set -x"};;
S) # Size of usable partition, which is used for creating creating the files
DISK_SIZE=$OPTARG;;
\?) usage
exit 0;;
esac
done
if [ $TMPBASE = "0" ]; then
tst_resm TBROK "You must specify the target directory [-d]"
exit 1
fi
export TST_COUNT=$LOOPS
echo ""
echo "Test Options:"
echo " Tested Filesystem: $TESTFS"
echo " Loops: $LOOPS"
if [ $RANDOM_SIZE -eq 0 ];then
echo " Data File Size: $SIZE"
else
echo " Data File Size: Random"
fi
sleep 5
$trace_logic
mkdir -p $TCtmp || end_testcase "Could not create $TCtmp"
chmod 777 $TCtmp
mkdir -p $TESTFS || end_testcase "Could not create $TESTFS"
chmod 777 $TESTFS
#=============================================================================
# FUNCTION NAME: main
#
# FUNCTION DESCRIPTION: Perform the test
#
# PARAMETERS: None.
#
# RETURNS: None.
#=============================================================================
loopcount=0
tst_resm TINFO "Test Started"
while [ $loopcount -lt $LOOPS ]
do
if [ $RANDOM_SIZE -eq 1 ]; then
SIZE=$RANDOM
let "SIZE %= 500"
while [ $SIZE -lt 10 ]
do
SIZE=$RANDOM
let "SIZE %= 500"
done
fi
create_datafile $SIZE $TCtmp/testfile >/dev/null
if [ $? != 0 ]; then
end_testcase "Could not create testfile of size ${SIZE}Mb"
fi
RANDOM_DEPTH=$RANDOM
: $(( RANDOM_DEPTH %= 500 ))
RANDOM_LENGTH=$RANDOM
: $(( RANDOM_LENGTH %= 500 ))
RANDOM_LENGTH=$(( $RANDOM_LENGTH / 10 ))
NameCount=0
DepthCount=0
FILEPATH=""
while [ $DepthCount -lt $RANDOM_DEPTH ]
do
if [ $NameCount -lt $RANDOM_LENGTH ]; then
FILEPATH=${FILEPATH}X
NameCount=$(( $NameCount + 1 ))
else
FILEPATH=${FILEPATH}/
NameCount=0
fi
DepthCount=$(( $DepthCount + 1 ))
done
mkdir -p ${TESTFS}/${FILEPATH} || end_testcase "Could not create ${TESTFS}/${FILEPATH}"
chmod -R 777 $TESTFS
cp $TCtmp/testfile ${TESTFS}/${FILEPATH}
cmp $TCtmp/testfile ${TESTFS}/${FILEPATH}/testfile
retval=$?
if [ "$retval" != 0 ]; then
end_testcase "Error in loop $loopcount: cmp after write FAILED"
fi
cp ${TESTFS}/${FILEPATH}/testfile $TCtmp/testfile_copy
cmp $TCtmp/testfile $TCtmp/testfile_copy
retval=$?
if [ "$retval" != 0 ]; then
end_testcase "Error in loop $loopcount: cmp after read FAILED"
fi
rm -rf ${TESTFS}/${FILEPATH}
rm -f $TCtmp/testfile*
loopcount=$(( $loopcount + 1 ))
tst_resm TINFO "Completed Loop $loopcount"
done
if [ "$DISK_SIZE" != 0 ]; then
#Create a datafile of size half of the disk size
tst_resm TINFO "Creating fragmented files. Please wait..."
DISK_SIZE=$(( $DISK_SIZE / 2 ))
if [ "$DISK_SIZE" == 0 ]; then
DISK_SIZE=1
fi
create_datafile $DISK_SIZE $TCtmp/testfile >/dev/null
retval=$?
if [ "$retval" != 0 ]; then
end_testcase "Error in creating data file"
fi
#Invoke frag to create 2 fragmented files and copy data file to both the files
frag $TCtmp/testfile $TMPBASE
retval=$?
if [ "$retval" != 0 ]; then
end_testcase "Error in creating frag files"
fi
tst_resm TINFO "Created fragmented files"
#Compare both frag files with data file
cmp $TCtmp/testfile $TMPBASE/frag1
retval=$?
if [ "$retval" != 0 ]; then
end_testcase "frag1 and datafile are not matching"
fi
if [ "$retval" != 0 ]; then
end_testcase "frag2 and datafile are not matching"
fi
tst_resm TINFO "Completed test with fragmented files"
rm -rf $TMPBASE/*
rm -f $TCtmp/testfile*
fi
end_testcase