tests: Support tests that check for client failure 82/296682/2
authorAlexandros Frantzis <alexandros.frantzis@collabora.com>
Tue, 15 Nov 2022 09:21:37 +0000 (11:21 +0200)
committerJoonbum Ko <joonbum.ko@samsung.com>
Wed, 23 Aug 2023 08:04:29 +0000 (17:04 +0900)
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.

Change-Id: Ib7eb2e313f39b04672a45b3a9d39cde0960ef833
Signed-off-by: Alexandros Frantzis <alexandros.frantzis@collabora.com>
tests/test-compositor.c
tests/test-compositor.h

index 46705f1..3a45151 100644 (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 ---
  */
index b681b09..3fb390c 100644 (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,