1 /* GSequencer - Advanced GTK Sequencer
2  * Copyright (C) 2005-2020 Joël Krähemann
3  *
4  * This file is part of GSequencer.
5  *
6  * GSequencer is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSequencer is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include <glib.h>
21 #include <glib-object.h>
22 
23 #include <CUnit/CUnit.h>
24 #include <CUnit/Automated.h>
25 #include <CUnit/Basic.h>
26 
27 #include <ags/libags.h>
28 
29 int ags_message_queue_test_init_suite();
30 int ags_message_queue_test_clean_suite();
31 
32 void ags_message_queue_test_set_sender_namespace();
33 void ags_message_queue_test_get_sender_namespace();
34 void ags_message_queue_test_set_recipient_namespace();
35 void ags_message_queue_test_get_recipient_namespace();
36 void ags_message_queue_test_set_message_envelope();
37 void ags_message_queue_test_get_message_envelope();
38 void ags_message_queue_test_add_message_envelope();
39 void ags_message_queue_test_remove_message_envelope();
40 void ags_message_queue_test_find_sender();
41 void ags_message_queue_test_find_recipient();
42 void ags_message_queue_test_query_message();
43 
44 #define AGS_MESSAGE_QUEUE_TEST_SENDER_NAMESPACE "test-sender"
45 
46 #define AGS_MESSAGE_QUEUE_TEST_RECIPIENT_NAMESPACE "test-recipient"
47 
48 /* The suite initialization function.
49  * Opens the temporary file used by the tests.
50  * Returns zero on success, non-zero otherwise.
51  */
52 int
ags_message_queue_test_init_suite()53 ags_message_queue_test_init_suite()
54 {
55   return(0);
56 }
57 
58 /* The suite cleanup function.
59  * Closes the temporary file used by the tests.
60  * Returns zero on success, non-zero otherwise.
61  */
62 int
ags_message_queue_test_clean_suite()63 ags_message_queue_test_clean_suite()
64 {
65   return(0);
66 }
67 
68 void
ags_message_queue_test_set_sender_namespace()69 ags_message_queue_test_set_sender_namespace()
70 {
71   AgsMessageQueue *message_queue;
72 
73   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
74 			       NULL);
75 
76   CU_ASSERT(message_queue->sender_namespace == NULL);
77 
78   ags_message_queue_set_sender_namespace(message_queue,
79 					 AGS_MESSAGE_QUEUE_TEST_SENDER_NAMESPACE);
80 
81   CU_ASSERT(!g_strcmp0(message_queue->sender_namespace,
82 		       AGS_MESSAGE_QUEUE_TEST_SENDER_NAMESPACE));
83 }
84 
85 void
ags_message_queue_test_get_sender_namespace()86 ags_message_queue_test_get_sender_namespace()
87 {
88   AgsMessageQueue *message_queue;
89 
90   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
91 			       NULL);
92 
93   message_queue->sender_namespace = g_strdup(AGS_MESSAGE_QUEUE_TEST_SENDER_NAMESPACE);
94 
95   CU_ASSERT(!g_strcmp0(ags_message_queue_get_sender_namespace(message_queue),
96 		       AGS_MESSAGE_QUEUE_TEST_SENDER_NAMESPACE));
97 }
98 
99 void
ags_message_queue_test_set_recipient_namespace()100 ags_message_queue_test_set_recipient_namespace()
101 {
102   AgsMessageQueue *message_queue;
103 
104   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
105 			       NULL);
106 
107   CU_ASSERT(message_queue->recipient_namespace == NULL);
108 
109   ags_message_queue_set_recipient_namespace(message_queue,
110 					    AGS_MESSAGE_QUEUE_TEST_RECIPIENT_NAMESPACE);
111 
112   CU_ASSERT(!g_strcmp0(message_queue->recipient_namespace,
113 		       AGS_MESSAGE_QUEUE_TEST_RECIPIENT_NAMESPACE));
114 }
115 
116 void
ags_message_queue_test_get_recipient_namespace()117 ags_message_queue_test_get_recipient_namespace()
118 {
119   AgsMessageQueue *message_queue;
120 
121   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
122 			       NULL);
123 
124   message_queue->recipient_namespace = g_strdup(AGS_MESSAGE_QUEUE_TEST_RECIPIENT_NAMESPACE);
125 
126   CU_ASSERT(!g_strcmp0(ags_message_queue_get_recipient_namespace(message_queue),
127 		       AGS_MESSAGE_QUEUE_TEST_RECIPIENT_NAMESPACE));
128 }
129 
130 void
ags_message_queue_test_set_message_envelope()131 ags_message_queue_test_set_message_envelope()
132 {
133   AgsMessageQueue *message_queue;
134 
135   GList *start_message_envelope;
136 
137   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
138 			       NULL);
139 
140   start_message_envelope = NULL;
141 
142   start_message_envelope = g_list_prepend(start_message_envelope,
143 					  g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, NULL));
144   start_message_envelope = g_list_prepend(start_message_envelope,
145 					  g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, NULL));
146 
147   CU_ASSERT(message_queue->message_envelope == NULL);
148 
149   ags_message_queue_set_message_envelope(message_queue,
150 					 start_message_envelope);
151 
152   CU_ASSERT(message_queue->message_envelope == start_message_envelope);
153 }
154 
155 void
ags_message_queue_test_get_message_envelope()156 ags_message_queue_test_get_message_envelope()
157 {
158   AgsMessageQueue *message_queue;
159 
160   GList *start_message_envelope;
161 
162   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
163 			       NULL);
164 
165   start_message_envelope = NULL;
166 
167   start_message_envelope = g_list_prepend(start_message_envelope,
168 					  g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, NULL));
169   start_message_envelope = g_list_prepend(start_message_envelope,
170 					  g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, NULL));
171 
172   message_queue->message_envelope = start_message_envelope;
173 
174   CU_ASSERT(ags_message_queue_get_message_envelope(message_queue) == start_message_envelope);
175 }
176 
177 void
ags_message_queue_test_add_message_envelope()178 ags_message_queue_test_add_message_envelope()
179 {
180   AgsMessageQueue *message_queue;
181 
182   AgsMessageEnvelope *message_envelope_0, *message_envelope_1;
183 
184   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
185 			       NULL);
186 
187   message_envelope_0 = g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, NULL);
188 
189   ags_message_queue_add_message_envelope(message_queue,
190 					 message_envelope_0);
191 
192   message_envelope_1 = g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, NULL);
193 
194   ags_message_queue_add_message_envelope(message_queue,
195 					 message_envelope_1);
196 
197   CU_ASSERT(g_list_find(message_queue->message_envelope, message_envelope_0) != NULL);
198   CU_ASSERT(g_list_find(message_queue->message_envelope, message_envelope_1) != NULL);
199 }
200 
201 void
ags_message_queue_test_remove_message_envelope()202 ags_message_queue_test_remove_message_envelope()
203 {
204   AgsMessageQueue *message_queue;
205 
206   GList *start_message_envelope;
207 
208   AgsMessageEnvelope *message_envelope_0, *message_envelope_1;
209 
210   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
211 			       NULL);
212 
213   start_message_envelope = NULL;
214 
215   start_message_envelope = g_list_prepend(start_message_envelope,
216 					  (message_envelope_0 = g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, NULL)));
217   start_message_envelope = g_list_prepend(start_message_envelope,
218 					  (message_envelope_1 = g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, NULL)));
219 
220   message_queue->message_envelope = start_message_envelope;
221 
222   ags_message_queue_remove_message_envelope(message_queue,
223 					    message_envelope_0);
224 
225   CU_ASSERT(g_list_find(message_queue->message_envelope, message_envelope_0) == NULL);
226   CU_ASSERT(g_list_find(message_queue->message_envelope, message_envelope_1) != NULL);
227 
228   ags_message_queue_remove_message_envelope(message_queue,
229 					    message_envelope_1);
230 
231   CU_ASSERT(g_list_find(message_queue->message_envelope, message_envelope_1) == NULL);
232 }
233 
234 void
ags_message_queue_test_find_sender()235 ags_message_queue_test_find_sender()
236 {
237   AgsMessageQueue *message_queue;
238 
239   GList *start_message_envelope;
240 
241   AgsMessageEnvelope *message_envelope_0, *message_envelope_1;
242   AgsThread *sender_0, *sender_1, *sender_2;
243 
244   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
245 			       NULL);
246 
247   start_message_envelope = NULL;
248 
249   start_message_envelope = g_list_prepend(start_message_envelope,
250 					  (message_envelope_0 = g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, "sender", (sender_0 = ags_thread_new()), NULL)));
251   start_message_envelope = g_list_prepend(start_message_envelope,
252 					  (message_envelope_1 = g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, "sender", (sender_1 = ags_thread_new()), NULL)));
253 
254   sender_2 = ags_thread_new();
255 
256   message_queue->message_envelope = start_message_envelope;
257 
258   CU_ASSERT(ags_message_queue_find_sender(message_queue, sender_0) != NULL);
259   CU_ASSERT(ags_message_queue_find_sender(message_queue, sender_1) != NULL);
260   CU_ASSERT(ags_message_queue_find_sender(message_queue, sender_2) == NULL);
261 }
262 
263 void
ags_message_queue_test_find_recipient()264 ags_message_queue_test_find_recipient()
265 {
266   AgsMessageQueue *message_queue;
267 
268   GList *start_message_envelope;
269 
270   AgsMessageEnvelope *message_envelope_0, *message_envelope_1;
271   AgsThread *recipient_0, *recipient_1, *recipient_2;
272 
273   message_queue = g_object_new(AGS_TYPE_MESSAGE_QUEUE,
274 			       NULL);
275 
276   start_message_envelope = NULL;
277 
278   start_message_envelope = g_list_prepend(start_message_envelope,
279 					  (message_envelope_0 = g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, "recipient", (recipient_0 = ags_thread_new()), NULL)));
280   start_message_envelope = g_list_prepend(start_message_envelope,
281 					  (message_envelope_1 = g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, "recipient", (recipient_1 = ags_thread_new()), NULL)));
282 
283   recipient_2 = ags_thread_new();
284 
285   message_queue->message_envelope = start_message_envelope;
286 
287   CU_ASSERT(ags_message_queue_find_recipient(message_queue, recipient_0) != NULL);
288   CU_ASSERT(ags_message_queue_find_recipient(message_queue, recipient_1) != NULL);
289   CU_ASSERT(ags_message_queue_find_recipient(message_queue, recipient_2) == NULL);
290 }
291 
292 void
ags_message_queue_test_query_message()293 ags_message_queue_test_query_message()
294 {
295   AgsMessageQueue *message_queue_0;
296   AgsMessageEnvelope *message_envelope_0, *message_envelope_1;
297 
298   xmlDoc *doc_0, *doc_1;
299   xmlNode *root_node;
300 
301   message_queue_0 = ags_message_queue_new("ags-test-000");
302 
303   /* specify message body */
304   doc_0 = xmlNewDoc("1.0");
305 
306   root_node = xmlNewNode(NULL,
307 			 "ags-command");
308   xmlDocSetRootElement(doc_0, root_node);
309 
310   xmlNewProp(root_node,
311 	     "method",
312 	     "AgsMessageQueueTest::test-signal");
313 
314   message_envelope_0 = ags_message_envelope_new(NULL,
315 						NULL,
316 						doc_0);
317   ags_message_queue_add_message_envelope(message_queue_0,
318 					 message_envelope_0);
319 
320   /* specify message body */
321   doc_1 = xmlNewDoc("1.0");
322 
323   root_node = xmlNewNode(NULL,
324 			 "ags-command");
325   xmlDocSetRootElement(doc_1, root_node);
326 
327   xmlNewProp(root_node,
328 	     "method",
329 	     "AgsMessageQueueTest::test-signal");
330 
331   message_envelope_1 = ags_message_envelope_new(NULL,
332 						NULL,
333 						doc_1);
334   ags_message_queue_add_message_envelope(message_queue_0,
335 					 message_envelope_1);
336 
337   CU_ASSERT(ags_message_queue_query_message(message_queue_0,
338 					    "/ags-command[@method = 'AgsMessageQueueTest::test-signal']") != NULL);
339   CU_ASSERT(ags_message_queue_query_message(message_queue_0,
340 					    "/ags-command[@method = 'AgsMessageQueueTest::test-signal']") != NULL);
341 
342   CU_ASSERT(g_list_length(ags_message_queue_query_message(message_queue_0,
343 							  "/ags-command[@method = 'AgsMessageQueueTest::test-signal']")) == 2);
344 }
345 
346 int
main(int argc,char ** argv)347 main(int argc, char **argv)
348 {
349   CU_pSuite pSuite = NULL;
350 
351   /* initialize the CUnit test registry */
352   if(CUE_SUCCESS != CU_initialize_registry()){
353     return CU_get_error();
354   }
355 
356   /* add a suite to the registry */
357   pSuite = CU_add_suite("AgsMessageQueueTest", ags_message_queue_test_init_suite, ags_message_queue_test_clean_suite);
358 
359   if(pSuite == NULL){
360     CU_cleanup_registry();
361 
362     return CU_get_error();
363   }
364 
365   /* add the tests to the suite */
366   if((CU_add_test(pSuite, "test of AgsMessageQueue set sender namespace", ags_message_queue_test_set_sender_namespace) == NULL) ||
367      (CU_add_test(pSuite, "test of AgsMessageQueue get sender namespace", ags_message_queue_test_get_sender_namespace) == NULL) ||
368      (CU_add_test(pSuite, "test of AgsMessageQueue set recipient namespace", ags_message_queue_test_set_recipient_namespace) == NULL) ||
369      (CU_add_test(pSuite, "test of AgsMessageQueue get recipient namespace", ags_message_queue_test_get_recipient_namespace) == NULL) ||
370      (CU_add_test(pSuite, "test of AgsMessageQueue set message envelope", ags_message_queue_test_set_message_envelope) == NULL) ||
371      (CU_add_test(pSuite, "test of AgsMessageQueue get message envelope", ags_message_queue_test_get_message_envelope) == NULL) ||
372      (CU_add_test(pSuite, "test of AgsMessageQueue add message envelope", ags_message_queue_test_add_message_envelope) == NULL) ||
373      (CU_add_test(pSuite, "test of AgsMessageQueue remove message envelope", ags_message_queue_test_remove_message_envelope) == NULL) ||
374      (CU_add_test(pSuite, "test of AgsMessageQueue find sender", ags_message_queue_test_find_sender) == NULL) ||
375      (CU_add_test(pSuite, "test of AgsMessageQueue find recipient", ags_message_queue_test_find_recipient) == NULL) ||
376      (CU_add_test(pSuite, "test of AgsMessageQueue query message", ags_message_queue_test_query_message) == NULL)){
377     CU_cleanup_registry();
378 
379     return CU_get_error();
380   }
381 
382   /* Run all tests using the CUnit Basic interface */
383   CU_basic_set_mode(CU_BRM_VERBOSE);
384   CU_basic_run_tests();
385 
386   CU_cleanup_registry();
387 
388   return(CU_get_error());
389 }
390 
391