Hi,

On 2024-05-12 16:29:23 -0700, Noah Misch wrote:
> Author:     Noah Misch <n...@leadboat.com>
> Commit:     Noah Misch <n...@leadboat.com>
> 
>     Make TAP todo_start effects the same under Meson and prove_check.
>     
>     This could have caused spurious failures only on SPARC Linux, because
>     today's only todo_start tests for that platform.  Back-patch to v16,
>     where Meson support first appeared.
>     
>     Reviewed by FIXME.
>     
>     Discussion: https://postgr.es/m/FIXME
> 
> diff --git a/src/tools/testwrap b/src/tools/testwrap
> index d01e610..9a270be 100755
> --- a/src/tools/testwrap
> +++ b/src/tools/testwrap
> @@ -41,12 +41,22 @@ env_dict = {**os.environ,
>              'TESTDATADIR': os.path.join(testdir, 'data'),
>              'TESTLOGDIR': os.path.join(testdir, 'log')}
>  
> -sp = subprocess.run(args.test_command, env=env_dict)
> +sp = subprocess.Popen(args.test_command, env=env_dict, 
> stdout=subprocess.PIPE)
> +# Meson categorizes a passing TODO test point as bad
> +# (https://github.com/mesonbuild/meson/issues/13183).  Remove the TODO
> +# directive, so Meson computes the file result like Perl does.  This could
> +# have the side effect of delaying stdout lines relative to stderr.  That
> +# doesn't affect the log file, and the TAP protocol uses stdout only.
> +for line in sp.stdout:
> +    if line.startswith(b'ok '):
> +        line = line.replace(b' # TODO ', b' # testwrap-overridden-TODO ', 1)
> +    sys.stdout.buffer.write(line)
> +returncode = sp.wait()

This has the issue that it causes the testwrap output to be buffered, which
makes running tests with ``meson test -v <testname>` update the output less
promptly, only updating whenever the output buffer is flushed.

That's not the end of the world, but it'd be nice to get the output more
promptly again. It doesn't matter that much when running the tests normally,
but if you run them with valgrind or such and you just want to see the first
failure, because it's going to take an hour to finish all tests...

The easiest fix is to just explicitly flush after each line, as in the
attached.

Greetings,

Andres Freund
>From 952068e2e6912698b291ee02d3682349d291a42d Mon Sep 17 00:00:00 2001
From: Andres Freund <and...@anarazel.de>
Date: Mon, 23 Sep 2024 11:36:37 -0400
Subject: [PATCH v1] meson: Flush stdout in testwrap

Otherwise the progress won't reliably be displayed during a test.
---
 src/tools/testwrap | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/tools/testwrap b/src/tools/testwrap
index 8ae8fb79ba7..21105146c9d 100755
--- a/src/tools/testwrap
+++ b/src/tools/testwrap
@@ -61,6 +61,7 @@ for line in sp.stdout:
     if line.startswith(b'ok '):
         line = line.replace(b' # TODO ', b' # testwrap-overridden-TODO ', 1)
     sys.stdout.buffer.write(line)
+    sys.stdout.flush()
 returncode = sp.wait()
 
 if returncode == 0:
-- 
2.48.1.76.g4e746b1a31.dirty

Reply via email to