#!/bin/sh
#
# UBI Volume creation/deletion/write/read test script
#
# Written in shell language to reduce dependencies to more sophisticated 
# interpreters, which may not be available on some stupid platforms.
#
# Author: Frank Haverkamp <haver@vnet.ibm.com>
#
# 1.0 Initial version
# 1.1 Use ubiupdatevol instead of ubiwritevol
#

VERSION="1.1"

export PATH=$PATH:~/bin:/usr/local/bin:/home/dedekind/work/prj/ubi/tools/flashutils/bin/

UBIMKVOL=ubimkvol
UBIRMVOL=ubirmvol
UBIUPDATEVOL=ubiupdatevol

# 128 KiB 131072
# 256 KiB 262144
# 512 KiB 524288

SIZE_512K=524288
SIZE_1M=1310720

SELF=$0
MINVOL=10
MAXVOL=12

#
# To have a standardized output I define the following function to be
# used when a test was ok or when it failed.
#
failed () 
{
    echo "FAILED"
}

passed ()
{
    echo "PASSED"
}

#
# Print sucess message. Consider to exit with zero as return code.
#
exit_success ()
{
    echo "SUCCESS"
    exit 0
}

#
# Print failure message. Consider to exit with non zero return code.
#
exit_failure ()
{
    echo "FAILED"
    exit 1
}

###############################################################################
#
# START
#
###############################################################################

fix_sysfs_issue ()
{
    echo -n "*** Fixing the sysfs issue with the /dev nodes ... "

    minor=0
    major=`grep ubi0 /proc/devices | sed -e 's/\(.*\) ubi0/\1/'`

    rm -rf /dev/ubi0
    mknod /dev/ubi0 c $major 0

    for minor in `seq 0 $MAXVOL`; do
	### echo " mknod /dev/ubi0_$minor c $major $(($minor + 1))"
        rm -rf /dev/ubi0_$minor
        mknod /dev/ubi0_$minor c $major $(($minor + 1))
    done
    passed
}

# delete_volume - Delete a volume. If it does not exist, do not try
#                 to delete it.
# @id:     volume id
#
delete_volume ()
{
    volume=$1

    ### FIXME broken sysfs!!!!
    if [ -e /sys/class/ubi/$volume -o -e /sys/class/ubi/ubi0/$volume -o -e /sys/class/ubi/ubi0_$volume ]; then

	echo -n "*** Truncate volume if it exists ... "
	$UBIUPDATEVOL -d0 -n$volume -t
	if [ $? -ne "0" ] ; then
	    exit_failure
	fi
	passed

	echo -n "*** Delete volume if it exists ... "
	$UBIRMVOL -d0 -n$volume
	if [ $? -ne "0" ] ; then
	    exit_failure
	fi
	passed
    fi
}

mkvol_rmvol_test ()
{
    type=$1

### Test if volume delete on non-existing volumes fails nicely

    for i in `seq $MINVOL $MAXVOL`; do
	echo "*** Delete if exist or not $i ... "

	delete_volume $i
	passed
    done

### Now deleting volumes must fail

    for i in `seq $MINVOL $MAXVOL`; do
	echo "*** Trying to delete non existing UBI Volume $i ... "

	$UBIRMVOL -d0 -n$i
	if [ $? -eq "0" ] ; then
	    exit_failure
	fi
	passed
    done

### Test if volume creation works ok

    for i in `seq $MINVOL $MAXVOL`; do
	echo "*** Creating UBI Volume $i ... "
	echo "    $UBIMKVOL -d0 -n$i -t$type -NNEW$i -s $SIZE_512K"

	$UBIMKVOL -d0 -n$i -t$type -N"NEW$i" -s $SIZE_512K
	if [ $? -ne "0" ] ; then
	    exit_failure
	fi
	passed
    done

### Now deleting volumes must be ok

    for i in `seq $MINVOL $MAXVOL`; do
	echo "*** Trying to delete UBI Volume $i ... "

	$UBIRMVOL -d0 -n$i
	if [ $? -ne "0" ] ; then
	    exit_failure
	fi
	passed
    done

### Now allocate too large volume

    echo -n "*** Try to create too large volume"
    $UBIMKVOL -d0 -n$MINVOL -t$type -N"NEW$MINVOL" -s 800000000
    if [ $? -eq "0" ] ; then
	exit_failure
    fi
    passed
}

# writevol_test - Tests volume creation and writing data to it.
#
# @size:    Size of random data to write
# @type:    Volume type static or dynamic
#
writevol_test ()
{
    size=$1
    type=$2

    echo "*** Write volume test with size $size"

### Make sure that volume exist, delete existing volume, create new

    delete_volume $MINVOL

    echo -n "*** Try to create volume ... "
    $UBIMKVOL -d0 -n$MINVOL -t$type -N"NEW$MINVOL" -s $SIZE_1M
    if [ $? -ne "0" ] ; then
	exit_failure
    fi
    passed
    
### Try to create same volume again
    echo -n "*** Try to create some volume again, this must fail ... "
    $UBIMKVOL -d0 -n$MINVOL -t$type -N"NEW$MINVOL" -s $SIZE_1M
    if [ $? -eq "0" ] ; then
	exit_failure
    fi
    passed
    
### Now create test data, write it, read it, compare it
    echo -n "*** Create test data ... "
    dd if=/dev/urandom of=testdata.bin bs=$size count=1
    if [ $? -ne "0" ] ; then
	exit_failure
    fi
    passed

    echo "*** Now writing data to volume ... "
    # sleep 5
    ls -l testdata.bin
    echo "    $UBIUPDATEVOL -d0 -n$MINVOL testdata.bin"
    $UBIUPDATEVOL -d0 -n$MINVOL testdata.bin
    if [ $? -ne "0" ] ; then
	exit_failure
    fi
    passed

    if [ $type = "static" ] ; then
	echo "*** Download data with cat ... "
	cat /dev/ubi0_$MINVOL > readdata.bin
	if [ $? -ne "0" ] ; then
	    exit_failure
	fi
	passed
    else
	echo "*** Download data with dd bs=1 ... "
	dd if=/dev/ubi0_$MINVOL of=readdata.bin bs=$size count=1
	if [ $? -ne "0" ] ; then
	    exit_failure
	fi
	passed

	# Size 1 does not work with this test ...
	#
	#echo "*** Download data with dd bs=$size ... "
	#dd if=/dev/ubi0_$MINVOL of=readdata2.bin bs=$size count=1
	#if [ $? -ne "0" ] ; then
	#    exit_failure
	#fi
	#passed

	#echo -n "*** Comparing data (1) ... "
	#cmp readdata.bin readdata2.bin
	#if [ $? -ne "0" ] ; then
	#    exit_failure
	#fi
	#passed
    fi

    echo -n "*** Comparing data ... "
    cmp readdata.bin testdata.bin
    if [ $? -ne "0" ] ; then
	exit_failure
    fi
    passed
}

echo "***********************************************************************"
echo "*           UBI Testing starts now ...                                *"
echo "*                                 Good luck!                          *"
echo "***********************************************************************"

# Set to zero if not running on example hardware
grep ubi /proc/devices > /dev/null
if [ $? -ne "0" ]; then
    echo "No UBI found in /proc/devices! I am broken!"
    exit_failure
fi

# Set to zero if not running on example hardware
grep 1142 /proc/cpuinfo > /dev/null
if [ $? -eq "0" ]; then
    echo "Running on example hardware"
    mount -o remount,rw / /
    sleep 1
    fix_sysfs_issue
else
    echo "Running on Artems hardware"
fi

echo "***********************************************************************"
echo "*        mkvol/rmvol testing for static volumes ...                   *"
echo "***********************************************************************"

mkvol_rmvol_test static

echo "***********************************************************************"
echo "*        mkvol/rmvol testing for dynamic volumes ...                  *"
echo "***********************************************************************"

mkvol_rmvol_test dynamic

echo "***********************************************************************"
echo "*                write to static volumes ...                          *"
echo "***********************************************************************"

# 10 Erase blocks = (128 KiB - 64 * 2) * 10
#                 = 1309440 bytes
# 128 KiB 131072
# 256 KiB 262144
# 512 KiB 524288

for size in 262144 131073 131072 2048 1 4096 12800 31313  ; do
    writevol_test $size static
done

echo "***********************************************************************"
echo "*                write to dynamic volumes ...                         *"
echo "***********************************************************************"
echo "VERSION: $VERSION"

for size in 131073 131072 2048 1 4096 12800 31313 262144 ; do
    writevol_test $size dynamic
done

echo "***********************************************************************"
echo "*               Congratulations, no errors found!                     *"
echo "*              Have fun with your cool UBI system!                    *"
echo "***********************************************************************"

exit_success