Commit Graph

253 Commits

Author SHA1 Message Date
Philip Withnall
2676ef03cc gtestutils: Fix a potential NULL pointer dereference in g_test_log()
Although unlikely, apparently `message` may be `NULL` (the rest of the
code checks for it), so the code to convert newlines to spaces should
probably also check for `NULL`.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Coverity CID: #1504054
2023-01-24 11:33:18 +00:00
Marco Trevisan (Treviño)
a707cebcd9 gtestutils: Improve TAP reporting on tests failures
When we've a failure our TAP reporting just bails out without that is clear
what is the test that has failed.

So in this case, expose a "not ok" message if the test name is known, and
use it to report the error message too if available.

Otherwise just use the same Bail out! strategy.
2023-01-20 15:28:58 +01:00
Marco Trevisan (Treviño)
d8e4c1a8f8 gtestutils: Do not make a subtest to Bail out! the root one
This is something that a base test should decide, so if a subtest fails it's
up to the caller to decide whether to bail out the whole suite or just the
subtest.
2023-01-20 15:27:27 +01:00
Marco Trevisan (Treviño)
f5f09445b8 gtestutils: Define TAP version clearly as defined value
As we do in tests
2023-01-20 15:23:59 +01:00
Marco Trevisan (Treviño)
03f5d0b060 gtestutils: Use test print handler to write subprocess output
When using verbose logging, all the printing and the glib info and debug
logs may end up being written in standard out, making meson TAP parser to be
confused and to fail with TAP parsing errors.

So, in such case write the subprocess output all at once using the the gtest
printer so that we add proper formatting.

Also do not write any gtest result message for subprocesses
2023-01-20 14:10:08 +01:00
Marco Trevisan (Treviño)
8b7b5f5457 gtestutils: Define a custom g_print handler for TAP
When using TAP output in gtest, all the printed strings should be commented
not to break the spec, so enforce this at GTest level, by ensuring that
all the lines written via g_print() will be in the commented form and will
respect the subtest indentation.

As per this we can remove some custom code in g_test_log() as now there are
very few cases in which we need to use the default print handler which is
now private when testing.
2023-01-20 14:10:08 +01:00
Marco Trevisan (Treviño)
5d91834d9b gtestutils: Do not generate the random seed if provided
There's no point to generate a seed if we're going to overwrite it when
--seed is used.
2023-01-20 14:06:23 +01:00
Xavier Claessens
c00135ec73 gtestutils: Do not use default log handler when using TAP
Only use g_test_log() because it will prepend `#` to log messages when
using TAP protocol. Meson >=1.0 rightfully prints a warning when using
TAP protocol and stdout contains non-comment unknown TAP command.
2023-01-17 21:08:49 +01:00
Marco Trevisan (Treviño)
f893df4b7d gtestutils: Use TAP 13 comments syntax for subtests
Sadly meson 60 doesn't support parsing TAP 14 subtests properly, so it would
fail.

So temporary go back to the previous logic in a simple way so that this
commit can be reverted quickly when we can use a newer meson version.
2023-01-17 21:08:49 +01:00
Marco Trevisan (Treviño)
28b73434be gtestutils: Use TAP version 14 Subtests syntax to show subtests output
Instead of just commenting all the output of sub-processes we can just use
the TAP 14 syntax for subtests, by using 4-spaces to indent the subtests
output.

This may not work perfectly when there are sub-process that may write
output mixed with the parent, but it should be enough to expose the
hierarchy.
2023-01-17 21:08:49 +01:00
Marco Trevisan (Treviño)
9cfae23915 gtestutils: Do not allow newlines in Bail out! messages
It would break TAP parsing, so let's just print all inline
2023-01-17 21:08:49 +01:00
Marco Trevisan (Treviño)
07ff0f7460 gtestutils: Print commented TAP output if running a subprocess
If a gtest process is run as a child of another process, we should not print
the TAP output in plain mode or we'll break the parent results.

We can instead just comment their output so that it gets ignored by TAP
parsers.
2023-01-17 21:08:49 +01:00
Xavier Claessens
28299eb467 gtestutils: "Bail out!" TAP message cannot be multiline
Extra lines must be prepended with `#` which g_test_message() does for
us. Note that lines after "Bail out" are ignored, so we print
stdout/stderr before.
2023-01-17 21:08:49 +01:00
Marco Trevisan (Treviño)
250f3f0644 gtestutils: Write g_test_message() output in a single operation
Do not write it in multiple lines, to ensure it's going to be written
all together, and nothing else could be written in the middle.

