Initial commit

Signed-off-by: Guido Günther <agx@sigxcpu.org>
This commit is contained in:
Guido Günther
2020-02-14 17:40:34 +01:00
commit 3663b7d149
83 changed files with 8059 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
{
"name" : "default",
"profiles" : [
{
"name" : "full",
"feedbacks" : [
{
"type" : "Dummy",
"event-name" : "test-dummy-0"
},
{
"type" : "Dummy",
"event-name" : "test-dummy-10",
"duration" : 10000
}
]
},
{
"name" : "quiet",
"feedbacks" : [
{
"type" : "Dummy",
"event-name" : "test-dummy-0"
},
{
"type" : "Dummy",
"event-name" : "test-dummy-10",
"duration" : 10000
}
]
},
{
"name" : "silent"
}
]
}
+86
View File
@@ -0,0 +1,86 @@
if get_option('tests')
test_env = environment()
test_env.set('G_TEST_SRCDIR', meson.current_source_dir())
test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
test_env.set('G_DEBUG', 'gc-friendly,fatal-warnings')
test_env.set('GSETTINGS_BACKEND', 'memory')
test_env.set('GSETTINGS_SCHEMA_DIR', '@0@/data'.format(meson.build_root()))
test_env.set('PYTHONDONTWRITEBYTECODE', 'yes')
test_env.set('MALLOC_CHECK_', '2')
test_env.set('XDG_CONFIG_HOME', meson.current_source_dir())
test_env.set('XDG_CONFIG_DIRS', meson.current_source_dir())
# Shared lfbrary Unit tests
test_lfb_cflags = [
'-DTEST_APP_ID="org.sigxcpu.feedbackd_test"',
'-DLIBFEEDBACK_USE_UNSTABLE_API',
'-DTEST_DATA_DIR="@0@"'.format(join_paths(meson.current_source_dir(), 'data')),
]
test_lfb_link_args = [
'-fPIC',
]
test_lfb_deps = [
libfeedback_dep,
glib,
gio_unix,
]
lfb_tests = [
'lfb-event',
]
if get_option ('daemon')
# The integration test needs the daemon
lfb_tests += 'lfb-integration'
subdir('services')
endif
foreach test : lfb_tests
t = executable('test-@0@'.format(test),
['test-@0@.c'.format(test)],
c_args : test_lfb_cflags,
pie : true,
link_args : test_lfb_link_args,
dependencies : test_lfb_deps)
test(test, t, env: test_env)
endforeach
# Daemon Unit tests
if get_option('daemon')
test_fbd_cflags = [
'-DTEST_APP_ID="org.sigxcpu.feedbackd_test"',
]
test_fbd_link_args = [
'-fPIC',
]
test_fbd_deps = [
fbd_dep,
]
fbd_tests = [
'fbd-feedback-profile',
'fbd-feedback-theme',
]
foreach test : fbd_tests
t = executable('test-@0@'.format(test),
['test-@0@.c'.format(test)],
c_args : test_fbd_cflags,
pie : true,
link_args : test_fbd_link_args,
include_directories : fbd_inc,
dependencies : test_fbd_deps)
test(test, t, env : test_env)
endforeach
endif # daemon
endif
+9
View File
@@ -0,0 +1,9 @@
service_file = 'org.sigxcpu.Feedback.service'
service_data = configuration_data()
service_data.set('ABS_BUILDDIR', meson.build_root())
configure_file(
input : service_file + '.in',
output : service_file,
configuration : service_data
)
@@ -0,0 +1,4 @@
[D-BUS Service]
Name=org.sigxcpu.Feedback
Exec=@ABS_BUILDDIR@/run
+168
View File
@@ -0,0 +1,168 @@
/*
* Copyright (C) 2020 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
* Author: Guido Günther <agx@sigxcpu.org>
*/
#include "fbd-event.h"
#include "fbd-feedback-dummy.h"
#define TEST_EVENT "window-close"
static void
test_fbd_event (void)
{
g_autoptr(FbdEvent) event = NULL;
g_autofree gchar *appid = NULL;
g_autofree gchar *name = NULL;
FbdEventEndReason reason;
gint timeout;
event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, 2);
g_assert_true (FBD_IS_EVENT (event));
g_object_get (event,
"end-reason", &reason,
"event", &name,
"app-id", &appid,
"timeout", &timeout,
NULL);
g_assert_cmpstr (fbd_event_get_event (event), ==, TEST_EVENT);
g_assert_cmpstr (name, ==, TEST_EVENT);
g_assert_cmpstr (fbd_event_get_app_id (event), ==, TEST_APP_ID);
g_assert_cmpstr (appid, ==, TEST_APP_ID);
g_assert_cmpint (fbd_event_get_timeout (event), ==, timeout);
g_assert_cmpint (timeout, ==, 2);
g_assert_cmpint (fbd_event_get_end_reason (event), ==, FBD_EVENT_END_REASON_NORMAL);
g_assert_cmpint (reason, ==, FBD_EVENT_END_REASON_NORMAL);
}
static void
test_fbd_event_feedback (void)
{
GSList *feedbacks;
g_autoptr(FbdEvent) event = NULL;
g_autoptr(FbdFeedbackDummy) feedback1 = NULL;
g_autoptr(FbdFeedbackDummy) feedback2 = NULL;
event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, -1);
feedback1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
feedback2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
feedbacks = fbd_event_get_feedbacks (event);
g_assert_cmpint (g_slist_length (feedbacks), ==, 0);
fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
feedbacks = fbd_event_get_feedbacks (event);
g_assert_cmpint (g_slist_length (feedbacks), ==, 1);
/* Remove non existing feedback */
fbd_event_remove_feedback (event, FBD_FEEDBACK_BASE(feedback2));
feedbacks = fbd_event_get_feedbacks (event);
g_assert_cmpint (g_slist_length (feedbacks), ==, 1);
fbd_event_remove_feedback (event, FBD_FEEDBACK_BASE(feedback1));
feedbacks = fbd_event_get_feedbacks (event);
g_assert_cmpint (g_slist_length (feedbacks), ==, 0);
fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback2));
feedbacks = fbd_event_get_feedbacks (event);
g_assert_cmpint (g_slist_length (feedbacks), ==, 2);
g_assert_false (fbd_event_get_feedbacks_ended (event));
fbd_event_end_feedbacks (event);
/* Dummy feedback ends immediately */
g_assert_true (fbd_event_get_feedbacks_ended (event));
}
static void
on_feedbacks_ended (FbdEvent *event, gboolean *ended)
{
FBD_IS_EVENT (event);
*ended = TRUE;
}
static void
test_fbd_event_feedback_ended (void)
{
g_autoptr(FbdEvent) event = NULL;
g_autoptr(FbdFeedbackDummy) feedback1 = NULL;
g_autoptr(FbdFeedbackDummy) feedback2 = NULL;
gboolean ended = FALSE;
event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, FBD_EVENT_TIMEOUT_ONESHOT);
feedback1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
feedback2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback2));
g_signal_connect (event, "feedbacks-ended",
(GCallback)on_feedbacks_ended, &ended);
fbd_event_end_feedbacks (event);
g_assert_true (ended);
}
static void
test_fbd_event_feedback_loop (void)
{
g_autoptr(FbdEvent) event = NULL;
g_autoptr(FbdFeedbackDummy) feedback1 = NULL;
g_autoptr(FbdFeedbackDummy) feedback2 = NULL;
gboolean ended = FALSE;
event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, FBD_EVENT_TIMEOUT_LOOP);
feedback1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
feedback2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback2));
g_signal_connect (event, "feedbacks-ended",
(GCallback)on_feedbacks_ended, &ended);
g_assert_false (ended);
fbd_event_end_feedbacks (event);
g_assert_true (ended);
}
static void
test_fbd_event_feedback_timeout (void)
{
g_autoptr(FbdEvent) event = NULL;
g_autoptr(FbdFeedbackDummy) feedback1 = NULL;
g_autoptr(FbdFeedbackDummy) feedback2 = NULL;
gboolean ended = FALSE;
event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, 1);
feedback1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
feedback2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback2));
g_signal_connect (event, "feedbacks-ended",
(GCallback)on_feedbacks_ended, &ended);
g_assert_false (ended);
fbd_event_end_feedbacks (event);
g_assert_true (ended);
}
gint
main (gint argc, gchar *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func("/feedbackd/fbd/event/new", test_fbd_event);
g_test_add_func("/feedbackd/fbd/event/feedbacks/props", test_fbd_event_feedback);
g_test_add_func("/feedbackd/fbd/event/feedbacks/ended", test_fbd_event_feedback_ended);
g_test_add_func("/feedbackd/fbd/event/feedbacks/loop", test_fbd_event_feedback_loop);
g_test_add_func("/feedbackd/fbd/event/feedbacks/timeout", test_fbd_event_feedback_timeout);
return g_test_run();
}
+94
View File
@@ -0,0 +1,94 @@
/*
* Copyright (C) 2020 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
* Author: Guido Günther <agx@sigxcpu.org>
*/
#include "fbd-feedback-profile.h"
#include "fbd-feedback-dummy.h"
#include "fbd-feedback-vibra.h"
#include <json-glib/json-glib.h>
#define PROFILE_NAME "test"
static void
test_fbd_feedback_profile_name (void)
{
g_autoptr(FbdFeedbackProfile) profile = fbd_feedback_profile_new (PROFILE_NAME);
g_assert_true (FBD_IS_FEEDBACK_PROFILE (profile));
g_assert_cmpstr (fbd_feedback_profile_get_name (profile), ==, PROFILE_NAME);
}
static void
test_fbd_feedback_profile_feedbacks (void)
{
GHashTable *feedbacks;
FbdFeedbackBase *fb;
g_autoptr (FbdFeedbackDummy) fb1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY,
"event-name", "event1",
NULL);
g_autoptr (FbdFeedbackDummy) fb2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY,
"event-name", "event2",
NULL);
g_autoptr(FbdFeedbackProfile) profile = fbd_feedback_profile_new (PROFILE_NAME);
g_assert_true (FBD_IS_FEEDBACK_PROFILE (profile));
g_object_get (profile, "feedbacks", &feedbacks, NULL);
g_assert_nonnull (feedbacks);
g_hash_table_unref (feedbacks);
fbd_feedback_profile_add_feedback (profile, FBD_FEEDBACK_BASE(fb1));
fbd_feedback_profile_add_feedback (profile, FBD_FEEDBACK_BASE(fb2));
fb = fbd_feedback_profile_get_feedback (profile, "event1");
g_assert_cmpstr (fbd_feedback_get_event_name (fb), ==, "event1");
fb = fbd_feedback_profile_get_feedback (profile, "does-not-exist");
g_assert_null (fb);
}
static void
test_fbd_feedback_profile_parse (void)
{
const char *json =" "
" { "
" \"name\" : \"full\", "
" \"feedbacks\" : [ "
" { "
" \"type\" : \"vibra\", "
" \"event-name\" : \"event1\" "
" }, "
" { "
" \"type\" : \"dummy\", "
" \"event-name\" : \"event2\" "
" } "
" ] "
" } ";
g_autoptr (GError) err = NULL;
g_autoptr (FbdFeedbackProfile) profile = NULL;
JsonNode *node;
FbdFeedbackBase *fb;
node = json_from_string(json, &err);
g_assert_no_error (err);
profile = FBD_FEEDBACK_PROFILE (json_gobject_deserialize (FBD_TYPE_FEEDBACK_PROFILE, node));
g_assert_nonnull (profile);
fb = fbd_feedback_profile_get_feedback (profile, "event2");
g_assert_true (FBD_IS_FEEDBACK_DUMMY(fb));
fb = fbd_feedback_profile_get_feedback (profile, "event1");
g_assert_true (FBD_IS_FEEDBACK_VIBRA(fb));
}
gint
main (gint argc, gchar *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func("/feedbackd/fbd/feedback-profile/name", test_fbd_feedback_profile_name);
g_test_add_func("/feedbackd/fbd/feedback-profile/feedbacks", test_fbd_feedback_profile_feedbacks);
g_test_add_func("/feedbackd/fbd/feedback-profile/parse", test_fbd_feedback_profile_parse);
return g_test_run();
}
+124
View File
@@ -0,0 +1,124 @@
/*
* Copyright (C) 2020 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
* Author: Guido Günther <agx@sigxcpu.org>
*/
#include "fbd-feedback-dummy.h"
#include "fbd-feedback-theme.h"
#include <json-glib/json-glib.h>
#define THEME_NAME "test"
static void
test_fbd_feedback_theme_name (void)
{
g_autoptr(FbdFeedbackTheme) theme = fbd_feedback_theme_new (THEME_NAME);
g_assert_true (FBD_IS_FEEDBACK_THEME (theme));
g_assert_cmpstr (fbd_feedback_theme_get_name (theme), ==, THEME_NAME);
}
static void
test_fbd_feedback_theme_profiles (void)
{
g_autoptr (FbdFeedbackDummy) quiet_fb1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY,
"event-name", "event1",
NULL);
g_autoptr (FbdFeedbackDummy) quiet_fb2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY,
"event-name", "event2",
NULL);
g_autoptr (FbdFeedbackDummy) full_fb1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY,
"event-name", "event1",
NULL);
g_autoptr (FbdFeedbackDummy) full_fb2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY,
"event-name", "event2",
NULL);
g_autoptr(FbdFeedbackTheme) theme = fbd_feedback_theme_new (THEME_NAME);
FbdFeedbackProfile *profile_full = fbd_feedback_profile_new ("full");
FbdFeedbackProfile *profile_quiet = fbd_feedback_profile_new ("quiet");
FbdFeedbackProfile *profile;
fbd_feedback_profile_add_feedback (profile_quiet, FBD_FEEDBACK_BASE(quiet_fb1));
fbd_feedback_profile_add_feedback (profile_quiet, FBD_FEEDBACK_BASE(quiet_fb2));
fbd_feedback_profile_add_feedback (profile_full, FBD_FEEDBACK_BASE(full_fb1));
fbd_feedback_profile_add_feedback (profile_full, FBD_FEEDBACK_BASE(full_fb2));
g_assert_true (FBD_IS_FEEDBACK_THEME (theme));
fbd_feedback_theme_add_profile (theme, profile_quiet);
fbd_feedback_theme_add_profile (theme, profile_full);
profile = fbd_feedback_theme_get_profile (theme, "full");
g_assert_true (FBD_IS_FEEDBACK_PROFILE (profile));
g_print ("%s\n", json_gobject_to_data (G_OBJECT(theme), NULL));
}
static void
test_fbd_feedback_theme_parse (void)
{
const char *json =" "
"{ "
" \"name\" : \"test\", "
" \"profiles\" : [ "
" { "
" \"name\" : \"full\", "
" \"feedbacks\" : [ "
" { "
" \"type\" : \"dummy\", "
" \"event-name\" : \"event1\" "
" }, "
" { "
" \"type\" : \"dummy\", "
" \"event-name\" : \"event2\" "
" } "
" ] "
" }, "
" { "
" \"name\" : \"quiet\", "
" \"feedbacks\" : [ "
" { "
" \"type\" : \"dummy\", "
" \"event-name\" : \"event1\" "
" }, "
" { "
" \"type\" : \"dummy\", "
" \"event-name\" : \"event2\" "
" } "
" ] "
" } "
" ] "
"} ";
g_autoptr (GError) err = NULL;
g_autoptr (FbdFeedbackTheme) theme = NULL;
FbdFeedbackProfile *profile;
theme = fbd_feedback_theme_new_from_data (json, &err);
g_assert_no_error (err);
g_assert_nonnull (theme);
profile = fbd_feedback_theme_get_profile (theme, "full");
g_assert_true (FBD_IS_FEEDBACK_PROFILE(profile));
g_assert_cmpstr ("full", ==,
fbd_feedback_profile_get_name (profile));
profile = fbd_feedback_theme_get_profile (theme, "quiet");
g_assert_true (FBD_IS_FEEDBACK_PROFILE(profile));
g_assert_cmpstr ("quiet", ==,
fbd_feedback_profile_get_name (profile));
}
gint
main (gint argc, gchar *argv[])
{
g_test_init (&argc, &argv, NULL);
g_test_add_func("/feedbackd/fbd/feedback-theme/name", test_fbd_feedback_theme_name);
g_test_add_func("/feedbackd/fbd/feedback-theme/profiles", test_fbd_feedback_theme_profiles);
g_test_add_func("/feedbackd/fbd/feedback-theme/parse", test_fbd_feedback_theme_parse);
return g_test_run();
}
+69
View File
@@ -0,0 +1,69 @@
/*
* Copyright (C) 2020 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
* Author: Guido Günther <agx@sigxcpu.org>
*/
#include "libfeedback.h"
#include <gio/gio.h>
/* Property set/get */
static void
test_lfb_event_props (void)
{
g_autoptr(LfbEvent) event = NULL;
g_autofree gchar *evname = NULL;
gint timeout;
g_assert_true (lfb_init (TEST_APP_ID, NULL));
event = lfb_event_new ("window-close");
g_assert_true (LFB_IS_EVENT (event));
g_object_get (event, "event", &evname, NULL);
g_assert_cmpstr (evname, ==, "window-close");
g_object_get (event, "timeout", &timeout, NULL);
g_assert_cmpint (timeout, ==, -1);
g_assert_cmpint (lfb_event_get_end_reason (event), ==, LFB_EVENT_END_REASON_NATURAL);
g_assert_cmpint (lfb_event_get_state (event), ==, LFB_EVENT_STATE_NONE);
lfb_uninit ();
}
/* Test failure paths when no feedback daemon is running */
static void
test_lfb_event_trigger (void)
{
g_autoptr(LfbEvent) event = NULL;
g_autofree gchar *evname = NULL;
g_autoptr (GError) err = NULL;
g_assert_true (lfb_init (TEST_APP_ID, NULL));
event = lfb_event_new ("window-close");
g_assert_false (lfb_event_trigger_feedback (event, &err));
g_assert_nonnull (err);
g_clear_error (&err);
g_assert_false (lfb_event_end_feedback (event, &err));
g_assert_nonnull (err);
g_clear_error (&err);
lfb_uninit ();
}
gint
main (gint argc, gchar *argv[])
{
g_test_init (&argc, &argv, NULL);
g_autoptr(GTestDBus) bus = g_test_dbus_new (0);
g_test_dbus_up (bus);
g_test_add_func("/feedbackd/libfeedback/lfb-event/props", test_lfb_event_props);
g_test_add_func("/feedbackd/libfeedback/lfb-event/trigger", test_lfb_event_trigger);
return g_test_run();
}
+228
View File
@@ -0,0 +1,228 @@
/*
* Copyright (C) 2020 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
* Author: Guido Günther <agx@sigxcpu.org>
*/
#include "libfeedback.h"
#include <gio/gio.h>
typedef struct {
GTestDBus *dbus;
} TestFixture;
GMainLoop *mainloop;
static void
fixture_setup (TestFixture *fixture, gconstpointer unused)
{
g_autoptr (GError) err = NULL;
gchar *relative, *servicesdir;
gint success;
fixture->dbus = g_test_dbus_new (G_TEST_DBUS_NONE);
relative = g_test_build_filename (G_TEST_BUILT, "services", NULL);
servicesdir = g_canonicalize_filename (relative, NULL);
g_free (relative);
g_test_dbus_add_service_dir (fixture->dbus, servicesdir);
g_free (servicesdir);
g_setenv ("FEEDBACK_THEME", TEST_DATA_DIR "/test.json", TRUE);
g_setenv ("GSETTINGS_BACKEND", "memory", TRUE);
g_test_dbus_up (fixture->dbus);
g_assert_null (mainloop);
mainloop = g_main_loop_new (NULL, FALSE);
success = lfb_init (TEST_APP_ID, &err);
g_assert_no_error (err);
g_assert_true (success);
}
static void
fixture_teardown (TestFixture *fixture, gconstpointer unused)
{
g_clear_pointer (&mainloop, g_main_loop_unref);
lfb_uninit ();
g_test_dbus_down (fixture->dbus);
g_object_unref (fixture->dbus);
}
static void
on_feedback_ended (LfbEvent *event, LfbEvent **cmp)
{
g_assert_true (LFB_IS_EVENT (event));
g_assert_null (*cmp);
g_debug ("Feedback ended for %s", lfb_event_get_event (event));
g_assert_cmpint (lfb_event_get_end_reason (event), ==, LFB_EVENT_END_REASON_EXPLICIT);
/* "Return" event */
*cmp = event;
g_main_loop_quit (mainloop);
}
static void
test_lfb_integration_event_sync (void)
{
g_autoptr(LfbEvent) event0 = NULL;
g_autoptr(LfbEvent) event1 = NULL;
g_autoptr(LfbEvent) event10 = NULL;
g_autofree gchar *evname = NULL;
g_autoptr (GError) err = NULL;
LfbEvent *cmp = NULL;
gboolean success;
event0 = lfb_event_new ("test-dummy-0");
success = lfb_event_trigger_feedback (event0, &err);
g_assert_no_error (err);
g_assert_true (success);
event10 = lfb_event_new ("test-dummy-10");
g_signal_connect (event10, "feedback-ended", (GCallback)on_feedback_ended, &cmp);
success = lfb_event_trigger_feedback (event10, &err);
g_assert_no_error (err);
g_assert_true (success);
success = lfb_event_end_feedback (event10, &err);
g_assert_no_error (err);
g_assert_true (success);
g_main_loop_run (mainloop);
/* If the signal fired cmp will match event */
g_assert_true (event10 == cmp);
g_assert_cmpint (lfb_event_get_state (event10), ==, LFB_EVENT_STATE_ENDED);
g_assert_cmpint (lfb_event_get_end_reason (event10), ==, LFB_EVENT_END_REASON_EXPLICIT);
}
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", __func__);
success = lfb_event_trigger_feedback_finish (event, res, &err);
g_assert_no_error (err);
g_assert_true (success);
/* "Return" event */
*cmp = event;
g_main_loop_quit (mainloop);
}
static void
on_event_ended (LfbEvent *event,
GAsyncResult *res,
LfbEvent **cmp)
{
g_autoptr (GError) err = NULL;
gboolean success;
g_debug ("%s", __func__);
g_assert_true (LFB_IS_EVENT (event));
g_assert_null (*cmp);
success = lfb_event_end_feedback_finish (event, res, &err);
g_assert_no_error (err);
g_assert_true (success);
/* "Return" event */
*cmp = event;
g_main_loop_quit (mainloop);
}
static void
test_lfb_integration_event_async (void)
{
g_autoptr(LfbEvent) event0 = NULL;
g_autoptr(LfbEvent) event10 = NULL;
g_autofree gchar *evname = NULL;
g_autoptr (GError) err = NULL;
LfbEvent *cmp = NULL;
gboolean success;
event0 = lfb_event_new ("test-dummy-0");
lfb_event_trigger_feedback_async (event0,
NULL,
(GAsyncReadyCallback)on_event_triggered,
&cmp);
g_main_loop_run (mainloop);
/* The async finish callback saw the right event */
g_assert_true (event0 == cmp);
cmp = NULL;
event10 = lfb_event_new ("test-dummy-10");
success = lfb_event_trigger_feedback (event10, &err);
g_assert_no_error (err);
g_assert_true (success);
lfb_event_end_feedback_async (event10,
NULL,
(GAsyncReadyCallback)on_event_ended,
&cmp);
g_main_loop_run (mainloop);
/* The async finish callback saw the right event */
g_assert_true (event10 == cmp);
g_assert_cmpint (lfb_event_get_state (event10), ==, LFB_EVENT_STATE_ENDED);
}
static void
on_profile_changed (LfbGdbusFeedback *proxy, GParamSpec *psepc, const gchar **profile)
{
g_assert_null (*profile);
*profile = lfb_get_feedback_profile();
g_debug("Set feedback profile to: '%s'", *profile);
g_main_loop_quit (mainloop);
}
static void
test_lfb_integration_profile (void)
{
g_autoptr (GError) err = NULL;
LfbGdbusFeedback *proxy;
gchar *cmp = NULL;
g_assert_cmpstr (lfb_get_feedback_profile (), ==, "full");
proxy = lfb_get_proxy ();
g_assert_nonnull (proxy);
lfb_set_feedback_profile ("quiet");
g_signal_connect (proxy, "notify::profile", (GCallback)on_profile_changed, &cmp);
g_main_loop_run (mainloop);
g_assert_cmpstr (lfb_get_feedback_profile (), ==, "quiet");
g_assert_cmpstr (cmp, ==, "quiet");
}
gint
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);
g_test_add("/feedbackd/lfb-integration/event_async", TestFixture, NULL,
(gpointer)fixture_setup,
(gpointer)test_lfb_integration_event_async,
(gpointer)fixture_teardown);
g_test_add("/feedbackd/lfb-integration/profile", TestFixture, NULL,
(gpointer)fixture_setup,
(gpointer)test_lfb_integration_profile,
(gpointer)fixture_teardown);
return g_test_run();
}