[PATCH 14/14] test: Convert test_fs fixtures to use FsHelper

Simon Glass sjg at chromium.org
Sat Apr 4 16:03:18 CEST 2026


Replace all direct calls to the mk_fs() function with FsHelper in the
filesystem test fixtures. Each fixture now creates an FsHelper instance,
populates its srcdir with test files, then calls mk_fs() on the object.

This removes manual scratch-directory management and cleanup code, since
FsHelper handles the source directory and image-file lifecycle.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 test/py/tests/test_fs/conftest.py | 198 ++++++++++--------------------
 1 file changed, 64 insertions(+), 134 deletions(-)

diff --git a/test/py/tests/test_fs/conftest.py b/test/py/tests/test_fs/conftest.py
index cc5c0fc3756..ba125cc7073 100644
--- a/test/py/tests/test_fs/conftest.py
+++ b/test/py/tests/test_fs/conftest.py
@@ -9,7 +9,7 @@ import re
 from subprocess import call, check_call, check_output, CalledProcessError
 from fstest_defs import *
 # pylint: disable=E0611
-from tests import fs_helper
+from tests.fs_helper import FsHelper
 
 supported_fs_basic = ['fat16', 'fat32', 'exfat', 'ext4', 'fs_generic']
 supported_fs_ext = ['fat12', 'fat16', 'fat32', 'exfat', 'fs_generic']
@@ -200,33 +200,26 @@ def fs_obj_basic(request, u_boot_config):
     fs_type = request.param
     fs_cmd_prefix = fstype_to_prefix(fs_type)
     fs_cmd_write = 'save' if fs_type == 'fs_generic' or fs_type == 'exfat' else 'write'
-    fs_img = ''
 
     fs_ubtype = fstype_to_ubname(fs_type)
     check_ubconfig(u_boot_config, fs_ubtype)
 
-    scratch_dir = u_boot_config.persistent_data_dir + '/scratch'
-
-    small_file = scratch_dir + '/' + SMALL_FILE
-    big_file = scratch_dir + '/' + BIG_FILE
-
+    fsh = FsHelper(u_boot_config, fs_type, 3072, '3GB')
     try:
-        check_call('mkdir -p %s' % scratch_dir, shell=True)
-    except CalledProcessError as err:
-        pytest.skip('Preparing mount folder failed for filesystem: ' + fs_type + '. {}'.format(err))
-        call('rm -f %s' % fs_img, shell=True)
-        return
+        fsh.setup()
+
+        small_file = fsh.srcdir + '/' + SMALL_FILE
+        big_file = fsh.srcdir + '/' + BIG_FILE
 
-    try:
         # Create a subdirectory.
-        check_call('mkdir %s/SUBDIR' % scratch_dir, shell=True)
+        check_call('mkdir %s/SUBDIR' % fsh.srcdir, shell=True)
 
         # Create big file in this image.
         # Note that we work only on the start 1MB, couple MBs in the 2GB range
         # and the last 1 MB of the huge 2.5GB file.
         # So, just put random values only in those areas.
         check_call('dd if=/dev/urandom of=%s bs=1M count=1'
-	    % big_file, shell=True)
+            % big_file, shell=True)
         check_call('dd if=/dev/urandom of=%s bs=1M count=2 seek=2047'
             % big_file, shell=True)
         check_call('dd if=/dev/urandom of=%s bs=1M count=1 seek=2499'
@@ -234,65 +227,54 @@ def fs_obj_basic(request, u_boot_config):
 
         # Create a small file in this image.
         check_call('dd if=/dev/urandom of=%s bs=1M count=1'
-	    % small_file, shell=True)
-
-        # Delete the small file copies which possibly are written as part of a
-        # previous test.
-        # check_call('rm -f "%s.w"' % MB1, shell=True)
-        # check_call('rm -f "%s.w2"' % MB1, shell=True)
+            % small_file, shell=True)
 
         # Generate the md5sums of reads that we will test against small file
         out = check_output(
             'dd if=%s bs=1M skip=0 count=1 2> /dev/null | md5sum'
-	    % small_file, shell=True).decode()
+            % small_file, shell=True).decode()
         md5val = [ out.split()[0] ]
 
         # Generate the md5sums of reads that we will test against big file
         # One from beginning of file.
         out = check_output(
             'dd if=%s bs=1M skip=0 count=1 2> /dev/null | md5sum'
-	    % big_file, shell=True).decode()
+            % big_file, shell=True).decode()
         md5val.append(out.split()[0])
 
         # One from end of file.
         out = check_output(
             'dd if=%s bs=1M skip=2499 count=1 2> /dev/null | md5sum'
-	    % big_file, shell=True).decode()
+            % big_file, shell=True).decode()
         md5val.append(out.split()[0])
 
         # One from the last 1MB chunk of 2GB
         out = check_output(
             'dd if=%s bs=1M skip=2047 count=1 2> /dev/null | md5sum'
-	    % big_file, shell=True).decode()
+            % big_file, shell=True).decode()
         md5val.append(out.split()[0])
 
         # One from the start 1MB chunk from 2GB
         out = check_output(
             'dd if=%s bs=1M skip=2048 count=1 2> /dev/null | md5sum'
-	    % big_file, shell=True).decode()
+            % big_file, shell=True).decode()
         md5val.append(out.split()[0])
 
         # One 1MB chunk crossing the 2GB boundary
         out = check_output(
             'dd if=%s bs=512K skip=4095 count=2 2> /dev/null | md5sum'
-	    % big_file, shell=True).decode()
+            % big_file, shell=True).decode()
         md5val.append(out.split()[0])
 
