mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <a.fatoum@pengutronix.de>
Subject: [PATCH v2] test: py: add dry run check for FIT image
Date: Mon, 26 Jan 2026 11:45:10 +0100	[thread overview]
Message-ID: <20260126104619.782459-1-a.fatoum@pengutronix.de> (raw)

A dry run should not alter system state in a way that would inhibit
normal operation or repeated dry runs.

The FIT image boot in the test suite, however, reduces the VFS root's
reference count beyond the initial value before the bootm.

This led to a warning on boot that can be reproduced by repeating the
dry run multiple times:

  FAILED test/py/test_fit.py::test_fit_dryrun -
	AssertionError: ['WARNING: at fs/fs.c:255/mntput()!',
			 'WARNING: refcount for mount "/" becomes negative']

This issue is now fixed, so add a regression test, so it doesn't
resurface.

Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
v1 -> v2:
  - fix typo: s/dyrun_attempts/dryrun_attempts/
  - adapt commit message after Sascha's fix
---
 test/py/helper.py   | 14 ++++++++++++++
 test/py/test_fit.py | 36 ++++++++++++++++++++++++++++--------
 2 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/test/py/helper.py b/test/py/helper.py
index ce8e236b4689..17d40c584679 100644
--- a/test/py/helper.py
+++ b/test/py/helper.py
@@ -86,6 +86,20 @@ def devinfo(barebox, device):
     return info
 
 
+def filter_errors(lines):
+    prefixes = (
+        "WARNING:",
+        "ERROR:",
+        "CRITICAL:",
+        "ALERT:",
+        "EMERG:",
+        "PANIC:",
+        "BUG:",
+    )
+
+    return [line for line in lines if line.startswith(prefixes)]
+
+
 def format_dict_with_prefix(varset: dict, prefix: str) -> str:
     parts = []
     for k, v in varset.items():
diff --git a/test/py/test_fit.py b/test/py/test_fit.py
index 1a2efde73f21..0f8fffee3361 100644
--- a/test/py/test_fit.py
+++ b/test/py/test_fit.py
@@ -6,11 +6,7 @@ import pytest
 import shutil
 import subprocess
 from pathlib import Path
-from .helper import of_get_property
-
-
-def fit_name(suffix):
-    return f"/mnt/9p/testfs/barebox-{suffix}.fit"
+from .helper import of_get_property, filter_errors
 
 
 def generate_bootscript(barebox, image, name="test"):
@@ -58,11 +54,35 @@ def fit_testdata(barebox_config, testfs):
         pytest.skip(f"Skip dm tests due to missing dependency: {e}")
 
 
-def test_fit(barebox, strategy, testfs, fit_testdata):
-    _, _, returncode = barebox.run(f"ls {fit_name('gzipped')}")
+@pytest.fixture(scope="function")
+def fitimage(barebox, testfs, fit_testdata):
+    path = f"/mnt/9p/testfs/barebox-gzipped.fit"
+    _, _, returncode = barebox.run(f"ls {path}")
     if returncode != 0:
         pytest.xfail("skipping test due to missing FIT image")
 
+    return path
+
+
+def test_fit_dryrun(barebox, strategy, fitimage):
+    # Sanity check, this is only fixed up on first boot
+    assert of_get_property(barebox, "/chosen/barebox-version") is False
+    [ver] = barebox.run_check("echo barebox-$global.version")
+    assert ver.startswith('barebox-2')
+
+    barebox.run_check("global dryrun_attempts=5")
+    barebox.run_check('[ "$global.dryrun_attempts" = 5 ]')
+
+    for i in range(5):
+        stdout, _, _ = barebox.run(f"bootm -d -v {fitimage}")
+        errors = filter_errors(stdout)
+        assert errors == [], errors
+
+    # If we actually did boot, this variable would be undefined
+    barebox.run_check('[ "$global.dryrun_attempts" = 5 ]')
+
+
+def test_fit(barebox, strategy, fitimage):
     # Sanity check, this is only fixed up on first boot
     assert of_get_property(barebox, "/chosen/barebox-version") is False
     [ver] = barebox.run_check("echo barebox-$global.version")
@@ -76,7 +96,7 @@ def test_fit(barebox, strategy, testfs, fit_testdata):
 
     barebox.run_check("global linux.bootargs.testarg=barebox.chainloaded")
 
-    boottarget = generate_bootscript(barebox, fit_name('gzipped'))
+    boottarget = generate_bootscript(barebox, fitimage)
 
     with strategy.boot_barebox(boottarget) as barebox:
         assert of_get_property(barebox, "/chosen/barebox-version") == ver, \
-- 
2.47.3




             reply	other threads:[~2026-01-26 10:47 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-26 10:45 Ahmad Fatoum [this message]
2026-01-30 13:37 ` Sascha Hauer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260126104619.782459-1-a.fatoum@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox