All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joao Marcos Costa <jmcosta944@gmail.com>
To: u-boot@lists.denx.de
Cc: thomas.petazzoni@bootlin.com, miquel.raynal@bootlin.com,
	richard.genoud@posteo.net, sjg@chromium.org,
	Joao Marcos Costa <jmcosta944@gmail.com>
Subject: [PATCH v3 1/3] test/py: rewrite common tools for SquashFS tests
Date: Wed, 30 Jun 2021 19:45:03 -0300	[thread overview]
Message-ID: <20210630224505.104648-2-jmcosta944@gmail.com> (raw)
In-Reply-To: <20210630224505.104648-1-jmcosta944@gmail.com>

Remove the previous OOP approach, which was confusing and incomplete.
Add more test cases by making SquashFS images with various options,
concerning file fragmentation and its compression. Add comments to
properly document the code.

Signed-off-by: Joao Marcos Costa <jmcosta944@gmail.com>
---
 .../test_fs/test_squashfs/sqfs_common.py      | 257 +++++++++++++-----
 1 file changed, 193 insertions(+), 64 deletions(-)

diff --git a/test/py/tests/test_fs/test_squashfs/sqfs_common.py b/test/py/tests/test_fs/test_squashfs/sqfs_common.py
index c96f92c1d8..267c4b57d1 100644
--- a/test/py/tests/test_fs/test_squashfs/sqfs_common.py
+++ b/test/py/tests/test_fs/test_squashfs/sqfs_common.py
@@ -3,74 +3,203 @@
 # Author: Joao Marcos Costa <joaomarcos.costa@bootlin.com>
 
 import os
-import random
-import string
+import shutil
 import subprocess
 
-def sqfs_get_random_letters(size):
-    letters = []
-    for i in range(0, size):
-            letters.append(random.choice(string.ascii_letters))
+""" standard test images table: Each table item is a key:value pair
+representing the output image name and its respective mksquashfs options.
+This table should be modified only when adding support for new compression
+algorithms. The 'default' case takes no options but the input and output
+names, so it must be assigned with an empty string.
+"""
+STANDARD_TABLE = {
+        'default' : '',
+        'lzo_comp_frag' : '',
+        'lzo_frag' : '',
+        'lzo_no_frag' : '',
+        'zstd_comp_frag' : '',
+        'zstd_frag' : '',
+        'zstd_no_frag' : '',
+        'gzip_comp_frag' : '',
+        'gzip_frag' : '',
+        'gzip_no_frag' : ''
+}
 
-    return ''.join(letters)
+""" EXTRA_TABLE: Set this table's keys and values if you want to make squashfs
+images with your own customized options.
+"""
+EXTRA_TABLE = {}
 
-def sqfs_generate_file(path, size):
-    content = sqfs_get_random_letters(size)
-    file = open(path, "w")
+# path to source directory used to make squashfs test images
+SQFS_SRC_DIR = 'sqfs_src_dir'
+
+def get_opts_list():
+    """ Combines fragmentation and compression options into a list of strings.
+
+    opts_list's firts item is an empty string as STANDARD_TABLE's first item is
+    the 'default' case.
+
+    Returns:
+        A list of strings whose items are formed by a compression and a
+        fragmentation option joined by a whitespace.
+    """
+    # supported compression options only
+    comp_opts = ['-comp lzo', '-comp zstd', '-comp gzip']
+    # file fragmentation options
+    frag_opts = ['-always-use-fragments', '-always-use-fragments -noF', '-no-fragments']
+
+    opts_list = [' ']
+    for comp_opt in comp_opts:
+        for frag_opt in frag_opts:
+            opts_list.append(' '.join([comp_opt, frag_opt]))
+
+    return opts_list
+
+def init_standard_table():
+    """ Initializes STANDARD_TABLE values.
+
+    STANDARD_TABLE's keys are pre-defined, and init_standard_table() assigns
+    the right value for each one of them.
+    """
+    opts_list = get_opts_list()
+
+    for key, value in zip(STANDARD_TABLE.keys(), opts_list):
+        STANDARD_TABLE[key] = value
+
+def generate_file(file_name, file_size):
+    """ Generates a file filled with 'x'.
+
+    Args:
+        file_name: the file's name.
+        file_size: the content's length and therefore the file size.
+    """
+    content = 'x' * file_size
+
+    file = open(file_name, 'w')
     file.write(content)
     file.close()
 