-        try:
-            # 3GiB volume
-            fs_img = fs_helper.mk_fs(u_boot_config, fs_type, 0xc0000000, '3GB', scratch_dir)
-        except CalledProcessError as err:
-            pytest.skip('Creating failed for filesystem: ' + fs_type + '. {}'.format(err))
-            return
+        fsh.mk_fs()
 
     except CalledProcessError as err:
         pytest.skip('Setup failed for filesystem: ' + fs_type + '. {}'.format(err))
         return
     else:
-        yield [fs_ubtype, fs_cmd_prefix, fs_cmd_write, fs_img, md5val]
+        yield [fs_ubtype, fs_cmd_prefix, fs_cmd_write, fsh.fs_img, md5val]
     finally:
-        call('rm -rf %s' % scratch_dir, shell=True)
-        call('rm -f %s' % fs_img, shell=True)
+        fsh.cleanup()
 
 #
 # Fixture for extended fs test
@@ -312,26 +294,19 @@ def fs_obj_ext(request, u_boot_config):
     fs_type = request.param
     fs_cmd_prefix = fstype_to_prefix(fs_type)
     fs_cmd_write = 'save' if fs_type == 'fs_generic' or fs_type == 'exfat' else 'write'
-    fs_img = ''
 
     fs_ubtype = fstype_to_ubname(fs_type)
     check_ubconfig(u_boot_config, fs_ubtype)
 
-    scratch_dir = u_boot_config.persistent_data_dir + '/scratch'
-
-    min_file = scratch_dir + '/' + MIN_FILE
-    tmp_file = scratch_dir + '/tmpfile'
-
+    fsh = FsHelper(u_boot_config, fs_type, 128, '128MB')
     try:
-        check_call('mkdir -p %s' % scratch_dir, shell=True)
-    except CalledProcessError as err:
-        pytest.skip('Preparing mount folder failed for filesystem: ' + fs_type + '. {}'.format(err))
-        call('rm -f %s' % fs_img, shell=True)
-        return
+        fsh.setup()
+
+        min_file = fsh.srcdir + '/' + MIN_FILE
+        tmp_file = fsh.srcdir + '/tmpfile'
 
-    try:
         # Create a test directory
