u-boot/test/fs/fat-noncontig-test.sh
Tom Rini 83d290c56f SPDX: Convert all of our single license tags to Linux Kernel style
When U-Boot started using SPDX tags we were among the early adopters and
there weren't a lot of other examples to borrow from.  So we picked the
area of the file that usually had a full license text and replaced it
with an appropriate SPDX-License-Identifier: entry.  Since then, the
Linux Kernel has adopted SPDX tags and they place it as the very first
line in a file (except where shebangs are used, then it's second line)
and with slightly different comment styles than us.

In part due to community overlap, in part due to better tag visibility
and in part for other minor reasons, switch over to that style.

This commit changes all instances where we have a single declared
license in the tag as both the before and after are identical in tag
contents.  There's also a few places where I found we did not have a tag
and have introduced one.

Signed-off-by: Tom Rini <trini@konsulko.com>
2018-05-07 09:34:12 -04:00

145 lines
4.1 KiB
Bash
Executable File

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0+
# (C) Copyright 2015 Stephen Warren
# This script tests U-Boot's FAT filesystem code's ability to read non-
# contiguous files.
# When porting the ff.c FAT parsing code into U-Boot, it was found that ff.c
# always reads files cluster-by-cluster, which results in poor performance.
# This was solved by adding a patch to ff.c to coalesce reads of adjacent
# clusters. Since this patch needed to correctly handle non-contiguous files,
# this test was written to validate that.
#
# To execute the test, simply run it from the U-Boot source root directory:
#
# cd u-boot
# ./test/fs/fat-noncontig-test.sh
#
# The test will create a FAT filesystem image, record the CRC of a randomly
# generated file in the image, build U-Boot sandbox, invoke U-Boot sandbox to
# read the file and validate that the CRCs match. Expected output is shown
# below. The important part of the log is the penultimate line that contains
# either "PASS" or "FAILURE".
#
# mkfs.fat 3.0.26 (2014-03-07)
#
#
# U-Boot 2015.10-rc4-00018-g4b22a3e5513f (Oct 03 2015 - 13:49:23 -0600)
#
# DRAM: 128 MiB
# Using default environment
#
# In: serial
# Out: lcd
# Err: lcd
# Net: No ethernet found.
# => host bind 0 sandbox/fat-noncontig.img
# => load host 0:0 1000 noncontig.img
# 33584964 bytes read in 18 ms (1.7 GiB/s)
# => crc32 1000 $filesize 0
# crc32 for 00001000 ... 02008743 ==> 6a080523
# => if itest.l *0 != 2305086a; then echo FAILURE; else echo PASS; fi
# PASS
# => reset
#
# All temporary files used by this script are created in ./sandbox to avoid
# polluting the source tree. test/fs/fs-test.sh also uses this directory for
# the same purpose.
#
# TODO: Integrate this (and many other corner-cases e.g. different types of
# FAT) with fs-test.sh so that a single script tests everything filesystem-
# related.
odir=sandbox
img=${odir}/fat-noncontig.img
mnt=${odir}/mnt
fill=/dev/urandom
testfn=noncontig.img
mnttestfn=${mnt}/${testfn}
crcaddr=0
loadaddr=1000
for prereq in fallocate mkfs.fat dd crc32; do
if [ ! -x "`which $prereq`" ]; then
echo "Missing $prereq binary. Exiting!"
exit 1
fi
done
make O=${odir} -s sandbox_defconfig && make O=${odir} -s -j8
mkdir -p ${mnt}
if [ ! -f ${img} ]; then
fallocate -l 40M ${img}
if [ $? -ne 0 ]; then
echo fallocate failed - using dd instead
dd if=/dev/zero of=${img} bs=1024 count=$((40 * 1024))
if [ $? -ne 0 ]; then
echo Could not create empty disk image
exit $?
fi
fi
mkfs.fat ${img}
if [ $? -ne 0 ]; then
echo Could not create FAT filesystem
exit $?
fi
sudo mount -o loop,uid=$(id -u) ${img} ${mnt}
if [ $? -ne 0 ]; then
echo Could not mount test filesystem
exit $?
fi
for ((sects=8; sects < 512; sects += 8)); do
fn=${mnt}/keep-${sects}.img
dd if=${fill} of=${fn} bs=512 count=${sects} >/dev/null 2>&1
fn=${mnt}/remove-${sects}.img
dd if=${fill} of=${fn} bs=512 count=${sects} >/dev/null 2>&1
done
rm -f ${mnt}/remove-*.img
# 511 deliberately to trigger a file size that's not a multiple of the
# sector size (ignoring sizes that are multiples of both).
dd if=${fill} of=${mnttestfn} bs=511 >/dev/null 2>&1
sudo umount ${mnt}
if [ $? -ne 0 ]; then
echo Could not unmount test filesystem
exit $?
fi
fi
sudo mount -o ro,loop,uid=$(id -u) ${img} ${mnt}
if [ $? -ne 0 ]; then
echo Could not mount test filesystem
exit $?
fi
crc=0x`crc32 ${mnttestfn}`
sudo umount ${mnt}
if [ $? -ne 0 ]; then
echo Could not unmount test filesystem
exit $?
fi
crc=`printf %02x%02x%02x%02x \
$((${crc} & 0xff)) \
$(((${crc} >> 8) & 0xff)) \
$(((${crc} >> 16) & 0xff)) \
$((${crc} >> 24))`
./sandbox/u-boot << EOF
host bind 0 ${img}
load host 0:0 ${loadaddr} ${testfn}
crc32 ${loadaddr} \$filesize ${crcaddr}
if itest.l *${crcaddr} != ${crc}; then echo FAILURE; else echo PASS; fi
reset
EOF
if [ $? -ne 0 ]; then
echo U-Boot exit status indicates an error
exit $?
fi