Also optimize a bit the code.
2023-01-17 21:08:48 +01:00
Marco Trevisan (Treviño)
f68c49102e gtestutils: Write log to stderr atomically
We used to send the test log to stderr in pieces, but this could be
problematic when running multiple tests in parallel, so let's just prepare
the string in pieces and write it all at once.
2023-01-17 21:08:48 +01:00
Marco Trevisan (Treviño)
a943d42104 gtestutils: Use TAP format for all the verbose output
In some cases if verbose output was enabled we were using wrong output
format in TAP mode, so let's fix these cases and run the 'testing' test
case in --verbose mode to ensure we won't regress.
2023-01-17 21:08:48 +01:00
Marco Trevisan (Treviño)
5c799ff01d gtestutils: Write tap test results atomically
When running multiple tests in parallel using meson, the output could be
mixed and if we write the TAP reports in multiple steps the output could
be mangled together with other results.

An example is: https://gitlab.gnome.org/3v1n0/glib/-/jobs/2507620

Where we have:
  ok 5 /cancellable/poll-fd# GLib-GIO-DEBUG: Collecting capable appnames: 0ms
  # Allocating hashtables:...... 0ms
  # Reading capable apps:        63ms
  # Reading URL associations:... 0ms
  # Reading extension assocs:    78ms
  # Reading exe-only apps:...... 47ms
  # Reading classes:             312ms
  # Reading UWP apps:            47ms
  # Postprocessing:..............16ms
  # TOTAL:                       563ms
   # SKIP Platform not supported

Leading to a clear TAP parsing error
2023-01-17 21:08:48 +01:00
Marco Trevisan (Treviño)
254c71e7c6 gtestutils: Set the TAP version 13 as first line of tests output
This is not required, but meson may warn about in future versions, so it's
safer to define it.

However, we must be sure that we only expose it once and in the root binary
if a test file launches another subprocess test file.
To avoid this, we set an environment variable at test init, so that it can
be inherited by children.
It's not the best solution, but for sure the best-effort one without having
to change gtest arguments and called binaries.

Non mentioning a version was considered as assuming we were using TAP
version 12, while no version earlier than 13 can be specified
explicitly so let's use it.

See: https://testanything.org/tap-specification.html
And: https://testanything.org/tap-version-13-specification.html
2023-01-17 21:08:48 +01:00
Marco Trevisan (Treviño)
ca0f04d1c6 gtestutils: Use $G_TEST_TMPDIR as temporary directory when defined
During tests in which we are isolating directories, we may still create
temporary files in the global temporary directory without cleaning them
because the value returned by g_get_tmp_dir() is cached when we isolate
the tests directory to the global TMPDIR.

To ensure that we're always isolating the temporary directories, let's
unset the cached temporary directory once we've defined $G_TEST_TMPDIR
so that the returned value of g_get_tmpdir() can be recomputed using the
test isolated temporary directory.
2022-12-19 21:37:19 +01:00
Philip Withnall
b012c3470b gtestutils: Check for failure to setenv() and return
This is very unlikely to happen, but it makes Coverity happier.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Coverity CID: #1474388
2022-12-14 15:11:10 +00:00
Philip Withnall
fc6db764cb gtestutils: Use backslashes for isolated test dirs on Windows
Using `test_run_name` in the path for the isolated dir tree for a test
is fine on Unix, because the `/` separator from GTest paths is suitable
as a file system separator.

On Windows, however, it doesn‘t work when mixed and concatenated with
paths which use backslashes. In particular, byte-by-byte path
comparisons don’t work. There are likely also issues if running on a
system with non-UTF-8 file system encoding.

Fix that by storing a file system path version of `test_run_name`
separately, and using the correct `G_DIR_SEPARATOR` for the host OS.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
2022-12-08 18:03:01 +00:00
Simon McVittie
de8672fe0b gtestutils: Add G_TEST_SUBPROCESS_DEFAULT, G_TEST_TRAP_DEFAULT
This makes calls to test subprocesses with default behaviour more
self-documenting.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2022-06-23 10:47:13 +01:00
Philip Withnall
70ee43f1e9 glib: Add SPDX license headers automatically
Add SPDX license (but not copyright) headers to all files which follow a
certain pattern in their existing non-machine-readable header comment.

This commit was entirely generated using the command:
```
git ls-files glib/*.[ch] | xargs perl -0777 -pi -e 's/\n \*\n \* This library is free software; you can redistribute it and\/or\n \* modify it under the terms of the GNU Lesser General Public/\n \*\n \* SPDX-License-Identifier: LGPL-2.1-or-later\n \*\n \* This library is free software; you can redistribute it and\/or\n \* modify it under the terms of the GNU Lesser General Public/igs'
```

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Helps: #1415
2022-05-18 09:19:02 +01:00
Philip Withnall
a6311f81ee gtestutils: Handle empty argv array passed to g_test_init()
This can happen if a caller (ab)uses `execve()` to execute a gtest
process with an empty `argv` array. `g_test_init()` has to gracefully
handle such a situation.