-        check_call('mkdir %s/dir1' % scratch_dir, shell=True)
+        check_call('mkdir %s/dir1' % fsh.srcdir, shell=True)
 
         # Create a small file and calculate md5
         check_call('dd if=/dev/urandom of=%s bs=1K count=20'
@@ -370,21 +345,15 @@ def fs_obj_ext(request, u_boot_config):
 
         check_call('rm %s' % tmp_file, shell=True)
 
-        try:
-            # 128MiB volume
-            fs_img = fs_helper.mk_fs(u_boot_config, fs_type, 0x8000000, '128MB', scratch_dir)
-        except CalledProcessError as err:
-            pytest.skip('Creating failed for filesystem: ' + fs_type + '. {}'.format(err))
-            return
+        fsh.mk_fs()
 
     except CalledProcessError:
         pytest.skip('Setup failed for filesystem: ' + fs_type)
         return
     else:
-        yield [fs_ubtype, fs_cmd_prefix, fs_cmd_write, fs_img, md5val]
+        yield [fs_ubtype, fs_cmd_prefix, fs_cmd_write, fsh.fs_img, md5val]
     finally:
-        call('rm -rf %s' % scratch_dir, shell=True)
-        call('rm -f %s' % fs_img, shell=True)
+        fsh.cleanup()
 
 #
 # Fixture for mkdir test
@@ -403,20 +372,19 @@ def fs_obj_mkdir(request, u_boot_config):
     """
     fs_type = request.param
     fs_cmd_prefix = fstype_to_prefix(fs_type)
-    fs_img = ''
 
     fs_ubtype = fstype_to_ubname(fs_type)
     check_ubconfig(u_boot_config, fs_ubtype)
 
+    fsh = FsHelper(u_boot_config, fs_type, 128, '128MB')
     try:
-        # 128MiB volume
-        fs_img = fs_helper.mk_fs(u_boot_config, fs_type, 0x8000000, '128MB', None)
+        fsh.mk_fs()
     except:
         pytest.skip('Setup failed for filesystem: ' + fs_type)
         return
     else:
-        yield [fs_ubtype, fs_cmd_prefix, fs_img]
-    call('rm -f %s' % fs_img, shell=True)
+        yield [fs_ubtype, fs_cmd_prefix, fsh.fs_img]
+    fsh.cleanup()
 
 #
 # Fixture for unlink test
@@ -435,57 +403,44 @@ def fs_obj_unlink(request, u_boot_config):
     """
     fs_type = request.param
     fs_cmd_prefix = fstype_to_prefix(fs_type)
-    fs_img = ''
 
     fs_ubtype = fstype_to_ubname(fs_type)
     check_ubconfig(u_boot_config, fs_ubtype)
 
-    scratch_dir = u_boot_config.persistent_data_dir + '/scratch'
-
+    fsh = FsHelper(u_boot_config, fs_type, 128, '128MB')
     try:
-        check_call('mkdir -p %s' % scratch_dir, shell=True)
-    except CalledProcessError as err:
-        pytest.skip('Preparing mount folder failed for filesystem: ' + fs_type + '. {}'.format(err))
-        call('rm -f %s' % fs_img, shell=True)
-        return
+        fsh.setup()
 
-    try:
         # Test Case 1 & 3
-        check_call('mkdir %s/dir1' % scratch_dir, shell=True)
+        check_call('mkdir %s/dir1' % fsh.srcdir, shell=True)
         check_call('dd if=/dev/urandom of=%s/dir1/file1 bs=1K count=1'
-                                    % scratch_dir, shell=True)
+                                    % fsh.srcdir, shell=True)
         check_call('dd if=/dev/urandom of=%s/dir1/file2 bs=1K count=1'
-                                    % scratch_dir, shell=True)
+                                    % fsh.srcdir, shell=True)
 
         # Test Case 2
-        check_call('mkdir %s/dir2' % scratch_dir, shell=True)
+        check_call('mkdir %s/dir2' % fsh.srcdir, shell=True)
         for i in range(0, 20):
             check_call('mkdir %s/dir2/0123456789abcdef%02x'
-                                    % (scratch_dir, i), shell=True)
+                                    % (fsh.srcdir, i), shell=True)
 
         # Test Case 4
-        check_call('mkdir %s/dir4' % scratch_dir, shell=True)
+        check_call('mkdir %s/dir4' % fsh.srcdir, shell=True)
 
         # Test Case 5, 6 & 7
-        check_call('mkdir %s/dir5' % scratch_dir, shell=True)
+        check_call('mkdir %s/dir5' % fsh.srcdir, shell=True)
         check_call('dd if=/dev/urandom of=%s/dir5/file1 bs=1K count=1'
-                                    % scratch_dir, shell=True)
+                                    % fsh.srcdir, shell=True)
 
-        try:
-            # 128MiB volume
-            fs_img = fs_helper.mk_fs(u_boot_config, fs_type, 0x8000000, '128MB', scratch_dir)
-        except CalledProcessError as err:
-            pytest.skip('Creating failed for filesystem: ' + fs_type + '. {}'.format(err))
-            return
+        fsh.mk_fs()
 
     except CalledProcessError:
         pytest.skip('Setup failed for filesystem: ' + fs_type)
         return
     else:
-        yield [fs_ubtype, fs_cmd_prefix, fs_img]
+        yield [fs_ubtype, fs_cmd_prefix, fsh.fs_img]
     finally:
-        call('rm -rf %s' % scratch_dir, shell=True)
-        call('rm -f %s' % fs_img, shell=True)
+        fsh.cleanup()
 
 #
 # Fixture for symlink fs test