-class Compression:
-    def __init__(self, name, files, sizes, block_size = 4096):
-        self.name = name
-        self.files = files
-        self.sizes = sizes
-        self.mksquashfs_opts = " -b " + str(block_size) + " -comp " + self.name
-
-    def add_opt(self, opt):
-        self.mksquashfs_opts += " " + opt
-
-    def gen_image(self, build_dir):
-        src = os.path.join(build_dir, "sqfs_src/")
-        os.mkdir(src)
-        for (f, s) in zip(self.files, self.sizes):
-            sqfs_generate_file(src + f, s)
-
-        # the symbolic link always targets the first file
-        os.symlink(self.files[0], src + "sym")
-
-        sqfs_img = os.path.join(build_dir, "sqfs-" + self.name)
-        i_o = src + " " + sqfs_img
-        opts = self.mksquashfs_opts
-        try:
-            subprocess.run(["mksquashfs " + i_o + opts], shell = True, check = True)
-        except:
-            print("mksquashfs error. Compression type: " + self.name)
-            raise RuntimeError
-
-    def clean_source(self, build_dir):
-        src = os.path.join(build_dir, "sqfs_src/")
-        for f in self.files:
-            os.remove(src + f)
-        os.remove(src + "sym")
-        os.rmdir(src)
-
-    def cleanup(self, build_dir):
-        self.clean_source(build_dir)
-        sqfs_img = os.path.join(build_dir, "sqfs-" + self.name)
-        os.remove(sqfs_img)
-
-files = ["blks_only", "blks_frag", "frag_only"]
-sizes = [4096, 5100, 100]
-gzip = Compression("gzip", files, sizes)
-zstd = Compression("zstd", files, sizes)
-lzo = Compression("lzo", files, sizes)
-
-# use fragment blocks for files larger than block_size
-gzip.add_opt("-always-use-fragments")
-zstd.add_opt("-always-use-fragments")
-
-# avoid fragments if lzo is used
-lzo.add_opt("-no-fragments")
-
-comp_opts = [gzip, zstd, lzo]
+def generate_sqfs_src_dir(build_dir):
+    """ Generates the source directory used to make the SquashFS images.
+
+    The source directory is generated at build_dir, and it has the following
+    structure:
+    sqfs_src_dir/
+    ├── empty-dir/
+    ├── f1000
+    ├── f4096
+    ├── f5096
+    ├── subdir/
+    │   └── subdir-file
+    └── sym -> subdir
+
+    3 directories, 4 files
+
+    The files in the root dir. are prefixed with an 'f' followed by its size.
+
+    Args:
+        build_dir: u-boot's build-sandbox directory.
+    """
+
+    root = os.path.join(build_dir, SQFS_SRC_DIR)
+    # make root directory
+    os.makedirs(root)
+
+    # 4096: minimum block size
+    file_name = 'f4096'
+    generate_file(os.path.join(root, file_name), 4096)
+
+    # 5096: minimum block size + 1000 chars (fragment)
+    file_name = 'f5096'
+    generate_file(os.path.join(root, file_name), 5096)
+
+    # 1000: less than minimum block size (fragment only)
+    file_name = 'f1000'
+    generate_file(os.path.join(root, file_name), 1000)
+
+    # sub-directory with a single file inside
+    subdir_path = os.path.join(root, 'subdir')
+    os.makedirs(subdir_path)
+    generate_file(os.path.join(subdir_path, 'subdir-file'), 100)
+
+    # symlink (target: sub-directory)
+    os.symlink('subdir', os.path.join(root, 'sym'))
+
+    # empty directory
+    os.makedirs(os.path.join(root, 'empty-dir'))
+
+def mksquashfs(args):
+    """ Runs mksquashfs command.
+
+    Args:
+        args: mksquashfs options (e.g.: compression and fragmentation).
+    """
+    subprocess.run(['mksquashfs ' + args], shell=True, check=True,
+                   stdout=subprocess.DEVNULL)
+
+def get_mksquashfs_version():
+    """ Parses the output of mksquashfs -version.
+
+    Returns:
+        mksquashfs's version as a float.
+    """
+    out = subprocess.run(['mksquashfs -version'], shell=True, check=True,
+                         capture_output=True, text=True)
+    # 'out' is: mksquashfs version X (yyyy/mm/dd) ...
+    return float(out.stdout.split()[2])
+
+def check_mksquashfs_version():
+    """ Checks if mksquashfs meets the required version. """
+
+    required_version = 4.4
+    if get_mksquashfs_version() < required_version:
+        print('Error: mksquashfs is too old.')
+        print('Required version: {}'.format(required_version))
+        raise AssertionError
+
+def make_all_images(build_dir):
+    """ Makes the SquashFS images used in the test suite.
+
+    The image names and respective mksquashfs options are defined in STANDARD_TABLE
+    and EXTRA_TABLE. The destination is defined by 'build_dir'.
+
+    Args:
+        build_dir: u-boot's build-sandbox directory.
+    """
+
+    init_standard_table()
+    input_path = os.path.join(build_dir, SQFS_SRC_DIR)
+
+    # make squashfs images according to STANDARD_TABLE
+    for out, opts in zip(STANDARD_TABLE.keys(), STANDARD_TABLE.values()):
+        output_path = os.path.join(build_dir, out)
+        mksquashfs(' '.join([input_path, output_path, opts]))
+
+    # make squashfs images according to EXTRA_TABLE
+    for out, opts in zip(EXTRA_TABLE.keys(), EXTRA_TABLE.values()):
+        output_path = os.path.join(build_dir, out)
+        mksquashfs(' '.join([input_path, output_path, opts]))
+
+def clean_all_images(build_dir):
+    """ Deletes the SquashFS images at build_dir.
+
+    Args:
+        build_dir: u-boot's build-sandbox directory.
+    """
+
+    for image_name in STANDARD_TABLE:
+        image_path = os.path.join(build_dir, image_name)
+        os.remove(image_path)
+
+    for image_name in EXTRA_TABLE:
+        image_path = os.path.join(build_dir, image_name)
+        os.remove(image_path)
+
+def clean_sqfs_src_dir(build_dir):
+    """ Deletes the source directory at build_dir.
+
+    Args:
+        build_dir: u-boot's build-sandbox directory.
+    """
+    path = os.path.join(build_dir, SQFS_SRC_DIR)
+    shutil.rmtree(path)
-- 
2.25.1


  reply	other threads:[~2021-06-30 22:45 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-30 22:45 [PATCH v3 0/3] test/py: Rewrite SquashFS commands test suite Joao Marcos Costa
2021-06-30 22:45 ` Joao Marcos Costa [this message]
2021-07-05 15:29   ` [PATCH v3 1/3] test/py: rewrite common tools for SquashFS tests Simon Glass
2021-07-06  0:59   ` Tom Rini
2021-06-30 22:45 ` [PATCH v3 2/3] test/py: rewrite sqfsload command test suite Joao Marcos Costa
2021-07-05 15:29   ` Simon Glass
2021-07-06  0:59   ` Tom Rini
2021-06-30 22:45 ` [PATCH v3 3/3] test/py: rewrite sqfsls " Joao Marcos Costa
2021-07-05 15:29   ` Simon Glass
2021-07-06  0:59   ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210630224505.104648-2-jmcosta944@gmail.com \
    --to=jmcosta944@gmail.com \
    --cc=miquel.raynal@bootlin.com \
    --cc=richard.genoud@posteo.net \
    --cc=sjg@chromium.org \
    --cc=thomas.petazzoni@bootlin.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.