From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 82D99C47082 for ; Mon, 24 May 2021 02:32:06 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BEEAF61003 for ; Mon, 24 May 2021 02:32:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BEEAF61003 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 22A0182AD8; Mon, 24 May 2021 04:32:00 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="EuLkHBjN"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 074D182E92; Mon, 24 May 2021 04:31:55 +0200 (CEST) Received: from mail-qt1-x836.google.com (mail-qt1-x836.google.com [IPv6:2607:f8b0:4864:20::836]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 0F33D82AD8 for ; Mon, 24 May 2021 04:31:50 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=jmcosta944@gmail.com Received: by mail-qt1-x836.google.com with SMTP id h21so19690004qtu.5 for ; Sun, 23 May 2021 19:31:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dHeZ8l+Uc3k2OgaUGpW/3AC+mVH0RHxPpV4Rsnl+ko0=; b=EuLkHBjNCHRMsbkY3rWuf4NBhHEkmUcyD2wFSoXRHZanqmdakMjOyhasjtGBMTQKcx SFk+F2R78GM6QuPwOMizuF18RdYKhG+9WyLMxkAQT4wrdOW9FZZqoG4UVvi95InQf1z+ G7HlWR48zu2Zk8JENNr+MpC+JOwYxQZ3P+O3gBmBi9iF8gYbLF0DbH+E9gfg6bK2iyu+ J/oiDEsOnf93en/8Iu6/SNgNvYrvAL8FTgDjBblRG/jLN3Er6EEt+sMOV8wwcAsTdKc7 FqKZalQ9LGCaXWqIqy38u+o1HPdnE3zPFta3EXonCmquLPB6NYR0EEn/6NXHsOTHl3w3 azig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dHeZ8l+Uc3k2OgaUGpW/3AC+mVH0RHxPpV4Rsnl+ko0=; b=XLkdob2zxCZMzA3NW8dt/CKbyWFpLlSmJUjlwsk6Pv1Eqg13b8sJXisl20KIziG2xt MNJXMPt6i1MJFLlBamofdfHQyVT5RgSc4ErO2qUGDmhRU0CP+grLI0IccsqJayUZs6HL 6p1SEZZnEtqL1vtAa1YdSq0ichP0ig5Yi4/4S/yTnpylqlequeyDYUCIjUbnQXaBeAwW rCDjf4KhNVh1V3CQMKGmi1B+qGL4sRCLsTeHGxGfc3aGvEK5EpHoh6AEiQd5cXCgRSpf FAeeDxTM+xDATZZHHBGve5Qch3O4No5kAhg6f6jgkUxjPj2kKzh02g3VeXo7c1ky+CbW VNIg== X-Gm-Message-State: AOAM533Zcz2v0A0Zb2Eofj9xn3719uAvRXO34BN+n0cWlN/Zc14OWfxl whKASxd4GrVfR4Oko76tZm6Y4GkM8vKvl17c X-Google-Smtp-Source: ABdhPJw9zuCsMLfwWiKcp9FzRCCPJZLiePZ1x+QXtbHktUhuV0pxFFeisx/pCxBRWXwzLyTnt69ikw== X-Received: by 2002:ac8:450c:: with SMTP id q12mr24645539qtn.327.1621823508623; Sun, 23 May 2021 19:31:48 -0700 (PDT) Received: from localhost.localdomain ([177.194.32.83]) by smtp.googlemail.com with ESMTPSA id h5sm10385647qkg.122.2021.05.23.19.31.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 May 2021 19:31:48 -0700 (PDT) From: Joao Marcos Costa 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 Subject: [PATCH 1/3] test/py: rewrite common tools for SquashFS tests Date: Sun, 23 May 2021 23:31:31 -0300 Message-Id: <20210524023133.22100-2-jmcosta944@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210524023133.22100-1-jmcosta944@gmail.com> References: <20210524023133.22100-1-jmcosta944@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.4 at phobos.denx.de X-Virus-Status: Clean 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 --- .../test_fs/test_squashfs/sqfs_common.py | 198 ++++++++++++------ 1 file changed, 133 insertions(+), 65 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..81a378a9f9 100644 --- a/test/py/tests/test_fs/test_squashfs/sqfs_common.py +++ b/test/py/tests/test_fs/test_squashfs/sqfs_common.py @@ -1,76 +1,144 @@ # SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2020 Bootlin +# Copyright (C) 2021 Bootlin # Author: Joao Marcos Costa 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' + +""" +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. +""" +def get_opts_list(): + # 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 c in comp_opts: + for f in frag_opts: + opts_list.append(' '.join([c, f])) + + return opts_list + +def init_standard_table(): + 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): + # file is filled with file_size * 'x' + content = '' + for i in range(file_size): + content += 'x' + + 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] +""" +sqfs_src_dir +├── empty-dir +├── f1000 +├── f4096 +├── f5096 +├── subdir +│   └── subdir-file +└── sym -> subdir + +3 directories, 4 files +""" +def generate_sqfs_src_dir(build_dir): + path = os.path.join(build_dir, sqfs_src_dir) + print(path) + #path = build_dir + '/' + sqfs_src_dir + # make root directory + os.makedirs(path) + + # 4096: minimum block size + file_name = 'f4096' + generate_file(os.path.join(path, file_name), 4096) + + # 5096: minimum block size + 1000 chars (fragment) + file_name = 'f5096' + generate_file(os.path.join(path, file_name), 5096) + + # 1000: less than minimum block size (fragment only) + file_name = 'f1000' + generate_file(os.path.join(path, file_name), 1000) + + # sub-directory with a single file inside + subdir_path = os.path.join(path, '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(path, 'sym')) + + # empty directory + os.makedirs(os.path.join(path, 'empty-dir')) + +def mksquashfs(args): + subprocess.run(['mksquashfs ' + args], shell = True, check = True, + stdout = subprocess.DEVNULL) + +def make_all_images(build_dir): + + 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): + for image_name in standard_table.keys(): + image_path = os.path.join(build_dir, image_name) + os.remove(image_path) + + for image_name in extra_table.keys(): + image_path = os.path.join(build_dir, image_name) + os.remove(image_path) + +def clean_sqfs_src_dir(build_dir): + path = os.path.join(build_dir, sqfs_src_dir) + shutil.rmtree(path) -- 2.25.1