aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJoao Marcos Costa2021-06-30 19:45:04 -0300
committerTom Rini2021-07-05 15:29:10 -0400
commit208eb2a4dcd37c0bb1b76b9d71f7bf28b85a899f (patch)
tree6f325ab40ce1c09216a217682755b4b928766d68 /test
parent04c9813e951ffa9391daec5a8dcda90539ca2989 (diff)
test/py: rewrite sqfsload command test suite
The previous strategy to know if a file was correctly loaded was to check for how many bytes were read and compare it against the file's original size. Since this is not a good solution, replace it by comparing the checksum of the loaded bytes against the original file's checksum. Add more test cases: files at a sub-directory and non-existent file. Reviewed-by: Simon Glass <sjg@chromium.org> Tested-by: Simon Glass <sjg@chromium.org> [on sandbox] Signed-off-by: Joao Marcos Costa <jmcosta944@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/py/tests/test_fs/test_squashfs/test_sqfs_load.py168
1 files changed, 138 insertions, 30 deletions
diff --git a/test/py/tests/test_fs/test_squashfs/test_sqfs_load.py b/test/py/tests/test_fs/test_squashfs/test_sqfs_load.py
index 9e900623846..6ec6ccec6c9 100644
--- a/test/py/tests/test_fs/test_squashfs/test_sqfs_load.py
+++ b/test/py/tests/test_fs/test_squashfs/test_sqfs_load.py
@@ -3,8 +3,118 @@
# Author: Joao Marcos Costa <joaomarcos.costa@bootlin.com>
import os
+import subprocess
import pytest
-from sqfs_common import *
+
+from sqfs_common import SQFS_SRC_DIR, STANDARD_TABLE
+from sqfs_common import generate_sqfs_src_dir, make_all_images
+from sqfs_common import clean_sqfs_src_dir, clean_all_images
+from sqfs_common import check_mksquashfs_version
+
+@pytest.mark.requiredtool('md5sum')
+def original_md5sum(path):
+ """ Runs md5sum command.
+
+ Args:
+ path: path to original file.
+ Returns:
+ The original file's checksum as a string.
+ """
+
+ out = subprocess.run(['md5sum ' + path], shell=True, check=True,
+ capture_output=True, text=True)
+ checksum = out.stdout.split()[0]
+
+ return checksum
+
+def uboot_md5sum(u_boot_console, address, count):
+ """ Runs U-Boot's md5sum command.
+
+ Args:
+ u_boot_console: provides the means to interact with U-Boot's console.
+ address: address where the file was loaded (e.g.: $kernel_addr_r).
+ count: file's size. It was named 'count' to match md5sum's respective
+ argument name.
+ Returns:
+ The checksum of the file loaded with sqfsload as a string.
+ """
+
+ out = u_boot_console.run_command('md5sum {} {}'.format(address, count))
+ checksum = out.split()[-1]
+
+ return checksum
+
+def sqfs_load_files(u_boot_console, files, sizes, address):
+ """ Loads files and asserts their checksums.
+
+ Args:
+ u_boot_console: provides the means to interact with U-Boot's console.
+ files: list of files to be loaded.
+ sizes: the sizes of each file.
+ address: the address where the files should be loaded.
+ """
+ build_dir = u_boot_console.config.build_dir
+ for (file, size) in zip(files, sizes):
+ out = u_boot_console.run_command('sqfsload host 0 {} {}'.format(address, file))
+
+ # check if the right amount of bytes was read
+ assert size in out
+
+ # compare original file's checksum against u-boot's
+ u_boot_checksum = uboot_md5sum(u_boot_console, address, hex(int(size)))
+ original_file_path = os.path.join(build_dir, SQFS_SRC_DIR + '/' + file)
+ original_checksum = original_md5sum(original_file_path)
+ assert u_boot_checksum == original_checksum
+
+def sqfs_load_files_at_root(u_boot_console):
+ """ Calls sqfs_load_files passing the files at the SquashFS image's root.
+
+ Args:
+ u_boot_console: provides the means to interact with U-Boot's console.
+ """
+
+ files = ['f4096', 'f5096', 'f1000']
+ sizes = ['4096', '5096', '1000']
+ address = '$kernel_addr_r'
+ sqfs_load_files(u_boot_console, files, sizes, address)
+
+def sqfs_load_files_at_subdir(u_boot_console):
+ """ Calls sqfs_load_files passing the files at the SquashFS image's subdir.
+
+ This test checks if the path resolution works, since the file is not at the
+ root directory.
+
+ Args:
+ u_boot_console: provides the means to interact with U-Boot's console.
+ """
+ files = ['subdir/subdir-file']
+ sizes = ['100']
+ address = '$kernel_addr_r'
+ sqfs_load_files(u_boot_console, files, sizes, address)
+
+def sqfs_load_non_existent_file(u_boot_console):
+ """ Calls sqfs_load_files passing an non-existent file to raise an error.
+
+ This test checks if the SquashFS support won't crash if it doesn't find the
+ specified file.
+
+ Args:
+ u_boot_console: provides the means to interact with U-Boot's console.
+ """
+ address = '$kernel_addr_r'
+ file = 'non-existent'
+ out = u_boot_console.run_command('sqfsload host 0 {} {}'.format(address, file))
+ assert 'Failed to load' in out
+
+def sqfs_run_all_load_tests(u_boot_console):
+ """ Runs all the previously defined test cases.
+
+ Args:
+ u_boot_console: provides the means to interact with U-Boot's console.
+ """
+ sqfs_load_files_at_root(u_boot_console)
+ sqfs_load_files_at_subdir(u_boot_console)
+ sqfs_load_non_existent_file(u_boot_console)
@pytest.mark.boardspec('sandbox')
@pytest.mark.buildconfigspec('cmd_fs_generic')
@@ -12,35 +122,33 @@ from sqfs_common import *
@pytest.mark.buildconfigspec('fs_squashfs')
@pytest.mark.requiredtool('mksquashfs')
def test_sqfs_load(u_boot_console):
+ """ Executes the sqfsload test suite.
+
+ First, it generates the SquashFS images, then it runs the test cases and
+ finally cleans the workspace. If an exception is raised, the workspace is
+ cleaned before exiting.
+
+ Args:
+ u_boot_console: provides the means to interact with U-Boot's console.
+ """
build_dir = u_boot_console.config.build_dir
- command = "sqfsload host 0 $kernel_addr_r "
- for opt in comp_opts:
- # generate and load the squashfs image
+ # setup test environment
+ check_mksquashfs_version()
+ generate_sqfs_src_dir(build_dir)
+ make_all_images(build_dir)
+
+ # run all tests for each image
+ for image in STANDARD_TABLE:
try:
- opt.gen_image(build_dir)
- except RuntimeError:
- opt.clean_source(build_dir)
- # skip unsupported compression types
- continue
-
- path = os.path.join(build_dir, "sqfs-" + opt.name)
- output = u_boot_console.run_command("host bind 0 " + path)
-
- output = u_boot_console.run_command(command + "xxx")
- assert "File not found." in output
-
- for (f, s) in zip(opt.files, opt.sizes):
- try:
- output = u_boot_console.run_command(command + f)
- assert str(s) in output
- except:
- assert False
- opt.cleanup(build_dir)
-
- # test symbolic link
- output = u_boot_console.run_command(command + "sym")
- assert str(opt.sizes[0]) in output
-
- # remove generated files
- opt.cleanup(build_dir)
+ image_path = os.path.join(build_dir, image)
+ u_boot_console.run_command('host bind 0 {}'.format(image_path))
+ sqfs_run_all_load_tests(u_boot_console)
+ except:
+ clean_all_images(build_dir)
+ clean_sqfs_src_dir(build_dir)
+ raise AssertionError
+
+ # clean test environment
+ clean_all_images(build_dir)
+ clean_sqfs_src_dir(build_dir)