280 lines
8.0 KiB
Bash
Executable File
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
|