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:
committed by
Tom Rini
parent
6dfed163bd
commit
91f6c1ca2e
@@ -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]
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user