On 6/10/2026 12:25 AM, Manos Pitsidianakis wrote:
> On Wed, 10 Jun 2026 07:30, Pierrick Bouvier
> <[email protected]> wrote:
>> On 6/9/2026 2:47 PM, Pierrick Bouvier wrote:
>>> A test can declare it expects a specific output on stdout. In this case,
>>> we compare it to a reference file. We implement this instead of relying
>>> on a wrapper because we need the flexibility to resolve name of
>>> reference file per target.
>>>
>>> For instance, multiarch float tests expect different ref files for each
>>> target, which is something we can't express with a test wrapper.
>>>
>>> Signed-off-by: Pierrick Bouvier <[email protected]>
>>> ---
>>>  tests/tcg/meson.build             |  9 ++++++++-
>>>  tests/tcg/scripts/run_and_diff.sh | 12 ++++++++++++
>>>  2 files changed, 20 insertions(+), 1 deletion(-)
>>>  create mode 100755 tests/tcg/scripts/run_and_diff.sh
>>>
>>> diff --git a/tests/tcg/meson.build b/tests/tcg/meson.build
>>> index 5380a360830..3d2c0d6583b 100644
>>> --- a/tests/tcg/meson.build
>>> +++ b/tests/tcg/meson.build
>>> @@ -7,6 +7,7 @@ if config_host.has_key('GDB')
>>>  endif
>>>  gdb = find_program(gdb_progs, required: false)
>>>  prog_gdb_test = find_program('../guest-debug/run-test.py')
>>> +prog_run_and_diff = find_program('./scripts/run_and_diff.sh')
>>>  
>>>  tcg_tests = {}
>>>  # tcg_tests is a dictionary with following structure:
>>> @@ -24,6 +25,7 @@ tcg_tests = {}
>>>  #           'test_name': ['provide an alternative test name'],
>>>  #           'cflags': ['cflags to compile test', ...],
>>>  #           'qemu_args': ['qemu command line flags', ...],
>>> +#           'expected_output': 'file_to_compare_output',
>>>  #           'gdb_test': ['gdb test args'],
>>>  #           'env_var': ['VAR=value', ...],
>>>  #           'wrapper': [program_to_launch_test, 'args'...],
>>> @@ -84,7 +86,7 @@ foreach target, plan: tcg_tests
>>>      foreach src, setup: t
>>>        # return a clear error if user mispell a setup entry
>>>        foreach key, _ : setup
>>> -        if key not in ['cflags', 'qemu_args', 'gdb_test',
>>> +        if key not in ['cflags', 'qemu_args', 'expected_output',
>>> 'gdb_test',
>>>                         'exe_name', 'test_name', 'env_var',
>>> 'plugin_test',
>>>                         'wrapper']
>>>            error('unknown tcg setup entry \'' + key + '\' for test '
>>> + src)
>>> @@ -197,6 +199,11 @@ foreach target, plan: tcg_tests
>>>                ]
>>>        endif
>>>  
>>> +      if 'expected_output' in setup
>>> +        expected = files(folder / setup['expected_output'])
>>> +        cmd = [prog_run_and_diff, expected, cmd]
>>> +      endif
>>> +
>>>        if 'wrapper' in setup
>>>          cmd = [setup['wrapper'], cmd]
>>>        endif
>>> diff --git a/tests/tcg/scripts/run_and_diff.sh b/tests/tcg/scripts/
>>> run_and_diff.sh
>>> new file mode 100755
>>> index 00000000000..d1e9243c49d
>>> --- /dev/null
>>> +++ b/tests/tcg/scripts/run_and_diff.sh
>>> @@ -0,0 +1,12 @@
>>> +#!/usr/bin/env bash
>>> +# SPDX-License-Identifier: GPL-2.0-or-later
>>> +
>>> +set -euo pipefail
>>> +
>>> +if [ $# -lt 2 ]; then
>>> +    echo "run_and_diff: expected_output_file cmd [args]..." 1>&2
>>> +    exit 1
>>> +fi
>>> +expected="$1";shift
>>> +set -x
>>> +diff <("$@") $expected
>>
>> Fixed this line, since it hides return code of program.
>> Write to a temporary file, then diff.
> 
> Also, consider if using #!/bin/sh is possible, since it's universally
> portable.
> 

Probably will move this to python instead.
sh does not have equivalent for set -euo pipefail.

Reply via email to