xserver: Branch 'master' - 5 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jan 30 00:24:52 UTC 2024


 test/fixes.c                             |   14 ++--
 test/hashtabletest.c                     |   74 +++++++++++++------------
 test/input.c                             |   69 ++++++++++++-----------
 test/list.c                              |   28 +++++----
 test/misc.c                              |   14 +++-
 test/signal-logging.c                    |   79 ++++++++++++++------------
 test/string.c                            |    9 ++-
 test/test_xkb.c                          |   14 ++--
 test/tests-common.c                      |   37 +++++++-----
 test/tests-common.h                      |    3 -
 test/tests.c                             |    2 
 test/tests.h                             |   77 +++++++++++++++-----------
 test/touch.c                             |   20 +++---
 test/xfree86.c                           |   12 ++--
 test/xi1/protocol-xchangedevicecontrol.c |   28 +++++----
 test/xi2/protocol-common.c               |   44 +++++++++-----
 test/xi2/protocol-common.h               |   23 -------
 test/xi2/protocol-eventconvert.c         |   22 ++++---
 test/xi2/protocol-xigetclientpointer.c   |   33 ++++++-----
 test/xi2/protocol-xigetselectedevents.c  |   51 +++++++++--------
 test/xi2/protocol-xipassivegrabdevice.c  |   61 ++++++++++----------
 test/xi2/protocol-xiquerydevice.c        |   72 +++++++++++-------------
 test/xi2/protocol-xiquerypointer.c       |   29 +++++----
 test/xi2/protocol-xiqueryversion.c       |   58 +++++++++----------
 test/xi2/protocol-xiselectevents.c       |   45 ++++++++-------
 test/xi2/protocol-xisetclientpointer.c   |   25 ++++----
 test/xi2/protocol-xiwarppointer.c        |   16 +++--
 test/xi2/xi2.c                           |    8 ++
 test/xtest.c                             |   91 ++++++++++++++++++-------------
 29 files changed, 573 insertions(+), 485 deletions(-)

New commits:
commit 9c7c470b12563fb99c722d42d706b0391818880b
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jan 5 15:48:06 2024 +1000

    test: use a dbg() macro for the test output
    
    Currently hardcoded to verbose = 0 until we have option parsing but meh.

diff --git a/test/hashtabletest.c b/test/hashtabletest.c
index f748183e6..59c39b464 100644
--- a/test/hashtabletest.c
+++ b/test/hashtabletest.c
@@ -14,14 +14,14 @@ static void
 print_xid(void* ptr, void* v)
 {
     XID *x = v;
-    printf("%ld", (long)(*x));
+    dbg("%ld", (long)(*x));
 }
 
 static void
 print_int(void* ptr, void* v)
 {
     int *x = v;
-    printf("%d", *x);
+    dbg("%d", *x);
 }
 
 static void
@@ -32,7 +32,7 @@ test1(void)
     int ok = 1;
     const int numKeys = 420;
 
-    printf("test1\n");
+    dbg("test1\n");
     h = ht_create(sizeof(XID), sizeof(int), ht_resourceid_hash, ht_resourceid_compare, NULL);
 
     for (c = 0; c < numKeys; ++c) {
@@ -44,9 +44,11 @@ test1(void)
       }
     }
 
-    printf("Distribution after insertion\n");
-    ht_dump_distribution(h);
-    ht_dump_contents(h, print_xid, print_int, NULL);
+    if (verbose) {
+      dbg("Distribution after insertion\n");
+      ht_dump_distribution(h);
+      ht_dump_contents(h, print_xid, print_int, NULL);
+    }
 
     for (c = 0; c < numKeys; ++c) {
       XID id = c;
@@ -55,26 +57,28 @@ test1(void)
         if (*v == 2 * c) {
           // ok
         } else {
-          printf("Key %d doesn't have expected value %d but has %d instead\n",
+          dbg("Key %d doesn't have expected value %d but has %d instead\n",
                  c, 2 * c, *v);
           ok = 0;
         }
       } else {
         ok = 0;
-        printf("Cannot find key %d\n", c);
+        dbg("Cannot find key %d\n", c);
       }
     }
 
     if (ok) {
-      printf("%d keys inserted and found\n", c);
+      dbg("%d keys inserted and found\n", c);
 
       for (c = 0; c < numKeys; ++c) {
         XID id = c;
         ht_remove(h, &id);
       }
 
-      printf("Distribution after deletion\n");
-      ht_dump_distribution(h);
+      if (verbose) {
+        dbg("Distribution after deletion\n");
+        ht_dump_distribution(h);
+      }
     }
 
     ht_destroy(h);
@@ -90,7 +94,7 @@ test2(void)
     int ok = 1;
     const int numKeys = 420;
 
-    printf("test2\n");
+    dbg("test2\n");
     h = ht_create(sizeof(XID), 0, ht_resourceid_hash, ht_resourceid_compare, NULL);
 
     for (c = 0; c < numKeys; ++c) {
@@ -102,7 +106,7 @@ test2(void)
       XID id = c;
       if (!ht_find(h, &id)) {
         ok = 0;
-        printf("Cannot find key %d\n", c);
+        dbg("Cannot find key %d\n", c);
       }
     }
 
@@ -110,16 +114,16 @@ test2(void)
         XID id = c + 1;
         if (ht_find(h, &id)) {
             ok = 0;
-            printf("Could find a key that shouldn't be there\n");
+            dbg("Could find a key that shouldn't be there\n");
         }
     }
 
     ht_destroy(h);
 
     if (ok) {
-        printf("Test with empty keys OK\n");
+        dbg("Test with empty keys OK\n");
     } else {
-        printf("Test with empty keys FAILED\n");
+        dbg("Test with empty keys FAILED\n");
     }
 
     assert(ok);
@@ -133,22 +137,24 @@ test3(void)
         .keySize = 4
     };
     HashTable h;
-    printf("test3\n");
+    dbg("test3\n");
     h = ht_create(4, 0, ht_generic_hash, ht_generic_compare, &hashSetup);
 
     if (!ht_add(h, "helo") ||
         !ht_add(h, "wrld")) {
-        printf("Could not insert keys\n");
+        dbg("Could not insert keys\n");
     }
 
     if (!ht_find(h, "helo") ||
         !ht_find(h, "wrld")) {
         ok = 0;
-        printf("Could not find inserted keys\n");
+        dbg("Could not find inserted keys\n");
     }
 
-    printf("Hash distribution with two strings\n");
-    ht_dump_distribution(h);
+    if (verbose) {
+       dbg("Hash distribution with two strings\n");
+       ht_dump_distribution(h);
+    }
 
     ht_destroy(h);
 
diff --git a/test/input.c b/test/input.c
index c7d7cffdb..5ca8a97cd 100644
--- a/test/input.c
+++ b/test/input.c
@@ -997,7 +997,7 @@ test_padding_for_int32(int i)
 static void
 include_byte_padding_macros(void)
 {
-    printf("Testing bits_to_bytes()\n");
+    dbg("Testing bits_to_bytes()\n");
 
     /* the macros don't provide overflow protection */
     test_bits_to_byte(0);
@@ -1010,7 +1010,7 @@ include_byte_padding_macros(void)
     test_bits_to_byte(INT_MAX - 9);
     test_bits_to_byte(INT_MAX - 8);
 
-    printf("Testing bytes_to_int32()\n");
+    dbg("Testing bytes_to_int32()\n");
 
     test_bytes_to_int32(0);
     test_bytes_to_int32(1);
@@ -1026,7 +1026,7 @@ include_byte_padding_macros(void)
     test_bytes_to_int32(INT_MAX - 4);
     test_bytes_to_int32(INT_MAX - 3);
 
-    printf("Testing pad_to_int32()\n");
+    dbg("Testing pad_to_int32()\n");
 
     test_pad_to_int32(0);
     test_pad_to_int32(1);
@@ -1043,7 +1043,7 @@ include_byte_padding_macros(void)
     test_pad_to_int32(INT_MAX - 4);
     test_pad_to_int32(INT_MAX - 3);
 
-    printf("Testing padding_for_int32()\n");
+    dbg("Testing padding_for_int32()\n");
 
     test_padding_for_int32(0);
     test_padding_for_int32(1);
@@ -1076,7 +1076,7 @@ xi_unregister_handlers(void)
     handler = XIRegisterPropertyHandler(&dev, NULL, NULL, NULL);
     assert(handler == 3);
 
-    printf("Unlinking from front.\n");
+    dbg("Unlinking from front.\n");
 
     XIUnregisterPropertyHandler(&dev, 4);       /* NOOP */
     assert(dev.properties.handlers->id == 3);
@@ -1565,7 +1565,7 @@ input_option_test(void)
     InputOption *opt;
     const char *val;
 
-    printf("Testing input_option list interface\n");
+    dbg("Testing input_option list interface\n");
 
     list = input_option_new(list, "key", "value");
     assert(list);
@@ -1654,7 +1654,7 @@ _test_double_fp16_values(double orig_d)
     double final_d;
 
     if (orig_d > 0x7FFF) {
-        printf("Test out of range\n");
+        dbg("Test out of range\n");
         assert(0);
     }
 
@@ -1668,7 +1668,7 @@ _test_double_fp16_values(double orig_d)
      *    snprintf(first_fp16_s, sizeof(first_fp16_s), "%d + %u * 2^-16", (first_fp16 & 0xffff0000) >> 16, first_fp16 & 0xffff);
      *    snprintf(final_fp16_s, sizeof(final_fp16_s), "%d + %u * 2^-16", (final_fp16 & 0xffff0000) >> 16, final_fp16 & 0xffff);
      *
-     *    printf("FP16: original double: %f first fp16: %s, re-encoded double: %f, final fp16: %s\n", orig_d, first_fp16_s, final_d, final_fp16_s);
+     *    dbg("FP16: original double: %f first fp16: %s, re-encoded double: %f, final fp16: %s\n", orig_d, first_fp16_s, final_d, final_fp16_s);
      * }
      */
 
@@ -1689,7 +1689,7 @@ _test_double_fp32_values(double orig_d)
     double final_d;
 
     if (orig_d > 0x7FFFFFFF) {
-        printf("Test out of range\n");
+        dbg("Test out of range\n");
         assert(0);
     }
 
@@ -1703,7 +1703,7 @@ _test_double_fp32_values(double orig_d)
      *     snprintf(first_fp32_s, sizeof(first_fp32_s), "%d + %u * 2^-32", first_fp32.integral, first_fp32.frac);
      *     snprintf(final_fp32_s, sizeof(final_fp32_s), "%d + %u * 2^-32", first_fp32.integral, final_fp32.frac);
      *
-     *     printf("FP32: original double: %f first fp32: %s, re-encoded double: %f, final fp32: %s\n", orig_d, first_fp32_s, final_d, final_fp32_s);
+     *     dbg("FP32: original double: %f first fp32: %s, re-encoded double: %f, final fp32: %s\n", orig_d, first_fp32_s, final_d, final_fp32_s);
      * }
      */
 
@@ -1722,7 +1722,7 @@ dix_double_fp_conversion(void)
 {
     uint32_t i;
 
-    printf("Testing double to FP1616/FP3232 conversions\n");
+    dbg("Testing double to FP1616/FP3232 conversions\n");
 
     _test_double_fp16_values(0);
     for (i = 1; i < 0x7FFF; i <<= 1) {
diff --git a/test/tests.c b/test/tests.c
index 97603822a..4ef0036a3 100644
--- a/test/tests.c
+++ b/test/tests.c
@@ -2,6 +2,8 @@
 #include "tests.h"
 #include "tests-common.h"
 
+int verbose = 0;
+
 int
 main(int argc, char **argv)
 {
diff --git a/test/tests.h b/test/tests.h
index c41fa1184..d04d6ea63 100644
--- a/test/tests.h
+++ b/test/tests.h
@@ -1,6 +1,9 @@
 #ifndef TESTS_H
 #define TESTS_H
 
+extern int verbose;
+#define dbg(...) if (verbose) printf("DBG" __VA_ARGS__);
+
 #define DECLARE_WRAP_FUNCTION(f_, rval_, ...) \
     extern rval_ (*wrapped_ ## f_)(__VA_ARGS__) \
 
diff --git a/test/xi1/protocol-xchangedevicecontrol.c b/test/xi1/protocol-xchangedevicecontrol.c
index 20b125d35..4c1a1740a 100644
--- a/test/xi1/protocol-xchangedevicecontrol.c
+++ b/test/xi1/protocol-xchangedevicecontrol.c
@@ -98,18 +98,18 @@ test_ChangeDeviceControl(void)
 
     client_request = init_client(request->length, request);
 
-    printf("Testing invalid lengths:\n");
-    printf(" -- no control struct\n");
+    dbg("Testing invalid lengths:\n");
+    dbg(" -- no control struct\n");
     request_ChangeDeviceControl(&client_request, request, control, BadLength);
 
-    printf(" -- xDeviceResolutionCtl\n");
+    dbg(" -- xDeviceResolutionCtl\n");
     request_init(request, ChangeDeviceControl);
     request->control = DEVICE_RESOLUTION;
     control->length = (sizeof(xDeviceResolutionCtl) >> 2);
     request->length += control->length - 2;
     request_ChangeDeviceControl(&client_request, request, control, BadLength);
 
-    printf(" -- xDeviceEnableCtl\n");
+    dbg(" -- xDeviceEnableCtl\n");
     request_init(request, ChangeDeviceControl);
     request->control = DEVICE_ENABLE;
     control->length = (sizeof(xDeviceEnableCtl) >> 2);
diff --git a/test/xi2/protocol-eventconvert.c b/test/xi2/protocol-eventconvert.c
index 5b4c34ac0..ed16b9498 100644
--- a/test/xi2/protocol-eventconvert.c
+++ b/test/xi2/protocol-eventconvert.c
@@ -742,7 +742,7 @@ test_values_XIDeviceChangedEvent(DeviceChangedEvent *in,
                        flags & SCROLL_FLAG_PREFERRED);
         }
         default:
-            printf("Invalid class type.\n\n");
+            dbg("Invalid class type.\n\n");
             assert(1);
             break;
         }
diff --git a/test/xi2/protocol-xigetclientpointer.c b/test/xi2/protocol-xigetclientpointer.c
index e7c4ca4c3..0a916fef0 100644
--- a/test/xi2/protocol-xigetclientpointer.c
+++ b/test/xi2/protocol-xigetclientpointer.c
@@ -113,26 +113,26 @@ test_XIGetClientPointer(void)
 
     client_request = init_client(request.length, &request);
 
-    printf("Testing invalid window\n");
+    dbg("Testing invalid window\n");
     request.win = INVALID_WINDOW_ID;
     request_XIGetClientPointer(&client_request, &request, BadWindow);
 
-    printf("Testing invalid length\n");
+    dbg("Testing invalid length\n");
     client_request.req_len -= 4;
     request_XIGetClientPointer(&client_request, &request, BadLength);
     client_request.req_len += 4;
 
     test_data.cp_is_set = FALSE;
 
-    printf("Testing window None, unset ClientPointer.\n");
+    dbg("Testing window None, unset ClientPointer.\n");
     request.win = None;
     request_XIGetClientPointer(&client_request, &request, Success);
 
-    printf("Testing valid window, unset ClientPointer.\n");
+    dbg("Testing valid window, unset ClientPointer.\n");
     request.win = CLIENT_WINDOW_ID;
     request_XIGetClientPointer(&client_request, &request, Success);
 
-    printf("Testing valid window, set ClientPointer.\n");
+    dbg("Testing valid window, set ClientPointer.\n");
     client_window.clientPtr = devices.vcp;
     test_data.dev = devices.vcp;
     test_data.cp_is_set = TRUE;
@@ -141,7 +141,7 @@ test_XIGetClientPointer(void)
 
     client_window.clientPtr = NULL;
 
-    printf("Testing window None, set ClientPointer.\n");
+    dbg("Testing window None, set ClientPointer.\n");
     client_request.clientPtr = devices.vcp;
     test_data.dev = devices.vcp;
     test_data.cp_is_set = TRUE;
diff --git a/test/xi2/protocol-xigetselectedevents.c b/test/xi2/protocol-xigetselectedevents.c
index 9471ca545..6b2f1f666 100644
--- a/test/xi2/protocol-xigetselectedevents.c
+++ b/test/xi2/protocol-xigetselectedevents.c
@@ -156,11 +156,11 @@ test_XIGetSelectedEvents(void)
 
     request_init(&request, XIGetSelectedEvents);
 
-    printf("Testing for BadWindow on invalid window.\n");
+    dbg("Testing for BadWindow on invalid window.\n");
     request.win = None;
     request_XIGetSelectedEvents(&request, BadWindow);
 
-    printf("Testing for zero-length (unset) masks.\n");
+    dbg("Testing for zero-length (unset) masks.\n");
     /* No masks set yet */
     test_data.num_masks_expected = 0;
     request.win = ROOT_WINDOW_ID;
@@ -171,7 +171,7 @@ test_XIGetSelectedEvents(void)
 
     memset(test_data.mask, 0, sizeof(test_data.mask));
 
-    printf("Testing for valid masks\n");
+    dbg("Testing for valid masks\n");
     memset(&dev, 0, sizeof(dev));       /* dev->id is enough for XISetEventMask */
     request.win = ROOT_WINDOW_ID;
 
@@ -197,7 +197,7 @@ test_XIGetSelectedEvents(void)
         }
     }
 
-    printf("Testing removing all masks\n");
+    dbg("Testing removing all masks\n");
     /* Unset all masks one-by-one */
     for (j = MAXDEVICES - 1; j >= 0; j--) {
         if (j < devices.num_devices + 2)
diff --git a/test/xi2/protocol-xipassivegrabdevice.c b/test/xi2/protocol-xipassivegrabdevice.c
index c7b5dc17d..b6ba65447 100644
--- a/test/xi2/protocol-xipassivegrabdevice.c
+++ b/test/xi2/protocol-xipassivegrabdevice.c
@@ -182,12 +182,12 @@ test_XIPassiveGrabDevice(void)
     wrapped_WriteToClient = reply_XIPassiveGrabDevice;
     client_request = init_client(request->length, request);
 
-    printf("Testing invalid device\n");
+    dbg("Testing invalid device\n");
     request->deviceid = 12;
     request_XIPassiveGrabDevice(&client_request, request, BadDevice,
                                 request->deviceid);
 
-    printf("Testing invalid length\n");
+    dbg("Testing invalid length\n");
     request->length -= 2;
     request_XIPassiveGrabDevice(&client_request, request, BadLength,
                                 client_request.errorValue);
@@ -196,14 +196,14 @@ test_XIPassiveGrabDevice(void)
     request->grab_window = CLIENT_WINDOW_ID;
     request->deviceid = XIAllMasterDevices;
 
-    printf("Testing invalid grab types\n");
+    dbg("Testing invalid grab types\n");
     for (i = XIGrabtypeGestureSwipeBegin + 1; i < 0xFF; i++) {
         request->grab_type = i;
         request_XIPassiveGrabDevice(&client_request, request, BadValue,
                                     request->grab_type);
     }
 
-    printf("Testing invalid grab type + detail combinations\n");
+    dbg("Testing invalid grab type + detail combinations\n");
     request->grab_type = XIGrabtypeEnter;
     request->detail = 1;
     request_XIPassiveGrabDevice(&client_request, request, BadValue,
@@ -215,7 +215,7 @@ test_XIPassiveGrabDevice(void)
 
     request->detail = 0;
 
-    printf("Testing invalid masks\n");
+    dbg("Testing invalid masks\n");
     mask = (unsigned char *) &request[1];
 
     request->mask_len = bytes_to_int32(XI2LASTEVENT + 1);
diff --git a/test/xi2/protocol-xiquerydevice.c b/test/xi2/protocol-xiquerydevice.c
index e32e713c0..72b30052e 100644
--- a/test/xi2/protocol-xiquerydevice.c
+++ b/test/xi2/protocol-xiquerydevice.c
@@ -319,16 +319,16 @@ test_XIQueryDevice(void)
     wrapped_WriteToClient = reply_XIQueryDevice;
     request_init(&request, XIQueryDevice);
 
-    printf("Testing XIAllDevices.\n");
+    dbg("Testing XIAllDevices.\n");
     request_XIQueryDevice(&test_data, XIAllDevices, Success);
-    printf("Testing XIAllMasterDevices.\n");
+    dbg("Testing XIAllMasterDevices.\n");
     request_XIQueryDevice(&test_data, XIAllMasterDevices, Success);
 
-    printf("Testing existing device ids.\n");
+    dbg("Testing existing device ids.\n");
     for (i = 2; i < 6; i++)
         request_XIQueryDevice(&test_data, i, Success);
 
-    printf("Testing non-existing device ids.\n");
+    dbg("Testing non-existing device ids.\n");
     for (i = 6; i <= 0xFFFF; i++)
         request_XIQueryDevice(&test_data, i, BadDevice);
 }
diff --git a/test/xi2/protocol-xiqueryversion.c b/test/xi2/protocol-xiqueryversion.c
index cd1865fdb..528a02c5a 100644
--- a/test/xi2/protocol-xiqueryversion.c
+++ b/test/xi2/protocol-xiqueryversion.c
@@ -154,23 +154,23 @@ test_XIQueryVersion(void)
 
     wrapped_WriteToClient = reply_XIQueryVersion;
 
-    printf("Server version 2.0 - client versions [1..3].0\n");
+    dbg("Server version 2.0 - client versions [1..3].0\n");
     /* some simple tests to catch common errors quickly */
     request_XIQueryVersion(2, 0, 1, 0, BadValue);
     request_XIQueryVersion(2, 0, 2, 0, Success);
     request_XIQueryVersion(2, 0, 3, 0, Success);
 
-    printf("Server version 3.0 - client versions [1..3].0\n");
+    dbg("Server version 3.0 - client versions [1..3].0\n");
     request_XIQueryVersion(3, 0, 1, 0, BadValue);
     request_XIQueryVersion(3, 0, 2, 0, Success);
     request_XIQueryVersion(3, 0, 3, 0, Success);
 
-    printf("Server version 2.0 - client versions [1..3].[1..3]\n");
+    dbg("Server version 2.0 - client versions [1..3].[1..3]\n");
     request_XIQueryVersion(2, 0, 1, 1, BadValue);
     request_XIQueryVersion(2, 0, 2, 2, Success);
     request_XIQueryVersion(2, 0, 3, 3, Success);
 
-    printf("Server version 2.2 - client versions [1..3].0\n");
+    dbg("Server version 2.2 - client versions [1..3].0\n");
     request_XIQueryVersion(2, 2, 1, 0, BadValue);
     request_XIQueryVersion(2, 2, 2, 0, Success);
     request_XIQueryVersion(2, 2, 3, 0, Success);
@@ -179,7 +179,7 @@ test_XIQueryVersion(void)
     /* this one takes a while */
     unsigned int cmin, cmaj, smin, smaj;
 
-    printf("Testing all combinations.\n");
+    dbg("Testing all combinations.\n");
     for (smaj = 2; smaj <= 0xFFFF; smaj++)
         for (smin = 0; smin <= 0xFFFF; smin++)
             for (cmin = 0; cmin <= 0xFFFF; cmin++)
diff --git a/test/xi2/protocol-xiselectevents.c b/test/xi2/protocol-xiselectevents.c
index 5dd4f9c36..9389bd27e 100644
--- a/test/xi2/protocol-xiselectevents.c
+++ b/test/xi2/protocol-xiselectevents.c
@@ -294,7 +294,7 @@ test_XISelectEvents(void)
 
     request_init(req, XISelectEvents);
 
-    printf("Testing for BadValue on zero-length masks\n");
+    dbg("Testing for BadValue on zero-length masks\n");
     /* zero masks are BadValue, regardless of the window */
     req->num_masks = 0;
 
@@ -307,7 +307,7 @@ test_XISelectEvents(void)
     req->win = CLIENT_WINDOW_ID;
     request_XISelectEvent(req, BadValue);
 
-    printf("Testing for BadWindow.\n");
+    dbg("Testing for BadWindow.\n");
     /* None window is BadWindow, regardless of the masks.
      * We don't actually need to set the masks here, BadWindow must occur
      * before checking the masks.
@@ -327,7 +327,7 @@ test_XISelectEvents(void)
     req->num_masks = 0xFFFC;
     request_XISelectEvent(req, BadWindow);
 
-    printf("Triggering num_masks/length overflow\n");
+    dbg("Triggering num_masks/length overflow\n");
     req->win = ROOT_WINDOW_ID;
     /* Integer overflow - req->length can't hold that much */
     req->num_masks = 0xFFFF;
@@ -336,14 +336,14 @@ test_XISelectEvents(void)
     req->win = ROOT_WINDOW_ID;
     req->num_masks = 1;
 
-    printf("Triggering bogus mask length error\n");
+    dbg("Triggering bogus mask length error\n");
     mask = (xXIEventMask *) &req[1];
     mask->deviceid = 0;
     mask->mask_len = 0xFFFF;
     request_XISelectEvent(req, BadLength);
 
     /* testing various device ids */
-    printf("Testing existing device ids.\n");
+    dbg("Testing existing device ids.\n");
     for (i = 0; i < 6; i++) {
         mask = (xXIEventMask *) &req[1];
         mask->deviceid = i;
@@ -353,7 +353,7 @@ test_XISelectEvents(void)
         request_XISelectEvent(req, Success);
     }
 
-    printf("Testing non-existing device ids.\n");
+    dbg("Testing non-existing device ids.\n");
     for (i = 6; i <= 0xFFFF; i++) {
         req->win = ROOT_WINDOW_ID;
         req->num_masks = 1;
diff --git a/test/xi2/protocol-xisetclientpointer.c b/test/xi2/protocol-xisetclientpointer.c
index f6ddb72b5..881fcf3f1 100644
--- a/test/xi2/protocol-xisetclientpointer.c
+++ b/test/xi2/protocol-xisetclientpointer.c
@@ -92,14 +92,14 @@ test_XISetClientPointer(void)
 
     request.win = CLIENT_WINDOW_ID;
 
-    printf("Testing BadDevice error for XIAllDevices and XIMasterDevices.\n");
+    dbg("Testing BadDevice error for XIAllDevices and XIMasterDevices.\n");
     request.deviceid = XIAllDevices;
     request_XISetClientPointer(&request, BadDevice);
 
     request.deviceid = XIAllMasterDevices;
     request_XISetClientPointer(&request, BadDevice);
 
-    printf("Testing Success for VCP and VCK.\n");
+    dbg("Testing Success for VCP and VCK.\n");
     request.deviceid = devices.vcp->id; /* 2 */
     request_XISetClientPointer(&request, Success);
     assert(client_window.clientPtr->id == 2);
@@ -108,19 +108,19 @@ test_XISetClientPointer(void)
     request_XISetClientPointer(&request, Success);
     assert(client_window.clientPtr->id == 2);
 
-    printf("Testing BadDevice error for all other devices.\n");
+    dbg("Testing BadDevice error for all other devices.\n");
     for (i = 4; i <= 0xFFFF; i++) {
         request.deviceid = i;
         request_XISetClientPointer(&request, BadDevice);
     }
 
-    printf("Testing window None\n");
+    dbg("Testing window None\n");
     request.win = None;
     request.deviceid = devices.vcp->id; /* 2 */
     request_XISetClientPointer(&request, Success);
     assert(client_request.clientPtr->id == 2);
 
-    printf("Testing invalid window\n");
+    dbg("Testing invalid window\n");
     request.win = INVALID_WINDOW_ID;
     request.deviceid = devices.vcp->id;
     request_XISetClientPointer(&request, BadWindow);
commit d178978ce2e14c1a4394ff560af70afcfd8fee6a
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jan 5 15:48:40 2024 +1000

    test: specify non-negative log verbosity for the siglogging test
    
    Less noise in the test output

diff --git a/test/signal-logging.c b/test/signal-logging.c
index 1eaf96867..80d7c6f60 100644
--- a/test/signal-logging.c
+++ b/test/signal-logging.c
@@ -148,6 +148,8 @@ number_formatting(void)
                                 -0x7FFFFFFFFFFFFFFF, /* Maximum 64-bit signed number */
     } ;
 
+    LogSetParameter(XLOG_VERBOSITY, -1);
+
     for (i = 0; i < ARRAY_SIZE(unsigned_tests); i++)
         assert(check_number_format_test(unsigned_tests[i]));
 
@@ -178,6 +180,8 @@ static void logging_format(void)
     uintptr_t ptr;
     char *fname = NULL;
 
+    LogSetParameter(XLOG_VERBOSITY, -1);
+
     /* set up buf to contain ".....end" */
     memset(buf, '.', sizeof(buf));
     strcpy(&buf[sizeof(buf) - 4], "end");
@@ -197,59 +201,59 @@ static void logging_format(void)
     } while (0)
 
     /* boring test message */
