tests: Support tests that check for client failure

Add the display_destroy_expect_signal() function to check that test
clients exit due to a particular signal. This is useful for checking
that clients fail in an expected way.

Signed-off-by: Alexandros Frantzis <alexandros.frantzis@collabora.com>
This commit is contained in:
Alexandros Frantzis 2022-11-15 11:21:37 +02:00 committed by Simon Ser
parent 0ba650202e
commit e09010f470
2 changed files with 21 additions and 3 deletions

View File

@ -114,7 +114,7 @@ handle_client_destroy(void *data)
case CLD_DUMPED:
fprintf(stderr, "Client '%s' was killed by signal %d\n",
ci->name, status.si_status);
ci->exit_code = status.si_status;
ci->kill_code = status.si_status;
break;
case CLD_EXITED:
if (status.si_status != EXIT_SUCCESS)
@ -425,8 +425,10 @@ display_resume(struct display *d)
wl_display_run(d->wl_display);
}
/* If signum is 0, expect a successful client exit, otherwise
* expect the client to have been killed by that signal. */
void
display_destroy(struct display *d)
display_destroy_expect_signal(struct display *d, int signum)
{
struct client_info *cl, *next;
int failed = 0;
@ -437,7 +439,15 @@ display_destroy(struct display *d)
wl_list_for_each_safe(cl, next, &d->clients, link) {
assert(cl->wl_client == NULL);
if (cl->exit_code != 0) {
if (signum != 0 && cl->kill_code != signum) {
++failed;
fprintf(stderr,
"Client '%s' failed, expecting signal %d, "
"got %d\n",
cl->name, signum, cl->kill_code);
}
else if (signum == 0 &&
(cl->kill_code != 0 || cl->exit_code != 0)) {
++failed;
fprintf(stderr, "Client '%s' failed\n", cl->name);
}
@ -457,6 +467,12 @@ display_destroy(struct display *d)
}
}
void
display_destroy(struct display *d)
{
display_destroy_expect_signal(d, 0);
}
/*
* --- Client helper functions ---
*/

View File

@ -40,6 +40,7 @@ struct client_info {
int pipe;
pid_t pid;
int exit_code;
int kill_code;
struct wl_list link;
void *data; /* for arbitrary use */
@ -91,6 +92,7 @@ void noop_request(struct client *);
*/
struct display *display_create(void);
void display_destroy(struct display *d);
void display_destroy_expect_signal(struct display *d, int signum);
void display_run(struct display *d);
/* This function posts the display_resumed event to all waiting clients,