Commit 7bf8049c authored by Marek Chalupa's avatar Marek Chalupa Committed by Pekka Paalanen
Browse files

tests: add timeout



Add test_set_timeout() function that allows the test to
set timeout for its completition. Any other call to the function
re-sets the timeout to the new value. The timeouts can be turned off
(usefull when debugging) by setting evironment variable
WAYLAND_TESTS_NO_TIMEOUTS.

v2:
  rename NO_TIMEOUTS to WAYLAND_TESTS_NO_TIMEOUTS
  use unsigned int as argument of test_set_timeout()
  improve printing of the message about timeout
Signed-off-by: default avatarMarek Chalupa <mchqwerty@gmail.com>
Reviewed-by: Pekka Paalanen's avatarPekka Paalanen <pekka.paalanen@collabora.co.uk>
parent 47c752ad
......@@ -44,6 +44,11 @@ static void* (*sys_calloc)(size_t, size_t);
int leak_check_enabled;
/* when this var is set to 0, every call to test_set_timeout() is
* suppressed - handy when debugging the test. Can be set by
* WAYLAND_TESTS_NO_TIMEOUTS evnironment var */
static int timeouts_enabled = 1;
extern const struct test __start_test_section, __stop_test_section;
__attribute__ ((visibility("default"))) void *
......@@ -110,14 +115,55 @@ usage(const char *name, int status)
exit(status);
}
void
test_set_timeout(unsigned int to)
{
int re;
if (!timeouts_enabled) {
fprintf(stderr, "Timeouts suppressed.\n");
return;
}
re = alarm(to);
fprintf(stderr, "Timeout was %sset", re ? "re-" : "");
if (to != 0)
fprintf(stderr, " to %d second%c from now.\n",
to, to > 1 ? 's' : 0);
else
fprintf(stderr, " off.\n");
}
static void
sigalrm_handler(int signum)
{
fprintf(stderr, "Test timed out.\n");
abort();
}
static void
run_test(const struct test *t)
{
int cur_alloc = num_alloc;
int cur_fds, num_fds;
struct sigaction sa;
cur_fds = count_open_fds();
if (timeouts_enabled) {
sa.sa_handler = sigalrm_handler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
assert(sigaction(SIGALRM, &sa, NULL) == 0);
}
t->run();
/* turn off timeout (if any) after test completition */
if (timeouts_enabled)
alarm(0);
if (leak_check_enabled) {
if (cur_alloc != num_alloc) {
fprintf(stderr, "Memory leak detected in test. "
......@@ -189,6 +235,7 @@ int main(int argc, char *argv[])
sys_free = dlsym(RTLD_NEXT, "free");
leak_check_enabled = !getenv("NO_ASSERT_LEAK_CHECK");
timeouts_enabled = !getenv("WAYLAND_TESTS_NO_TIMEOUTS");
if (argc == 2 && strcmp(argv[1], "--help") == 0)
usage(argv[0], EXIT_SUCCESS);
......
......@@ -37,4 +37,11 @@ count_open_fds(void);
void
exec_fd_leak_check(int nr_expected_fds); /* never returns */
/*
* set/reset the timeout in seconds. The timeout starts
* at the point of invoking this function
*/
void
test_set_timeout(unsigned int);
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment