1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-03 17:52:07 +02:00

test/py: Add tests for LZO and ZSTD

Improve SquashFS tests architecture. Add 'Compression' class. LZO
algorithm may crash if the file is fragmented, so the fragments are
disabled when testing LZO.

Signed-off-by: Joao Marcos Costa <joaomarcos.costa@bootlin.com>
This commit is contained in:
Joao Marcos Costa
2020-08-18 17:17:25 +02:00
committed by Tom Rini
parent 6dfed163bd
commit 91f6c1ca2e
3 changed files with 101 additions and 46 deletions

View File

@@ -5,6 +5,7 @@
import os import os
import random import random
import string import string
import subprocess
def sqfs_get_random_letters(size): def sqfs_get_random_letters(size):
letters = [] letters = []
@@ -19,24 +20,57 @@ def sqfs_generate_file(path, size):
file.write(content) file.write(content)
file.close() file.close()
# generate image with three files and a symbolic link class Compression:
def sqfs_generate_image(cons): def __init__(self, name, files, sizes, block_size = 4096):
src = os.path.join(cons.config.build_dir, "sqfs_src/") self.name = name
dest = os.path.join(cons.config.build_dir, "sqfs") self.files = files
os.mkdir(src) self.sizes = sizes
sqfs_generate_file(src + "frag_only", 100) self.mksquashfs_opts = " -b " + str(block_size) + " -comp " + self.name
sqfs_generate_file(src + "blks_frag", 5100)
sqfs_generate_file(src + "blks_only", 4096)
os.symlink("frag_only", src + "sym")
os.system("mksquashfs " + src + " " + dest + " -b 4096 -always-use-fragments")
# removes all files created by sqfs_generate_image() def add_opt(self, opt):
def sqfs_clean(cons): self.mksquashfs_opts += " " + opt
src = os.path.join(cons.config.build_dir, "sqfs_src/")
dest = os.path.join(cons.config.build_dir, "sqfs") def gen_image(self, build_dir):
os.remove(src + "frag_only") src = os.path.join(build_dir, "sqfs_src/")
os.remove(src + "blks_frag") os.mkdir(src)
os.remove(src + "blks_only") for (f, s) in zip(self.files, self.sizes):
os.remove(src + "sym") sqfs_generate_file(src + f, s)
os.rmdir(src)
os.remove(dest) # 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]

View File

@@ -12,23 +12,35 @@ from sqfs_common import *
@pytest.mark.buildconfigspec('fs_squashfs') @pytest.mark.buildconfigspec('fs_squashfs')
@pytest.mark.requiredtool('mksquashfs') @pytest.mark.requiredtool('mksquashfs')
def test_sqfs_load(u_boot_console): def test_sqfs_load(u_boot_console):
cons = u_boot_console build_dir = u_boot_console.config.build_dir
sqfs_generate_image(cons)
command = "sqfsload host 0 $kernel_addr_r " command = "sqfsload host 0 $kernel_addr_r "
path = os.path.join(cons.config.build_dir, "sqfs")
try: for opt in comp_opts:
# generate and load the squashfs image
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("host bind 0 " + path)
output = u_boot_console.run_command(command + "xxx") output = u_boot_console.run_command(command + "xxx")
assert "File not found." in output assert "File not found." in output
output = u_boot_console.run_command(command + "frag_only")
assert "100 bytes read in" in output for (f, s) in zip(opt.files, opt.sizes):
output = u_boot_console.run_command(command + "blks_frag") try:
assert "5100 bytes read in" in output output = u_boot_console.run_command(command + f)
output = u_boot_console.run_command(command + "blks_only") assert str(s) in output
assert "4096 bytes read in" in output except:
assert False
opt.cleanup(build_dir)
# test symbolic link
output = u_boot_console.run_command(command + "sym") output = u_boot_console.run_command(command + "sym")
assert "100 bytes read in" in output assert str(opt.sizes[0]) in output
except:
sqfs_clean(cons) # remove generated files
sqfs_clean(cons) opt.cleanup(build_dir)

View File

@@ -12,16 +12,25 @@ from sqfs_common import *
@pytest.mark.buildconfigspec('fs_squashfs') @pytest.mark.buildconfigspec('fs_squashfs')
@pytest.mark.requiredtool('mksquashfs') @pytest.mark.requiredtool('mksquashfs')
def test_sqfs_ls(u_boot_console): def test_sqfs_ls(u_boot_console):
cons = u_boot_console build_dir = u_boot_console.config.build_dir
sqfs_generate_image(cons) for opt in comp_opts:
path = os.path.join(cons.config.build_dir, "sqfs") try:
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("host bind 0 " + path)
output = u_boot_console.run_command("sqfsls host 0")
assert "4 file(s), 0 dir(s)" in output try:
assert "<SYM> sym" in output # list files in root directory
output = u_boot_console.run_command("sqfsls host 0 xxx") output = u_boot_console.run_command("sqfsls host 0")
assert "** Cannot find directory. **" in output assert str(len(opt.files) + 1) + " file(s), 0 dir(s)" in output
except: assert "<SYM> sym" in output
sqfs_clean(cons) output = u_boot_console.run_command("sqfsls host 0 xxx")
sqfs_clean(cons) assert "** Cannot find directory. **" in output
except:
opt.cleanup(build_dir)
assert False
opt.cleanup(build_dir)