-    LogMessageVerbSigSafe(X_ERROR, -1, "test message\n");
+    LogMessageVerbSigSafe(X_ERROR, 1, "test message\n");
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) test message\n") == 0);
 
     /* long buf is truncated to "....en\n" */
-    LogMessageVerbSigSafe(X_ERROR, -1, buf);
+    LogMessageVerbSigSafe(X_ERROR, 1, buf);
     read_log_msg(logmsg);
     assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
 
     /* same thing, this time as string substitution */
-    LogMessageVerbSigSafe(X_ERROR, -1, "%s", buf);
+    LogMessageVerbSigSafe(X_ERROR, 1, "%s", buf);
     read_log_msg(logmsg);
     assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
 
     /* strings containing placeholders should just work */
-    LogMessageVerbSigSafe(X_ERROR, -1, "%s\n", str);
+    LogMessageVerbSigSafe(X_ERROR, 1, "%s\n", str);
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) %s %d %u %% %p %i\n") == 0);
 
     /* literal % */
-    LogMessageVerbSigSafe(X_ERROR, -1, "test %%\n");
+    LogMessageVerbSigSafe(X_ERROR, 1, "test %%\n");
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) test %\n") == 0);
 
     /* character */
-    LogMessageVerbSigSafe(X_ERROR, -1, "test %c\n", 'a');
+    LogMessageVerbSigSafe(X_ERROR, 1, "test %c\n", 'a');
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) test a\n") == 0);
 
     /* something unsupported % */
-    LogMessageVerbSigSafe(X_ERROR, -1, "test %Q\n");
+    LogMessageVerbSigSafe(X_ERROR, 1, "test %Q\n");
     read_log_msg(logmsg);
     assert(strstr(logmsg, "BUG") != NULL);
-    LogMessageVerbSigSafe(X_ERROR, -1, "\n");
+    LogMessageVerbSigSafe(X_ERROR, 1, "\n");
     fseek(f, 0, SEEK_END);
 
     /* string substitution */
-    LogMessageVerbSigSafe(X_ERROR, -1, "%s\n", "substituted string");
+    LogMessageVerbSigSafe(X_ERROR, 1, "%s\n", "substituted string");
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) substituted string\n") == 0);
 
     /* Invalid format */
-    LogMessageVerbSigSafe(X_ERROR, -1, "%4", 4);
+    LogMessageVerbSigSafe(X_ERROR, 1, "%4", 4);
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) ") == 0);
-    LogMessageVerbSigSafe(X_ERROR, -1, "\n");
+    LogMessageVerbSigSafe(X_ERROR, 1, "\n");
     fseek(f, 0, SEEK_END);
 
     /* %hld is bogus */
-    LogMessageVerbSigSafe(X_ERROR, -1, "%hld\n", 4);
+    LogMessageVerbSigSafe(X_ERROR, 1, "%hld\n", 4);
     read_log_msg(logmsg);
     assert(strstr(logmsg, "BUG") != NULL);
-    LogMessageVerbSigSafe(X_ERROR, -1, "\n");
+    LogMessageVerbSigSafe(X_ERROR, 1, "\n");
     fseek(f, 0, SEEK_END);
 
     /* number substitution */
@@ -257,12 +261,12 @@ static void logging_format(void)
     do {
         char expected[30];
         sprintf(expected, "(EE) %u\n", ui);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%u\n", ui);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%u\n", ui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %x\n", ui);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%x\n", ui);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%x\n", ui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
@@ -276,22 +280,21 @@ static void logging_format(void)
     do {
         char expected[30];
         sprintf(expected, "(EE) %lu\n", lui);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%lu\n", lui);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%lu\n", lui);
         read_log_msg(logmsg);
 
         sprintf(expected, "(EE) %lld\n", (unsigned long long)ui);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%lld\n", (unsigned long long)ui);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%lld\n", (unsigned long long)ui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %lx\n", lui);
-        printf("%s\n", expected);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%lx\n", lui);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%lx\n", lui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %llx\n", (unsigned long long)ui);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%llx\n", (unsigned long long)ui);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%llx\n", (unsigned long long)ui);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
@@ -306,12 +309,12 @@ static void logging_format(void)
     do {
         char expected[30];
         sprintf(expected, "(EE) %d\n", i);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%d\n", i);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%d\n", i);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %d\n", i | INT_MIN);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%d\n", i | INT_MIN);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%d\n", i | INT_MIN);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
@@ -325,22 +328,22 @@ static void logging_format(void)
     do {
         char expected[30];
         sprintf(expected, "(EE) %ld\n", li);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%ld\n", li);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%ld\n", li);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %ld\n", li | LONG_MIN);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%ld\n", li | LONG_MIN);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%ld\n", li | LONG_MIN);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %lld\n", (long long)li);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%lld\n", (long long)li);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%lld\n", (long long)li);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         sprintf(expected, "(EE) %lld\n", (long long)(li | LONG_MIN));
-        LogMessageVerbSigSafe(X_ERROR, -1, "%lld\n", (long long)(li | LONG_MIN));
+        LogMessageVerbSigSafe(X_ERROR, 1, "%lld\n", (long long)(li | LONG_MIN));
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
@@ -353,7 +356,7 @@ static void logging_format(void)
 
     /* pointer substitution */
     /* we print a null-pointer differently to printf */
-    LogMessageVerbSigSafe(X_ERROR, -1, "%p\n", NULL);
+    LogMessageVerbSigSafe(X_ERROR, 1, "%p\n", NULL);
     read_log_msg(logmsg);
     assert(strcmp(logmsg, "(EE) 0x0\n") == 0);
 
@@ -365,7 +368,7 @@ static void logging_format(void)
 #else
         sprintf(expected, "(EE) %p\n", (void*)ptr);
 #endif
-        LogMessageVerbSigSafe(X_ERROR, -1, "%p\n", (void*)ptr);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%p\n", (void*)ptr);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
         ptr <<= 1;
@@ -376,20 +379,20 @@ static void logging_format(void)
         double d = float_tests[i];
         char expected[30];
         sprintf(expected, "(EE) %.2f\n", d);
-        LogMessageVerbSigSafe(X_ERROR, -1, "%f\n", d);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%f\n", d);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
         /* test for length modifiers, we just ignore them atm */
-        LogMessageVerbSigSafe(X_ERROR, -1, "%.3f\n", d);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%.3f\n", d);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
-        LogMessageVerbSigSafe(X_ERROR, -1, "%3f\n", d);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%3f\n", d);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
 
-        LogMessageVerbSigSafe(X_ERROR, -1, "%.0f\n", d);
+        LogMessageVerbSigSafe(X_ERROR, 1, "%.0f\n", d);
         read_log_msg(logmsg);
         assert(strcmp(logmsg, expected) == 0);
     }
commit 3c5eaedaf90199172181ed42451b349a4c3f80f9
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jan 5 14:35:01 2024 +1000

    test: switch the remaining wrapped functions to use the macros
    
    dixLookupWindow and dixLookupClient have a test-global default
    implementation because overriding that in ever test doesn't make sense.

diff --git a/test/tests.h b/test/tests.h
index d3fbb9c42..c41fa1184 100644
--- a/test/tests.h
+++ b/test/tests.h
@@ -44,12 +44,5 @@ const testfunc_t* protocol_xiwarppointer_test(void);
 const testfunc_t* protocol_eventconvert_test(void);
 const testfunc_t* xi2_test(void);
 
-#ifndef INSIDE_PROTOCOL_COMMON
-
-extern int enable_XISetEventMask_wrap;
-extern int enable_GrabButton_wrap;
-
-#endif /* INSIDE_PROTOCOL_COMMON */
-
 #endif /* TESTS_H */
 
