From 10a64d683dd8c17f6fd6d8f0529892c54842b81d Mon Sep 17 00:00:00 2001 From: Daniel van Vugt Date: Wed, 29 Jan 2025 17:02:17 +0800 Subject: [PATCH] tests: Unify DRM mocking macros Having separate macros for error injection and filtering meant that you could never use both on a single DRM function. Because each would redefine the same function. --- src/tests/drm-mock/drm-mock.c | 58 +++++++++++---------------- src/tests/drm-mock/drm-mock.h | 12 ++---- src/tests/native-kms-headless-start.c | 6 +-- src/tests/native-kms-hotplug.c | 14 +++---- 4 files changed, 37 insertions(+), 53 deletions(-) diff --git a/src/tests/drm-mock/drm-mock.c b/src/tests/drm-mock/drm-mock.c index 83af82789ab..ec45f4f4ae5 100644 --- a/src/tests/drm-mock/drm-mock.c +++ b/src/tests/drm-mock/drm-mock.c @@ -36,7 +36,7 @@ typedef struct _DrmMockResourceFilter } DrmMockResourceFilter; static GList *queued_errors[DRM_MOCK_N_CALLS]; -static DrmMockResourceFilter *resource_filters[DRM_MOCK_N_CALL_FILTERS]; +static DrmMockResourceFilter *resource_filters[DRM_MOCK_N_CALLS]; static int maybe_mock_error (DrmMockCall call) @@ -56,47 +56,35 @@ maybe_mock_error (DrmMockCall call) return 0; } -#define MOCK_FUNCTION(FunctionName, CALL_TYPE, args_type, args) \ -\ -DRM_MOCK_EXPORT int \ -FunctionName args_type \ -{ \ - static int (* real_function) args_type; \ - int ret; \ -\ - if (G_UNLIKELY (!real_function)) \ - real_function = dlsym (RTLD_NEXT, #FunctionName); \ -\ - ret = maybe_mock_error (CALL_TYPE); \ - if (ret != 0) \ - return ret; \ -\ - return real_function args; \ -} - -#define MOCK_FILTER_FUNCTION(FunctionName, CALL_FILTER_TYPE, return_type, args_type, args) \ +#define MOCK_FUNCTION(FunctionName, CALL_TYPE, return_type, args_type, args) \ \ DRM_MOCK_EXPORT return_type \ FunctionName args_type \ { \ static return_type (* real_function) args_type; \ + int int_ret; \ return_type ret; \ DrmMockResourceFilter *filter; \ \ if (G_UNLIKELY (!real_function)) \ real_function = dlsym (RTLD_NEXT, #FunctionName); \ +\ + int_ret = maybe_mock_error (CALL_TYPE); \ + if (int_ret != 0) \ + return (return_type) ret; \ \ ret = real_function args; \ \ - filter = resource_filters[CALL_FILTER_TYPE]; \ + filter = resource_filters[CALL_TYPE]; \ if (filter) \ - filter->filter_func (ret, filter->user_data); \ + filter->filter_func (&ret, filter->user_data); \ \ return ret; \ } MOCK_FUNCTION (drmModeAtomicCommit, DRM_MOCK_CALL_ATOMIC_COMMIT, + int, (int fd, drmModeAtomicReqPtr req, uint32_t flags, @@ -105,6 +93,7 @@ MOCK_FUNCTION (drmModeAtomicCommit, MOCK_FUNCTION (drmModePageFlip, DRM_MOCK_CALL_PAGE_FLIP, + int, (int fd, uint32_t crtc_id, uint32_t fb_id, @@ -114,6 +103,7 @@ MOCK_FUNCTION (drmModePageFlip, MOCK_FUNCTION (drmModeSetCrtc, DRM_MOCK_CALL_SET_CRTC, + int, (int fd, uint32_t crtc_id, uint32_t fb_id, @@ -124,12 +114,12 @@ MOCK_FUNCTION (drmModeSetCrtc, drmModeModeInfoPtr mode), (fd, crtc_id, fb_id, x, y, connectors, count, mode)) -MOCK_FILTER_FUNCTION (drmModeGetConnector, - DRM_MOCK_CALL_FILTER_GET_CONNECTOR, - drmModeConnectorPtr, - (int fd, - uint32_t connector_id), - (fd, connector_id)) +MOCK_FUNCTION (drmModeGetConnector, + DRM_MOCK_CALL_GET_CONNECTOR, + drmModeConnectorPtr, + (int fd, + uint32_t connector_id), + (fd, connector_id)) void drm_mock_queue_error (DrmMockCall call, @@ -142,7 +132,7 @@ drm_mock_queue_error (DrmMockCall call, } void -drm_mock_set_resource_filter (DrmMockCallFilter call_filter, +drm_mock_set_resource_filter (DrmMockCall call, DrmMockResourceFilterFunc filter_func, gpointer user_data) { @@ -153,15 +143,15 @@ drm_mock_set_resource_filter (DrmMockCallFilter call_filter, new_filter->filter_func = filter_func; new_filter->user_data = user_data; - old_filter = resource_filters[call_filter]; - g_atomic_pointer_set (&resource_filters[call_filter], new_filter); + old_filter = resource_filters[call]; + g_atomic_pointer_set (&resource_filters[call], new_filter); } void -drm_mock_unset_resource_filter (DrmMockCallFilter call_filter) +drm_mock_unset_resource_filter (DrmMockCall call) { g_autofree DrmMockResourceFilter *old_filter = NULL; - old_filter = resource_filters[call_filter]; - g_atomic_pointer_set (&resource_filters[call_filter], NULL); + old_filter = resource_filters[call]; + g_atomic_pointer_set (&resource_filters[call], NULL); } diff --git a/src/tests/drm-mock/drm-mock.h b/src/tests/drm-mock/drm-mock.h index 3bc111f753c..b22418219e6 100644 --- a/src/tests/drm-mock/drm-mock.h +++ b/src/tests/drm-mock/drm-mock.h @@ -35,17 +35,11 @@ typedef enum _DrmMockCall DRM_MOCK_CALL_ATOMIC_COMMIT, DRM_MOCK_CALL_PAGE_FLIP, DRM_MOCK_CALL_SET_CRTC, + DRM_MOCK_CALL_GET_CONNECTOR, DRM_MOCK_N_CALLS } DrmMockCall; -typedef enum _DrmMockCallFilter -{ - DRM_MOCK_CALL_FILTER_GET_CONNECTOR, - - DRM_MOCK_N_CALL_FILTERS -} DrmMockCallFilter; - typedef void (* DrmMockResourceFilterFunc) (gpointer resource, gpointer user_data); @@ -54,9 +48,9 @@ void drm_mock_queue_error (DrmMockCall call, int error_number); DRM_MOCK_EXPORT -void drm_mock_set_resource_filter (DrmMockCallFilter call_filter, +void drm_mock_set_resource_filter (DrmMockCall call, DrmMockResourceFilterFunc filter_func, gpointer user_data); DRM_MOCK_EXPORT -void drm_mock_unset_resource_filter (DrmMockCallFilter call_filter); +void drm_mock_unset_resource_filter (DrmMockCall call); diff --git a/src/tests/native-kms-headless-start.c b/src/tests/native-kms-headless-start.c index bea310fe53c..90fcadf05a3 100644 --- a/src/tests/native-kms-headless-start.c +++ b/src/tests/native-kms-headless-start.c @@ -82,7 +82,7 @@ meta_test_headless_monitor_connect (void) ClutterActor *stage; g_autoptr (GError) error = NULL; - drm_mock_unset_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR); + drm_mock_unset_resource_filter (DRM_MOCK_CALL_GET_CONNECTOR); udev_devices = meta_udev_list_drm_devices (udev, META_UDEV_DEVICE_TYPE_CARD, @@ -126,7 +126,7 @@ static void disconnect_connector_filter (gpointer resource, gpointer user_data) { - drmModeConnector *drm_connector = resource; + drmModeConnector *drm_connector = *(drmModeConnector **) resource; drm_connector->connection = DRM_MODE_DISCONNECTED; } @@ -144,7 +144,7 @@ main (int argc, char *argv[]) test_context = context; - drm_mock_set_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR, + drm_mock_set_resource_filter (DRM_MOCK_CALL_GET_CONNECTOR, disconnect_connector_filter, NULL); return meta_context_test_run_tests (META_CONTEXT_TEST (context), diff --git a/src/tests/native-kms-hotplug.c b/src/tests/native-kms-hotplug.c index db97a6f72f1..ea1c36159ab 100644 --- a/src/tests/native-kms-hotplug.c +++ b/src/tests/native-kms-hotplug.c @@ -109,7 +109,7 @@ static void disconnect_connector_filter (gpointer resource, gpointer user_data) { - drmModeConnector *drm_connector = resource; + drmModeConnector *drm_connector = *(drmModeConnector **) resource; drm_connector->connection = DRM_MODE_DISCONNECTED; } @@ -172,7 +172,7 @@ meta_test_disconnect_connect (void) clutter_actor_queue_redraw (stage); while (state < PAINTED) g_main_context_iteration (NULL, TRUE); - drm_mock_set_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR, + drm_mock_set_resource_filter (DRM_MOCK_CALL_GET_CONNECTOR, disconnect_connector_filter, NULL); g_signal_emit_by_name (udev, "hotplug", udev_device); logical_monitors = @@ -186,7 +186,7 @@ meta_test_disconnect_connect (void) g_main_context_iteration (NULL, TRUE); g_debug ("Reconnect connector, wait for presented"); - drm_mock_unset_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR); + drm_mock_unset_resource_filter (DRM_MOCK_CALL_GET_CONNECTOR); g_signal_emit_by_name (udev, "hotplug", udev_device); logical_monitors = meta_monitor_manager_get_logical_monitors (monitor_manager); @@ -197,7 +197,7 @@ meta_test_disconnect_connect (void) g_main_context_iteration (NULL, TRUE); g_debug ("Disconnect after page flip"); - drm_mock_set_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR, + drm_mock_set_resource_filter (DRM_MOCK_CALL_GET_CONNECTOR, disconnect_connector_filter, NULL); g_signal_emit_by_name (udev, "hotplug", udev_device); logical_monitors = @@ -210,7 +210,7 @@ meta_test_disconnect_connect (void) } g_debug ("Restore"); - drm_mock_unset_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR); + drm_mock_unset_resource_filter (DRM_MOCK_CALL_GET_CONNECTOR); g_signal_emit_by_name (udev, "hotplug", udev_device); logical_monitors = meta_monitor_manager_get_logical_monitors (monitor_manager); @@ -419,7 +419,7 @@ meta_test_power_save_implicit_on (void) g_signal_connect_swapped (monitor_manager, "monitors-changed", G_CALLBACK (set_true_cb), &monitors_changed); - drm_mock_set_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR, + drm_mock_set_resource_filter (DRM_MOCK_CALL_GET_CONNECTOR, disconnect_connector_filter, NULL); emulate_hotplug (); @@ -429,7 +429,7 @@ meta_test_power_save_implicit_on (void) g_signal_handler_disconnect (monitor_manager, power_save_handler_id); g_signal_handler_disconnect (monitor_manager, monitors_changed_handler_id); - drm_mock_unset_resource_filter (DRM_MOCK_CALL_FILTER_GET_CONNECTOR); + drm_mock_unset_resource_filter (DRM_MOCK_CALL_GET_CONNECTOR); emulate_hotplug (); logical_monitors = meta_monitor_manager_get_logical_monitors (monitor_manager); -- GitLab