Commit Graph

203 Commits

Author SHA1 Message Date
Paolo Bonzini 5215f4fa98 cleanup self.options.wd
It is never None and always an absolute path
2021-07-07 18:00:37 +02:00
Paolo Bonzini b44a51d0fd resolve symlinks passed to -C
"meson setup" is resolving symlinks for the build directory in
validate_core_dirs.  For consistency with it, do the same when
the build directory is passed via -C to devenv, dist, init, install
and test.

This ensures for example that the path to test dependencies is
computed correctly in "meson test".

Fixes: #8765
2021-07-07 18:00:37 +02:00
Daniel Mensinger 3e396b3782
fix: Always explicitly set encoding for text files (fixes #8263) 2021-06-29 11:28:08 +02:00
Paolo Bonzini ea48edbb0f mtest: timeout if the write side of pipes does not close
If a test program forks a child, the pipes might remain open and
"await stdo_task"/"await stde_task" will never complete in
SingleTestRunner._run_cmd().

Instead, catch them in TestSubprocess.wait() so that the whole
process group is killed.

Fixes: #8533
Reported-by: Bastien Nocera <hadess@hadess.net>
2021-03-23 00:07:14 +02:00
Paolo Bonzini 13d3fbbf3e mtest: remove pointless try/except from try_wait_one
asyncio.wait does not return an asyncio.TimeoutError, so there is no
exception to catch.
2021-03-23 00:07:14 +02:00
Dylan Baker 40e3577a65 split program related classes and functions out of dependencies
Dependencies is already a large and complicated package without adding
programs to the list. This also allows us to untangle a bit of spaghetti
that we have.
2021-03-19 08:47:10 -04:00
Eli Schwartz 6a0fabc647
mass rewrite of string formatting to use f-strings everywhere
performed by running "pyupgrade --py36-plus" and committing the results
2021-03-04 17:16:11 -05:00
Eli Schwartz 4340bf34fa
various python neatness cleanups
All changes were created by running

"pyupgrade --py3-only --keep-percent-format"

and committing the results. I have not touched string formatting for
now.

- use set literals
- simplify .format() parameter naming
- remove __future__
- remove default "r" mode for open()
- use OSError rather than compatibility aliases
- remove stray parentheses in function(generator) scopes
2021-03-04 17:11:26 -05:00
Paolo Bonzini 0c663d056a mtest: create separate runners for multiple repeats
Reusing the runners for multiple repeats of the test run gets in the
way of the progress report, which stores runners in an OrderedSet.
Instead, create a separate SingleTestRunner object for each repeat.

While at it, fix the "duplicate suite" assertion as it can fire
with TAP tests and --repeat=N.

Fixes: #8405
2021-03-02 00:57:57 +02:00
Luke Drummond 79f7328d6a [TAP] Fix TAP parser when test exits with status
Some time between 0.56 and 0.57 the TAP parser broke when a test exits
with a nonzero status.
The TAP protocol does not specify this behaviour - giving latitude to
implementers, and meson's previous behaviour was to report the exit
status gracefully.

This patch restores the old behaviour and adds a regression test
2021-02-19 17:17:20 +02:00
Paolo Bonzini 2b48d75c7e mtest: use / as path separator for ninja targets
os.path.relpath(f, wd) returns path with \ seperator on Windows, but ninja
targets always uses / separator.

See for example https://gitlab.freedesktop.org/ocrete/libnice/-/jobs/7348274.

Analyzed-by: Xavier Claessens <xavier.claessens@collabora.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-02-17 12:10:05 -05:00
Paolo Bonzini b1efd03619 mtest: include classname in <testcase> JUnit element
It looks like GitLab ignores the suite name and actually uses
the classname.  Adjust the output accordingly.

Fixes: #8316
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-02-10 15:01:57 +01:00
Paolo Bonzini 6c40b134df mtest: cancel stdout/stderr tasks on timeout
Avoid that the tasks linger and SingleTestRunner.run() never terminates.

In order to do this, we need read_decode() and read_decode_lines() to be
cancellable, and to handle the CancelledError gracefully while returning
the output they have collected so far.

For read_decode(), this means always operating on a line-by-line basis,
even if console_mode is not ConsoleUser.STDOUT.  For read_decode_lines(),
instead, we cannot return an iterator.  Rather, read_decode_lines()
returns the output directly (similar to read_decode) and communication
with the parser is mediated by an asyncio.Queue.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-02-10 12:01:55 +01:00
Paolo Bonzini c6b135c1f9 mtest: clean up conditions on whether tests are run in parallel
This makes non-parallel tests emit their output on the fly,
similar to ninja console jobs.  It also cleans up the code
a bit, avoiding the repetition of "self.options.num_processes"
tests.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-02-10 10:58:21 +01:00
Paolo Bonzini 711d9feb4e mtest: fix nits in printing test stdout
- Ensure the output is terminated with a \n even if the test does not
  include one.

- Ensure that stdout is flushed for each reported result

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-02-10 10:57:55 +01:00
Paolo Bonzini 3506d8daf2 mtest: TestSetup can have [] as an exe_wrapper
Fix "meson test --wrapper foo --setup bar", it should work just fine
if the setup does not define a wrapper.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-02-09 18:51:05 +01:00
Paolo Bonzini b1a9578091 mtest: run the test output parser as a task
Start the parsing of the output early; this avoids a deadlock
if the test writes to stdout but no one reads from it.  It
also reports TAP or Rust subtest results as they happen,
which was the intention all along.

While at it, use a consistent naming conventions for coroutines
vs tasks.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-02-09 18:50:21 +01:00
Paolo Bonzini 8b94aa578a mtest: hide infinite timeout from the progress report
Avoid printing something like "30/-1s" when tests are run without
a timeout or with --timeout-multiplier 0.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-02-09 18:42:26 +01:00
Paolo Bonzini c7c2bc8db1 interpreter, mtest: introduce add_test_setup(exclude_suites: ...)
This new keyword argument makes it possible to run specific
test setups only on a subset of the tests.  For example, to
mark some tests as slow and avoid running them by default:

    add_test_setup('quick', exclude_suites: ['slow'], is_default: true)
    add_test_setup('slow')

It will then be possible to run the slow tests with either
`meson test --setup slow` or `meson test --suite slow`.
2021-02-02 11:23:33 +01:00
Paolo Bonzini e7b587c81f mtest: extract get_test_setup, rename merge_suite_options
merge_suite_options is really about test setups, so rename
accordingly.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-02-02 11:22:58 +01:00
Paolo Bonzini 26a3148e19 mtest: load build data early
This will be needed to exclude testsuites from test setups (which
are stored in the build data).  While at it, since a chdir is
needed simplify a bit the loading of tests and benchmarks.
2021-02-02 11:21:11 +01:00
Paolo Bonzini 0aeb2074b9 mtest: compute logfile name early
Do this before overriding self.options.setup with the default setup.
2021-02-02 11:20:49 +01:00
Paolo Bonzini 203f368949 mtest: remove useless argument 2021-02-02 10:06:55 +01:00
Jussi Pakkanen f0fbb31ccf
Merge pull request #8200 from bonzini/mtest-asyncio-logs
mtest: improvements to logging
2021-01-30 09:52:43 +00:00
Xavier Claessens e4137ae3ec test: Make timeout <= 0 infinite duraction 2021-01-27 08:26:20 -05:00
Paolo Bonzini 12b3d05d1e mtest: log individual TAP subtests 2021-01-22 12:18:59 +01:00
Paolo Bonzini 7b02abeac6 mtest: infrastructure to print subtest results 2021-01-22 12:18:59 +01:00
Paolo Bonzini bb9d8b5b80 mtest: move --print-errorlogs output during the test run
Print the (shortened) output of the failed tests as they happen.
If neither --verbose nor --print-errorlogs was specified, omit the
summary of failures, because it is pretty much the same as the earlier
output of "meson test".
2021-01-22 12:18:59 +01:00
Paolo Bonzini 4d6a0cc174 mtest: log test start in verbose mode
In non-parallel verbose mode the output of the test/benchmark
is not buffered, therefore the command line is only printed by
ConsoleLogger for failing tests and only after the test has run.

Verbose mode is designed mostly for CI systems, where output must
be human readable but is generally consumed from a browser with "Find"
commands rather than from a terminal.  With this usecase in mind, it
is better to provide as much detail as possible, so add more output
and just tell the user which tests have started.  Do so, using the
recently introduced TestResult.RUNNING state.
2021-01-22 12:18:59 +01:00
Paolo Bonzini 959e4b3a5e mtest: call TestLogger.start_test when TestRun is in the RUNNING state 2021-01-22 12:18:59 +01:00
Paolo Bonzini 289cc2e2c5 mtest: use buffered stdout/stderr in parallel mode
Similar to ninja, buffer stdout/stderr even in verbose mode if more than one test is
being run in parallel.
2021-01-22 12:18:59 +01:00
Paolo Bonzini a0da710172 mtest: quote environment variable values and command line arguments 2021-01-22 12:18:59 +01:00
Paolo Bonzini 04bab9d595 mtest: include full environment in the TestRun object
Ensure that all the required modifications are included in the logs.
This makes it possible for users to cut-and-paste from the logs when
trying to reproduce failures outside Meson.
2021-01-22 12:18:59 +01:00
Paolo Bonzini 111f22a4f8 mtest: make log output more suitable for console
Right now the same code is used to print the logs for both the console
and the text log.  Differentiating them lets the important bits of
the console output stand out, and makes the console output a bit more
readable.
2021-01-22 12:18:59 +01:00
Paolo Bonzini a118cae9d2 mtest: small refactoring of log printing
Start moving console-specific code to ConsoleLogger, as well
as moving code out of get_log().
2021-01-22 12:18:59 +01:00
Paolo Bonzini 2386f336f1 mtest: log in verbose mode, but not in gdb mode
This is now possible because all stdout/stderr goes through asyncio pipes.
However, logs make little sense in gdb mode.
2021-01-22 12:18:59 +01:00
Paolo Bonzini 2e982a3864 mtest: collect stdout/stderr even in verbose mode
Using verbose mode dropped stdout/stderr from the logs, because
it was not captured.

Now that we can easily stick code in the middle of the reading of
stdout/stderr, use that to print stdout and stderr on the fly
while also capturing them for the logs.  The output is line-buffered.

As a side effect, this also fixes a possible deadlock due to
not using ensure_future around stdo_task and stde_task.  In
particular:

- the stdo_task coroutine would not terminate until the test closed
stdo_task

- the stde_task coroutine would not start until the stdo_task
coroutine finished

Therefore, the test could get stuck waiting for its parent to
read the contents of stderr, but that would not happen because
Meson was still in the stdo_task coroutine.
2021-01-20 15:06:59 +01:00
Paolo Bonzini e7c8555575 mtest: move I/O handling to TestSubprocess
Move the logic to start the read/decode
tasks to TestSubprocess and keep SingleTestRunner simple.

The lines() inner function is tweaked to produce stdout as a future.
This removes the nonlocal access (which is not possible anymore
when the code is moved out of _run_cmd), and also lets _run_cmd
use "await stdo_task" for both parsed and unparsed output.
2021-01-15 15:58:53 +01:00
Paolo Bonzini 401464c61a mtest: tweak the gathering of stdo_task/stde_task results
After the next patch, we will need to complete parse_task before
stdo_task (because parse_task will not set the "stdo" variable
anymore but it will still collect stdout just like now).  Do
the change now to isolate the more complicated changes.
2021-01-15 10:03:54 +01:00
Paolo Bonzini 90ea0dc583 mtest: disable the progress report in gdb mode
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2021-01-15 10:03:54 +01:00
Paolo Bonzini c1c1408fae mtest: introduce ConsoleUser
This new enum can be used by TestSubprocess and TestHarness to
understand (at a higher level) how SingleTestRunner sets up
stdout/stderr redirection.
2021-01-15 10:03:54 +01:00
Paolo Bonzini 1f52e2fa45 mtest: turn TestRun into a hierarchy
Make SimpleTestRunner oblivious of the various test protocols.  All
the different "complete_*" and "parse_*" methods move to the
subclasses of TestRun.
2021-01-15 10:03:54 +01:00
Paolo Bonzini 9e42048e3c mtest: pass command line to TestRun.start
The command line is already available when the test is started.  Pass it to
TestRun.start instead of TestRun.complete*.
2021-01-15 10:03:54 +01:00
Paolo Bonzini 1f5634f15d mtest: add complete_skip to TestRun 2021-01-15 10:03:54 +01:00
Paolo Bonzini c544529faa mtest: simplify complete_exitcode
There is no need anymore to pass the JUnit XML down to complete_exitcode.  Just
set self.junit in complete_gtest instead.
2021-01-15 10:03:54 +01:00
Paolo Bonzini 51e1f01c85 mtest: store the environment in the TestRun
The test_env was lost from the TestRun object in commit
30741a0f2 ("mtest: create TestRun object early on").  Fix
things.
2021-01-15 10:03:54 +01:00
Paolo Bonzini 458c3125e0 mtest: do not print time out message twice
Rebase mistake in "mtest: move timeout message to ConsoleLogger".
2021-01-15 10:03:54 +01:00
Paolo Bonzini ea2f34e286 mtest: allow quickly interrupting the test run
The new behavior of interrupting the longest running test with Ctrl-C is useful
when tests hang, but not when the run is completely broken for some reason.
Psychology tells us that the user will compulsively spam Ctrl-C in this case,
so exit if three Ctrl-C's are detected within a second.
2021-01-14 22:00:51 +00:00
Paolo Bonzini f13b2b4b1d mtest: fix flake8 2021-01-14 22:00:51 +00:00
Paolo Bonzini f13dde1f08 mtest: print TAP subtest count
The parentheses look ugly in the progress report.  To keep it aligned
with the test outcomes, remove them from the outcomes as well.
2021-01-07 19:20:40 +01:00