On Mon, Mar 09, 2026 at 11:55:58AM +0000, Peter Maydell wrote:
> The functional test documentation suggests running a single test
> with the build/run script. But if you do this where do the logfiles go?
They should always go in the build directory
> As you can see from this transcript, they don't seem to get written
> into the place that a "make check-functional" run puts them:
>
> $ ls -l
> build/san/tests/functional/arm/test_emcraft_sf2.EmcraftSf2Machine.test_arm_emcraft_sf2/
> total 16
> -rw-r--r-- 1 pm215 pm215 3084 Mar 9 10:51 base.log
> -rw-r--r-- 1 pm215 pm215 825 Mar 9 10:51 console.log
> -rw-r--r-- 1 pm215 pm215 235 Mar 9 10:54 default.log
> drwxr-xr-x 3 pm215 pm215 4096 Mar 9 10:51 scratch
> $ date
> Mon Mar 9 11:20:13 GMT 2026
> $ time QEMU_TEST_QEMU_BINARY=./build/san/qemu-system-arm
> ./build/san/run tests/functional/arm/test_emcraft_sf2.py
> TAP version 13
> ok 1 test_emcraft_sf2.EmcraftSf2Machine.test_arm_emcraft_sf2
> 1..1
>
> real 3m24.394s
> user 3m21.314s
> sys 0m3.100s
> $ ls -l
> build/san/tests/functional/arm/test_emcraft_sf2.EmcraftSf2Machine.test_arm_emcraft_sf2/
> total 16
> -rw-r--r-- 1 pm215 pm215 3084 Mar 9 10:51 base.log
> -rw-r--r-- 1 pm215 pm215 825 Mar 9 10:51 console.log
> -rw-r--r-- 1 pm215 pm215 235 Mar 9 10:54 default.log
> drwxr-xr-x 3 pm215 pm215 4096 Mar 9 10:51 scratch
That seems different from the behaviour I get
$ ls -al
build/tests/functional/arm/test_emcraft_sf2.EmcraftSf2Machine.test_arm_emcraft_sf2/
total 28
drwxr-xr-x. 2 berrange berrange 4096 Mar 9 12:31 .
drwxr-xr-x. 3 berrange berrange 4096 Mar 9 12:30 ..
-rw-r--r--. 1 berrange berrange 6449 Mar 9 12:31 base.log
-rw-r--r--. 1 berrange berrange 8200 Mar 9 12:31 console.log
-rw-r--r--. 1 berrange berrange 0 Mar 9 12:30 default.log
$ time QEMU_TEST_QEMU_BINARY=qemu-system-arm ./build/run
tests/functional/arm/test_emcraft_sf2.py
TAP version 13
ok 1 test_emcraft_sf2.EmcraftSf2Machine.test_arm_emcraft_sf2
1..1
real 0m10.731s
user 0m10.597s
sys 0m0.130s
$ ls -al
build/tests/functional/arm/test_emcraft_sf2.EmcraftSf2Machine.test_arm_emcraft_sf2/
total 28
drwxr-xr-x. 2 berrange berrange 4096 Mar 9 12:32 .
drwxr-xr-x. 3 berrange berrange 4096 Mar 9 12:30 ..
-rw-r--r--. 1 berrange berrange 7253 Mar 9 12:32 base.log
-rw-r--r--. 1 berrange berrange 8200 Mar 9 12:32 console.log
-rw-r--r--. 1 berrange berrange 0 Mar 9 12:32 default.log
but in my case I'm just using ./build, where as you are using
./build/san, and I think that's tripping us up
def _build_dir():
root = os.getenv('QEMU_BUILD_ROOT')
if root is not None:
return Path(root)
# Makefile.mtest only exists in build dir, so if it is available, use CWD
if os.path.exists('Makefile.mtest'):
return Path(os.getcwd())
root = os.path.join(_source_dir(), 'build')
if os.path.exists(root):
return Path(root)
raise Exception("Cannot identify build dir, set QEMU_BUILD_ROOT")
The $CWD is the directory from which you are invoking the scripts,
so that Makefile.mtest check won't pass.
The _source_dir() / 'build' test will pass, but that's not your
actual build dir, so that's not really correct.
The QEMU_BUILD_ROOT env was a special hack to allow overrides, but
we never set that by default.
These days, we do, however, set MESON_BUILD_ROOT in the meson devenv,
so the 'run' script should see that.
IOW, we should fix the _build_dir() method to look at MESON_BUILD_ROOT
instead of QEMU_BUILD_ROOT.
Meanwhile your logs are likely in build/tests/functional/... instead
of build/san/tests/functional.
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|