| #!/bin/sh |
| # |
| # UBI Volume creation/deletion/write/read and JFFS2 on top of UBI |
| # testcases. |
| # |
| # 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 Added fixup for delayed device node creation by udev |
| # This points to a problem in the tools, mabe in the desing |
| # Tue Oct 31 14:14:54 CET 2006 |
| # |
| |
| VERSION="1.1" |
| |
| export PATH=$PATH:/bin:~/bin:/usr/local/bin:/home/dedekind/work/prj/ubi/tools/flashutils/bin/ |
| |
| ITERATIONS=250 |
| ALIGNMENT=2048 |
| |
| UBIMKVOL="ubimkvol -a $ALIGNMENT" |
| UBIRMVOL=ubirmvol |
| UBIUPDATEVOL=ubiupdatevol |
| |
| SIZE_512K=524288 |
| SIZE_1M=1310720 |
| |
| MINVOL=10 |
| MAXVOL=12 |
| |
| TLOG=/dev/null |
| |
| # |
| # 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 "*** 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 $MINVOL $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 |
| } |
| |
| # |
| # FIXME Udev needs some time until the device nodes are created. |
| # This will cause trouble if after ubimkvol an update attempt |
| # is started immediately, since the device node is not yet |
| # available. We should either fix the tools with inotify or |
| # other ideas or figure out a different way to solve the problem |
| # e.g. to use ubi0 and make the volume device nodes obsolete... |
| # |
| udev_wait () |
| { |
| echo -n "FIXME Waiting for udev to create/delete device node " |
| grep 2\.6\.5 /proc/version > /dev/null |
| if [ $? -eq "0" ]; then |
| for i in `seq 0 5`; do |
| sleep 1; echo -n "."; |
| done |
| echo " ok" |
| fi |
| } |
| |
| # 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 "*** Truncate volume if it exists ... " |
| echo " $UBIUPDATEVOL -d0 -n$volume -t" |
| $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 |
| # udev_wait |
| fi |
| } |
| |
| # writevol_test - Tests volume creation and writing data to it. |
| # |
| # @volume: Volume number |
| # @size: Size of random data to write |
| # @type: Volume type static or dynamic |
| # |
| writevol_test () |
| { |
| volume=$1 |
| size=$2 |
| type=$3 |
| |
| echo "*** Write volume test with size $size" |
| |
| ### Make sure that volume exist, delete existing volume, create new |
| |
| delete_volume $volume |
| |
| echo "*** Try to create volume" |
| echo " $UBIMKVOL -d0 -n$volume -t$type -NNEW$volume -s $size ... " |
| $UBIMKVOL -d0 -n$volume -t$type -N"NEW$volume" -s $size |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| udev_wait |
| |
| ### Try to create same volume again |
| echo -n "*** Try to create some volume again, this must fail ... " |
| $UBIMKVOL -d0 -n$volume -t$type -N"NEW$volume" -s $size |
| 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 ... " |
| echo " $UBIUPDATEVOL -d0 -n$volume testdata.bin" |
| ls -l testdata.bin |
| $UBIUPDATEVOL -d0 -n$volume testdata.bin |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| echo "*** Download data with dd bs=1 ... " |
| dd if=/dev/ubi0_$volume of=readdata.bin bs=$size count=1 |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| echo -n "*** Comparing data ... " |
| cmp readdata.bin testdata.bin |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| echo -n "*** Now truncate volume ... " |
| $UBIUPDATEVOL -d0 -n$volume -t |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| } |
| |
| jffs2_torture () |
| { |
| cat /dev/null > TLOG |
| |
| echo "*** Torture test ... " |
| |
| for i in `seq $iterations`; do |
| dd if=/dev/urandom of=test.bin bs=$i count=1 2>> $TLOG |
| if [ $? -ne "0" ] ; then |
| echo "Testing $i byte (dd if=/dev/urandom of=foo bs=$i count=1) ... " |
| exit_failure |
| fi |
| #passed |
| |
| dd if=test.bin of=new.bin bs=$i count=1 2>> $TLOG |
| if [ $? -ne "0" ] ; then |
| echo "dd if=test.bin of=new.bin bs=$i count=1 2>> $TLOG" |
| exit_failure |
| fi |
| #passed |
| |
| #echo "Comparing files ... " |
| cmp test.bin new.bin |
| dd if=test.bin of=new.bin bs=$i count=1 2>> $TLOG |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| #passed |
| #echo -n "." |
| done |
| |
| echo -n "step0:ok " |
| |
| for i in `seq $iterations`; do |
| dd if=/dev/urandom of=foo bs=$i count=1 2>> $TLOG |
| if [ $? -ne "0" ] ; then |
| echo "Testing $i byte (dd if=/dev/urandom of=foo bs=$i count=1) ... " |
| exit_failure |
| fi |
| #passed |
| done |
| |
| echo -n "step1:ok " |
| |
| for i in `seq $iterations`; do |
| dd if=/dev/zero of=foo bs=1 count=$i 2>> $TLOG |
| if [ $? -ne "0" ] ; then |
| echo "Testing $i byte (dd if=/dev/zero of=foo bs=1 count=$i) ... " |
| exit_failure |
| fi |
| #passed |
| done |
| |
| echo -n "step2:ok " |
| |
| for i in `seq $iterations`; do |
| dd if=/dev/zero of=foo bs=$i count=16 2>> $TLOG |
| if [ $? -ne "0" ] ; then |
| echo "Testing $i byte (dd if=/dev/zero of=foo bs=$i count=1024) ... " |
| exit_failure |
| fi |
| #passed |
| done |
| |
| echo -n "step3:ok " |
| |
| passed |
| } |
| |
| # writevol_test - Tests volume creation and writing data to it. |
| # |
| # @volume: Volume number |
| # @size: Size of random data to write |
| # @type: Volume type static or dynamic |
| # |
| jffs2_test () |
| { |
| name=$1 |
| iterations=$2 |
| directory=`pwd` |
| |
| ### Setup |
| ulimit -c unlimited |
| |
| echo -n "*** Create directory /mnt/$name ... " |
| mkdir -p /mnt/$name |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| echo -n "*** mount -t jffs2 mtd:$name /mnt/$name ... " |
| mount -t jffs2 mtd:$name /mnt/$name |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| echo -n "*** change directory ... " |
| cd /mnt/$name |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| ls |
| echo "*** list directory ... " |
| ls -la |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| ### Torture |
| echo -n "*** touch I_WAS_HERE ... " |
| touch I_WAS_HERE |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| jffs2_torture |
| |
| echo "*** list directory ... " |
| ls -la |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| ### Cleanup |
| echo -n "*** go back ... " |
| cd $directory |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| ### Still mounted, ubiupdatevol must fail! |
| |
| echo -n "*** $UBIUPDATEVOL -d0 -n$volume -t must fail! ..." |
| $UBIUPDATEVOL -d0 -n$volume -t |
| if [ $? -eq "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| echo -n "*** umount /mnt/$name ... " |
| umount /mnt/$name |
| if [ $? -ne "0" ] ; then |
| exit_failure |
| fi |
| passed |
| |
| return |
| } |
| |
| echo "***********************************************************************" |
| echo "* UBI JFFS2 Testing starts now ... *" |
| echo "* Good luck! *" |
| echo "***********************************************************************" |
| echo "VERSION: $VERSION" |
| |
| # 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 |
| |
| for volume in `seq $MINVOL $MAXVOL`; do |
| echo -n "************ VOLUME $volume NEW$volume " |
| echo "******************************************" |
| writevol_test $volume $SIZE_1M dynamic |
| jffs2_test NEW$volume $ITERATIONS |
| delete_volume $volume |
| done |
| |
| echo "***********************************************************************" |
| echo "* Congratulations, no errors found! *" |
| echo "* Have fun with your cool UBI system! *" |
| echo "***********************************************************************" |
| |
| exit_success |