diff --git a/test/xi2/protocol-common.c b/test/xi2/protocol-common.c
index 602b62b4b..219a6fd05 100644
--- a/test/xi2/protocol-common.c
+++ b/test/xi2/protocol-common.c
@@ -37,7 +37,6 @@
 #include "syncsrv.h"
 #include <X11/extensions/XI2.h>
 
-#define INSIDE_PROTOCOL_COMMON
 #include "protocol-common.h"
 
 struct devices devices;
@@ -46,13 +45,6 @@ WindowRec root;
 WindowRec window;
 static ClientRec server_client;
 
-void *global_userdata;
-
-void (*reply_handler) (ClientPtr client, int len, char *data, void *userdata);
-
-int enable_GrabButton_wrap = 1;
-int enable_XISetEventMask_wrap = 1;
-
 static void
 fake_init_sprite(DeviceIntPtr dev)
 {
@@ -292,13 +284,35 @@ WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data)
     IMPLEMENT_WRAP_FUNCTION(WriteToClient, client, len, data);
 }
 
+WRAP_FUNCTION(XISetEventMask, int,
+              DeviceIntPtr dev, WindowPtr win, ClientPtr client,
+              int len, unsigned char *mask)
+{
+    IMPLEMENT_WRAP_FUNCTION_WITH_RETURN(XISetEventMask, dev, win, client, len, mask);
+}
+
+WRAP_FUNCTION(AddResource, Bool, XID id, RESTYPE type, void *value)
+{
+    IMPLEMENT_WRAP_FUNCTION_WITH_RETURN(AddResource, id, type, value);
+}
+
+WRAP_FUNCTION(GrabButton, int,
+              ClientPtr client, DeviceIntPtr dev,
+              DeviceIntPtr modifier_device, int button,
+              GrabParameters *param, enum InputLevel grabtype,
+              GrabMask *mask)
+{
+    IMPLEMENT_WRAP_FUNCTION_WITH_RETURN(GrabButton, client, dev, modifier_device,
+                                        button, param, grabtype, mask);
+}
+
 /* dixLookupWindow requires a lot of setup not necessary for this test.
  * Simple wrapper that returns either one of the fake root window or the
  * fake client window. If the requested ID is neither of those wanted,
  * return whatever the real dixLookupWindow does.
  */
-int
-__wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
+WRAP_FUNCTION(dixLookupWindow, int,
+              WindowPtr *win, XID id, ClientPtr client, Mask access)
 {
     if (id == root.drawable.id) {
         *win = &root;
@@ -314,9 +328,8 @@ __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client, Mask access)
 
 extern ClientRec client_window;
 
-int
-__wrap_dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client,
-                       Mask access)
+WRAP_FUNCTION(dixLookupClient, int,
+              ClientPtr *pClient, XID rid, ClientPtr client, Mask access)
 {
     if (rid == ROOT_WINDOW_ID)
         return BadWindow;
diff --git a/test/xi2/protocol-common.h b/test/xi2/protocol-common.h
index c49ee81c6..c3485a432 100644
--- a/test/xi2/protocol-common.h
+++ b/test/xi2/protocol-common.h
@@ -90,17 +90,6 @@ struct devices {
  */
 extern struct devices devices;
 
-/**
- * test-specific userdata, passed into the reply handler.
- */
-extern void *global_userdata;
-
-/**
- * The reply handler called from WriteToClient. Set this handler if you need
- * to check the reply values.
- */
-extern void (*reply_handler) (ClientPtr client, int len, char *data, void *userdata);
-
 /**
  * The default screen used for the windows. Initialized by init_simple().
  */
@@ -142,15 +131,4 @@ void init_window(WindowPtr window, WindowPtr parent, int id);
  */
 void init_simple(void);
 
-/* Declarations for various overrides in the test files. */
-int __wrap_XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
-                          int len, unsigned char *mask);
-int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client,
-                           Mask access);
-int __real_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client,
-                           Mask access);
-Bool __wrap_AddResource(XID id, RESTYPE type, void *value);
-int __wrap_dixLookupClient(ClientPtr *c, XID id, ClientPtr client, Mask access);
-int __real_dixLookupClient(ClientPtr *c, XID id, ClientPtr client, Mask access);
-
 #endif                          /* PROTOCOL_COMMON_H */
diff --git a/test/xi2/protocol-xigetselectedevents.c b/test/xi2/protocol-xigetselectedevents.c
index a35db2610..9471ca545 100644
--- a/test/xi2/protocol-xigetselectedevents.c
+++ b/test/xi2/protocol-xigetselectedevents.c
@@ -53,6 +53,7 @@
 #include "protocol-common.h"
 
 DECLARE_WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data);
+DECLARE_WRAP_FUNCTION(AddResource, Bool, XID id, RESTYPE type, void *value);
 
 static void reply_XIGetSelectedEvents(ClientPtr client, int len, void *data);
 static void reply_XIGetSelectedEvents_data(ClientPtr client, int len, void *data);
@@ -66,8 +67,8 @@ static struct {
 extern ClientRec client_window;
 
 /* AddResource is called from XISetSEventMask, we don't need this */
-Bool
-__wrap_AddResource(XID id, RESTYPE type, void *value)
+static Bool
+override_AddResource(XID id, RESTYPE type, void *value)
 {
     return TRUE;
 }
@@ -148,9 +149,9 @@ test_XIGetSelectedEvents(void)
     unsigned char *mask;
     DeviceIntRec dev;
 
+    wrapped_AddResource = override_AddResource;
+
     init_simple();
-    enable_GrabButton_wrap = 0;
-    enable_XISetEventMask_wrap = 0;
     client = init_client(0, NULL);
 
     request_init(&request, XIGetSelectedEvents);
diff --git a/test/xi2/protocol-xipassivegrabdevice.c b/test/xi2/protocol-xipassivegrabdevice.c
index 343eaf772..c7b5dc17d 100644
--- a/test/xi2/protocol-xipassivegrabdevice.c
+++ b/test/xi2/protocol-xipassivegrabdevice.c
@@ -45,6 +45,11 @@
 #include "protocol-common.h"
 
 DECLARE_WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data);
+DECLARE_WRAP_FUNCTION(GrabButton, int,
+                      ClientPtr client, DeviceIntPtr dev,
+                      DeviceIntPtr modifier_device, int button,
+                      GrabParameters *param, enum InputLevel grabtype,
+                      GrabMask *mask);
 
 extern ClientRec client_window;
 static ClientRec client_request;
@@ -56,26 +61,16 @@ static struct test_data {
     int num_modifiers;
 } testdata;
 
-int __wrap_GrabButton(ClientPtr client, DeviceIntPtr dev,
-                      DeviceIntPtr modifier_device, int button,
-                      GrabParameters *param, enum InputLevel grabtype,
-                      GrabMask *mask);
-int __real_GrabButton(ClientPtr client, DeviceIntPtr dev,
-                      DeviceIntPtr modifier_device, int button,
-                      GrabParameters *param, enum InputLevel grabtype,
-                      GrabMask *mask);
+
 static void reply_XIPassiveGrabDevice_data(ClientPtr client, int len,
                                            void *data);
 
-int
-__wrap_GrabButton(ClientPtr client, DeviceIntPtr dev,
+static int
+override_GrabButton(ClientPtr client, DeviceIntPtr dev,
                   DeviceIntPtr modifier_device, int button,
                   GrabParameters *param, enum InputLevel grabtype,
                   GrabMask *mask)
 {
-    if (!enable_GrabButton_wrap)
-        __real_GrabButton(client, dev, modifier_device, button, param, grabtype, mask);
-
     /* Fail every odd modifier */
     if (param->modifiers % 2)
         return BadAccess;
@@ -176,6 +171,8 @@ test_XIPassiveGrabDevice(void)
     xXIPassiveGrabDeviceReq *request = (xXIPassiveGrabDeviceReq *) data;
     unsigned char *mask;
 
+    wrapped_GrabButton = override_GrabButton;
+
     init_simple();
 
     request_init(request, XIPassiveGrabDevice);
diff --git a/test/xi2/protocol-xiselectevents.c b/test/xi2/protocol-xiselectevents.c
index 3f3810263..5dd4f9c36 100644
--- a/test/xi2/protocol-xiselectevents.c
+++ b/test/xi2/protocol-xiselectevents.c
@@ -63,21 +63,19 @@
 
 #include "protocol-common.h"
 
+DECLARE_WRAP_FUNCTION(XISetEventMask, int, DeviceIntPtr dev,
+                      WindowPtr win, ClientPtr client,
+                      int len, unsigned char *mask);
+
+
 static unsigned char *data[4096 * 20];  /* the request data buffer */
 
 extern ClientRec client_window;
 
-int
-__real_XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
-                      int len, unsigned char *mask);
-
-int
-__wrap_XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
-                      int len, unsigned char *mask)
+static int
+override_XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
+                        int len, unsigned char *mask)
 {
-    if (!enable_XISetEventMask_wrap)
-        return __real_XISetEventMask(dev, win, client, len, mask);
-
     return Success;
 }
 
@@ -288,6 +286,8 @@ test_XISelectEvents(void)
     xXIEventMask *mask;
     xXISelectEventsReq *req;
 
+    wrapped_XISetEventMask = override_XISetEventMask;
+
     init_simple();
 
     req = (xXISelectEventsReq *) data;
commit 7e9d167c9c027be200f298ef7d5469b31d61de55
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jan 5 14:08:29 2024 +1000

    test: make wrapping a function more generic
    
    This cleans up some of the mess this code was in. Functions we need to
    wrap can now have a standard implementation using WRAP_FUNCTION - that
    macro declares the __real and __wrap functions and a wrapped_$func
    global variable.
    
    Tests can set that variable to their desired functions and it will be
    then be called on demand.

diff --git a/test/tests.h b/test/tests.h
index 4f69fdd3e..d3fbb9c42 100644
--- a/test/tests.h
+++ b/test/tests.h
@@ -1,6 +1,23 @@
 #ifndef TESTS_H
 #define TESTS_H
 