Fix a few problem areas in the code, and add a simple test which checks
that `g_test_init()` doesn’t crash when called with an empty `argv`.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
2022-02-11 14:47:19 +00:00
Philip Withnall
1094bfc7d7 Merge branch 'wip/smcv/defer-test-cleanup' into 'main'
testutils: Defer global cleanup until we really exit

Closes #2563

See merge request GNOME/glib!2420
2022-02-11 14:21:43 +00:00
Philip Withnall
f2d67f3605 gtestutils: Mark a variable as const
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

See: !2420
2022-02-11 13:04:06 +00:00
Philip Withnall
6fd53df562 Merge branch 'wip/hadess/timer-docs' into 'main'
gtestutils: Mention the unit used for the test timer

See merge request GNOME/glib!2378
2022-02-11 12:46:15 +00:00
Simon McVittie
c651ea0453 testutils: Defer global cleanup until we really exit
Some test suites try to call g_test_build_filename() after g_test_run()
has returned. In the installed-tests use-case where G_TEST_BUILDDIR and
G_TEST_SRCDIR are unset, that call uses test_argv0_dirname, which
is freed in test_cleanup(). Defer test_cleanup() using atexit() so it
isn't freed until after we return from main().

Resolves: https://gitlab.gnome.org/GNOME/glib/-/issues/2563
Signed-off-by: Simon McVittie <smcv@collabora.com>
2022-01-06 15:41:13 +00:00
Philip Withnall
e6b85bc05c gtestutils: Fix minor typos in the g_test_get_filename() docs
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
2022-01-06 12:52:00 +00:00
Sophie Herold
68eab1d999 utils: Add XDG_STATE_HOME support 2021-12-24 20:11:39 +00:00
Charles Barto
5c82bf65d6 include crtdbg first, so includes are alphabatical 2021-12-17 16:49:42 -08:00
Charles Barto
77df44371e Only call _set_abort_behavior with the ucrt. 2021-12-17 16:05:14 -08:00
Charles Barto
908ed3498b Prevent gtest tests from popping up dialog boxes
Many UCRT (and msvcrt/msvcxx) functions open dialog boxes
by default for .... some reason. This is a problem because a test runner
waiting on a process to exit won't see it exit unless someone actually
clicks away the box, which won't happen on a CI machine.

Additionally g_abort unconditionally raises a debugging exception,
which, if uncaught, will cause windows error reporting to pop a dialog

Resolve the first problem by calling platform specific (but documented)
functions to change the CRT's behavior in g_test_init

Resolve the second by only throwing a debug exception if we're under
debugging, and just calling abort() otherwise.

This reduces the number of popups triggerd by `meson test` from
over 10 to about three on my machine, mostly in the spawn test code.
2021-12-16 20:20:56 -08:00
Bastien Nocera
0cc75eb728 gtestutils: Mention the unit used for the test timer 2021-12-01 11:19:30 +01:00
Simon McVittie
a076dbcb68 gtestutils: Allow failing a test with a printf-style message
This allows a pattern like

    g_test_message ("cannot reticulate splines: %s", error->message);
    g_test_fail ();

to be replaced by the simpler

    g_test_fail_printf ("cannot reticulate splines: %s", error->message);

with the secondary benefit of making the message available to TAP
consumers as part of the "not ok" message.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-08-19 09:49:11 +01:00
Simon McVittie
182d9995ca gtestutils: Allow skipping tests with a printf-style message
Forming the g_test_skip() message from printf-style arguments seems
common enough to deserve a convenience function.

g_test_incomplete() is mechanically almost equivalent to g_test_skip()
(the semantics are different but the implementation is very similar),
so give it a similar mechanism for symmetry.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-08-19 09:41:08 +01:00
GOUJON Évan
bd779c96e9 glib/gtestutils: Introduce and use a test_cleanup function 2021-07-23 22:20:54 +02:00
GOUJON Évan
353f0b5235 glib/gtestutils: Introduce and use a g_test_suite_free function 2021-07-23 22:16:44 +02:00
GOUJON Évan
f0c0d8b67c glib/gtestutils: Introduce and use a g_test_case_free function 2021-07-23 22:10:08 +02:00
GOUJON Évan
0786031804 g_test_run: Introduce a clean up path once test suite ran 2021-07-23 22:05:52 +02:00
Philip Withnall
46ab6821a3 gtestutils: Allow full URIs in g_test_bug()
Even if `g_test_bug_base()` has been called.

