From 15d33f4f855f96e8aa57295787bf19fa9401a06a Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 9 Nov 2022 11:01:29 +0100 Subject: [PATCH 1/4] tests/integration: Indicate that callback quits main loop on_event_triggered() is renamed to on_event_triggered_quit() as we will shortly introduce a variant that does not quit. --- tests/test-lfb-integration.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test-lfb-integration.c b/tests/test-lfb-integration.c index 639c7fa..d110614 100644 --- a/tests/test-lfb-integration.c +++ b/tests/test-lfb-integration.c @@ -123,7 +123,7 @@ test_lfb_integration_event_not_found (void) } static void -on_event_triggered (LfbEvent *event, +on_event_triggered_quit (LfbEvent *event, GAsyncResult *res, LfbEvent **cmp) { @@ -179,7 +179,7 @@ test_lfb_integration_event_async (void) event0 = lfb_event_new ("test-dummy-0"); lfb_event_trigger_feedback_async (event0, NULL, - (GAsyncReadyCallback)on_event_triggered, + (GAsyncReadyCallback)on_event_triggered_quit, &cmp1); g_main_loop_run (mainloop); /* The async finish callback saw the right event */ @@ -195,7 +195,7 @@ test_lfb_integration_event_async (void) /* The async callback ends the main loop */ lfb_event_trigger_feedback_async (event10, NULL, - (GAsyncReadyCallback)on_event_triggered, + (GAsyncReadyCallback)on_event_triggered_quit, &cmp2); g_main_loop_run (mainloop); From efca781f7f0acbe15467583ca441c1bfeea08779 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 9 Nov 2022 11:48:19 +0100 Subject: [PATCH 2/4] tests/integration: Fix whitespace Remove all tabs in favour of spaces and align function arguments. --- tests/test-lfb-integration.c | 58 ++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/test-lfb-integration.c b/tests/test-lfb-integration.c index d110614..d565a22 100644 --- a/tests/test-lfb-integration.c +++ b/tests/test-lfb-integration.c @@ -124,8 +124,8 @@ test_lfb_integration_event_not_found (void) static void on_event_triggered_quit (LfbEvent *event, - GAsyncResult *res, - LfbEvent **cmp) + GAsyncResult *res, + LfbEvent **cmp) { g_autoptr (GError) err = NULL; gboolean success; @@ -178,9 +178,9 @@ test_lfb_integration_event_async (void) event0 = lfb_event_new ("test-dummy-0"); lfb_event_trigger_feedback_async (event0, - NULL, - (GAsyncReadyCallback)on_event_triggered_quit, - &cmp1); + NULL, + (GAsyncReadyCallback)on_event_triggered_quit, + &cmp1); g_main_loop_run (mainloop); /* The async finish callback saw the right event */ g_assert_true (event0 == cmp1); @@ -194,16 +194,16 @@ test_lfb_integration_event_async (void) /* The async callback ends the main loop */ lfb_event_trigger_feedback_async (event10, - NULL, - (GAsyncReadyCallback)on_event_triggered_quit, - &cmp2); + NULL, + (GAsyncReadyCallback)on_event_triggered_quit, + &cmp2); g_main_loop_run (mainloop); /* The async callback ends the main loop */ lfb_event_end_feedback_async (event10, - NULL, - (GAsyncReadyCallback)on_event_end_finished, - &cmp3); + NULL, + (GAsyncReadyCallback)on_event_end_finished, + &cmp3); g_main_loop_run (mainloop); /* Check if callbacks saw the right event */ @@ -246,9 +246,9 @@ test_lfb_integration_event_async_error (void) /* Empty event names are invalid */ event0 = lfb_event_new (""); lfb_event_trigger_feedback_async (event0, - NULL, - (GAsyncReadyCallback)on_event_with_error_triggered, - &cmp1); + NULL, + (GAsyncReadyCallback)on_event_with_error_triggered, + &cmp1); g_main_loop_run (mainloop); /* The async finish callback saw the right event */ g_assert_true (event0 == cmp1); @@ -288,29 +288,29 @@ main (gint argc, gchar *argv[]) g_test_init (&argc, &argv, NULL); g_test_add("/feedbackd/lfb-integration/event_sync", TestFixture, NULL, - (gpointer)fixture_setup, - (gpointer)test_lfb_integration_event_sync, - (gpointer)fixture_teardown); + (gpointer)fixture_setup, + (gpointer)test_lfb_integration_event_sync, + (gpointer)fixture_teardown); g_test_add("/feedbackd/lfb-integration/event_async/success", TestFixture, NULL, - (gpointer)fixture_setup, - (gpointer)test_lfb_integration_event_async, - (gpointer)fixture_teardown); + (gpointer)fixture_setup, + (gpointer)test_lfb_integration_event_async, + (gpointer)fixture_teardown); g_test_add("/feedbackd/lfb-integration/event_async/error", TestFixture, NULL, - (gpointer)fixture_setup, - (gpointer)test_lfb_integration_event_async_error, - (gpointer)fixture_teardown); + (gpointer)fixture_setup, + (gpointer)test_lfb_integration_event_async_error, + (gpointer)fixture_teardown); g_test_add("/feedbackd/lfb-integration/event_not_found", TestFixture, NULL, - (gpointer)fixture_setup, - (gpointer)test_lfb_integration_event_not_found, - (gpointer)fixture_teardown); + (gpointer)fixture_setup, + (gpointer)test_lfb_integration_event_not_found, + (gpointer)fixture_teardown); g_test_add("/feedbackd/lfb-integration/profile", TestFixture, NULL, - (gpointer)fixture_setup, - (gpointer)test_lfb_integration_profile, - (gpointer)fixture_teardown); + (gpointer)fixture_setup, + (gpointer)test_lfb_integration_profile, + (gpointer)fixture_teardown); return g_test_run(); } From 72c7d3ba25426c6d49f27fe6c21f9ef27490b581 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Wed, 9 Nov 2022 11:48:09 +0100 Subject: [PATCH 3/4] tests/integration: Test that "feedback-ended" is propagated through LfbEvent When no feedbacks are available (either because the requested event does not exist in the theme or because the system does not have required capabilities, e.g. no vibration motor or LED) feedbackd will emit a "feedback-ended" signal (with reason LFB_EVENT_STATE_REASON_NOT_FOUND) on DBus _before_ completing the event triggering DBus call. Since the DBus call was not completed yet, LfbEvent will not have learned it's ID yet and therefore not emit it's own "feedback-ended" GObject signal. In this case the test will timeout since the main loop is never quit. --- tests/test-lfb-integration.c | 53 ++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tests/test-lfb-integration.c b/tests/test-lfb-integration.c index d565a22..48b39b3 100644 --- a/tests/test-lfb-integration.c +++ b/tests/test-lfb-integration.c @@ -122,6 +122,28 @@ test_lfb_integration_event_not_found (void) g_assert_cmpint (lfb_event_get_end_reason (event0), ==, LFB_EVENT_END_REASON_NOT_FOUND); } +static void +on_event_triggered (LfbEvent *event, + GAsyncResult *res, + LfbEvent **cmp) +{ + g_autoptr (GError) err = NULL; + gboolean success; + + g_assert_true (LFB_IS_EVENT (event)); + g_assert_null (*cmp); + + g_debug ("%s: %p, %s", __func__, event, lfb_event_get_event (event)); + success = lfb_event_trigger_feedback_finish (event, res, &err); + g_assert_no_error (err); + g_assert_true (success); + + g_assert_cmpint (lfb_event_get_state (event), ==, LFB_EVENT_STATE_RUNNING); + + /* "Return" event */ + *cmp = event; +} + static void on_event_triggered_quit (LfbEvent *event, GAsyncResult *res, @@ -169,6 +191,32 @@ on_event_end_finished (LfbEvent *event, g_main_loop_quit (mainloop); } +static void +test_lfb_integration_event_not_found_async (void) +{ + g_autoptr(LfbEvent) event0 = NULL; + LfbEvent *cmp = NULL; + LfbEvent *cmp2 = NULL; + + event0 = lfb_event_new ("test-does-not-exist"); + g_signal_connect (event0, "feedback-ended", (GCallback)on_feedback_ended, &cmp2); + + /* The main loop will only quit if the "feedback-ended" signal actually gets emitted */ + g_signal_connect_swapped (event0, "feedback-ended", (GCallback)g_main_loop_quit, mainloop); + + lfb_event_trigger_feedback_async (event0, + NULL, + (GAsyncReadyCallback)on_event_triggered, + &cmp); + g_main_loop_run (mainloop); + + /* If the signal fired cmp will match event */ + g_assert_true (event0 == cmp); + g_assert_true (event0 == cmp2); + g_assert_cmpint (lfb_event_get_state (event0), ==, LFB_EVENT_STATE_ENDED); + g_assert_cmpint (lfb_event_get_end_reason (event0), ==, LFB_EVENT_END_REASON_NOT_FOUND); +} + static void test_lfb_integration_event_async (void) { @@ -307,6 +355,11 @@ main (gint argc, gchar *argv[]) (gpointer)test_lfb_integration_event_not_found, (gpointer)fixture_teardown); + g_test_add("/feedbackd/lfb-integration/event_not_found_async", TestFixture, NULL, + (gpointer)fixture_setup, + (gpointer)test_lfb_integration_event_not_found_async, + (gpointer)fixture_teardown); + g_test_add("/feedbackd/lfb-integration/profile", TestFixture, NULL, (gpointer)fixture_setup, (gpointer)test_lfb_integration_profile, From d739a33a5fd5d484369180f8fbd62214712e0f44 Mon Sep 17 00:00:00 2001 From: Evangelos Ribeiro Tzaras Date: Fri, 4 Nov 2022 09:43:09 +0100 Subject: [PATCH 4/4] feedback-manager: Complete DBus call before emitting "feedback-ended" See previous commit adding the test (that now passes) for the reasoning. Fixes: #62 --- src/fbd-feedback-manager.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/fbd-feedback-manager.c b/src/fbd-feedback-manager.c index dbcf08d..9578bd8 100644 --- a/src/fbd-feedback-manager.c +++ b/src/fbd-feedback-manager.c @@ -384,6 +384,8 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object, found_fb = FALSE; } + lfb_gdbus_feedback_complete_trigger_feedback (object, invocation, event_id); + if (found_fb) { g_signal_connect_object (event, "feedbacks-ended", (GCallback) on_event_feedbacks_ended, @@ -397,7 +399,6 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object, FBD_EVENT_END_REASON_NOT_FOUND); } - lfb_gdbus_feedback_complete_trigger_feedback (object, invocation, event_id); return TRUE; }