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: case CLD_DUMPED:
fprintf(stderr, "Client '%s' was killed by signal %d\n", fprintf(stderr, "Client '%s' was killed by signal %d\n",
ci->name, status.si_status); ci->name, status.si_status);
ci->exit_code = status.si_status; ci->kill_code = status.si_status;
break; break;
case CLD_EXITED: case CLD_EXITED:
if (status.si_status != EXIT_SUCCESS) if (status.si_status != EXIT_SUCCESS)
@ -425,8 +425,10 @@ display_resume(struct display *d)
wl_display_run(d->wl_display); 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 void
display_destroy(struct display *d) display_destroy_expect_signal(struct display *d, int signum)
{ {
struct client_info *cl, *next; struct client_info *cl, *next;
int failed = 0; int failed = 0;
@ -437,7 +439,15 @@ display_destroy(struct display *d)
wl_list_for_each_safe(cl, next, &d->clients, link) { wl_list_for_each_safe(cl, next, &d->clients, link) {
assert(cl->wl_client == NULL); 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; ++failed;
fprintf(stderr, "Client '%s' failed\n", cl->name); 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 --- * --- Client helper functions ---
*/ */

View file

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