See https://gitlab.gnome.org/GNOME/glib/-/merge_requests/275#note_303175

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
2021-05-13 21:57:40 +01:00
Philip Withnall
0f7950f199 gtestutils: Improve documentation formatting for g_test_bug_base()
Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
2021-05-13 21:57:25 +01:00
Emmanuele Bassi
85eec6aae8 Split g_test_log() messages that contain multiple lines
When using TAP we want every single line to be one of the following:

 - a valid TAP clause
 - a comment
 - a blank line

Typical explicit test logs are single line comments, but in some cases
we might end up printing debug messages from libraries, and those may
contain multiple lines. When that happens, we break the TAP and fail the
test in conditions entirely outside of our control.

One option to avoid outright failure is to always prepend each line of a
messge with `#`, to ensure that the whole thing is considered a comment.
2021-04-07 16:19:34 +01:00
Philip Withnall
19470722b3 glib: Use g_memdup2() instead of g_memdup() in obvious places
Convert all the call sites which use `g_memdup()`’s length argument
trivially (for example, by passing a `sizeof()` or an existing `gsize`
variable), so that they use `g_memdup2()` instead.

In almost all of these cases the use of `g_memdup()` would not have
caused problems, but it will soon be deprecated, so best port away from
it

In particular, this fixes an overflow within `g_bytes_new()`, identified
as GHSL-2021-045 by GHSL team member Kevin Backhouse.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
Fixes: GHSL-2021-045
Helps: #2319
2021-02-04 16:04:10 +00:00
Simon McVittie
9fef98cf84 gtestutils: Default to -m no-undefined under AddressSanitizer
AddressSanitizer detects memory leaks, NULL parameters where only a
non-NULL parameter is expected, and other suspicious behaviour, so if
we try to test that sort of thing we can expect it to fail.

Signed-off-by: Simon McVittie <smcv@collabora.com>
2021-02-01 10:44:35 +00:00
Jonas Ådahl
657d18fdbb gtestutils: Add g_test_get_path() API
I found myself wanting to know the test that is currently being run,
where e.g. __func__ would be inconvenient to use, because e.g. the place
the string was needed was not in the test case function. Using __func__
also relies on the test function itself containing the whole path, while
loosing the "/" information that is part of the test path.
2021-01-25 16:34:12 +01:00
Frederic Martinsons
3872bf2ccf Introduce new options -r (or --run-prefix) and -x (or --skip-prefix)
They extend the behavior of, respectively, -p and -s options of the
glib test framework

Currently test suite are only run for one level under -p path, for
example, testfilemonitor -p /monitor would execute the following tests:

/monitor/atomic-replace
/monitor/file-changes
/monitor/dir-monitor
/monitor/dir-not-existent
/monitor/cross-dir-moves

With the --run-prefix the sub-test suite file will be executed:

/monitor/atomic-replace
/monitor/file-changes
/monitor/dir-monitor
/monitor/dir-not-existent
/monitor/cross-dir-moves
/monitor/file/hard-links

The --skip-prefix and run-prefix seems symmetrical, but there is a
difference with skip towards run:
--skip-prefix will use a prefix while --run-prefix only work for a valid test path.
For example and for the following test family:

/monitor/atomic-replace
/monitor/file-changes
/monitor/dir-monitor
/monitor/dir-not-existent
/monitor/cross-dir-moves
/monitor/file/hard-links

while --run-prefix /mon will not execute anything, --skip-prefix /mon
 will skip all of these tests.

See #2238 which references this change.
2020-11-30 14:42:58 +01:00
Philip Withnall
065dea99f4 gtestutils: Drop unnecessary NULL check
The macro wrapper to `g_assertion_message_cmpstrv()` makes sure that
neither array is `NULL`, so there’s no need for a second `NULL` check.
Additionally, this check happens after the arrays have already been
dereferenced, at which point the program would have crashed if the
arrays were `NULL`.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Coverity CID: #1436406, #1436407
2020-11-17 10:31:59 +00:00
Niels De Graef
f98f2c5d0f gtestutils: Add g_assert_cmpstrv()
Add a test util function that helps asserting two string arrays are the
same, and which adds some useful information if they're not.

Fixes: #2015
2020-11-14 18:17:19 +00:00
Philip Withnall
43d984464d gtestutils: Mark a return value as explicitly ignored
We can’t do anything differently based on whether removing a file fails.

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>

Coverity CID: #1354857
2020-11-13 14:12:49 +00:00