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.

Signed-off-by: Joao Marcos Costa <jmcosta...@gmail.com>
---
 .../test_fs/test_squashfs/test_sqfs_load.py   | 166 ++++++++++++++----
 1 file changed, 136 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 9e90062384..ef4be1339c 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,117 @@
 # Author: Joao Marcos Costa <joaomarcos.co...@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
+
+@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 +121,32 @@ 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
+    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)
-- 
2.25.1

Reply via email to