diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2022-10-27 11:51:27 +0100 |
---|---|---|
committer | Matthew Pickering <matthewtpickering@gmail.com> | 2022-10-27 11:56:38 +0100 |
commit | a23bfc898a3d94aee81c9cbbb9352b497b318db8 (patch) | |
tree | 11bb111290c5a0afe61cd608f0443cd8c0e4b245 | |
parent | 0270cc54481bef9630274e77c2750940c1a4eff5 (diff) | |
download | haskell-a23bfc898a3d94aee81c9cbbb9352b497b318db8.tar.gz |
testsuite: Improve output from tests which have failing pre_cmdwip/t22329
There are two changes:
* If a pre_cmd fails, then don't attempt to run the test.
* If a pre_cmd fails, then print the stdout and stderr from running that
command (which hopefully has a nice error message).
For example:
```
=====> 1 of 1 [0, 0, 0]
*** framework failure for test-defaulting-plugin(normal) pre_cmd failed: 2
** pre_cmd was "$MAKE -s --no-print-directory -C defaulting-plugin package.test-defaulting-plugin TOP={top}".
stdout:
stderr:
DefaultLifted.hs:19:13: error: [GHC-76037]
Not in scope: type constructor or class ‘Typ’
Suggested fix:
Perhaps use one of these:
‘Type’ (imported from GHC.Tc.Utils.TcType),
data constructor ‘Type’ (imported from GHC.Plugins)
|
19 | instance Eq Typ where
| ^^^
make: *** [Makefile:17: package.test-defaulting-plugin] Error 1
Performance Metrics (test environment: local):
```
Fixes #22329
-rw-r--r-- | testsuite/driver/testlib.py | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py index 29929892e9..120ef0bf10 100644 --- a/testsuite/driver/testlib.py +++ b/testsuite/driver/testlib.py @@ -1241,14 +1241,23 @@ def do_test(name: TestName, dst_makefile.write_text(makefile, encoding='UTF-8') if opts.pre_cmd: + stdout_path = in_testdir(name, 'pre_cmd_stdout') + stderr_path = in_testdir(name, 'pre_cmd_stderr') exit_code = runCmd('cd "{0}" && {1}'.format(opts.testdir, override_options(opts.pre_cmd)), - stderr = subprocess.STDOUT, + stdout = stdout_path, + stderr = stderr_path, print_output = config.verbose >= 3) # If user used expect_broken then don't record failures of pre_cmd if exit_code != 0 and opts.expect not in ['fail']: framework_fail(name, way, 'pre_cmd failed: {0}'.format(exit_code)) if_verbose(1, '** pre_cmd was "{0}".'.format(override_options(opts.pre_cmd))) + stderr_contents = stderr_path.read_text(encoding='UTF-8', errors='replace') + stdout_contents = stdout_path.read_text(encoding='UTF-8', errors='replace') + if_verbose(1, 'stdout: {0}'.format(stdout_contents)) + if_verbose(1, 'stderr: {0}'.format(stderr_contents)) + # Don't continue and try to run the test if the pre_cmd fails. + return result = func(*[name,way] + args) |