1 /*
2  * Copyright (C) 2020 Purism SPC
3  * SPDX-License-Identifier: GPL-3.0+
4  * Author: Guido Günther <agx@sigxcpu.org>
5  */
6 
7 #include "fbd-event.h"
8 #include "fbd-feedback-dummy.h"
9 
10 #define TEST_EVENT "window-close"
11 
12 static void
test_fbd_event(void)13 test_fbd_event (void)
14 {
15   g_autoptr(FbdEvent) event = NULL;
16   g_autofree gchar *appid = NULL;
17   g_autofree gchar *name = NULL;
18   g_autofree gchar *sender = NULL;
19   FbdEventEndReason reason;
20   gint timeout;
21 
22   event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, 2, "sender-id");
23 
24   g_assert_true (FBD_IS_EVENT (event));
25   g_object_get (event,
26                 "end-reason", &reason,
27                 "event", &name,
28                 "app-id", &appid,
29                 "timeout", &timeout,
30                 "sender", &sender,
31                 NULL);
32 
33   g_assert_cmpstr (fbd_event_get_event (event), ==, TEST_EVENT);
34   g_assert_cmpstr (name, ==, TEST_EVENT);
35 
36   g_assert_cmpstr (fbd_event_get_app_id (event), ==, TEST_APP_ID);
37   g_assert_cmpstr (appid, ==, TEST_APP_ID);
38 
39   g_assert_cmpint (fbd_event_get_timeout (event), ==, timeout);
40   g_assert_cmpint (timeout, ==, 2);
41 
42   g_assert_cmpstr (fbd_event_get_sender (event), ==, sender);
43   g_assert_cmpstr (sender, ==, "sender-id");
44 
45   g_assert_cmpint (fbd_event_get_end_reason (event), ==, FBD_EVENT_END_REASON_NATURAL);
46   g_assert_cmpint (reason, ==, FBD_EVENT_END_REASON_NATURAL);
47 }
48 
49 static void
test_fbd_event_feedback(void)50 test_fbd_event_feedback (void)
51 {
52   GSList *feedbacks;
53   g_autoptr(FbdEvent) event = NULL;
54   g_autoptr(FbdFeedbackDummy) feedback1 = NULL;
55   g_autoptr(FbdFeedbackDummy) feedback2 = NULL;
56 
57   event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, -1, NULL);
58   feedback1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
59   feedback2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
60 
61   feedbacks = fbd_event_get_feedbacks (event);
62   g_assert_cmpint (g_slist_length (feedbacks), ==, 0);
63 
64   fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
65   feedbacks = fbd_event_get_feedbacks (event);
66   g_assert_cmpint (g_slist_length (feedbacks), ==, 1);
67 
68   /* Remove non existing feedback */
69   fbd_event_remove_feedback (event, FBD_FEEDBACK_BASE(feedback2));
70   feedbacks = fbd_event_get_feedbacks (event);
71   g_assert_cmpint (g_slist_length (feedbacks), ==, 1);
72 
73   fbd_event_remove_feedback (event, FBD_FEEDBACK_BASE(feedback1));
74   feedbacks = fbd_event_get_feedbacks (event);
75   g_assert_cmpint (g_slist_length (feedbacks), ==, 0);
76 
77   fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
78   fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback2));
79   feedbacks = fbd_event_get_feedbacks (event);
80   g_assert_cmpint (g_slist_length (feedbacks), ==, 2);
81 
82   g_assert_false (fbd_event_get_feedbacks_ended (event));
83   fbd_event_end_feedbacks (event);
84   /* Dummy feedback ends immediately */
85   g_assert_true (fbd_event_get_feedbacks_ended (event));
86 }
87 
88 static void
on_feedbacks_ended(FbdEvent * event,gboolean * ended)89 on_feedbacks_ended (FbdEvent *event, gboolean *ended)
90 {
91   FBD_IS_EVENT (event);
92 
93   *ended = TRUE;
94 }
95 
96 static void
test_fbd_event_feedback_ended(void)97 test_fbd_event_feedback_ended (void)
98 {
99   g_autoptr(FbdEvent) event = NULL;
100   g_autoptr(FbdFeedbackDummy) feedback1 = NULL;
101   g_autoptr(FbdFeedbackDummy) feedback2 = NULL;
102   gboolean ended = FALSE;
103 
104   event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, FBD_EVENT_TIMEOUT_ONESHOT, NULL);
105   feedback1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
106   fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
107   feedback2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
108   fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback2));
109 
110   g_signal_connect (event, "feedbacks-ended",
111                     (GCallback)on_feedbacks_ended, &ended);
112 
113   fbd_event_end_feedbacks (event);
114   g_assert_true (ended);
115 }
116 
117 static void
test_fbd_event_feedback_loop(void)118 test_fbd_event_feedback_loop (void)
119 {
120   g_autoptr(FbdEvent) event = NULL;
121   g_autoptr(FbdFeedbackDummy) feedback1 = NULL;
122   g_autoptr(FbdFeedbackDummy) feedback2 = NULL;
123   gboolean ended = FALSE;
124 
125   event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, FBD_EVENT_TIMEOUT_LOOP, NULL);
126   feedback1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
127   fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
128   feedback2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
129   fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback2));
130 
131   g_signal_connect (event, "feedbacks-ended",
132                     (GCallback)on_feedbacks_ended, &ended);
133   g_assert_false (ended);
134 
135   fbd_event_end_feedbacks (event);
136   g_assert_true (ended);
137 }
138 
139 static void
test_fbd_event_feedback_timeout(void)140 test_fbd_event_feedback_timeout (void)
141 {
142   g_autoptr(FbdEvent) event = NULL;
143   g_autoptr(FbdFeedbackDummy) feedback1 = NULL;
144   g_autoptr(FbdFeedbackDummy) feedback2 = NULL;
145   gboolean ended = FALSE;
146 
147   event = fbd_event_new (1, TEST_APP_ID, TEST_EVENT, 1, NULL);
148   feedback1 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
149   fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback1));
150   feedback2 = g_object_new (FBD_TYPE_FEEDBACK_DUMMY, NULL);
151   fbd_event_add_feedback (event, FBD_FEEDBACK_BASE(feedback2));
152 
153   g_signal_connect (event, "feedbacks-ended",
154                     (GCallback)on_feedbacks_ended, &ended);
155   g_assert_false (ended);
156 
157   fbd_event_end_feedbacks (event);
158   g_assert_true (ended);
159 }
160 
161 gint
main(gint argc,gchar * argv[])162 main (gint argc, gchar *argv[])
163 {
164   g_test_init (&argc, &argv, NULL);
165 
166   g_test_add_func("/feedbackd/fbd/event/new", test_fbd_event);
167   g_test_add_func("/feedbackd/fbd/event/feedbacks/props", test_fbd_event_feedback);
168   g_test_add_func("/feedbackd/fbd/event/feedbacks/ended", test_fbd_event_feedback_ended);
169   g_test_add_func("/feedbackd/fbd/event/feedbacks/loop", test_fbd_event_feedback_loop);
170   g_test_add_func("/feedbackd/fbd/event/feedbacks/timeout", test_fbd_event_feedback_timeout);
171 
172   return g_test_run();
173 }
174