+#define DECLARE_WRAP_FUNCTION(f_, rval_, ...) \
+    extern rval_ (*wrapped_ ## f_)(__VA_ARGS__) \
+
+#define IMPLEMENT_WRAP_FUNCTION(f_, ...) \
+    if (wrapped_ ## f_) wrapped_ ## f_(__VA_ARGS__); \
+    else __real_ ## f_(__VA_ARGS__)
+
+#define IMPLEMENT_WRAP_FUNCTION_WITH_RETURN(f_, ...) \
+    if (wrapped_ ## f_) return wrapped_ ## f_(__VA_ARGS__); \
+    else return __real_ ## f_(__VA_ARGS__)
+
+#define WRAP_FUNCTION(f_, rval_, ...) \
+    rval_ (*wrapped_ ## f_)(__VA_ARGS__); \
+    extern rval_ __real_ ## f_(__VA_ARGS__); \
+    rval_ __wrap_ ## f_(__VA_ARGS__); \
+    rval_ __wrap_ ## f_(__VA_ARGS__)
+
 typedef void (*testfunc_t)(void);
 
 const testfunc_t* fixes_test(void);
diff --git a/test/xi1/protocol-xchangedevicecontrol.c b/test/xi1/protocol-xchangedevicecontrol.c
index 392bd75f8..20b125d35 100644
--- a/test/xi1/protocol-xchangedevicecontrol.c
+++ b/test/xi1/protocol-xchangedevicecontrol.c
@@ -40,11 +40,13 @@
 
 #include "protocol-common.h"
 
+DECLARE_WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data);
+
 extern ClientRec client_window;
 static ClientRec client_request;
 
 static void
-reply_ChangeDeviceControl(ClientPtr client, int len, char *data, void *userdata)
+reply_ChangeDeviceControl(ClientPtr client, int len, void *data)
 {
     xChangeDeviceControlReply *rep = (xChangeDeviceControlReply *) data;
 
@@ -92,7 +94,7 @@ test_ChangeDeviceControl(void)
 
     request_init(request, ChangeDeviceControl);
 
-    reply_handler = reply_ChangeDeviceControl;
+    wrapped_WriteToClient  = reply_ChangeDeviceControl;
 
     client_request = init_client(request->length, request);
 
diff --git a/test/xi2/protocol-common.c b/test/xi2/protocol-common.c
index 69d7c14cb..602b62b4b 100644
--- a/test/xi2/protocol-common.c
+++ b/test/xi2/protocol-common.c
@@ -287,12 +287,9 @@ init_simple(void)
     devices = init_devices();
 }
 
-void
-__wrap_WriteToClient(ClientPtr client, int len, void *data)
+WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data)
 {
-    assert(reply_handler != NULL);
-
-    (*reply_handler) (client, len, data, global_userdata);
+    IMPLEMENT_WRAP_FUNCTION(WriteToClient, client, len, data);
 }
 
 /* dixLookupWindow requires a lot of setup not necessary for this test.
diff --git a/test/xi2/protocol-common.h b/test/xi2/protocol-common.h
index 742ce348f..c49ee81c6 100644
--- a/test/xi2/protocol-common.h
+++ b/test/xi2/protocol-common.h
@@ -143,7 +143,6 @@ void init_window(WindowPtr window, WindowPtr parent, int id);
 void init_simple(void);
 
 /* Declarations for various overrides in the test files. */
-void __wrap_WriteToClient(ClientPtr client, int len, void *data);
 int __wrap_XISetEventMask(DeviceIntPtr dev, WindowPtr win, ClientPtr client,
                           int len, unsigned char *mask);
 int __wrap_dixLookupWindow(WindowPtr *win, XID id, ClientPtr client,
diff --git a/test/xi2/protocol-xigetclientpointer.c b/test/xi2/protocol-xigetclientpointer.c
index 101590ae2..e7c4ca4c3 100644
--- a/test/xi2/protocol-xigetclientpointer.c
+++ b/test/xi2/protocol-xigetclientpointer.c
@@ -43,6 +43,8 @@
 
 #include "protocol-common.h"
 
+DECLARE_WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data);
+
 static struct {
     int cp_is_set;
     DeviceIntPtr dev;
@@ -53,7 +55,7 @@ extern ClientRec client_window;
 static ClientRec client_request;
 
 static void
-reply_XIGetClientPointer(ClientPtr client, int len, char *data, void *userdata)
+reply_XIGetClientPointer(ClientPtr client, int len, void *data)
 {
     xXIGetClientPointerReply *rep = (xXIGetClientPointerReply *) data;
 
@@ -107,7 +109,7 @@ test_XIGetClientPointer(void)
 
     request.win = CLIENT_WINDOW_ID;
 
-    reply_handler = reply_XIGetClientPointer;
+    wrapped_WriteToClient = reply_XIGetClientPointer;
 
     client_request = init_client(request.length, &request);
 
diff --git a/test/xi2/protocol-xigetselectedevents.c b/test/xi2/protocol-xigetselectedevents.c
index 797accca3..a35db2610 100644
--- a/test/xi2/protocol-xigetselectedevents.c
+++ b/test/xi2/protocol-xigetselectedevents.c
@@ -52,10 +52,10 @@
 
 #include "protocol-common.h"
 
-static void reply_XIGetSelectedEvents(ClientPtr client, int len, char *data,
-                                      void *userdata);
-static void reply_XIGetSelectedEvents_data(ClientPtr client, int len,
-                                           char *data, void *userdata);
+DECLARE_WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data);
+
+static void reply_XIGetSelectedEvents(ClientPtr client, int len, void *data);
+static void reply_XIGetSelectedEvents_data(ClientPtr client, int len, void *data);
 
 static struct {
     int num_masks_expected;
@@ -73,7 +73,7 @@ __wrap_AddResource(XID id, RESTYPE type, void *value)
 }
 
 static void
-reply_XIGetSelectedEvents(ClientPtr client, int len, char *data, void *userdata)
+reply_XIGetSelectedEvents(ClientPtr client, int len, void *data)
 {
     xXIGetSelectedEventsReply *rep = (xXIGetSelectedEventsReply *) data;
 
@@ -87,12 +87,11 @@ reply_XIGetSelectedEvents(ClientPtr client, int len, char *data, void *userdata)
 
     assert(rep->num_masks == test_data.num_masks_expected);
 
-    reply_handler = reply_XIGetSelectedEvents_data;
+    wrapped_WriteToClient = reply_XIGetSelectedEvents_data;
 }
 
 static void
-reply_XIGetSelectedEvents_data(ClientPtr client, int len, char *data,
-                               void *userdata)
+reply_XIGetSelectedEvents_data(ClientPtr client, int len, void *data)
 {
     int i;
     xXIEventMask *mask;
@@ -127,12 +126,12 @@ request_XIGetSelectedEvents(xXIGetSelectedEventsReq * req, int error)
 
     client = init_client(req->length, req);
 
-    reply_handler = reply_XIGetSelectedEvents;
+    wrapped_WriteToClient = reply_XIGetSelectedEvents;
 
     rc = ProcXIGetSelectedEvents(&client);
     assert(rc == error);
 
-    reply_handler = reply_XIGetSelectedEvents;
+    wrapped_WriteToClient = reply_XIGetSelectedEvents;
     client.swapped = TRUE;
     swapl(&req->win);
     swaps(&req->length);
diff --git a/test/xi2/protocol-xipassivegrabdevice.c b/test/xi2/protocol-xipassivegrabdevice.c
index 2bc4912b7..343eaf772 100644
--- a/test/xi2/protocol-xipassivegrabdevice.c
+++ b/test/xi2/protocol-xipassivegrabdevice.c
@@ -44,6 +44,8 @@
 
 #include "protocol-common.h"
 
+DECLARE_WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data);
+
 extern ClientRec client_window;
 static ClientRec client_request;
 
@@ -63,7 +65,7 @@ int __real_GrabButton(ClientPtr client, DeviceIntPtr dev,
                       GrabParameters *param, enum InputLevel grabtype,
                       GrabMask *mask);
 static void reply_XIPassiveGrabDevice_data(ClientPtr client, int len,
-                                           char *data, void *closure);
+                                           void *data);
 
 int
 __wrap_GrabButton(ClientPtr client, DeviceIntPtr dev,
@@ -82,7 +84,7 @@ __wrap_GrabButton(ClientPtr client, DeviceIntPtr dev,
 }
 
 static void
-reply_XIPassiveGrabDevice(ClientPtr client, int len, char *data, void *closure)
+reply_XIPassiveGrabDevice(ClientPtr client, int len, void *data)
 {
     xXIPassiveGrabDeviceReply *rep = (xXIPassiveGrabDeviceReply *) data;
 
@@ -99,12 +101,11 @@ reply_XIPassiveGrabDevice(ClientPtr client, int len, char *data, void *closure)
     /* ProcXIPassiveGrabDevice sends the data in two batches, let the second
      * handler handle the modifier data */
     if (rep->num_modifiers > 0)
-        reply_handler = reply_XIPassiveGrabDevice_data;
+        wrapped_WriteToClient = reply_XIPassiveGrabDevice_data;
 }
 
 static void
-reply_XIPassiveGrabDevice_data(ClientPtr client, int len, char *data,
-                               void *closure)
+reply_XIPassiveGrabDevice_data(ClientPtr client, int len, void *data)
 {
     int i;
 
@@ -124,7 +125,7 @@ reply_XIPassiveGrabDevice_data(ClientPtr client, int len, char *data,
         assert(mods->pad1 == 0);
     }
 
-    reply_handler = reply_XIPassiveGrabDevice;
+    wrapped_WriteToClient = reply_XIPassiveGrabDevice;
 }
 
 static void
@@ -181,7 +182,7 @@ test_XIPassiveGrabDevice(void)
 
     request->grab_window = CLIENT_WINDOW_ID;
 
-    reply_handler = reply_XIPassiveGrabDevice;
+    wrapped_WriteToClient = reply_XIPassiveGrabDevice;
     client_request = init_client(request->length, request);
 
     printf("Testing invalid device\n");
diff --git a/test/xi2/protocol-xiquerydevice.c b/test/xi2/protocol-xiquerydevice.c
index a87f5737c..e32e713c0 100644
--- a/test/xi2/protocol-xiquerydevice.c
+++ b/test/xi2/protocol-xiquerydevice.c
@@ -42,6 +42,8 @@
 #include "xiquerydevice.h"
 
 #include "protocol-common.h"
+
+DECLARE_WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data);
 /*
  * Protocol testing for XIQueryDevice request and reply.
  *
@@ -52,24 +54,20 @@
  * Repeatedly test with varying deviceids and check against data in reply.
  */
 
-struct test_data {
+static struct test_data {
     int which_device;
     int num_devices_in_reply;
-};
+} test_data;
 
 extern ClientRec client_window;
 
-static void reply_XIQueryDevice_data(ClientPtr client, int len, char *data,
-                                     void *closure);
-static void reply_XIQueryDevice(ClientPtr client, int len, char *data,
-                                void *closure);
+static void reply_XIQueryDevice_data(ClientPtr client, int len, void *data);
 
 /* reply handling for the first bytes that constitute the reply */
 static void
-reply_XIQueryDevice(ClientPtr client, int len, char *data, void *userdata)
+reply_XIQueryDevice(ClientPtr client, int len, void *data)
 {
     xXIQueryDeviceReply *rep = (xXIQueryDeviceReply *) data;
-    struct test_data *querydata = (struct test_data *) userdata;
 
     if (client->swapped) {
         swapl(&rep->length);
@@ -79,29 +77,29 @@ reply_XIQueryDevice(ClientPtr client, int len, char *data, void *userdata)
 
     reply_check_defaults(rep, len, XIQueryDevice);
 
-    if (querydata->which_device == XIAllDevices)
+    if (test_data.which_device == XIAllDevices)
         assert(rep->num_devices == devices.num_devices);
-    else if (querydata->which_device == XIAllMasterDevices)
+    else if (test_data.which_device == XIAllMasterDevices)
         assert(rep->num_devices == devices.num_master_devices);
     else
         assert(rep->num_devices == 1);
 
-    querydata->num_devices_in_reply = rep->num_devices;
-    reply_handler = reply_XIQueryDevice_data;
+    test_data.num_devices_in_reply = rep->num_devices;
+
+    wrapped_WriteToClient = reply_XIQueryDevice_data;
 }
 
 /* reply handling for the trailing bytes that constitute the device info */
 static void
-reply_XIQueryDevice_data(ClientPtr client, int len, char *data, void *closure)
+reply_XIQueryDevice_data(ClientPtr client, int len, void *data)
 {
     int i, j;
-    struct test_data *querydata = (struct test_data *) closure;
 
     DeviceIntPtr dev;
     xXIDeviceInfo *info = (xXIDeviceInfo *) data;
     xXIAnyInfo *any;
 
-    for (i = 0; i < querydata->num_devices_in_reply; i++) {
+    for (i = 0; i < test_data.num_devices_in_reply; i++) {
         if (client->swapped) {
             swaps(&info->deviceid);
             swaps(&info->attachment);
@@ -110,8 +108,8 @@ reply_XIQueryDevice_data(ClientPtr client, int len, char *data, void *closure)
             swaps(&info->name_len);
         }
 
-        if (querydata->which_device > XIAllMasterDevices)
-            assert(info->deviceid == querydata->which_device);
+        if (test_data.which_device > XIAllMasterDevices)
+            assert(info->deviceid == test_data.which_device);
 
         assert(info->deviceid >= 2);    /* 0 and 1 is reserved */
 
@@ -287,7 +285,7 @@ request_XIQueryDevice(struct test_data *querydata, int deviceid, int error)
 
     request_init(&request, XIQueryDevice);
     client = init_client(request.length, &request);
-    reply_handler = reply_XIQueryDevice;
+    wrapped_WriteToClient = reply_XIQueryDevice;
 
     querydata->which_device = deviceid;
 
@@ -298,7 +296,7 @@ request_XIQueryDevice(struct test_data *querydata, int deviceid, int error)
     if (rc != Success)
         assert(client.errorValue == deviceid);
 
-    reply_handler = reply_XIQueryDevice;
+    wrapped_WriteToClient = reply_XIQueryDevice;
 
     client.swapped = TRUE;
     swaps(&request.length);
@@ -315,29 +313,24 @@ test_XIQueryDevice(void)
 {
     int i;
     xXIQueryDeviceReq request;
-    struct test_data data;
 
     init_simple();
 
-    reply_handler = reply_XIQueryDevice;
-    global_userdata = &data;
+    wrapped_WriteToClient = reply_XIQueryDevice;
     request_init(&request, XIQueryDevice);
 
     printf("Testing XIAllDevices.\n");
-    request_XIQueryDevice(&data, XIAllDevices, Success);
+    request_XIQueryDevice(&test_data, XIAllDevices, Success);
     printf("Testing XIAllMasterDevices.\n");
-    request_XIQueryDevice(&data, XIAllMasterDevices, Success);
+    request_XIQueryDevice(&test_data, XIAllMasterDevices, Success);
 
     printf("Testing existing device ids.\n");
     for (i = 2; i < 6; i++)
-        request_XIQueryDevice(&data, i, Success);
+        request_XIQueryDevice(&test_data, i, Success);
 
     printf("Testing non-existing device ids.\n");
     for (i = 6; i <= 0xFFFF; i++)
-        request_XIQueryDevice(&data, i, BadDevice);
-
-    reply_handler = NULL;
-
+        request_XIQueryDevice(&test_data, i, BadDevice);
 }
 
 const testfunc_t*
diff --git a/test/xi2/protocol-xiquerypointer.c b/test/xi2/protocol-xiquerypointer.c
index dfa8016e4..bb92ed1f2 100644
--- a/test/xi2/protocol-xiquerypointer.c
+++ b/test/xi2/protocol-xiquerypointer.c
@@ -44,10 +44,11 @@
 
 #include "protocol-common.h"
 
+DECLARE_WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data);
+
 extern ClientRec client_window;
 static ClientRec client_request;
-static void reply_XIQueryPointer_data(ClientPtr client, int len,
-                                      char *data, void *closure);
+static void reply_XIQueryPointer_data(ClientPtr client, int len, void *data);
 
 static struct {
     DeviceIntPtr dev;
@@ -55,7 +56,7 @@ static struct {
 } test_data;
 
 static void
-reply_XIQueryPointer(ClientPtr client, int len, char *data, void *closure)
+reply_XIQueryPointer(ClientPtr client, int len, void *data)
 {
     xXIQueryPointerReply *rep = (xXIQueryPointerReply *) data;
     SpritePtr sprite;
@@ -102,13 +103,13 @@ reply_XIQueryPointer(ClientPtr client, int len, char *data, void *closure)
 
     assert(rep->same_screen == xTrue);
 
-    reply_handler = reply_XIQueryPointer_data;
+    wrapped_WriteToClient = reply_XIQueryPointer_data;
 }
 
 static void
-reply_XIQueryPointer_data(ClientPtr client, int len, char *data, void *closure)
+reply_XIQueryPointer_data(ClientPtr client, int len, void *data)
 {
-    reply_handler = reply_XIQueryPointer;
+    wrapped_WriteToClient = reply_XIQueryPointer;
 }
 
 static void
@@ -145,7 +146,7 @@ test_XIQueryPointer(void)
 
     request_init(&request, XIQueryPointer);
 
-    reply_handler = reply_XIQueryPointer;
+    wrapped_WriteToClient = reply_XIQueryPointer;
 
     client_request = init_client(request.length, &request);
 
diff --git a/test/xi2/protocol-xiqueryversion.c b/test/xi2/protocol-xiqueryversion.c
index 009563d50..cd1865fdb 100644
--- a/test/xi2/protocol-xiqueryversion.c
+++ b/test/xi2/protocol-xiqueryversion.c
@@ -50,24 +50,26 @@
 #include "protocol-common.h"
 #include "exglobals.h"
 
+DECLARE_WRAP_FUNCTION(WriteToClient, void, ClientPtr client, int len, void *data);
+
 extern XExtensionVersion XIVersion;
 
-struct test_data {
+static struct test_data {
     int major_client;
     int minor_client;
     int major_server;
     int minor_server;
     int major_expected;
     int minor_expected;
-};
+} versions;
+
 
 extern ClientRec client_window;
 
 static void
-reply_XIQueryVersion(ClientPtr client, int len, char *data, void *closure)
+reply_XIQueryVersion(ClientPtr client, int len, void *data)
 {
     xXIQueryVersionReply *rep = (xXIQueryVersionReply *) data;
-    struct test_data *versions = (struct test_data *) closure;
     unsigned int sver, cver, ver;
 
     if (client->swapped) {
@@ -81,8 +83,8 @@ reply_XIQueryVersion(ClientPtr client, int len, char *data, void *closure)
 
     assert(rep->length == 0);
 
-    sver = versions->major_server * 1000 + versions->minor_server;
-    cver = versions->major_client * 1000 + versions->minor_client;
+    sver = versions.major_server * 1000 + versions.minor_server;
+    cver = versions.major_client * 1000 + versions.minor_client;
     ver = rep->major_version * 1000 + rep->minor_version;
 
     assert(ver >= 2000);
@@ -90,16 +92,15 @@ reply_XIQueryVersion(ClientPtr client, int len, char *data, void *closure)
 }
 
 static void
-reply_XIQueryVersion_multiple(ClientPtr client, int len, char *data, void *closure)
+reply_XIQueryVersion_multiple(ClientPtr client, int len, void *data)
 {
     xXIQueryVersionReply *rep = (xXIQueryVersionReply *) data;
-    struct test_data *versions = (struct test_data *) closure;
 
     reply_check_defaults(rep, len, XIQueryVersion);
     assert(rep->length == 0);
 
-    assert(versions->major_expected == rep->major_version);
-    assert(versions->minor_expected == rep->minor_version);
+    assert(versions.major_expected == rep->major_version);
+    assert(versions.minor_expected == rep->minor_version);
 }
 
 /**
@@ -112,13 +113,11 @@ static void
 request_XIQueryVersion(int smaj, int smin, int cmaj, int cmin, int error)
 {
     int rc;
-    struct test_data versions;
     xXIQueryVersionReq request;
     ClientRec client;
 
     request_init(&request, XIQueryVersion);
     client = init_client(request.length, &request);
-    global_userdata = (void *) &versions;
 
     /* Change the server to support smaj.smin */
     XIVersion.major_version = smaj;
@@ -153,7 +152,7 @@ test_XIQueryVersion(void)
 {
     init_simple();
 
-    reply_handler = reply_XIQueryVersion;
+    wrapped_WriteToClient = reply_XIQueryVersion;
 
     printf("Server version 2.0 - client versions [1..3].0\n");
     /* some simple tests to catch common errors quickly */
@@ -191,8 +190,6 @@ test_XIQueryVersion(void)
                 }
 
 #endif
-
-    reply_handler = NULL;
 }
 
 
@@ -202,7 +199,6 @@ test_XIQueryVersion_multiple(void)
     xXIQueryVersionReq request;
     ClientRec client;
     XIClientPtr pXIClient;
-    struct test_data versions;
     int rc;
 
     init_simple();
@@ -214,8 +210,7 @@ test_XIQueryVersion_multiple(void)
     XIVersion.major_version = 2;
     XIVersion.minor_version = 2;
 
-    reply_handler = reply_XIQueryVersion_multiple;
-    global_userdata = (void *) &versions;
+    wrapped_WriteToClient = reply_XIQueryVersion_multiple;
 
     /* run 1 */
 
commit 46b579e8d5580c2e0a5c1e31550712256f65d3aa
Author: Peter Hutterer <peter.hutterer at who-t.net>
Date:   Fri Jan 5 11:26:26 2024 +1000

    test: switch the unit tests to something resembling a test suite
    
    The tests have inadvertent dependencies on each other so let's avoid
    those by changing to a system that returns a null-terminated list of
    test functions and our test runner iterates over those and forks off one
    process per function.

diff --git a/test/fixes.c b/test/fixes.c
index ba7323495..b5d57cf8f 100644
--- a/test/fixes.c
+++ b/test/fixes.c
@@ -347,13 +347,15 @@ fixes_pointer_barrier_clamp_test(void)
     assert(cy == barrier.y1);
 }
 
-int
+const testfunc_t*
 fixes_test(void)
 {
+    static const testfunc_t testfuncs[] = {
+        fixes_pointer_barriers_test,
+        fixes_pointer_barrier_direction_test,
+        fixes_pointer_barrier_clamp_test,
+        NULL,
+    };
 
-    fixes_pointer_barriers_test();
-    fixes_pointer_barrier_direction_test();
-    fixes_pointer_barrier_clamp_test();
-
-    return 0;
+    return testfuncs;
 }
diff --git a/test/hashtabletest.c b/test/hashtabletest.c
index 0387587cb..f748183e6 100644
--- a/test/hashtabletest.c
+++ b/test/hashtabletest.c
@@ -24,7 +24,7 @@ print_int(void* ptr, void* v)
     printf("%d", *x);
 }
 
-static int
+static void
 test1(void)
 {
     HashTable h;
@@ -79,10 +79,10 @@ test1(void)
 
     ht_destroy(h);
 
-    return ok;
+    assert(ok);
 }
 
-static int
+static void
 test2(void)
 {
     HashTable h;
@@ -122,10 +122,10 @@ test2(void)
         printf("Test with empty keys FAILED\n");
     }
 
-    return ok;
+    assert(ok);
 }
 
-static int
+static void
 test3(void)
 {
     int ok = 1;
@@ -152,15 +152,17 @@ test3(void)
 
     ht_destroy(h);
 
-    return ok;
+    assert(ok);
 }
 
-int
+const testfunc_t*
 hashtabletest_test(void)
 {
-    int ok = test1();
-    ok = ok && test2();
-    ok = ok && test3();
-
-    return ok ? 0 : 1;
+    static const testfunc_t testfuncs[] = {
+        test1,
+        test2,
+        test3,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/input.c b/test/input.c
index 34a75fd7f..c7d7cffdb 100644
--- a/test/input.c
+++ b/test/input.c
@@ -1926,28 +1926,31 @@ dix_enqueue_events(void)
     inputInfo.devices = NULL;
 }
 
-int
+const testfunc_t*
 input_test(void)
 {
-    dix_enqueue_events();
-    dix_double_fp_conversion();
-    dix_input_valuator_masks();
-    dix_input_valuator_masks_unaccel();
-    dix_input_attributes();
-    dix_init_valuators();
-    dix_event_to_core_conversion();
-    dix_event_to_xi1_conversion();
-    dix_check_grab_values();
-    xi2_struct_sizes();
-    dix_grab_matching();
-    dix_valuator_mode();
-    include_byte_padding_macros();
-    include_bit_test_macros();
-    xi_unregister_handlers();
-    dix_valuator_alloc();
-    dix_get_master();
-    input_option_test();
-    mieq_test();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        dix_enqueue_events,
+        dix_double_fp_conversion,
+        dix_input_valuator_masks,
+        dix_input_valuator_masks_unaccel,
+        dix_input_attributes,
+        dix_init_valuators,
+        dix_event_to_core_conversion,
+        dix_event_to_xi1_conversion,
+        dix_check_grab_values,
+        xi2_struct_sizes,
+        dix_grab_matching,
+        dix_valuator_mode,
+        include_byte_padding_macros,
+        include_bit_test_macros,
+        xi_unregister_handlers,
+        dix_valuator_alloc,
+        dix_get_master,
+        input_option_test,
+        mieq_test,
+        NULL,
+    };
+
+    return testfuncs;
 }
diff --git a/test/list.c b/test/list.c
index fee41a538..06a9afc1e 100644
--- a/test/list.c
+++ b/test/list.c
@@ -377,19 +377,21 @@ test_nt_list_delete(void)
     free(list);
 }
 
-int
+const testfunc_t*
 list_test(void)
 {
-    test_xorg_list_init();
-    test_xorg_list_add();
-    test_xorg_list_append();
-    test_xorg_list_del();
-    test_xorg_list_for_each();
-
-    test_nt_list_init();
-    test_nt_list_append();
-    test_nt_list_insert();
-    test_nt_list_delete();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        test_xorg_list_init,
+        test_xorg_list_add,
+        test_xorg_list_append,
+        test_xorg_list_del,
+        test_xorg_list_for_each,
+
+        test_nt_list_init,
+        test_nt_list_append,
+        test_nt_list_insert,
+        test_nt_list_delete,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/misc.c b/test/misc.c
index 19ff13275..ba7a80b51 100644
--- a/test/misc.c
+++ b/test/misc.c
@@ -223,13 +223,17 @@ bswap_test(void)
     assert(result_64 == expect_64);
 }
 
-int
+const testfunc_t*
 misc_test(void)
 {
-    dix_version_compare();
-    dix_update_desktop_dimensions();
-    dix_request_size_checks();
-    bswap_test();
+    static const testfunc_t testfuncs[] = {
+        dix_version_compare,
+        dix_update_desktop_dimensions,
+        dix_request_size_checks,
+        bswap_test,
+        NULL,
+    };
+    return testfuncs;
 
     return 0;
 }
diff --git a/test/signal-logging.c b/test/signal-logging.c
index 97477dcee..1eaf96867 100644
--- a/test/signal-logging.c
+++ b/test/signal-logging.c
@@ -402,11 +402,13 @@ static void logging_format(void)
 }
 #pragma GCC diagnostic pop /* "-Wformat-security" */
 
-int
+const testfunc_t*
 signal_logging_test(void)
 {
-    number_formatting();
-    logging_format();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        number_formatting,
+        logging_format,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/string.c b/test/string.c
index 3fd0fb76e..6fa4882d9 100644
--- a/test/string.c
+++ b/test/string.c
@@ -65,10 +65,13 @@ strndup_checks(void)
     free(allofit);
 }
 
-int
+const testfunc_t*
 string_test(void)
 {
-    strndup_checks();
+    static const testfunc_t testfuncs[] = {
+        strndup_checks,
+        NULL,
+    };
 
-    return 0;
+    return testfuncs;
 }
diff --git a/test/test_xkb.c b/test/test_xkb.c
index 18e37e408..b92e5d555 100644
--- a/test/test_xkb.c
+++ b/test/test_xkb.c
@@ -175,12 +175,14 @@ xkb_set_get_rules_test(void)
     XkbFreeRMLVOSet(&rmlvo_backup, FALSE);
 }
 
