diff options
Diffstat (limited to 'test')
-rwxr-xr-x | test/fs/fs-test.sh | 145 | ||||
-rw-r--r-- | test/py/tests/test_vboot.py | 16 |
2 files changed, 95 insertions, 66 deletions
diff --git a/test/fs/fs-test.sh b/test/fs/fs-test.sh index 93679cb..6e71b61 100755 --- a/test/fs/fs-test.sh +++ b/test/fs/fs-test.sh @@ -9,14 +9,14 @@ # It currently tests the fs/sb and native commands for ext4 and fat partitions # Expected results are as follows: # EXT4 tests: -# fs-test.sb.ext4.out: Summary: PASS: 17 FAIL: 2 -# fs-test.ext4.out: Summary: PASS: 10 FAIL: 9 -# fs-test.fs.ext4.out: Summary: PASS: 10 FAIL: 9 +# fs-test.sb.ext4.out: Summary: PASS: 23 FAIL: 0 +# fs-test.ext4.out: Summary: PASS: 14 FAIL: 9 +# fs-test.fs.ext4.out: Summary: PASS: 14 FAIL: 9 # FAT tests: -# fs-test.sb.fat.out: Summary: PASS: 17 FAIL: 2 -# fs-test.fat.out: Summary: PASS: 19 FAIL: 0 -# fs-test.fs.fat.out: Summary: PASS: 19 FAIL: 0 -# Total Summary: TOTAL PASS: 92 TOTAL FAIL: 22 +# fs-test.sb.fat.out: Summary: PASS: 23 FAIL: 0 +# fs-test.fat.out: Summary: PASS: 20 FAIL: 3 +# fs-test.fs.fat.out: Summary: PASS: 20 FAIL: 3 +# Total Summary: TOTAL PASS: 114 TOTAL FAIL: 24 # pre-requisite binaries list. PREREQ_BINS="md5sum mkfs mount umount dd fallocate mkdir" @@ -135,22 +135,6 @@ function create_image() { fi } -# 1st parameter is the FS type: fat/ext4 -# 2nd parameter is the name of small file -# Returns filename which can be used for fat or ext4 for writing -function fname_for_write() { - case $1 in - ext4) - # ext4 needs absolute path name of file - echo /${2}.w - ;; - - *) - echo ${2}.w - ;; - esac -} - # 1st parameter is image file # 2nd parameter is file system type - fat/ext4 # 3rd parameter is name of small file @@ -166,11 +150,14 @@ function test_image() { case "$2" in fat) + FPATH="" PREFIX="fat" WRITE="write" ;; ext4) + # ext4 needs absolute path + FPATH="/" PREFIX="ext4" WRITE="write" ;; @@ -205,16 +192,15 @@ function test_image() { esac - if [ -z "$6" ]; then - FILE_WRITE=`fname_for_write $2 $3` - FILE_SMALL=$3 - FILE_BIG=$4 - else - FILE_WRITE=$6/`fname_for_write $2 $3` - FILE_SMALL=$6/$3 - FILE_BIG=$6/$4 + # sb always uses full path to mointpoint, irrespective of filesystem + if [ "$5" = "sb" ]; then + FPATH=${6}/ fi + FILE_WRITE=${3}.w + FILE_SMALL=$3 + FILE_BIG=$4 + # In u-boot commands, <interface> stands for host or hostfs # hostfs maps to the host fs. # host maps to the "sb bind" that we do @@ -230,13 +216,13 @@ ${PREFIX}ls host${SUFFIX} $6 # sb size hostfs - $3 for hostfs commands. # 1MB is 0x0010 0000 # Test Case 2 - size of small file -${PREFIX}size host${SUFFIX} $FILE_SMALL +${PREFIX}size host${SUFFIX} ${FPATH}$FILE_SMALL printenv filesize setenv filesize # 2.5GB (1024*1024*2500) is 0x9C40 0000 # Test Case 3 - size of big file -${PREFIX}size host${SUFFIX} $FILE_BIG +${PREFIX}size host${SUFFIX} ${FPATH}$FILE_BIG printenv filesize setenv filesize @@ -245,14 +231,14 @@ setenv filesize # Last two parameters are size and offset. # Test Case 4a - Read full 1MB of small file -${PREFIX}load host${SUFFIX} $addr $FILE_SMALL +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_SMALL printenv filesize # Test Case 4b - Read full 1MB of small file md5sum $addr \$filesize setenv filesize # Test Case 5a - First 1MB of big file -${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x0 +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x0 printenv filesize # Test Case 5b - First 1MB of big file md5sum $addr \$filesize @@ -260,7 +246,7 @@ setenv filesize # fails for ext as no offset support # Test Case 6a - Last 1MB of big file -${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x9C300000 +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x9C300000 printenv filesize # Test Case 6b - Last 1MB of big file md5sum $addr \$filesize @@ -268,7 +254,7 @@ setenv filesize # fails for ext as no offset support # Test Case 7a - One from the last 1MB chunk of 2GB -${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x7FF00000 +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x7FF00000 printenv filesize # Test Case 7b - One from the last 1MB chunk of 2GB md5sum $addr \$filesize @@ -276,7 +262,7 @@ setenv filesize # fails for ext as no offset support # Test Case 8a - One from the start 1MB chunk from 2GB -${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x80000000 +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x80000000 printenv filesize # Test Case 8b - One from the start 1MB chunk from 2GB md5sum $addr \$filesize @@ -284,7 +270,7 @@ setenv filesize # fails for ext as no offset support # Test Case 9a - One 1MB chunk crossing the 2GB boundary -${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x7FF80000 +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG $length 0x7FF80000 printenv filesize # Test Case 9b - One 1MB chunk crossing the 2GB boundary md5sum $addr \$filesize @@ -292,21 +278,44 @@ setenv filesize # Generic failure case # Test Case 10 - 2MB chunk from the last 1MB of big file -${PREFIX}load host${SUFFIX} $addr $FILE_BIG 0x00200000 0x9C300000 +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_BIG 0x00200000 0x9C300000 printenv filesize # # Read 1MB from small file -${PREFIX}load host${SUFFIX} $addr $FILE_SMALL +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_SMALL # Write it back to test the writes # Test Case 11a - Check that the write succeeded -${PREFIX}${WRITE} host${SUFFIX} $addr $FILE_WRITE \$filesize +${PREFIX}${WRITE} host${SUFFIX} $addr ${FPATH}$FILE_WRITE \$filesize mw.b $addr 00 100 -${PREFIX}load host${SUFFIX} $addr $FILE_WRITE +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_WRITE # Test Case 11b - Check md5 of written to is same as the one read from md5sum $addr \$filesize setenv filesize # + +# Next test case checks writing a file whose dirent +# is the first in the block, which is always true for "." +# The write should fail, but the lookup should work +# Test Case 12 - Check directory traversal +${PREFIX}${WRITE} host${SUFFIX} $addr ${FPATH}. 0x10 + +# Read 1MB from small file +${PREFIX}load host${SUFFIX} $addr ${FPATH}$FILE_SMALL +# Write it via "same directory", i.e. "." dirent +# Test Case 13a - Check directory traversal +${PREFIX}${WRITE} host${SUFFIX} $addr ${FPATH}./${FILE_WRITE}2 \$filesize +mw.b $addr 00 100 +${PREFIX}load host${SUFFIX} $addr ${FPATH}./${FILE_WRITE}2 +# Test Case 13b - Check md5 of written to is same as the one read from +md5sum $addr \$filesize +setenv filesize +mw.b $addr 00 100 +${PREFIX}load host${SUFFIX} $addr ${FPATH}${FILE_WRITE}2 +# Test Case 13c - Check md5 of written to is same as the one read from +md5sum $addr \$filesize +setenv filesize +# reset EOF @@ -343,9 +352,10 @@ function create_files() { &> /dev/null fi - # Delete the small file which possibly is written as part of a + # Delete the small file copies which possibly are written as part of a # previous test. sudo rm -f "${MB1}.w" + sudo rm -f "${MB1}.w2" # Generate the md5sums of reads that we will test against small file dd if="${MB1}" bs=1M skip=0 count=1 2> /dev/null | md5sum > "$2" @@ -400,7 +410,7 @@ check_md5() { # md5sum in u-boot has output of form: # md5 for 01000008 ... 01100007 ==> <md5> # the 7th field is the actual md5 - md5_src=`grep -A3 "$1" "$2" | grep "md5 for" | tr -d '\r'` + md5_src=`grep -A2 "$1" "$2" | grep "md5 for" | tr -d '\r'` md5_src=($md5_src) md5_src=${md5_src[6]} @@ -445,48 +455,60 @@ function check_results() { pass_fail "TC3: size of $4" # Check read full mb of 1MB.file - grep -A6 "Test Case 4a " "$1" | grep -q "filesize=100000" + grep -A4 "Test Case 4a " "$1" | grep -q "filesize=100000" pass_fail "TC4: load of $3 size" check_md5 "Test Case 4b " "$1" "$2" 1 "TC4: load from $3" # Check first mb of 2.5GB.file - grep -A6 "Test Case 5a " "$1" | grep -q "filesize=100000" + grep -A4 "Test Case 5a " "$1" | grep -q "filesize=100000" pass_fail "TC5: load of 1st MB from $4 size" check_md5 "Test Case 5b " "$1" "$2" 2 "TC5: load of 1st MB from $4" # Check last mb of 2.5GB.file - grep -A6 "Test Case 6a " "$1" | grep -q "filesize=100000" + grep -A4 "Test Case 6a " "$1" | grep -q "filesize=100000" pass_fail "TC6: load of last MB from $4 size" check_md5 "Test Case 6b " "$1" "$2" 3 "TC6: load of last MB from $4" # Check last 1mb chunk of 2gb from 2.5GB file - grep -A6 "Test Case 7a " "$1" | grep -q "filesize=100000" + grep -A4 "Test Case 7a " "$1" | grep -q "filesize=100000" pass_fail "TC7: load of last 1mb chunk of 2GB from $4 size" check_md5 "Test Case 7b " "$1" "$2" 4 \ "TC7: load of last 1mb chunk of 2GB from $4" # Check first 1mb chunk after 2gb from 2.5GB file - grep -A6 "Test Case 8a " "$1" | grep -q "filesize=100000" + grep -A4 "Test Case 8a " "$1" | grep -q "filesize=100000" pass_fail "TC8: load 1st MB chunk after 2GB from $4 size" check_md5 "Test Case 8b " "$1" "$2" 5 \ "TC8: load 1st MB chunk after 2GB from $4" # Check 1mb chunk crossing the 2gb boundary from 2.5GB file - grep -A6 "Test Case 9a " "$1" | grep -q "filesize=100000" + grep -A4 "Test Case 9a " "$1" | grep -q "filesize=100000" pass_fail "TC9: load 1MB chunk crossing 2GB boundary from $4 size" check_md5 "Test Case 9b " "$1" "$2" 6 \ "TC9: load 1MB chunk crossing 2GB boundary from $4" # Check 2mb chunk from the last 1MB of 2.5GB file loads 1MB - grep -A6 "Test Case 10 " "$1" | grep -q "filesize=100000" + grep -A5 "Test Case 10 " "$1" | grep -q "filesize=100000" pass_fail "TC10: load 2MB from the last 1MB of $4 loads 1MB" # Check 1mb chunk write - grep -A3 "Test Case 11a " "$1" | \ - egrep -q '1048576 bytes written|update journal' - pass_fail "TC11: 1MB write to $5 - write succeeded" + grep -A2 "Test Case 11a " "$1" | grep -q '1048576 bytes written' + pass_fail "TC11: 1MB write to $3.w - write succeeded" check_md5 "Test Case 11b " "$1" "$2" 1 \ - "TC11: 1MB write to $5 - content verified" + "TC11: 1MB write to $3.w - content verified" + + # Check lookup of 'dot' directory + grep -A4 "Test Case 12 " "$1" | grep -q 'Unable to write file' + pass_fail "TC12: 1MB write to . - write denied" + + # Check directory traversal + grep -A2 "Test Case 13a " "$1" | grep -q '1048576 bytes written' + pass_fail "TC13: 1MB write to ./$3.w2 - write succeeded" + check_md5 "Test Case 13b " "$1" "$2" 1 \ + "TC13: 1MB read from ./$3.w2 - content verified" + check_md5 "Test Case 13c " "$1" "$2" 1 \ + "TC13: 1MB read from $3.w2 - content verified" + echo "** End $1" } @@ -500,8 +522,12 @@ function test_fs_nonfs() { OUT_FILE="${OUT}.$1.${fs}.out" test_image $IMAGE $fs $SMALL_FILE $BIG_FILE $1 "" \ > ${OUT_FILE} 2>&1 - check_results $OUT_FILE $MD5_FILE_FS $SMALL_FILE $BIG_FILE \ - $WRITE_FILE + # strip out noise from fs code + grep -v -e "File System is consistent\|update journal finished" \ + -e "reading .*\.file\|writing .*\.file.w" \ + < ${OUT_FILE} > ${OUT_FILE}_clean + check_results ${OUT_FILE}_clean $MD5_FILE_FS $SMALL_FILE \ + $BIG_FILE TOTAL_FAIL=$((TOTAL_FAIL + FAIL)) TOTAL_PASS=$((TOTAL_PASS + PASS)) echo "Summary: PASS: $PASS FAIL: $FAIL" @@ -551,8 +577,7 @@ for fs in ext4 fat; do sudo umount "$MOUNT_DIR" rmdir "$MOUNT_DIR" - check_results $OUT_FILE $MD5_FILE_FS $SMALL_FILE $BIG_FILE \ - $WRITE_FILE + check_results $OUT_FILE $MD5_FILE_FS $SMALL_FILE $BIG_FILE TOTAL_FAIL=$((TOTAL_FAIL + FAIL)) TOTAL_PASS=$((TOTAL_PASS + PASS)) echo "Summary: PASS: $PASS FAIL: $FAIL" diff --git a/test/py/tests/test_vboot.py b/test/py/tests/test_vboot.py index 021892b..6e62820 100644 --- a/test/py/tests/test_vboot.py +++ b/test/py/tests/test_vboot.py @@ -53,7 +53,7 @@ def test_vboot(u_boot_console): util.run_and_log(cons, 'dtc %s %s%s -O dtb ' '-o %s%s' % (dtc_args, datadir, dts, tmpdir, dtb)) - def run_bootm(sha_algo, test_type, expect_string): + def run_bootm(sha_algo, test_type, expect_string, boots): """Run a 'bootm' command U-Boot. This always starts a fresh U-Boot instance since the device tree may @@ -64,6 +64,8 @@ def test_vboot(u_boot_console): expect_string: A string which is expected in the output. sha_algo: Either 'sha1' or 'sha256', to select the algorithm to use. + boots: A boolean that is True if Linux should boot and False if + we are expected to not boot """ cons.restart_uboot() with cons.log.section('Verified boot %s %s' % (sha_algo, test_type)): @@ -72,6 +74,8 @@ def test_vboot(u_boot_console): 'fdt addr 100', 'bootm 100']) assert(expect_string in ''.join(output)) + if boots: + assert('sandbox: continuing, as we cannot run' in ''.join(output)) def make_fit(its): """Make a new FIT from the .its source file. @@ -117,22 +121,22 @@ def test_vboot(u_boot_console): # Build the FIT, but don't sign anything yet cons.log.action('%s: Test FIT with signed images' % sha_algo) make_fit('sign-images-%s.its' % sha_algo) - run_bootm(sha_algo, 'unsigned images', 'dev-') + run_bootm(sha_algo, 'unsigned images', 'dev-', True) # Sign images with our dev keys sign_fit(sha_algo) - run_bootm(sha_algo, 'signed images', 'dev+') + run_bootm(sha_algo, 'signed images', 'dev+', True) # Create a fresh .dtb without the public keys dtc('sandbox-u-boot.dts') cons.log.action('%s: Test FIT with signed configuration' % sha_algo) make_fit('sign-configs-%s.its' % sha_algo) - run_bootm(sha_algo, 'unsigned config', '%s+ OK' % sha_algo) + run_bootm(sha_algo, 'unsigned config', '%s+ OK' % sha_algo, True) # Sign images with our dev keys sign_fit(sha_algo) - run_bootm(sha_algo, 'signed config', 'dev+') + run_bootm(sha_algo, 'signed config', 'dev+', True) cons.log.action('%s: Check signed config on the host' % sha_algo) @@ -149,7 +153,7 @@ def test_vboot(u_boot_console): util.run_and_log(cons, 'fdtput -t bx %s %s value %s' % (fit, sig_node, sig)) - run_bootm(sha_algo, 'Signed config with bad hash', 'Bad Data Hash') + run_bootm(sha_algo, 'Signed config with bad hash', 'Bad Data Hash', False) cons.log.action('%s: Check bad config on the host' % sha_algo) util.run_and_log_expect_exception(cons, [fit_check_sign, '-f', fit, |