xref: /rk3399_rockchip-uboot/test/fs/fs-test.sh (revision 2d221489df021393654805536be7effcb9d39702)
16c016485SSuriyan Ramasami#!/bin/bash
26c016485SSuriyan Ramasami#
36c016485SSuriyan Ramasami# (C) Copyright 2014 Suriyan Ramasami
46c016485SSuriyan Ramasami#
56c016485SSuriyan Ramasami#  SPDX-License-Identifier:	GPL-2.0+
66c016485SSuriyan Ramasami#
76c016485SSuriyan Ramasami
86c016485SSuriyan Ramasami# Invoke this test script from U-Boot base directory as ./test/fs/fs-test.sh
96c016485SSuriyan Ramasami# It currently tests the fs/sb and native commands for ext4 and fat partitions
106c016485SSuriyan Ramasami# Expected results are as follows:
116c016485SSuriyan Ramasami# EXT4 tests:
12df9e4cdaSTom Rini# fs-test.sb.ext4.out: Summary: PASS: 23 FAIL: 0
13*b1849152SStefan Brüns# fs-test.ext4.out: Summary: PASS: 23 FAIL: 0
14*b1849152SStefan Brüns# fs-test.fs.ext4.out: Summary: PASS: 23 FAIL: 0
156c016485SSuriyan Ramasami# FAT tests:
16df9e4cdaSTom Rini# fs-test.sb.fat.out: Summary: PASS: 23 FAIL: 0
17df9e4cdaSTom Rini# fs-test.fat.out: Summary: PASS: 20 FAIL: 3
18df9e4cdaSTom Rini# fs-test.fs.fat.out: Summary: PASS: 20 FAIL: 3
19*b1849152SStefan Brüns# Total Summary: TOTAL PASS: 132 TOTAL FAIL: 6
206c016485SSuriyan Ramasami
216c016485SSuriyan Ramasami# pre-requisite binaries list.
226c016485SSuriyan RamasamiPREREQ_BINS="md5sum mkfs mount umount dd fallocate mkdir"
236c016485SSuriyan Ramasami
246c016485SSuriyan Ramasami# All generated output files from this test will be in $OUT_DIR
256c016485SSuriyan Ramasami# Hence everything is sandboxed.
266c016485SSuriyan RamasamiOUT_DIR="sandbox/test/fs"
276c016485SSuriyan Ramasami
286c016485SSuriyan Ramasami# Location of generated sandbox u-boot
296c016485SSuriyan RamasamiUBOOT="./sandbox/u-boot"
306c016485SSuriyan Ramasami
316c016485SSuriyan Ramasami# Our mount directory will be in the sandbox
326c016485SSuriyan RamasamiMOUNT_DIR="${OUT_DIR}/mnt"
336c016485SSuriyan Ramasami
346c016485SSuriyan Ramasami# The file system image we create will have the $IMG prefix.
356c016485SSuriyan RamasamiIMG="${OUT_DIR}/3GB"
366c016485SSuriyan Ramasami
376c016485SSuriyan Ramasami# $SMALL_FILE is the name of the 1MB file in the file system image
386c016485SSuriyan RamasamiSMALL_FILE="1MB.file"
396c016485SSuriyan Ramasami
406c016485SSuriyan Ramasami# $BIG_FILE is the name of the 2.5GB file in the file system image
416c016485SSuriyan RamasamiBIG_FILE="2.5GB.file"
426c016485SSuriyan Ramasami
436c016485SSuriyan Ramasami# $MD5_FILE will have the expected md5s when we do the test
446c016485SSuriyan Ramasami# They shall have a suffix which represents their file system (ext4/fat)
456c016485SSuriyan RamasamiMD5_FILE="${OUT_DIR}/md5s.list"
466c016485SSuriyan Ramasami
476c016485SSuriyan Ramasami# $OUT shall be the prefix of the test output. Their suffix will be .out
486c016485SSuriyan RamasamiOUT="${OUT_DIR}/fs-test"
496c016485SSuriyan Ramasami
506c016485SSuriyan Ramasami# Full Path of the 1 MB file that shall be created in the fs image.
516c016485SSuriyan RamasamiMB1="${MOUNT_DIR}/${SMALL_FILE}"
526c016485SSuriyan RamasamiGB2p5="${MOUNT_DIR}/${BIG_FILE}"
536c016485SSuriyan Ramasami
546c016485SSuriyan Ramasami# ************************
556c016485SSuriyan Ramasami# * Functions start here *
566c016485SSuriyan Ramasami# ************************
576c016485SSuriyan Ramasami
586c016485SSuriyan Ramasami# Check if the prereq binaries exist, or exit
596c016485SSuriyan Ramasamifunction check_prereq() {
606c016485SSuriyan Ramasami	for prereq in $PREREQ_BINS; do
6147b71644SStephen Warren		if [ ! -x "`which $prereq`" ]; then
626c016485SSuriyan Ramasami			echo "Missing $prereq binary. Exiting!"
636c016485SSuriyan Ramasami			exit
646c016485SSuriyan Ramasami		fi
656c016485SSuriyan Ramasami	done
666c016485SSuriyan Ramasami
676c016485SSuriyan Ramasami	# We use /dev/urandom to create files. Check if it exists.
686c016485SSuriyan Ramasami	if [ ! -c /dev/urandom ]; then
696c016485SSuriyan Ramasami		echo "Missing character special /dev/urandom. Exiting!"
706c016485SSuriyan Ramasami		exit
716c016485SSuriyan Ramasami	fi
726c016485SSuriyan Ramasami}
736c016485SSuriyan Ramasami
746c016485SSuriyan Ramasami# If 1st param is "clean", then clean out the generated files and exit
756c016485SSuriyan Ramasamifunction check_clean() {
766c016485SSuriyan Ramasami	if [ "$1" = "clean" ]; then
776c016485SSuriyan Ramasami		rm -rf "$OUT_DIR"
786c016485SSuriyan Ramasami		echo "Cleaned up generated files. Exiting"
796c016485SSuriyan Ramasami		exit
806c016485SSuriyan Ramasami	fi
816c016485SSuriyan Ramasami}
826c016485SSuriyan Ramasami
836c016485SSuriyan Ramasami# Generate sandbox U-Boot - gleaned from /test/dm/test-dm.sh
846c016485SSuriyan Ramasamifunction compile_sandbox() {
856c016485SSuriyan Ramasami	unset CROSS_COMPILE
866c016485SSuriyan Ramasami	NUM_CPUS=$(cat /proc/cpuinfo |grep -c processor)
876c016485SSuriyan Ramasami	make O=sandbox sandbox_config
886c016485SSuriyan Ramasami	make O=sandbox -s -j${NUM_CPUS}
896c016485SSuriyan Ramasami
906c016485SSuriyan Ramasami	# Check if U-Boot exists
916c016485SSuriyan Ramasami	if [ ! -x "$UBOOT" ]; then
926c016485SSuriyan Ramasami		echo "$UBOOT does not exist or is not executable"
936c016485SSuriyan Ramasami		echo "Build error?"
946c016485SSuriyan Ramasami		echo "Please run this script as ./test/fs/`basename $0`"
956c016485SSuriyan Ramasami		exit
966c016485SSuriyan Ramasami	fi
976c016485SSuriyan Ramasami}
986c016485SSuriyan Ramasami
996c016485SSuriyan Ramasami# Clean out all generated files other than the file system images
1006c016485SSuriyan Ramasami# We save time by not deleting and recreating the file system images
1016c016485SSuriyan Ramasamifunction prepare_env() {
1026c016485SSuriyan Ramasami	rm -f ${MD5_FILE}.* ${OUT}.*
10308eee271SStephen Warren	mkdir -p ${OUT_DIR}
1046c016485SSuriyan Ramasami}
1056c016485SSuriyan Ramasami
1066c016485SSuriyan Ramasami# 1st parameter is the name of the image file to be created
1076c016485SSuriyan Ramasami# 2nd parameter is the filesystem - fat ext4 etc
1086c016485SSuriyan Ramasami# -F cant be used with fat as it means something else.
1096c016485SSuriyan Ramasamifunction create_image() {
1106c016485SSuriyan Ramasami	# Create image if not already present - saves time, while debugging
1116c016485SSuriyan Ramasami	if [ "$2" = "ext4" ]; then
1126c016485SSuriyan Ramasami		MKFS_OPTION="-F"
1136c016485SSuriyan Ramasami	else
1146c016485SSuriyan Ramasami		MKFS_OPTION=""
1156c016485SSuriyan Ramasami	fi
1166c016485SSuriyan Ramasami	if [ ! -f "$1" ]; then
1176c016485SSuriyan Ramasami		fallocate -l 3G "$1" &> /dev/null
11808eee271SStephen Warren		if [ $? -ne 0 ]; then
11908eee271SStephen Warren			echo fallocate failed - using dd instead
12008eee271SStephen Warren			dd if=/dev/zero of=$1 bs=1024 count=$((3 * 1024 * 1024))
12108eee271SStephen Warren			if [ $? -ne 0 ]; then
12208eee271SStephen Warren				echo Could not create empty disk image
12308eee271SStephen Warren				exit $?
12408eee271SStephen Warren			fi
12508eee271SStephen Warren		fi
1266c016485SSuriyan Ramasami		mkfs -t "$2" $MKFS_OPTION "$1" &> /dev/null
1276c016485SSuriyan Ramasami		if [ $? -ne 0 -a "$2" = "fat" ]; then
1286c016485SSuriyan Ramasami			# If we fail and we did fat, try vfat.
1296c016485SSuriyan Ramasami			mkfs -t vfat $MKFS_OPTION "$1" &> /dev/null
1306c016485SSuriyan Ramasami		fi
13108eee271SStephen Warren		if [ $? -ne 0 ]; then
13208eee271SStephen Warren			echo Could not create filesystem
13308eee271SStephen Warren			exit $?
13408eee271SStephen Warren		fi
1356c016485SSuriyan Ramasami	fi
1366c016485SSuriyan Ramasami}
1376c016485SSuriyan Ramasami
1386c016485SSuriyan Ramasami# 1st parameter is image file
1396c016485SSuriyan Ramasami# 2nd parameter is file system type - fat/ext4
1406c016485SSuriyan Ramasami# 3rd parameter is name of small file
1416c016485SSuriyan Ramasami# 4th parameter is name of big file
1426c016485SSuriyan Ramasami# 5th parameter is fs/nonfs/sb - to dictate generic fs commands or
1436c016485SSuriyan Ramasami# otherwise or sb hostfs
1446c016485SSuriyan Ramasami# 6th parameter is the directory path for the files. Its "" for generic
1456c016485SSuriyan Ramasami# fs and ext4/fat and full patch for sb hostfs
1466c016485SSuriyan Ramasami# UBOOT is set in env
1476c016485SSuriyan Ramasamifunction test_image() {
1486c016485SSuriyan Ramasami	addr="0x01000008"
1496c016485SSuriyan Ramasami	length="0x00100000"
1506c016485SSuriyan Ramasami
1516c016485SSuriyan Ramasami	case "$2" in
1526c016485SSuriyan Ramasami		fat)
15386853568SStefan Brüns		FPATH=""
1546c016485SSuriyan Ramasami		PREFIX="fat"
1556c016485SSuriyan Ramasami		WRITE="write"
1566c016485SSuriyan Ramasami		;;
1576c016485SSuriyan Ramasami
1586c016485SSuriyan Ramasami		ext4)
15986853568SStefan Brüns		# ext4 needs absolute path
16086853568SStefan Brüns		FPATH="/"
1616c016485SSuriyan Ramasami		PREFIX="ext4"
1626c016485SSuriyan Ramasami		WRITE="write"
1636c016485SSuriyan Ramasami		;;
1646c016485SSuriyan Ramasami
1656c016485SSuriyan Ramasami		*)
1666c016485SSuriyan Ramasami		echo "Unhandled filesystem $2. Exiting!"
1676c016485SSuriyan Ramasami		exit
1686c016485SSuriyan Ramasami		;;
1696c016485SSuriyan Ramasami	esac
1706c016485SSuriyan Ramasami
1716c016485SSuriyan Ramasami	case "$5" in
1726c016485SSuriyan Ramasami		fs)
1736c016485SSuriyan Ramasami		PREFIX=""
1746c016485SSuriyan Ramasami		WRITE="save"
1756c016485SSuriyan Ramasami		SUFFIX=" 0:0"
1766c016485SSuriyan Ramasami		;;
1776c016485SSuriyan Ramasami
1786c016485SSuriyan Ramasami		nonfs)
1796c016485SSuriyan Ramasami		SUFFIX=" 0:0"
1806c016485SSuriyan Ramasami		;;
1816c016485SSuriyan Ramasami
1826c016485SSuriyan Ramasami		sb)
1836c016485SSuriyan Ramasami		PREFIX="sb "
1846c016485SSuriyan Ramasami		WRITE="save"
1856c016485SSuriyan Ramasami		SUFFIX="fs -"
1866c016485SSuriyan Ramasami		;;
1876c016485SSuriyan Ramasami
1886c016485SSuriyan Ramasami		*)
1896c016485SSuriyan Ramasami		echo "Unhandled mode $5. Exiting!"
1906c016485SSuriyan Ramasami		exit
1916c016485SSuriyan Ramasami		;;
1926c016485SSuriyan Ramasami
1936c016485SSuriyan Ramasami	esac
1946c016485SSuriyan Ramasami
19586853568SStefan Brüns	# sb always uses full path to mointpoint, irrespective of filesystem
19686853568SStefan Brüns	if [ "$5" = "sb" ]; then
19786853568SStefan Brüns		FPATH=${6}/
19886853568SStefan Brüns	fi
19986853568SStefan Brüns
20086853568SStefan Brüns	FILE_WRITE=${3}.w
2016c016485SSuriyan Ramasami	FILE_SMALL=$3
2026c016485SSuriyan Ramasami	FILE_BIG=$4
2036c016485SSuriyan Ramasami
2046c016485SSuriyan Ramasami	# In u-boot commands, <interface> stands for host or hostfs
2056c016485SSuriyan Ramasami	# hostfs maps to the host fs.
2066c016485SSuriyan Ramasami	# host maps to the "sb bind" that we do
2076c016485SSuriyan Ramasami
2086c016485SSuriyan Ramasami	$UBOOT << EOF
2096c016485SSuriyan Ramasamisb=$5
2106c016485SSuriyan Ramasamisetenv bind 'if test "\$sb" != sb; then sb bind 0 "$1"; fi'
2116c016485SSuriyan Ramasamirun bind
2126c016485SSuriyan Ramasami# Test Case 1 - ls
2136c016485SSuriyan Ramasami${PREFIX}ls host${SUFFIX} $6
2146c016485SSuriyan Ramasami#
2156c016485SSuriyan Ramasami# We want ${PREFIX}size host 0:0 $3 for host commands and
2166c016485SSuriyan Ramasami# sb size hostfs - $3 for hostfs commands.
2176c016485SSuriyan Ramasami# 1MB is 0x0010 0000
2186c016485SSuriyan Ramasami# Test Case 2 - size of small file
21986853568SStefan Brüns${PREFIX}size host${SUFFIX} ${FPATH}$FILE_SMALL
2206c016485SSuriyan Ramasamiprintenv filesize
2216c016485SSuriyan Ramasamisetenv filesize
2226c016485SSuriyan Ramasami
2236c016485SSuriyan Ramasami# 2.5GB (1024*1024*2500) is 0x9C40 0000
2246c016485SSuriyan Ramasami# Test Case 3 - size of big file
22586853568SStefan Brüns${PREFIX}size host${SUFFIX} ${FPATH}$FILE_BIG
2266c016485SSuriyan Ramasamiprintenv filesize
2276c016485SSuriyan Ramasamisetenv filesize
2286c016485SSuriyan Ramasami
2296c016485SSuriyan Ramasami# Notes about load operation
2306c016485SSuriyan Ramasami# If I use 0x01000000 I get DMA misaligned error message
2316c016485SSuriyan Ramasami# Last two parameters are size and offset.
2326c016485SSuriyan Ramasami
2336c016485SSuriyan Ramasami# Test Case 4a - Read full 1MB of small file
23486853568SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_SMALL
2356c016485SSuriyan Ramasamiprintenv filesize
2366c016485SSuriyan Ramasami# Test Case 4b - Read full 1MB of small file
2376c016485SSuriyan Ramasamimd5sum $addr \$filesize
2386c016485SSuriyan Ramasamisetenv filesize
2396c016485SSuriyan Ramasami
2406c016485SSuriyan Ramasami# Test Case 5a - First 1MB of big file
24186853568SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x0
2426c016485SSuriyan Ramasamiprintenv filesize
2436c016485SSuriyan Ramasami# Test Case 5b - First 1MB of big file
2446c016485SSuriyan Ramasamimd5sum $addr \$filesize
2456c016485SSuriyan Ramasamisetenv filesize
2466c016485SSuriyan Ramasami
2476c016485SSuriyan Ramasami# fails for ext as no offset support
2486c016485SSuriyan Ramasami# Test Case 6a - Last 1MB of big file
24986853568SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x9C300000
2506c016485SSuriyan Ramasamiprintenv filesize
2516c016485SSuriyan Ramasami# Test Case 6b - Last 1MB of big file
2526c016485SSuriyan Ramasamimd5sum $addr \$filesize
2536c016485SSuriyan Ramasamisetenv filesize
2546c016485SSuriyan Ramasami
2556c016485SSuriyan Ramasami# fails for ext as no offset support
2566c016485SSuriyan Ramasami# Test Case 7a - One from the last 1MB chunk of 2GB
25786853568SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x7FF00000
2586c016485SSuriyan Ramasamiprintenv filesize
2596c016485SSuriyan Ramasami# Test Case 7b - One from the last 1MB chunk of 2GB
2606c016485SSuriyan Ramasamimd5sum $addr \$filesize
2616c016485SSuriyan Ramasamisetenv filesize
2626c016485SSuriyan Ramasami
2636c016485SSuriyan Ramasami# fails for ext as no offset support
2646c016485SSuriyan Ramasami# Test Case 8a - One from the start 1MB chunk from 2GB
26586853568SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x80000000
2666c016485SSuriyan Ramasamiprintenv filesize
2676c016485SSuriyan Ramasami# Test Case 8b - One from the start 1MB chunk from 2GB
2686c016485SSuriyan Ramasamimd5sum $addr \$filesize
2696c016485SSuriyan Ramasamisetenv filesize
2706c016485SSuriyan Ramasami
2716c016485SSuriyan Ramasami# fails for ext as no offset support
2726c016485SSuriyan Ramasami# Test Case 9a - One 1MB chunk crossing the 2GB boundary
27386853568SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x7FF80000
2746c016485SSuriyan Ramasamiprintenv filesize
2756c016485SSuriyan Ramasami# Test Case 9b - One 1MB chunk crossing the 2GB boundary
2766c016485SSuriyan Ramasamimd5sum $addr \$filesize
2776c016485SSuriyan Ramasamisetenv filesize
2786c016485SSuriyan Ramasami
2796c016485SSuriyan Ramasami# Generic failure case
2806c016485SSuriyan Ramasami# Test Case 10 - 2MB chunk from the last 1MB of big file
28186853568SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG 0x00200000 0x9C300000
2826c016485SSuriyan Ramasamiprintenv filesize
2836c016485SSuriyan Ramasami#
2846c016485SSuriyan Ramasami
2856c016485SSuriyan Ramasami# Read 1MB from small file
28686853568SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_SMALL
2876c016485SSuriyan Ramasami# Write it back to test the writes
2886c016485SSuriyan Ramasami# Test Case 11a - Check that the write succeeded
28986853568SStefan Brüns${PREFIX}${WRITE} host${SUFFIX} $addr ${FPATH}$FILE_WRITE \$filesize
2906c016485SSuriyan Ramasamimw.b $addr 00 100
29186853568SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_WRITE
2926c016485SSuriyan Ramasami# Test Case 11b - Check md5 of written to is same as the one read from
2936c016485SSuriyan Ramasamimd5sum $addr \$filesize
2946c016485SSuriyan Ramasamisetenv filesize
2956c016485SSuriyan Ramasami#
29614678b3cSStefan Brüns
29714678b3cSStefan Brüns# Next test case checks writing a file whose dirent
29814678b3cSStefan Brüns# is the first in the block, which is always true for "."
29914678b3cSStefan Brüns# The write should fail, but the lookup should work
30014678b3cSStefan Brüns# Test Case 12 - Check directory traversal
30114678b3cSStefan Brüns${PREFIX}${WRITE} host${SUFFIX} $addr ${FPATH}. 0x10
3022365a4b8SStefan Brüns
3032365a4b8SStefan Brüns# Read 1MB from small file
3042365a4b8SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_SMALL
3052365a4b8SStefan Brüns# Write it via "same directory", i.e. "." dirent
3062365a4b8SStefan Brüns# Test Case 13a - Check directory traversal
3072365a4b8SStefan Brüns${PREFIX}${WRITE} host${SUFFIX} $addr ${FPATH}./${FILE_WRITE}2 \$filesize
3082365a4b8SStefan Brünsmw.b $addr 00 100
3092365a4b8SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}./${FILE_WRITE}2
3102365a4b8SStefan Brüns# Test Case 13b - Check md5 of written to is same as the one read from
3112365a4b8SStefan Brünsmd5sum $addr \$filesize
3122365a4b8SStefan Brünssetenv filesize
3132365a4b8SStefan Brünsmw.b $addr 00 100
3142365a4b8SStefan Brüns${PREFIX}load host${SUFFIX} $addr ${FPATH}${FILE_WRITE}2
3152365a4b8SStefan Brüns# Test Case 13c - Check md5 of written to is same as the one read from
3162365a4b8SStefan Brünsmd5sum $addr \$filesize
3172365a4b8SStefan Brünssetenv filesize
3182365a4b8SStefan Brüns#
3196c016485SSuriyan Ramasamireset
3206c016485SSuriyan Ramasami
3216c016485SSuriyan RamasamiEOF
3226c016485SSuriyan Ramasami}
3236c016485SSuriyan Ramasami
3246c016485SSuriyan Ramasami# 1st argument is the name of the image file.
3256c016485SSuriyan Ramasami# 2nd argument is the file where we generate the md5s of the files
3266c016485SSuriyan Ramasami# generated with the appropriate start and length that we use to test.
3276c016485SSuriyan Ramasami# It creates the necessary files in the image to test.
3286c016485SSuriyan Ramasami# $GB2p5 is the path of the big file (2.5 GB)
3296c016485SSuriyan Ramasami# $MB1 is the path of the small file (1 MB)
3306c016485SSuriyan Ramasami# $MOUNT_DIR is the path we can use to mount the image file.
3316c016485SSuriyan Ramasamifunction create_files() {
3326c016485SSuriyan Ramasami	# Mount the image so we can populate it.
3336c016485SSuriyan Ramasami	mkdir -p "$MOUNT_DIR"
3346c016485SSuriyan Ramasami	sudo mount -o loop,rw "$1" "$MOUNT_DIR"
3356c016485SSuriyan Ramasami
3366c016485SSuriyan Ramasami	# Create big file in this image.
3376c016485SSuriyan Ramasami	# Note that we work only on the start 1MB, couple MBs in the 2GB range
3386c016485SSuriyan Ramasami	# and the last 1 MB of the huge 2.5GB file.
3396c016485SSuriyan Ramasami	# So, just put random values only in those areas.
3406c016485SSuriyan Ramasami	if [ ! -f "${GB2p5}" ]; then
3416c016485SSuriyan Ramasami		sudo dd if=/dev/urandom of="${GB2p5}" bs=1M count=1 \
3426c016485SSuriyan Ramasami			&> /dev/null
3436c016485SSuriyan Ramasami		sudo dd if=/dev/urandom of="${GB2p5}" bs=1M count=2 seek=2047 \
3446c016485SSuriyan Ramasami			&> /dev/null
3456c016485SSuriyan Ramasami		sudo dd if=/dev/urandom of="${GB2p5}" bs=1M count=1 seek=2499 \
3466c016485SSuriyan Ramasami			&> /dev/null
3476c016485SSuriyan Ramasami	fi
3486c016485SSuriyan Ramasami
3496c016485SSuriyan Ramasami	# Create a small file in this image.
3506c016485SSuriyan Ramasami	if [ ! -f "${MB1}" ]; then
3516c016485SSuriyan Ramasami		sudo dd if=/dev/urandom of="${MB1}" bs=1M count=1 \
3526c016485SSuriyan Ramasami			&> /dev/null
3536c016485SSuriyan Ramasami	fi
3546c016485SSuriyan Ramasami
3552365a4b8SStefan Brüns	# Delete the small file copies which possibly are written as part of a
3566c016485SSuriyan Ramasami	# previous test.
3576c016485SSuriyan Ramasami	sudo rm -f "${MB1}.w"
3582365a4b8SStefan Brüns	sudo rm -f "${MB1}.w2"
3596c016485SSuriyan Ramasami
3606c016485SSuriyan Ramasami	# Generate the md5sums of reads that we will test against small file
3616c016485SSuriyan Ramasami	dd if="${MB1}" bs=1M skip=0 count=1 2> /dev/null | md5sum > "$2"
3626c016485SSuriyan Ramasami
3636c016485SSuriyan Ramasami	# Generate the md5sums of reads that we will test against big file
3646c016485SSuriyan Ramasami	# One from beginning of file.
3656c016485SSuriyan Ramasami	dd if="${GB2p5}" bs=1M skip=0 count=1 \
3666c016485SSuriyan Ramasami		2> /dev/null | md5sum >> "$2"
3676c016485SSuriyan Ramasami
3686c016485SSuriyan Ramasami	# One from end of file.
3696c016485SSuriyan Ramasami	dd if="${GB2p5}" bs=1M skip=2499 count=1 \
3706c016485SSuriyan Ramasami		2> /dev/null | md5sum >> "$2"
3716c016485SSuriyan Ramasami
3726c016485SSuriyan Ramasami	# One from the last 1MB chunk of 2GB
3736c016485SSuriyan Ramasami	dd if="${GB2p5}" bs=1M skip=2047 count=1 \
3746c016485SSuriyan Ramasami		2> /dev/null | md5sum >> "$2"
3756c016485SSuriyan Ramasami
3766c016485SSuriyan Ramasami	# One from the start 1MB chunk from 2GB
3776c016485SSuriyan Ramasami	dd if="${GB2p5}" bs=1M skip=2048 count=1 \
3786c016485SSuriyan Ramasami		2> /dev/null | md5sum >> "$2"
3796c016485SSuriyan Ramasami
3806c016485SSuriyan Ramasami	# One 1MB chunk crossing the 2GB boundary
3816c016485SSuriyan Ramasami	dd if="${GB2p5}" bs=512K skip=4095 count=2 \
3826c016485SSuriyan Ramasami		2> /dev/null | md5sum >> "$2"
3836c016485SSuriyan Ramasami
3846c016485SSuriyan Ramasami	sync
3856c016485SSuriyan Ramasami	sudo umount "$MOUNT_DIR"
3866c016485SSuriyan Ramasami	rmdir "$MOUNT_DIR"
3876c016485SSuriyan Ramasami}
3886c016485SSuriyan Ramasami
3896c016485SSuriyan Ramasami# 1st parameter is the text to print
3906c016485SSuriyan Ramasami# if $? is 0 its a pass, else a fail
3916c016485SSuriyan Ramasami# As a side effect it shall update env variable PASS and FAIL
3926c016485SSuriyan Ramasamifunction pass_fail() {
3936c016485SSuriyan Ramasami	if [ $? -eq 0 ]; then
3946c016485SSuriyan Ramasami		echo pass - "$1"
3956c016485SSuriyan Ramasami		PASS=$((PASS + 1))
3966c016485SSuriyan Ramasami	else
3976c016485SSuriyan Ramasami		echo FAIL - "$1"
3986c016485SSuriyan Ramasami		FAIL=$((FAIL + 1))
3996c016485SSuriyan Ramasami	fi
4006c016485SSuriyan Ramasami}
4016c016485SSuriyan Ramasami
4026c016485SSuriyan Ramasami# 1st parameter is the string which leads to an md5 generation
4036c016485SSuriyan Ramasami# 2nd parameter is the file we grep, for that string
4046c016485SSuriyan Ramasami# 3rd parameter is the name of the file which has md5s in it
4056c016485SSuriyan Ramasami# 4th parameter is the line # in the md5 file that we match it against
4066c016485SSuriyan Ramasami# This function checks if the md5 of the file in the sandbox matches
4076c016485SSuriyan Ramasami# that calculated while generating the file
4086c016485SSuriyan Ramasami# 5th parameter is the string to print with the result
4096c016485SSuriyan Ramasamicheck_md5() {
4106c016485SSuriyan Ramasami	# md5sum in u-boot has output of form:
4116c016485SSuriyan Ramasami	# md5 for 01000008 ... 01100007 ==> <md5>
4126c016485SSuriyan Ramasami	# the 7th field is the actual md5
413d9554b7fSStefan Brüns	md5_src=`grep -A2 "$1" "$2" | grep "md5 for" | tr -d '\r'`
4146c016485SSuriyan Ramasami	md5_src=($md5_src)
4156c016485SSuriyan Ramasami	md5_src=${md5_src[6]}
4166c016485SSuriyan Ramasami
4176c016485SSuriyan Ramasami	# The md5 list, each line is of the form:
4186c016485SSuriyan Ramasami	# - <md5>
4196c016485SSuriyan Ramasami	# the 2nd field is the actual md5
4206c016485SSuriyan Ramasami	md5_dst=`sed -n $4p $3`
4216c016485SSuriyan Ramasami	md5_dst=($md5_dst)
4226c016485SSuriyan Ramasami	md5_dst=${md5_dst[0]}
4236c016485SSuriyan Ramasami
4246c016485SSuriyan Ramasami	# For a pass they should match.
4256c016485SSuriyan Ramasami	[ "$md5_src" = "$md5_dst" ]
4266c016485SSuriyan Ramasami	pass_fail "$5"
4276c016485SSuriyan Ramasami}
4286c016485SSuriyan Ramasami
4296c016485SSuriyan Ramasami# 1st parameter is the name of the output file to check
4306c016485SSuriyan Ramasami# 2nd parameter is the name of the file containing the md5 expected
4316c016485SSuriyan Ramasami# 3rd parameter is the name of the small file
4326c016485SSuriyan Ramasami# 4th parameter is the name of the big file
4336c016485SSuriyan Ramasami# 5th paramter is the name of the written file
4346c016485SSuriyan Ramasami# This function checks the output file for correct results.
4356c016485SSuriyan Ramasamifunction check_results() {
4366c016485SSuriyan Ramasami	echo "** Start $1"
4376c016485SSuriyan Ramasami
4386c016485SSuriyan Ramasami	PASS=0
4396c016485SSuriyan Ramasami	FAIL=0
4406c016485SSuriyan Ramasami
4416c016485SSuriyan Ramasami	# Check if the ls is showing correct results for 2.5 gb file
4426c016485SSuriyan Ramasami	grep -A6 "Test Case 1 " "$1" | egrep -iq "2621440000 *$4"
4436c016485SSuriyan Ramasami	pass_fail "TC1: ls of $4"
4446c016485SSuriyan Ramasami
4456c016485SSuriyan Ramasami	# Check if the ls is showing correct results for 1 mb file
4466c016485SSuriyan Ramasami	grep -A6 "Test Case 1 " "$1" | egrep -iq "1048576 *$3"
4476c016485SSuriyan Ramasami	pass_fail "TC1: ls of $3"
4486c016485SSuriyan Ramasami
4496c016485SSuriyan Ramasami	# Check size command on 1MB.file
4506c016485SSuriyan Ramasami	egrep -A3 "Test Case 2 " "$1" | grep -q "filesize=100000"
4516c016485SSuriyan Ramasami	pass_fail "TC2: size of $3"
4526c016485SSuriyan Ramasami
4536c016485SSuriyan Ramasami	# Check size command on 2.5GB.file
4546c016485SSuriyan Ramasami	egrep -A3 "Test Case 3 " "$1" | grep -q "filesize=9c400000"
4556c016485SSuriyan Ramasami	pass_fail "TC3: size of $4"
4566c016485SSuriyan Ramasami
4576c016485SSuriyan Ramasami	# Check read full mb of 1MB.file
458d9554b7fSStefan Brüns	grep -A4 "Test Case 4a " "$1" | grep -q "filesize=100000"
4596c016485SSuriyan Ramasami	pass_fail "TC4: load of $3 size"
4606c016485SSuriyan Ramasami	check_md5 "Test Case 4b " "$1" "$2" 1 "TC4: load from $3"
4616c016485SSuriyan Ramasami
4626c016485SSuriyan Ramasami	# Check first mb of 2.5GB.file
463d9554b7fSStefan Brüns	grep -A4 "Test Case 5a " "$1" | grep -q "filesize=100000"
4646c016485SSuriyan Ramasami	pass_fail "TC5: load of 1st MB from $4 size"
4656c016485SSuriyan Ramasami	check_md5 "Test Case 5b " "$1" "$2" 2 "TC5: load of 1st MB from $4"
4666c016485SSuriyan Ramasami
4676c016485SSuriyan Ramasami	# Check last mb of 2.5GB.file
468d9554b7fSStefan Brüns	grep -A4 "Test Case 6a " "$1" | grep -q "filesize=100000"
4696c016485SSuriyan Ramasami	pass_fail "TC6: load of last MB from $4 size"
4706c016485SSuriyan Ramasami	check_md5 "Test Case 6b " "$1" "$2" 3 "TC6: load of last MB from $4"
4716c016485SSuriyan Ramasami
4726c016485SSuriyan Ramasami	# Check last 1mb chunk of 2gb from 2.5GB file
473d9554b7fSStefan Brüns	grep -A4 "Test Case 7a " "$1" | grep -q "filesize=100000"
4746c016485SSuriyan Ramasami	pass_fail "TC7: load of last 1mb chunk of 2GB from $4 size"
4756c016485SSuriyan Ramasami	check_md5 "Test Case 7b " "$1" "$2" 4 \
4766c016485SSuriyan Ramasami		"TC7: load of last 1mb chunk of 2GB from $4"
4776c016485SSuriyan Ramasami
4786c016485SSuriyan Ramasami	# Check first 1mb chunk after 2gb from 2.5GB file
479d9554b7fSStefan Brüns	grep -A4 "Test Case 8a " "$1" | grep -q "filesize=100000"
4806c016485SSuriyan Ramasami	pass_fail "TC8: load 1st MB chunk after 2GB from $4 size"
4816c016485SSuriyan Ramasami	check_md5 "Test Case 8b " "$1" "$2" 5 \
4826c016485SSuriyan Ramasami		"TC8: load 1st MB chunk after 2GB from $4"
4836c016485SSuriyan Ramasami
4846c016485SSuriyan Ramasami	# Check 1mb chunk crossing the 2gb boundary from 2.5GB file
485d9554b7fSStefan Brüns	grep -A4 "Test Case 9a " "$1" | grep -q "filesize=100000"
4866c016485SSuriyan Ramasami	pass_fail "TC9: load 1MB chunk crossing 2GB boundary from $4 size"
4876c016485SSuriyan Ramasami	check_md5 "Test Case 9b " "$1" "$2" 6 \
4886c016485SSuriyan Ramasami		"TC9: load 1MB chunk crossing 2GB boundary from $4"
4896c016485SSuriyan Ramasami
490e8de6d7bSTom Rini	# Check 2mb chunk from the last 1MB of 2.5GB file loads 1MB
491d9554b7fSStefan Brüns	grep -A5 "Test Case 10 " "$1" | grep -q "filesize=100000"
492e8de6d7bSTom Rini	pass_fail "TC10: load 2MB from the last 1MB of $4 loads 1MB"
4936c016485SSuriyan Ramasami
4946c016485SSuriyan Ramasami	# Check 1mb chunk write
495d9554b7fSStefan Brüns	grep -A2 "Test Case 11a " "$1" | grep -q '1048576 bytes written'
49606806e38SStefan Brüns	pass_fail "TC11: 1MB write to $3.w - write succeeded"
4976c016485SSuriyan Ramasami	check_md5 "Test Case 11b " "$1" "$2" 1 \
49806806e38SStefan Brüns		"TC11: 1MB write to $3.w - content verified"
49914678b3cSStefan Brüns
50014678b3cSStefan Brüns	# Check lookup of 'dot' directory
50114678b3cSStefan Brüns	grep -A4 "Test Case 12 " "$1" | grep -q 'Unable to write file'
50214678b3cSStefan Brüns	pass_fail "TC12: 1MB write to . - write denied"
5032365a4b8SStefan Brüns
5042365a4b8SStefan Brüns	# Check directory traversal
5052365a4b8SStefan Brüns	grep -A2 "Test Case 13a " "$1" | grep -q '1048576 bytes written'
5062365a4b8SStefan Brüns	pass_fail "TC13: 1MB write to ./$3.w2 - write succeeded"
5072365a4b8SStefan Brüns	check_md5 "Test Case 13b " "$1" "$2" 1 \
5082365a4b8SStefan Brüns		"TC13: 1MB read from ./$3.w2 - content verified"
5092365a4b8SStefan Brüns	check_md5 "Test Case 13c " "$1" "$2" 1 \
5102365a4b8SStefan Brüns		"TC13: 1MB read from $3.w2 - content verified"
5112365a4b8SStefan Brüns
5126c016485SSuriyan Ramasami	echo "** End $1"
5136c016485SSuriyan Ramasami}
5146c016485SSuriyan Ramasami
5156c016485SSuriyan Ramasami# Takes in one parameter which is "fs" or "nonfs", which then dictates
5166c016485SSuriyan Ramasami# if a fs test (size/load/save) or a nonfs test (fatread/extread) needs to
5176c016485SSuriyan Ramasami# be performed.
5186c016485SSuriyan Ramasamifunction test_fs_nonfs() {
5196c016485SSuriyan Ramasami	echo "Creating files in $fs image if not already present."
5206c016485SSuriyan Ramasami	create_files $IMAGE $MD5_FILE_FS
5216c016485SSuriyan Ramasami
52204812605SStephen Warren	OUT_FILE="${OUT}.$1.${fs}.out"
5236c016485SSuriyan Ramasami	test_image $IMAGE $fs $SMALL_FILE $BIG_FILE $1 "" \
52404812605SStephen Warren		> ${OUT_FILE} 2>&1
525d9554b7fSStefan Brüns	# strip out noise from fs code
526d9554b7fSStefan Brüns	grep -v -e "File System is consistent\|update journal finished" \
527d9554b7fSStefan Brüns		-e "reading .*\.file\|writing .*\.file.w" \
528d9554b7fSStefan Brüns		< ${OUT_FILE} > ${OUT_FILE}_clean
529d9554b7fSStefan Brüns	check_results ${OUT_FILE}_clean $MD5_FILE_FS $SMALL_FILE \
530d9554b7fSStefan Brüns		$BIG_FILE
5316c016485SSuriyan Ramasami	TOTAL_FAIL=$((TOTAL_FAIL + FAIL))
5326c016485SSuriyan Ramasami	TOTAL_PASS=$((TOTAL_PASS + PASS))
5336c016485SSuriyan Ramasami	echo "Summary: PASS: $PASS FAIL: $FAIL"
5346c016485SSuriyan Ramasami	echo "--------------------------------------------"
5356c016485SSuriyan Ramasami}
5366c016485SSuriyan Ramasami
5376c016485SSuriyan Ramasami# ********************
5386c016485SSuriyan Ramasami# * End of functions *
5396c016485SSuriyan Ramasami# ********************
5406c016485SSuriyan Ramasami
5416c016485SSuriyan Ramasamicheck_clean "$1"
5426c016485SSuriyan Ramasamicheck_prereq
5436c016485SSuriyan Ramasamicompile_sandbox
5446c016485SSuriyan Ramasamiprepare_env
5456c016485SSuriyan Ramasami
5466c016485SSuriyan Ramasami# Track TOTAL_FAIL and TOTAL_PASS
5476c016485SSuriyan RamasamiTOTAL_FAIL=0
5486c016485SSuriyan RamasamiTOTAL_PASS=0
5496c016485SSuriyan Ramasami
5506c016485SSuriyan Ramasami# In each loop, for a given file system image, we test both the
5516c016485SSuriyan Ramasami# fs command, like load/size/write, the file system specific command
5526c016485SSuriyan Ramasami# like: ext4load/ext4size/ext4write and the sb load/ls/save commands.
5536c016485SSuriyan Ramasamifor fs in ext4 fat; do
5546c016485SSuriyan Ramasami
5556c016485SSuriyan Ramasami	echo "Creating $fs image if not already present."
5566c016485SSuriyan Ramasami	IMAGE=${IMG}.${fs}.img
5576c016485SSuriyan Ramasami	MD5_FILE_FS="${MD5_FILE}.${fs}"
5586c016485SSuriyan Ramasami	create_image $IMAGE $fs
5596c016485SSuriyan Ramasami
5606c016485SSuriyan Ramasami	# sb commands test
5616c016485SSuriyan Ramasami	echo "Creating files in $fs image if not already present."
5626c016485SSuriyan Ramasami	create_files $IMAGE $MD5_FILE_FS
5636c016485SSuriyan Ramasami
5646c016485SSuriyan Ramasami	# Lets mount the image and test sb hostfs commands
5656c016485SSuriyan Ramasami	mkdir -p "$MOUNT_DIR"
5666c016485SSuriyan Ramasami	if [ "$fs" = "fat" ]; then
5676c016485SSuriyan Ramasami		uid="uid=`id -u`"
5686c016485SSuriyan Ramasami	else
5696c016485SSuriyan Ramasami		uid=""
5706c016485SSuriyan Ramasami	fi
5716c016485SSuriyan Ramasami	sudo mount -o loop,rw,$uid "$IMAGE" "$MOUNT_DIR"
5726c016485SSuriyan Ramasami	sudo chmod 777 "$MOUNT_DIR"
5736c016485SSuriyan Ramasami
5746c016485SSuriyan Ramasami	OUT_FILE="${OUT}.sb.${fs}.out"
5756c016485SSuriyan Ramasami	test_image $IMAGE $fs $SMALL_FILE $BIG_FILE sb `pwd`/$MOUNT_DIR \
57604812605SStephen Warren		> ${OUT_FILE} 2>&1
5776c016485SSuriyan Ramasami	sudo umount "$MOUNT_DIR"
5786c016485SSuriyan Ramasami	rmdir "$MOUNT_DIR"
5796c016485SSuriyan Ramasami
58006806e38SStefan Brüns	check_results $OUT_FILE $MD5_FILE_FS $SMALL_FILE $BIG_FILE
5816c016485SSuriyan Ramasami	TOTAL_FAIL=$((TOTAL_FAIL + FAIL))
5826c016485SSuriyan Ramasami	TOTAL_PASS=$((TOTAL_PASS + PASS))
5836c016485SSuriyan Ramasami	echo "Summary: PASS: $PASS FAIL: $FAIL"
5846c016485SSuriyan Ramasami	echo "--------------------------------------------"
5856c016485SSuriyan Ramasami
5866c016485SSuriyan Ramasami	test_fs_nonfs nonfs
5876c016485SSuriyan Ramasami	test_fs_nonfs fs
5886c016485SSuriyan Ramasamidone
5896c016485SSuriyan Ramasami
5906c016485SSuriyan Ramasamiecho "Total Summary: TOTAL PASS: $TOTAL_PASS TOTAL FAIL: $TOTAL_FAIL"
5916c016485SSuriyan Ramasamiecho "--------------------------------------------"
5926c016485SSuriyan Ramasamiif [ $TOTAL_FAIL -eq 0 ]; then
5936c016485SSuriyan Ramasami	echo "PASSED"
5946c016485SSuriyan Ramasami	exit 0
5956c016485SSuriyan Ramasamielse
5966c016485SSuriyan Ramasami	echo "FAILED"
5976c016485SSuriyan Ramasami	exit 1
5986c016485SSuriyan Ramasamifi
599