oeqa/selftest/wic: test recursive dir copy on ext partitions

Extend the wic selftests to cover recursive directory copying
into ext partitions.

Previously, copying a directory into an ext partition could
appear to succeed, but attempting to access the directory
contents would fail with:

  -l: Ext2 inode is not a directory

This was fixed in commit 4fc3b42774 ("wic/engine: fix copying
directories into wic image with ext* partition").

This test now verifies that directories copied with "wic cp"
into an ext4 partition:
  - are created with correct inode types
  - can be listed recursively with "wic ls"
  - preserve files and subdirectories
  - can be copied back out of the image without data loss

A simple directory structure is used in this test:

wic-test-cp-ext-dir/
├── topfile.txt
└── subdir/
    └── subfile.txt

(From OE-Core rev: 1e051c02bc05367d6b911ac9486403029f6f7cd8)

Signed-off-by: Daniel Dragomir <daniel.dragomir@windriver.com>
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 6de3d2602f4f4a8192d6a6040e89e814187dcf93)
Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
Signed-off-by: Paul Barker <paul@pbarker.dev>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Dragomir, Daniel
2026-01-28 16:35:47 +02:00
committed by Richard Purdie
parent 6c2a243d6c
commit 77f60c1165

View File

@@ -12,6 +12,7 @@ import os
import sys import sys
import unittest import unittest
import hashlib import hashlib
import filecmp
from glob import glob from glob import glob
from shutil import rmtree, copy from shutil import rmtree, copy
@@ -1662,6 +1663,70 @@ class ModifyTests(WicTestCase):
runCmd("wic cp %s:2/etc/fstab %s -n %s" % (images[0], testfile.name, sysroot)) runCmd("wic cp %s:2/etc/fstab %s -n %s" % (images[0], testfile.name, sysroot))
self.assertTrue(os.stat(testfile.name).st_size > 0, msg="Filesize not as expected %s" % os.stat(testfile.name).st_size) self.assertTrue(os.stat(testfile.name).st_size > 0, msg="Filesize not as expected %s" % os.stat(testfile.name).st_size)
# prepare directory structure
testdir = os.path.join(self.resultdir, "wic-test-cp-ext-dir")
testsubdir = os.path.join(testdir, "subdir")
os.makedirs(testsubdir)
# add a file in the top-level of the directory
src_file = os.path.join(testdir, "topfile.txt")
with open(src_file, "w") as f:
f.write("top-level\n")
# add file in the subdir
src_subfile = os.path.join(testsubdir, "subfile.txt")
with open(src_subfile, "w") as f:
f.write("sub-level\n")
# copy directory to the partition root
runCmd("wic cp %s %s:2/ -n %s" % (testdir, images[0], sysroot))
basedir = os.path.basename(testdir)
# check if directory is there at partition root
result = runCmd("wic ls %s:2/ -n %s" % (images[0], sysroot))
root_entries = set(line.split()[-1] for line in result.output.split('\n') if line)
self.assertIn(basedir, root_entries, msg="Expected directory not present at root: %s" % root_entries)
# list INSIDE the copied directory
result = runCmd("wic ls %s:2/%s/ -n %s" % (images[0], basedir, sysroot))
self.assertEqual(0, result.status,
msg="wic ls inside copied directory failed. Output:\n%s" % result.output)
self.assertNotIn("Ext2 inode is not a directory", result.output,
msg="Regression detected (inode not a directory). Output:\n%s" % result.output)
inside_entries = set(line.split()[-1] for line in result.output.split('\n') if line)
self.assertTrue(set(["subdir", "topfile.txt"]).issubset(inside_entries),
msg="Expected entries missing inside dir: %s" % inside_entries)
# list inside the subdir
result = runCmd("wic ls %s:2/%s/subdir/ -n %s" % (images[0], basedir, sysroot))
self.assertEqual(0, result.status,
msg="wic ls inside copied subdir failed. Output:\n%s" % result.output)
self.assertNotIn("Ext2 inode is not a directory", result.output,
msg="Regression detected (inode not a directory). Output:\n%s" % result.output)
sub_entries = set(line.split()[-1] for line in result.output.split('\n') if line)
self.assertIn("subfile.txt", sub_entries, msg="Expected file missing in subdir: %s" % sub_entries)
# copy directory from the partition and compare with original
outparent = os.path.join(self.resultdir, "wic-test-cp-ext-out")
os.makedirs(outparent)
runCmd("wic cp %s:2/%s %s -n %s" % (images[0], basedir, outparent, sysroot))
copied_dir = os.path.join(outparent, basedir)
self.assertTrue(os.path.isdir(copied_dir), msg="Copied-back directory not created: %s" % copied_dir)
copied_file = os.path.join(copied_dir, "topfile.txt")
copied_subfile = os.path.join(copied_dir, "subdir", "subfile.txt")
self.assertTrue(os.path.isfile(copied_file), msg="Missing copied-back file: %s" % copied_file)
self.assertTrue(os.path.isfile(copied_subfile), msg="Missing copied-back subfile: %s" % copied_subfile)
self.assertTrue(filecmp.cmp(src_file, copied_file, shallow=False),
msg="topfile.txt differs after round-trip copy")
self.assertTrue(filecmp.cmp(src_subfile, copied_subfile, shallow=False),
msg="subfile.txt differs after round-trip copy")
def test_wic_rm_ext(self): def test_wic_rm_ext(self):
"""Test removing files from the ext partition.""" """Test removing files from the ext partition."""