-int
+const testfunc_t*
 xkb_test(void)
 {
-    xkb_set_get_rules_test();
-    xkb_get_rules_test();
-    xkb_set_rules_test();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        xkb_set_get_rules_test,
+        xkb_get_rules_test,
+        xkb_set_rules_test,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/tests-common.c b/test/tests-common.c
index 686852827..dad07412b 100644
--- a/test/tests-common.c
+++ b/test/tests-common.c
@@ -7,27 +7,34 @@
 #include "tests-common.h"
 
 void
-run_test_in_child(int (*func)(void), const char *funcname)
+run_test_in_child(const testfunc_t* (*suite)(void), const char *funcname)
 {
     int cpid;
     int csts;
     int exit_code = -1;
+    const testfunc_t *func = suite();
 
     printf("\n---------------------\n%s...\n", funcname);
-    cpid = fork();
-    if (cpid) {
-        waitpid(cpid, &csts, 0);
-        if (!WIFEXITED(csts))
-            goto child_failed;
-        exit_code = WEXITSTATUS(csts);
-        if (exit_code == 0)
-            printf(" Pass\n");
-        else {
-child_failed:
-            printf(" FAIL\n");
-            exit(exit_code);
+
+    while (*func)
+    {
+        cpid = fork();
+        if (cpid) {
+            waitpid(cpid, &csts, 0);
+            if (!WIFEXITED(csts))
+                goto child_failed;
+            exit_code = WEXITSTATUS(csts);
+            if (exit_code != 0) {
+    child_failed:
+                printf(" FAIL\n");
+                exit(exit_code);
+            }
+        } else {
+            testfunc_t f = *func;
+            f();
+            exit(0);
         }
-    } else {
-        exit(func());
+        func++;
     }
+    printf(" Pass\n");
 }
diff --git a/test/tests-common.h b/test/tests-common.h
index ea0642247..c3bcf26a2 100644
--- a/test/tests-common.h
+++ b/test/tests-common.h
@@ -3,10 +3,11 @@
 
 #include "tests.h"
 
+
 #define ARRAY_SIZE(a)  (sizeof((a)) / sizeof((a)[0]))
 
 #define run_test(func) run_test_in_child(func, #func)
 
-void run_test_in_child(int (*func)(void), const char *funcname);
+void run_test_in_child(const testfunc_t* (*func)(void), const char *funcname);
 
 #endif /* TESTS_COMMON_H */
diff --git a/test/tests.h b/test/tests.h
index b96ca78bb..4f69fdd3e 100644
--- a/test/tests.h
+++ b/test/tests.h
@@ -1,31 +1,31 @@
 #ifndef TESTS_H
 #define TESTS_H
 
-int fixes_test(void);
-int hashtabletest_test(void);
-int input_test(void);
-int list_test(void);
-int misc_test(void);
-int signal_logging_test(void);
-int string_test(void);
-int touch_test(void);
-int xfree86_test(void);
-int xkb_test(void);
-int xtest_test(void);
-
-int protocol_xchangedevicecontrol_test(void);
-
-int protocol_xiqueryversion_test(void);
-int protocol_xiquerydevice_test(void);
-int protocol_xiselectevents_test(void);
-int protocol_xigetselectedevents_test(void);
-int protocol_xisetclientpointer_test(void);
-int protocol_xigetclientpointer_test(void);
-int protocol_xipassivegrabdevice_test(void);
-int protocol_xiquerypointer_test(void);
-int protocol_xiwarppointer_test(void);
-int protocol_eventconvert_test(void);
-int xi2_test(void);
+typedef void (*testfunc_t)(void);
+
+const testfunc_t* fixes_test(void);
+const testfunc_t* hashtabletest_test(void);
+const testfunc_t* input_test(void);
+const testfunc_t* list_test(void);
+const testfunc_t* misc_test(void);
+const testfunc_t* signal_logging_test(void);
+const testfunc_t* string_test(void);
+const testfunc_t* touch_test(void);
+const testfunc_t* xfree86_test(void);
+const testfunc_t* xkb_test(void);
+const testfunc_t* xtest_test(void);
+const testfunc_t* protocol_xchangedevicecontrol_test(void);
+const testfunc_t* protocol_xiqueryversion_test(void);
+const testfunc_t* protocol_xiquerydevice_test(void);
+const testfunc_t* protocol_xiselectevents_test(void);
+const testfunc_t* protocol_xigetselectedevents_test(void);
+const testfunc_t* protocol_xisetclientpointer_test(void);
+const testfunc_t* protocol_xigetclientpointer_test(void);
+const testfunc_t* protocol_xipassivegrabdevice_test(void);
+const testfunc_t* protocol_xiquerypointer_test(void);
+const testfunc_t* protocol_xiwarppointer_test(void);
+const testfunc_t* protocol_eventconvert_test(void);
+const testfunc_t* xi2_test(void);
 
 #ifndef INSIDE_PROTOCOL_COMMON
 
diff --git a/test/touch.c b/test/touch.c
index 1f183a72a..e4d14f63d 100644
--- a/test/touch.c
+++ b/test/touch.c
@@ -306,16 +306,16 @@ touch_init(void)
     free_device(&dev);
 }
 
-int
+const testfunc_t*
 touch_test(void)
 {
-    printf("touch_test: start...\n");
-    touch_grow_queue();
-    touch_find_ddxid();
-    touch_begin_ddxtouch();
-    touch_init();
-    touch_begin_touch();
-
-    printf("touch_test: exiting successfully\n");
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        touch_grow_queue,
+        touch_find_ddxid,
+        touch_begin_ddxtouch,
+        touch_init,
+        touch_begin_touch,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/xfree86.c b/test/xfree86.c
index 76837d57e..7cbd37f40 100644
--- a/test/xfree86.c
+++ b/test/xfree86.c
@@ -108,11 +108,13 @@ xfree86_add_comment(void)
     free(current);
 }
 
-int
+const testfunc_t*
 xfree86_test(void)
 {
-    xfree86_option_list_duplicate();
-    xfree86_add_comment();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        xfree86_option_list_duplicate,
+        xfree86_add_comment,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/xi1/protocol-xchangedevicecontrol.c b/test/xi1/protocol-xchangedevicecontrol.c
index f3e2b1472..392bd75f8 100644
--- a/test/xi1/protocol-xchangedevicecontrol.c
+++ b/test/xi1/protocol-xchangedevicecontrol.c
@@ -85,6 +85,8 @@ static unsigned char *data[4096];       /* the request buffer */
 static void
 test_ChangeDeviceControl(void)
 {
+    init_simple();
+
     xChangeDeviceControlReq *request = (xChangeDeviceControlReq *) data;
     xDeviceCtl *control = (xDeviceCtl *) (&request[1]);
 
@@ -115,12 +117,12 @@ test_ChangeDeviceControl(void)
     /* XXX: Test functionality! */
 }
 
-int
+const testfunc_t*
 protocol_xchangedevicecontrol_test(void)
 {
-    init_simple();
-
-    test_ChangeDeviceControl();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        test_ChangeDeviceControl,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/xi2/protocol-eventconvert.c b/test/xi2/protocol-eventconvert.c
index 0e0123708..5b4c34ac0 100644
--- a/test/xi2/protocol-eventconvert.c
+++ b/test/xi2/protocol-eventconvert.c
@@ -1206,15 +1206,17 @@ test_convert_XIBarrierEvent(void)
     test_XIBarrierEvent(&in);
 }
 
-int
+const testfunc_t*
 protocol_eventconvert_test(void)
 {
-    test_convert_XIRawEvent();
-    test_convert_XIFocusEvent();
-    test_convert_XIDeviceEvent();
-    test_convert_XIDeviceChangedEvent();
-    test_convert_XITouchOwnershipEvent();
-    test_convert_XIBarrierEvent();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        test_convert_XIRawEvent,
+        test_convert_XIFocusEvent,
+        test_convert_XIDeviceEvent,
+        test_convert_XIDeviceChangedEvent,
+        test_convert_XITouchOwnershipEvent,
+        test_convert_XIBarrierEvent,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/xi2/protocol-xigetclientpointer.c b/test/xi2/protocol-xigetclientpointer.c
index 40dacfc4d..101590ae2 100644
--- a/test/xi2/protocol-xigetclientpointer.c
+++ b/test/xi2/protocol-xigetclientpointer.c
@@ -100,6 +100,9 @@ test_XIGetClientPointer(void)
 {
     xXIGetClientPointerReq request;
 
+    init_simple();
+    client_window = init_client(0, NULL);
+
     request_init(&request, XIGetClientPointer);
 
     request.win = CLIENT_WINDOW_ID;
@@ -144,13 +147,13 @@ test_XIGetClientPointer(void)
     request_XIGetClientPointer(&client_request, &request, Success);
 }
 
-int
+const testfunc_t*
 protocol_xigetclientpointer_test(void)
 {
-    init_simple();
-    client_window = init_client(0, NULL);
-
-    test_XIGetClientPointer();
+    static const testfunc_t testfuncs[] = {
+        test_XIGetClientPointer,
+        NULL,
+    };
 
-    return 0;
+    return testfuncs;
 }
diff --git a/test/xi2/protocol-xigetselectedevents.c b/test/xi2/protocol-xigetselectedevents.c
index 0c7ef1675..797accca3 100644
--- a/test/xi2/protocol-xigetselectedevents.c
+++ b/test/xi2/protocol-xigetselectedevents.c
@@ -145,10 +145,15 @@ test_XIGetSelectedEvents(void)
 {
     int i, j;
     xXIGetSelectedEventsReq request;
-    ClientRec client = init_client(0, NULL);
+    ClientRec client;
     unsigned char *mask;
     DeviceIntRec dev;
 
+    init_simple();
+    enable_GrabButton_wrap = 0;
+    enable_XISetEventMask_wrap = 0;
+    client = init_client(0, NULL);
+
     request_init(&request, XIGetSelectedEvents);
 
     printf("Testing for BadWindow on invalid window.\n");
@@ -208,14 +213,14 @@ test_XIGetSelectedEvents(void)
     }
 }
 
-int
+const testfunc_t*
 protocol_xigetselectedevents_test(void)
 {
-    init_simple();
-    enable_GrabButton_wrap = 0;
-    enable_XISetEventMask_wrap = 0;
-
-    test_XIGetSelectedEvents();
+    static const testfunc_t testfuncs[] = {
+        test_XIGetSelectedEvents,
+        NULL,
+    };
+    return testfuncs;
 
     return 0;
 }
diff --git a/test/xi2/protocol-xipassivegrabdevice.c b/test/xi2/protocol-xipassivegrabdevice.c
index 56645c63a..2bc4912b7 100644
--- a/test/xi2/protocol-xipassivegrabdevice.c
+++ b/test/xi2/protocol-xipassivegrabdevice.c
@@ -175,6 +175,8 @@ test_XIPassiveGrabDevice(void)
     xXIPassiveGrabDeviceReq *request = (xXIPassiveGrabDeviceReq *) data;
     unsigned char *mask;
 
+    init_simple();
+
     request_init(request, XIPassiveGrabDevice);
 
     request->grab_window = CLIENT_WINDOW_ID;
@@ -247,12 +249,13 @@ test_XIPassiveGrabDevice(void)
     request_XIPassiveGrabDevice(&client_request, request, Success, 0);
 }
 
-int
+const testfunc_t*
 protocol_xipassivegrabdevice_test(void)
 {
-    init_simple();
-
-    test_XIPassiveGrabDevice();
+    static const testfunc_t testfuncs[] = {
+        test_XIPassiveGrabDevice,
+        NULL,
+    };
 
-    return 0;
+    return testfuncs;
 }
diff --git a/test/xi2/protocol-xiquerydevice.c b/test/xi2/protocol-xiquerydevice.c
index 821ca4063..a87f5737c 100644
--- a/test/xi2/protocol-xiquerydevice.c
+++ b/test/xi2/protocol-xiquerydevice.c
@@ -317,6 +317,8 @@ test_XIQueryDevice(void)
     xXIQueryDeviceReq request;
     struct test_data data;
 
+    init_simple();
+
     reply_handler = reply_XIQueryDevice;
     global_userdata = &data;
     request_init(&request, XIQueryDevice);
@@ -338,12 +340,13 @@ test_XIQueryDevice(void)
 
 }
 
-int
+const testfunc_t*
 protocol_xiquerydevice_test(void)
 {
-    init_simple();
-
-    test_XIQueryDevice();
+    static const testfunc_t testfuncs[] = {
+        test_XIQueryDevice,
+        NULL,
+    };
 
-    return 0;
+    return testfuncs;
 }
diff --git a/test/xi2/protocol-xiquerypointer.c b/test/xi2/protocol-xiquerypointer.c
index e04b0bad8..dfa8016e4 100644
--- a/test/xi2/protocol-xiquerypointer.c
+++ b/test/xi2/protocol-xiquerypointer.c
@@ -139,6 +139,8 @@ test_XIQueryPointer(void)
     int i;
     xXIQueryPointerReq request;
 
+    init_simple();
+
     memset(&request, 0, sizeof(request));
 
     request_init(&request, XIQueryPointer);
@@ -192,12 +194,12 @@ test_XIQueryPointer(void)
     request_XIQueryPointer(&client_request, &request, BadLength);
 }
 