@@ -503,26 +458,19 @@ def fs_obj_symlink(request, u_boot_config):
         volume file name and  a list of MD5 hashes.
     """
     fs_type = request.param
-    fs_img = ''
 
     fs_ubtype = fstype_to_ubname(fs_type)
     check_ubconfig(u_boot_config, fs_ubtype)
 
-    scratch_dir = u_boot_config.persistent_data_dir + '/scratch'
-
-    small_file = scratch_dir + '/' + SMALL_FILE
-    medium_file = scratch_dir + '/' + MEDIUM_FILE
-
+    fsh = FsHelper(u_boot_config, fs_type, 1024, '1GB')
     try:
-        check_call('mkdir -p %s' % scratch_dir, shell=True)
-    except CalledProcessError as err:
-        pytest.skip('Preparing mount folder failed for filesystem: ' + fs_type + '. {}'.format(err))
-        call('rm -f %s' % fs_img, shell=True)
-        return
+        fsh.setup()
+
+        small_file = fsh.srcdir + '/' + SMALL_FILE
+        medium_file = fsh.srcdir + '/' + MEDIUM_FILE
 
-    try:
         # Create a subdirectory.
-        check_call('mkdir %s/SUBDIR' % scratch_dir, shell=True)
+        check_call('mkdir %s/SUBDIR' % fsh.srcdir, shell=True)
 
         # Create a small file in this image.
         check_call('dd if=/dev/urandom of=%s bs=1M count=1'
@@ -542,21 +490,15 @@ def fs_obj_symlink(request, u_boot_config):
             % medium_file, shell=True).decode()
         md5val.extend([out.split()[0]])
 
-        try:
-            # 1GiB volume
-            fs_img = fs_helper.mk_fs(u_boot_config, fs_type, 0x40000000, '1GB', scratch_dir)
-        except CalledProcessError as err:
-            pytest.skip('Creating failed for filesystem: ' + fs_type + '. {}'.format(err))
-            return
+        fsh.mk_fs()
 
     except CalledProcessError:
         pytest.skip('Setup failed for filesystem: ' + fs_type)
         return
     else:
-        yield [fs_ubtype, fs_img, md5val]
+        yield [fs_ubtype, fsh.fs_img, md5val]
     finally:
-        call('rm -rf %s' % scratch_dir, shell=True)
-        call('rm -f %s' % fs_img, shell=True)
+        fsh.cleanup()
 
 #
 # Fixture for rename test
@@ -584,21 +526,15 @@ def fs_obj_rename(request, u_boot_config):
         return out.decode().split()[0]
 
     fs_type = request.param
-    fs_img = ''
 
     fs_ubtype = fstype_to_ubname(fs_type)
     check_ubconfig(u_boot_config, fs_ubtype)
 
-    mount_dir = u_boot_config.persistent_data_dir + '/scratch'
-
+    fsh = FsHelper(u_boot_config, fs_type, 128, '128MB')
     try:
-        check_call('mkdir -p %s' % mount_dir, shell=True)
-    except CalledProcessError as err:
-        pytest.skip('Preparing mount folder failed for filesystem: ' + fs_type + '. {}'.format(err))
-        call('rm -f %s' % fs_img, shell=True)
-        return
+        fsh.setup()
+        mount_dir = fsh.srcdir
 
-    try:
         md5val = {}
         # Test Case 1
         check_call('mkdir %s/test1' % mount_dir, shell=True)
@@ -657,21 +593,15 @@ def fs_obj_rename(request, u_boot_config):
         new_rand_file('%s/test11/dir1/file1' % mount_dir)
         md5val['test11'] = file_hash('%s/test11/dir1/file1' % mount_dir)
 
-        try:
-            # 128MiB volume
-            fs_img = fs_helper.mk_fs(u_boot_config, fs_type, 0x8000000, '128MB', mount_dir)
-        except CalledProcessError as err:
-            pytest.skip('Creating failed for filesystem: ' + fs_type + '. {}'.format(err))
-            return
+        fsh.mk_fs()
 
     except CalledProcessError:
         pytest.skip('Setup failed for filesystem: ' + fs_type)
         return
     else:
-        yield [fs_ubtype, fs_img, md5val]
+        yield [fs_ubtype, fsh.fs_img, md5val]
     finally:
-        call('rm -rf %s' % mount_dir, shell=True)
-        call('rm -f %s' % fs_img, shell=True)
+        fsh.cleanup()
 
 #
 # Fixture for fat test
@@ -697,19 +627,19 @@ def fs_obj_fat(request, u_boot_config):
     MIN_FAT16_SIZE = 8208 * 1024
 
     fs_type = request.param
-    fs_img = ''
 
     fs_ubtype = fstype_to_ubname(fs_type)
     check_ubconfig(u_boot_config, fs_ubtype)
 
     fs_size = MAX_FAT12_SIZE if fs_type == 'fat12' else MIN_FAT16_SIZE
+    size_mb = (fs_size + (1 << 20) - 1) >> 20
 
+    fsh = FsHelper(u_boot_config, fs_type, size_mb, f'{fs_size}')
     try:
-        # the volume size depends on the filesystem
-        fs_img = fs_helper.mk_fs(u_boot_config, fs_type, fs_size, f'{fs_size}')
+        fsh.mk_fs()
     except:
         pytest.skip('Setup failed for filesystem: ' + fs_type)
         return
     else:
-        yield [fs_ubtype, fs_img]
-    call('rm -f %s' % fs_img, shell=True)
+        yield [fs_ubtype, fsh.fs_img]
+    fsh.cleanup()
-- 
2.43.0



More information about the U-Boot mailing list