-int
+const testfunc_t*
 protocol_xiquerypointer_test(void)
 {
-    init_simple();
-
-    test_XIQueryPointer();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        test_XIQueryPointer,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/xi2/protocol-xiqueryversion.c b/test/xi2/protocol-xiqueryversion.c
index 89df18431..009563d50 100644
--- a/test/xi2/protocol-xiqueryversion.c
+++ b/test/xi2/protocol-xiqueryversion.c
@@ -151,6 +151,8 @@ request_XIQueryVersion(int smaj, int smin, int cmaj, int cmin, int error)
 static void
 test_XIQueryVersion(void)
 {
+    init_simple();
+
     reply_handler = reply_XIQueryVersion;
 
     printf("Server version 2.0 - client versions [1..3].0\n");
@@ -203,6 +205,8 @@ test_XIQueryVersion_multiple(void)
     struct test_data versions;
     int rc;
 
+    init_simple();
+
     request_init(&request, XIQueryVersion);
     client = init_client(request.length, &request);
 
@@ -290,13 +294,14 @@ test_XIQueryVersion_multiple(void)
     assert(rc == BadValue);
 }
 
-int
+const testfunc_t*
 protocol_xiqueryversion_test(void)
 {
-    init_simple();
-
-    test_XIQueryVersion();
-    test_XIQueryVersion_multiple();
+    static const testfunc_t testfuncs[] = {
+        test_XIQueryVersion,
+        test_XIQueryVersion_multiple,
+        NULL,
+    };
 
-    return 0;
+    return testfuncs;
 }
diff --git a/test/xi2/protocol-xiselectevents.c b/test/xi2/protocol-xiselectevents.c
index 41a370a3e..3f3810263 100644
--- a/test/xi2/protocol-xiselectevents.c
+++ b/test/xi2/protocol-xiselectevents.c
@@ -288,6 +288,8 @@ test_XISelectEvents(void)
     xXIEventMask *mask;
     xXISelectEventsReq *req;
 
+    init_simple();
+
     req = (xXISelectEventsReq *) data;
 
     request_init(req, XISelectEvents);
@@ -364,12 +366,13 @@ test_XISelectEvents(void)
     request_XISelectEvents_masks(req);
 }
 
-int
+const testfunc_t*
 protocol_xiselectevents_test(void)
 {
-    init_simple();
-
-    test_XISelectEvents();
+    static const testfunc_t testfuncs[] = {
+        test_XISelectEvents,
+        NULL,
+    };
 
-    return 0;
+    return testfuncs;
 }
diff --git a/test/xi2/protocol-xisetclientpointer.c b/test/xi2/protocol-xisetclientpointer.c
index 0e94a91e2..f6ddb72b5 100644
--- a/test/xi2/protocol-xisetclientpointer.c
+++ b/test/xi2/protocol-xisetclientpointer.c
@@ -85,6 +85,9 @@ test_XISetClientPointer(void)
     int i;
     xXISetClientPointerReq request;
 
+    init_simple();
+    client_window = init_client(0, NULL);
+
     request_init(&request, XISetClientPointer);
 
     request.win = CLIENT_WINDOW_ID;
@@ -124,13 +127,13 @@ test_XISetClientPointer(void)
 
 }
 
-int
+const testfunc_t*
 protocol_xisetclientpointer_test(void)
 {
-    init_simple();
-    client_window = init_client(0, NULL);
-
-    test_XISetClientPointer();
+    static const testfunc_t testfuncs[] = {
+        test_XISetClientPointer,
+        NULL,
+    };
 
-    return 0;
+    return testfuncs;
 }
diff --git a/test/xi2/protocol-xiwarppointer.c b/test/xi2/protocol-xiwarppointer.c
index 1b6a2fca6..417d9adfc 100644
--- a/test/xi2/protocol-xiwarppointer.c
+++ b/test/xi2/protocol-xiwarppointer.c
@@ -106,6 +106,9 @@ test_XIWarpPointer(void)
     ClientRec client_request;
     xXIWarpPointerReq request;
 
+    init_simple();
+    screen.SetCursorPosition = ScreenSetCursorPosition;
+
     memset(&request, 0, sizeof(request));
 
     request_init(&request, XIWarpPointer);
@@ -188,13 +191,12 @@ test_XIWarpPointer(void)
     request_XIWarpPointer(&client_request, &request, BadLength);
 }
 
-int
+const testfunc_t*
 protocol_xiwarppointer_test(void)
 {
-    init_simple();
-    screen.SetCursorPosition = ScreenSetCursorPosition;
-
-    test_XIWarpPointer();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        test_XIWarpPointer,
+        NULL,
+    };
+    return testfuncs;
 }
diff --git a/test/xi2/xi2.c b/test/xi2/xi2.c
index 153cd759b..03022ebfa 100644
--- a/test/xi2/xi2.c
+++ b/test/xi2/xi2.c
@@ -139,10 +139,14 @@ xi2mask_test(void)
     free(mask);
 }
 
-int
+const testfunc_t*
 xi2_test(void)
 {
-    xi2mask_test();
+    static const testfunc_t testfuncs[] = {
+        xi2mask_test,
+        NULL,
+    };
+    return testfuncs;
 
     return 0;
 }
diff --git a/test/xtest.c b/test/xtest.c
index 171f285f6..bfb066b7d 100644
--- a/test/xtest.c
+++ b/test/xtest.c
@@ -59,9 +59,49 @@ device_cursor_cleanup(DeviceIntPtr dev, ScreenPtr screen)
 {
 }
 
+static void
+xtest_init(void)
+{
+    static ScreenRec screen = {0};
+    static ClientRec server_client = {0};
+    static WindowRec root = {{0}};
+    static WindowOptRec optional = {0};
+
+    /* random stuff that needs initialization */
+    root.drawable.id = 0xab;
+    root.optional = &optional;
+    screen.root = &root;
+    screenInfo.numScreens = 1;
+    screenInfo.screens[0] = &screen;
+    screen.myNum = 0;
+    screen.id = 100;
+    screen.width = 640;
+    screen.height = 480;
+    screen.DeviceCursorInitialize = device_cursor_init;
+    screen.DeviceCursorCleanup = device_cursor_cleanup;
+    dixResetPrivates();
+    serverClient = &server_client;
+    InitClient(serverClient, 0, (void *) NULL);
+    if (!InitClientResources(serverClient)) /* for root resources */
+        FatalError("couldn't init server resources");
+    InitAtoms();
+    SyncExtensionInit();
+
+    /* this also inits the xtest devices */
+    InitCoreDevices();
+}
+
+static void
+xtest_cleanup(void)
+{
+    CloseDownDevices();
+}
+
 static void
 xtest_init_devices(void)
 {
+    xtest_init();
+
     assert(xtestpointer);
     assert(xtestkeyboard);
     assert(IsXTestDevice(xtestpointer, NULL));
@@ -72,6 +112,8 @@ xtest_init_devices(void)
     assert(GetXTestDevice(inputInfo.pointer) == xtestpointer);
 
     assert(GetXTestDevice(inputInfo.keyboard) == xtestkeyboard);
+
+    xtest_cleanup();
 }
 
 /**
@@ -84,8 +126,11 @@ xtest_properties(void)
     int rc;
     char value = 1;
     XIPropertyValuePtr prop;
-    Atom xtest_prop = XIGetKnownProperty(XI_PROP_XTEST_DEVICE);
+    Atom xtest_prop;
 
+    xtest_init();
+
+    xtest_prop = XIGetKnownProperty(XI_PROP_XTEST_DEVICE);
     rc = XIGetDeviceProperty(xtestpointer, xtest_prop, &prop);
     assert(rc == Success);
     assert(prop);
@@ -102,43 +147,17 @@ xtest_properties(void)
                                 XA_INTEGER, 8, PropModeReplace, 1, &value,
                                 FALSE);
     assert(rc == BadAccess);
+
+    xtest_cleanup();
 }
 
-int
+const testfunc_t*
 xtest_test(void)
 {
-    ScreenRec screen = {0};
-    ClientRec server_client = {0};
-    WindowRec root = {{0}};
-    WindowOptRec optional = {0};
-
-    /* random stuff that needs initialization */
-    root.drawable.id = 0xab;
-    root.optional = &optional;
-    screen.root = &root;
-    screenInfo.numScreens = 1;
-    screenInfo.screens[0] = &screen;
-    screen.myNum = 0;
-    screen.id = 100;
-    screen.width = 640;
-    screen.height = 480;
-    screen.DeviceCursorInitialize = device_cursor_init;
-    screen.DeviceCursorCleanup = device_cursor_cleanup;
-    dixResetPrivates();
-    serverClient = &server_client;
-    InitClient(serverClient, 0, (void *) NULL);
-    if (!InitClientResources(serverClient)) /* for root resources */
-        FatalError("couldn't init server resources");
-    InitAtoms();
-    SyncExtensionInit();
-
-    /* this also inits the xtest devices */
-    InitCoreDevices();
-
-    xtest_init_devices();
-    xtest_properties();
-
-    CloseDownDevices();
-
-    return 0;
+    static const testfunc_t testfuncs[] = {
+        xtest_init_devices,
+        xtest_properties,
+        NULL,
+    };
+    return testfuncs;
 }


More information about the xorg-commit mailing list