Timeout merge #3:
[opensync.git] / tests / ipc-tests / check_ipc.c
blob10dadd8522bf19ea10b5ad86d821d66b704fdb1e
1 #include "support.h"
2 #ifndef _WIN32
3 #include <sys/wait.h>
4 #endif
6 #include <opensync/opensync-ipc.h>
7 #include "opensync/ipc/opensync_message_internals.h"
8 #include "opensync/ipc/opensync_queue_internals.h"
10 START_TEST (ipc_new)
12 char *testbed = setup_testbed(NULL);
13 osync_testing_file_remove("/tmp/testpipe");
15 OSyncError *error = NULL;
16 OSyncQueue *queue1 = osync_queue_new("/tmp/testpipe", &error);
17 fail_unless(queue1 != NULL, NULL);
18 fail_unless(error == NULL, NULL);
20 osync_queue_unref(queue1);
22 destroy_testbed(testbed);
24 END_TEST
26 START_TEST (ipc_ref)
28 char *testbed = setup_testbed(NULL);
29 osync_testing_file_remove("/tmp/testpipe");
31 OSyncError *error = NULL;
32 OSyncQueue *queue1 = osync_queue_new("/tmp/testpipe", &error);
33 fail_unless(queue1 != NULL, NULL);
34 fail_unless(error == NULL, NULL);
36 queue1 = osync_queue_ref(queue1);
37 fail_unless(queue1 != NULL, NULL);
39 osync_queue_unref(queue1);
40 osync_queue_unref(queue1);
42 destroy_testbed(testbed);
44 END_TEST
46 START_TEST (ipc_create)
48 char *testbed = setup_testbed(NULL);
49 osync_testing_file_remove("/tmp/testpipe");
51 OSyncError *error = NULL;
52 OSyncQueue *queue1 = osync_queue_new("/tmp/testpipe", &error);
53 fail_unless(queue1 != NULL, NULL);
54 fail_unless(error == NULL, NULL);
56 fail_unless(osync_queue_create(queue1, &error), NULL);
57 fail_unless(error == NULL, NULL);
59 fail_unless(osync_testing_file_exists("/tmp/testpipe") == TRUE, NULL);
61 fail_unless(osync_queue_remove(queue1, &error), NULL);
62 fail_unless(error == NULL, NULL);
64 fail_unless(osync_testing_file_exists("/tmp/testpipe") == FALSE, NULL);
66 osync_queue_unref(queue1);
68 destroy_testbed(testbed);
70 END_TEST
72 START_TEST (ipc_connect)
74 char *testbed = setup_testbed(NULL);
75 osync_testing_file_remove("/tmp/testpipe");
77 OSyncError *error = NULL;
78 OSyncQueue *queue = osync_queue_new("/tmp/testpipe", &error);
80 osync_queue_create(queue, &error);
81 fail_unless(error == NULL, NULL);
83 pid_t cpid = fork();
84 if (cpid == 0) { //Child
85 osync_assert(osync_queue_connect(queue, OSYNC_QUEUE_RECEIVER, &error));
86 osync_assert(error == NULL);
88 if (osync_queue_disconnect(queue, &error) != TRUE || error != NULL)
89 exit(1);
91 osync_queue_unref(queue);
93 g_free(testbed);
94 exit(0);
95 } else {
96 fail_unless(osync_queue_connect(queue, OSYNC_QUEUE_SENDER, &error), NULL);
97 fail_unless(error == NULL, NULL);
99 osync_queue_disconnect(queue, &error);
100 fail_unless(error == NULL, NULL);
102 int status = 0;
103 wait(&status);
104 fail_unless(WEXITSTATUS(status) == 0, NULL);
108 fail_unless(osync_testing_file_exists("/tmp/testpipe") == TRUE, NULL);
110 fail_unless(osync_queue_remove(queue, &error), NULL);
111 fail_unless(error == NULL, NULL);
113 fail_unless(osync_testing_file_exists("/tmp/testpipe") == FALSE, NULL);
115 osync_queue_unref(queue);
117 destroy_testbed(testbed);
119 END_TEST
121 START_TEST (ipc_payload)
123 char *testbed = setup_testbed(NULL);
124 osync_testing_file_remove("/tmp/testpipe-server");
125 osync_testing_file_remove("/tmp/testpipe-client");
127 OSyncError *error = NULL;
128 OSyncQueue *server_queue = osync_queue_new("/tmp/testpipe-server", &error);
129 OSyncQueue *client_queue = osync_queue_new("/tmp/testpipe-client", &error);
130 OSyncMessage *message = NULL;
132 osync_queue_create(server_queue, &error);
133 fail_unless(error == NULL, NULL);
135 osync_queue_create(client_queue, &error);
136 fail_unless(error == NULL, NULL);
137 char *data = "this is another test string";
139 pid_t cpid = fork();
140 if (cpid == 0) { //Child
141 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
142 osync_assert(error == NULL);
144 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
145 osync_assert(error == NULL);
147 message = osync_queue_get_message(client_queue);
149 if (osync_message_get_command(message) != OSYNC_MESSAGE_INITIALIZE) {
150 exit (1);
153 int int1;
154 long long int longint1;
155 char *string;
156 void *databuf;
158 osync_message_read_int(message, &int1);
159 osync_message_read_const_string(message, &string);
160 osync_message_read_long_long_int(message, &longint1);
161 osync_message_read_const_data(message, &databuf, strlen(data) + 1);
163 osync_assert(int1 == 4000000);
164 osync_assert(!strcmp(string, "this is a test string"));
165 osync_assert(longint1 == 400000000);
166 osync_assert(!strcmp(databuf, "this is another test string"));
168 OSyncMessage *reply = osync_message_new_reply(message, &error);
170 osync_message_unref(message);
172 if (osync_queue_disconnect(client_queue, &error) != TRUE || error != NULL)
173 exit(1);
174 osync_queue_unref(client_queue);
176 osync_queue_send_message(server_queue, NULL, reply, &error);
177 osync_message_unref(reply);
179 message = osync_queue_get_message(server_queue);
181 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
182 exit (1);
185 osync_message_unref(message);
187 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
188 exit(1);
189 osync_queue_unref(server_queue);
191 g_free(testbed);
193 exit(0);
194 } else {
195 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
196 fail_unless(error == NULL, NULL);
198 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
199 fail_unless(error == NULL, NULL);
201 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
202 fail_unless(message != NULL, NULL);
203 fail_unless(!osync_error_is_set(&error), NULL);
205 osync_message_write_int(message, 4000000);
206 osync_message_write_string(message, "this is a test string");
207 osync_message_write_long_long_int(message, 400000000);
208 osync_message_write_data(message, data, strlen(data) + 1);
210 fail_unless(osync_queue_send_message(client_queue, NULL, message, &error), NULL);
211 fail_unless(!osync_error_is_set(&error), NULL);
213 osync_message_unref(message);
215 while (!(message = osync_queue_get_message(server_queue))) {
216 g_usleep(100000);
219 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_REPLY);
221 osync_message_unref(message);
223 osync_queue_disconnect(server_queue, &error);
224 fail_unless(error == NULL, NULL);
226 while (!(message = osync_queue_get_message(client_queue))) {
227 g_usleep(10000);
230 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
231 exit (1);
234 osync_message_unref(message);
236 osync_queue_disconnect(client_queue, &error);
237 fail_unless(error == NULL, NULL);
239 int status = 0;
240 wait(&status);
241 fail_unless(WEXITSTATUS(status) == 0, NULL);
244 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
246 fail_unless(osync_queue_remove(client_queue, &error), NULL);
247 fail_unless(osync_queue_remove(server_queue, &error), NULL);
248 fail_unless(!osync_error_is_set(&error), NULL);
250 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
252 osync_queue_unref(client_queue);
253 osync_queue_unref(server_queue);
255 destroy_testbed(testbed);
257 END_TEST
259 START_TEST (ipc_payload_wait)
261 char *testbed = setup_testbed(NULL);
262 osync_testing_file_remove("/tmp/testpipe-server");
263 osync_testing_file_remove("/tmp/testpipe-client");
265 OSyncError *error = NULL;
266 OSyncQueue *server_queue = osync_queue_new("/tmp/testpipe-server", &error);
267 OSyncQueue *client_queue = osync_queue_new("/tmp/testpipe-client", &error);
268 OSyncMessage *message = NULL;
270 osync_queue_create(server_queue, &error);
271 fail_unless(error == NULL, NULL);
273 osync_queue_create(client_queue, &error);
274 fail_unless(error == NULL, NULL);
275 char *data = "this is another test string";
277 pid_t cpid = fork();
278 if (cpid == 0) { //Child
279 g_usleep(1*G_USEC_PER_SEC);
280 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
281 osync_assert(error == NULL);
283 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
284 osync_assert(error == NULL);
286 while (!(message = osync_queue_get_message(client_queue))) {
287 g_usleep(10000);
290 if (osync_message_get_command(message) != OSYNC_MESSAGE_INITIALIZE) {
291 exit (1);
294 int int1;
295 long long int longint1;
296 char *string;
297 char databuf[strlen(data) + 1];
299 osync_message_read_int(message, &int1);
300 osync_message_read_string(message, &string);
301 osync_message_read_long_long_int(message, &longint1);
302 osync_message_read_data(message, databuf, strlen(data) + 1);
304 osync_assert(int1 == 4000000);
305 osync_assert(!strcmp(string, "this is a test string"));
306 osync_assert(longint1 == 400000000);
307 osync_assert(!strcmp(databuf, "this is another test string"));
309 g_usleep(1*G_USEC_PER_SEC);
311 OSyncMessage *reply = osync_message_new_reply(message, &error);
313 osync_message_unref(message);
315 osync_queue_send_message(server_queue, NULL, reply, &error);
317 osync_message_unref(reply);
319 g_usleep(1*G_USEC_PER_SEC);
321 if (osync_queue_disconnect(client_queue, &error) != TRUE || error != NULL)
322 exit(1);
323 osync_queue_unref(client_queue);
325 while (!(message = osync_queue_get_message(server_queue))) {
326 g_usleep(10000);
329 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
330 exit (1);
333 osync_message_unref(message);
334 g_usleep(1*G_USEC_PER_SEC);
336 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
337 exit(1);
338 osync_queue_unref(server_queue);
340 g_free(testbed);
342 exit(0);
343 } else {
344 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
345 fail_unless(error == NULL, NULL);
347 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
348 fail_unless(error == NULL, NULL);
350 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
351 fail_unless(message != NULL, NULL);
352 fail_unless(!osync_error_is_set(&error), NULL);
354 osync_message_write_int(message, 4000000);
355 osync_message_write_string(message, "this is a test string");
356 osync_message_write_long_long_int(message, 400000000);
357 osync_message_write_data(message, data, strlen(data) + 1);
359 fail_unless(osync_queue_send_message(client_queue, NULL, message, &error), NULL);
360 fail_unless(!osync_error_is_set(&error), NULL);
362 osync_message_unref(message);
364 while (!(message = osync_queue_get_message(server_queue))) {
365 g_usleep(100000);
368 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_REPLY);
370 osync_message_unref(message);
372 osync_queue_disconnect(server_queue, &error);
373 fail_unless(error == NULL, NULL);
375 while (!(message = osync_queue_get_message(client_queue))) {
376 g_usleep(10000);
379 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
380 exit (1);
382 osync_message_unref(message);
384 osync_queue_disconnect(client_queue, &error);
385 fail_unless(error == NULL, NULL);
387 int status = 0;
388 wait(&status);
389 fail_unless(WEXITSTATUS(status) == 0, NULL);
392 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
394 fail_unless(osync_queue_remove(client_queue, &error), NULL);
395 fail_unless(osync_queue_remove(server_queue, &error), NULL);
396 fail_unless(!osync_error_is_set(&error), NULL);
398 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
400 osync_queue_unref(client_queue);
401 osync_queue_unref(server_queue);
403 destroy_testbed(testbed);
405 END_TEST
407 START_TEST (ipc_payload_stress)
409 char *testbed = setup_testbed(NULL);
410 osync_testing_file_remove("/tmp/testpipe-server");
411 osync_testing_file_remove("/tmp/testpipe-client");
413 int num_mess = 1000;
414 int size = 100;
416 char *data = malloc(size);
417 memset(data, 42, size);
419 OSyncError *error = NULL;
420 OSyncQueue *server_queue = osync_queue_new("/tmp/testpipe-server", &error);
421 OSyncQueue *client_queue = osync_queue_new("/tmp/testpipe-client", &error);
422 OSyncMessage *message = NULL;
424 osync_queue_create(server_queue, &error);
425 fail_unless(error == NULL, NULL);
427 osync_queue_create(client_queue, &error);
428 fail_unless(error == NULL, NULL);
430 pid_t cpid = fork();
431 if (cpid == 0) { //Child
432 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
433 osync_assert(error == NULL);
435 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
436 osync_assert(error == NULL);
438 while (num_mess > 0) {
439 osync_trace(TRACE_INTERNAL, "Waiting for message");
440 message = osync_queue_get_message(client_queue);
442 if (osync_message_get_command(message) != OSYNC_MESSAGE_INITIALIZE) {
443 exit (1);
446 osync_trace(TRACE_INTERNAL, "Parsing message");
447 char databuf[size];
449 osync_message_read_data(message, databuf, size);
451 osync_assert(!memcmp(databuf, data, size));
453 osync_trace(TRACE_INTERNAL, "Creating new reply");
454 OSyncMessage *reply = osync_message_new_reply(message, &error);
456 osync_message_unref(message);
458 osync_trace(TRACE_INTERNAL, "Sending reply");
459 osync_queue_send_message(server_queue, NULL, reply, &error);
461 osync_message_unref(reply);
463 num_mess--;
466 if (osync_queue_disconnect(client_queue, &error) != TRUE || error != NULL)
467 exit(1);
468 osync_queue_unref(client_queue);
470 message = osync_queue_get_message(server_queue);
472 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
473 exit (1);
476 osync_message_unref(message);
478 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
479 exit(1);
480 osync_queue_unref(server_queue);
482 g_free(data);
483 g_free(testbed);
485 exit(0);
486 } else {
487 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
488 fail_unless(error == NULL, NULL);
490 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
491 fail_unless(error == NULL, NULL);
493 while (num_mess > 0) {
494 osync_trace(TRACE_INTERNAL, "Creating new message");
495 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
496 fail_unless(message != NULL, NULL);
497 fail_unless(!osync_error_is_set(&error), NULL);
499 osync_message_write_data(message, data, size);
501 osync_trace(TRACE_INTERNAL, "Sending message");
502 fail_unless(osync_queue_send_message(client_queue, NULL, message, &error), NULL);
503 fail_unless(!osync_error_is_set(&error), NULL);
505 osync_message_unref(message);
507 osync_trace(TRACE_INTERNAL, "Waiting for message");
508 message = osync_queue_get_message(server_queue);
510 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_REPLY);
512 osync_message_unref(message);
514 num_mess--;
517 osync_queue_disconnect(server_queue, &error);
518 fail_unless(error == NULL, NULL);
520 message = osync_queue_get_message(client_queue);
522 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
523 exit (1);
526 osync_message_unref(message);
528 osync_queue_disconnect(client_queue, &error);
529 fail_unless(error == NULL, NULL);
531 int status = 0;
532 wait(&status);
533 fail_unless(WEXITSTATUS(status) == 0, NULL);
536 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
538 fail_unless(osync_queue_remove(client_queue, &error), NULL);
539 fail_unless(osync_queue_remove(server_queue, &error), NULL);
540 fail_unless(!osync_error_is_set(&error), NULL);
542 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
544 osync_queue_unref(client_queue);
545 osync_queue_unref(server_queue);
547 g_free(data);
548 destroy_testbed(testbed);
550 END_TEST
552 START_TEST (ipc_payload_stress2)
554 char *testbed = setup_testbed(NULL);
555 osync_testing_file_remove("/tmp/testpipe-server");
556 osync_testing_file_remove("/tmp/testpipe-client");
557 int i = 0;
559 int num_mess = 1000;
560 int size = 100;
562 char *data = malloc(size);
563 memset(data, 42, size);
565 OSyncError *error = NULL;
566 OSyncQueue *server_queue = osync_queue_new("/tmp/testpipe-server", &error);
567 OSyncQueue *client_queue = osync_queue_new("/tmp/testpipe-client", &error);
568 OSyncMessage *message = NULL;
570 osync_queue_create(server_queue, &error);
571 fail_unless(error == NULL, NULL);
573 osync_queue_create(client_queue, &error);
574 fail_unless(error == NULL, NULL);
576 pid_t cpid = fork();
577 if (cpid == 0) { //Child
578 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
579 osync_assert(error == NULL);
581 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
582 osync_assert(error == NULL);
584 for (i = 0; i < num_mess; i++) {
585 message = osync_queue_get_message(client_queue);
587 if (osync_message_get_command(message) != OSYNC_MESSAGE_INITIALIZE) {
588 exit (1);
591 char databuf[size];
593 osync_message_read_data(message, databuf, size);
595 osync_assert(!memcmp(databuf, data, size));
597 osync_message_unref(message);
600 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
602 for (i = 0; i < num_mess; i++) {
603 OSyncMessage *reply = osync_message_new_reply(message, &error);
605 osync_queue_send_message(server_queue, NULL, reply, &error);
607 osync_message_unref(reply);
610 osync_message_unref(message);
612 if (osync_queue_disconnect(client_queue, &error) != TRUE || error != NULL)
613 exit(1);
614 osync_queue_unref(client_queue);
616 message = osync_queue_get_message(server_queue);
618 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
619 exit (1);
622 osync_message_unref(message);
624 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
625 exit(1);
626 osync_queue_unref(server_queue);
628 g_free(data);
629 g_free(testbed);
631 exit(0);
632 } else {
633 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
634 fail_unless(error == NULL, NULL);
636 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
637 fail_unless(error == NULL, NULL);
639 for (i = 0; i < num_mess; i++) {
640 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
641 fail_unless(message != NULL, NULL);
642 fail_unless(!osync_error_is_set(&error), NULL);
644 osync_message_write_data(message, data, size);
646 fail_unless(osync_queue_send_message(client_queue, NULL, message, &error), NULL);
647 fail_unless(!osync_error_is_set(&error), NULL);
649 osync_message_unref(message);
652 for (i = 0; i < num_mess; i++) {
653 message = osync_queue_get_message(server_queue);
655 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_REPLY);
657 osync_message_unref(message);
660 osync_queue_disconnect(server_queue, &error);
661 fail_unless(error == NULL, NULL);
663 message = osync_queue_get_message(client_queue);
665 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
666 exit (1);
669 osync_message_unref(message);
671 osync_queue_disconnect(client_queue, &error);
672 fail_unless(error == NULL, NULL);
674 int status = 0;
675 wait(&status);
676 fail_unless(WEXITSTATUS(status) == 0, NULL);
679 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
681 fail_unless(osync_queue_remove(client_queue, &error), NULL);
682 fail_unless(osync_queue_remove(server_queue, &error), NULL);
683 fail_unless(!osync_error_is_set(&error), NULL);
685 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
687 osync_queue_unref(client_queue);
688 osync_queue_unref(server_queue);
690 g_free(data);
691 destroy_testbed(testbed);
693 END_TEST
695 START_TEST (ipc_large_payload)
697 char *testbed = setup_testbed(NULL);
698 osync_testing_file_remove("/tmp/testpipe-server");
699 osync_testing_file_remove("/tmp/testpipe-client");
700 int i = 0;
702 int num_mess = 10;
703 int size = 1024 * 1024 * 20; //20mbyte
705 char *data = malloc(size);
706 memset(data, 42, size);
708 OSyncError *error = NULL;
709 OSyncQueue *server_queue = osync_queue_new("/tmp/testpipe-server", &error);
710 OSyncQueue *client_queue = osync_queue_new("/tmp/testpipe-client", &error);
711 OSyncMessage *message = NULL;
713 osync_queue_create(server_queue, &error);
714 fail_unless(error == NULL, NULL);
716 osync_queue_create(client_queue, &error);
717 fail_unless(error == NULL, NULL);
719 pid_t cpid = fork();
720 if (cpid == 0) { //Child
721 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
722 osync_assert(error == NULL);
724 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
725 osync_assert(error == NULL);
727 for (i = 0; i < num_mess; i++) {
728 message = osync_queue_get_message(client_queue);
730 if (osync_message_get_command(message) != OSYNC_MESSAGE_INITIALIZE) {
731 exit (1);
734 void *databuf = NULL;
735 osync_message_read_const_data(message, &databuf, size);
737 if (memcmp(databuf, data, size))
738 exit(1);
740 OSyncMessage *reply = osync_message_new_reply(message, &error);
742 osync_message_unref(message);
744 osync_queue_send_message(server_queue, NULL, reply, &error);
746 osync_message_unref(reply);
749 if (osync_queue_disconnect(client_queue, &error) != TRUE || error != NULL)
750 exit(1);
751 osync_queue_unref(client_queue);
753 message = osync_queue_get_message(server_queue);
755 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
756 exit (1);
759 osync_message_unref(message);
761 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
762 exit(1);
763 osync_queue_unref(server_queue);
765 g_free(data);
767 g_free(testbed);
769 exit(0);
770 } else {
771 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
772 fail_unless(error == NULL, NULL);
774 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
775 fail_unless(error == NULL, NULL);
777 for (i = 0; i < num_mess; i++) {
778 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
779 fail_unless(message != NULL, NULL);
780 fail_unless(!osync_error_is_set(&error), NULL);
782 osync_message_write_data(message, data, size);
784 fail_unless(osync_queue_send_message(client_queue, NULL, message, &error), NULL);
785 fail_unless(!osync_error_is_set(&error), NULL);
787 osync_message_unref(message);
789 message = osync_queue_get_message(server_queue);
791 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_REPLY);
793 osync_message_unref(message);
796 osync_queue_disconnect(server_queue, &error);
797 fail_unless(error == NULL, NULL);
799 message = osync_queue_get_message(client_queue);
801 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
802 exit (1);
805 osync_message_unref(message);
807 osync_queue_disconnect(client_queue, &error);
808 fail_unless(error == NULL, NULL);
810 int status = 0;
811 wait(&status);
812 fail_unless(WEXITSTATUS(status) == 0, NULL);
815 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
817 fail_unless(osync_queue_remove(client_queue, &error), NULL);
818 fail_unless(osync_queue_remove(server_queue, &error), NULL);
819 fail_unless(!osync_error_is_set(&error), NULL);
821 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
823 osync_queue_unref(client_queue);
824 osync_queue_unref(server_queue);
826 g_free(data);
827 destroy_testbed(testbed);
829 END_TEST
831 START_TEST (ipc_error_no_pipe)
833 char *testbed = setup_testbed(NULL);
834 osync_testing_file_remove("/tmp/testpipe");
836 OSyncError *error = NULL;
837 OSyncQueue *queue1 = osync_queue_new("/tmp/testpipe", &error);
838 fail_unless(queue1 != NULL, NULL);
839 fail_unless(error == NULL, NULL);
841 fail_unless(!osync_queue_connect(queue1, OSYNC_QUEUE_RECEIVER, &error), NULL);
842 fail_unless(error != NULL, NULL);
843 osync_error_unref(&error);
845 osync_queue_unref(queue1);
847 destroy_testbed(testbed);
849 END_TEST
851 START_TEST (ipc_error_perm)
853 char *testbed = setup_testbed(NULL);
854 osync_testing_file_remove("/tmp/testpipe");
856 OSyncError *error = NULL;
857 OSyncQueue *queue = osync_queue_new("/tmp/testpipe", &error);
859 osync_queue_create(queue, &error);
860 fail_unless(error == NULL, NULL);
862 if (osync_testing_file_chmod("/tmp/testpipe", 000))
863 abort();
865 fail_unless(!osync_queue_connect(queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
866 fail_unless(error != NULL, NULL);
867 osync_error_unref(&error);
869 fail_unless(osync_testing_file_exists("/tmp/testpipe") == TRUE, NULL);
871 fail_unless(osync_queue_remove(queue, &error), NULL);
872 fail_unless(error == NULL, NULL);
874 fail_unless(osync_testing_file_exists("/tmp/testpipe") == FALSE, NULL);
876 osync_queue_unref(queue);
878 destroy_testbed(testbed);
880 END_TEST
882 START_TEST (ipc_error_rem)
884 char *testbed = setup_testbed(NULL);
885 osync_testing_file_remove("/tmp/testpipe");
887 OSyncError *error = NULL;
888 OSyncQueue *server_queue = osync_queue_new("/tmp/testpipe", &error);
889 OSyncMessage *message = NULL;
891 osync_queue_create(server_queue, &error);
892 fail_unless(error == NULL, NULL);
894 pid_t cpid = fork();
895 if (cpid == 0) { //Child
896 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error));
897 osync_assert(error == NULL);
899 g_free(testbed);
900 exit(0);
901 } else {
902 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error), NULL);
903 fail_unless(error == NULL, NULL);
905 message = osync_queue_get_message(server_queue);
906 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
907 osync_message_unref(message);
909 osync_queue_disconnect(server_queue, &error);
910 fail_unless(error == NULL, NULL);
912 int status = 0;
913 wait(&status);
914 fail_unless(WEXITSTATUS(status) == 0, NULL);
917 fail_unless(osync_testing_file_exists("/tmp/testpipe") == TRUE, NULL);
919 fail_unless(osync_queue_remove(server_queue, &error), NULL);
920 fail_unless(!osync_error_is_set(&error), NULL);
922 fail_unless(osync_testing_file_exists("/tmp/testpipe") == FALSE, NULL);
924 osync_queue_unref(server_queue);
926 destroy_testbed(testbed);
928 END_TEST
930 START_TEST (ipc_error_rem2)
932 char *testbed = setup_testbed(NULL);
933 osync_testing_file_remove("/tmp/testpipe");
935 OSyncError *error = NULL;
936 OSyncQueue *server_queue = osync_queue_new("/tmp/testpipe", &error);
937 OSyncMessage *message = NULL;
939 osync_queue_create(server_queue, &error);
940 fail_unless(error == NULL, NULL);
942 pid_t cpid = fork();
943 if (cpid == 0) { //Child
944 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
945 osync_assert(error == NULL);
947 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
948 osync_assert(message != NULL);
949 osync_assert(!osync_error_is_set(&error));
951 osync_message_write_int(message, 4000000);
952 osync_message_write_string(message, "this is a test string");
953 osync_message_write_long_long_int(message, 400000000);
955 osync_assert(osync_queue_send_message(server_queue, NULL, message, &error));
956 osync_assert(!osync_error_is_set(&error));
958 osync_message_unref(message);
960 g_usleep(2*G_USEC_PER_SEC);
962 osync_queue_disconnect(server_queue, &error);
963 osync_assert(error == NULL);
965 osync_queue_unref(server_queue);
967 g_free(testbed);
968 exit(0);
969 } else {
970 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
971 fail_unless(error == NULL, NULL);
973 message = osync_queue_get_message(server_queue);
975 /* 2005-05-23 dgollub
976 This unit tests seems to be kind of broken! What is is supposed to test?
977 No errors appears.... change osync_assert to "OSYNC_MESSAGE_INITALIZE".
978 TODO: Armin, whats wrong with this testcase? What means ipc_error_rem2? rem? read error message?
981 // osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_ERROR);
982 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
984 osync_message_unref(message);
986 osync_queue_disconnect(server_queue, &error);
987 fail_unless(error == NULL, NULL);
989 int status = 0;
990 wait(&status);
991 fail_unless(WEXITSTATUS(status) == 0, NULL);
994 fail_unless(osync_testing_file_exists("/tmp/testpipe") == TRUE, NULL);
996 fail_unless(osync_queue_remove(server_queue, &error), NULL);
997 fail_unless(!osync_error_is_set(&error), NULL);
999 fail_unless(osync_testing_file_exists("/tmp/testpipe") == FALSE, NULL);
1001 osync_queue_unref(server_queue);
1003 destroy_testbed(testbed);
1005 END_TEST
1007 OSyncQueue *server_queue = NULL;
1008 OSyncQueue *client_queue = NULL;
1010 void server_handler1(OSyncMessage *message, void *user_data)
1012 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
1013 OSyncError *error = NULL;
1015 osync_assert(GPOINTER_TO_INT(user_data) ==1);
1017 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
1019 osync_queue_disconnect(server_queue, &error);
1020 osync_assert(error == NULL);
1022 osync_trace(TRACE_EXIT, "%s", __func__);
1025 void client_handler1(OSyncMessage *message, void *user_data)
1027 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
1028 OSyncError *error = NULL;
1030 osync_assert(GPOINTER_TO_INT(user_data) ==1);
1031 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
1033 int int1;
1034 long long int longint1;
1035 char *string;
1036 void *databuf;
1038 osync_message_read_int(message, &int1);
1039 osync_message_read_const_string(message, &string);
1040 osync_message_read_long_long_int(message, &longint1);
1041 osync_message_read_const_data(message, &databuf, strlen("this is another test string") + 1);
1043 osync_assert(int1 == 4000000);
1044 osync_assert(!strcmp(string, "this is a test string"));
1045 osync_assert(longint1 == 400000000);
1046 osync_assert(!strcmp(databuf, "this is another test string"));
1048 OSyncMessage *reply = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
1050 osync_queue_send_message(server_queue, NULL, reply, &error);
1052 osync_message_unref(reply);
1054 osync_trace(TRACE_EXIT, "%s", __func__);
1057 START_TEST (ipc_loop_payload)
1059 char *testbed = setup_testbed(NULL);
1060 osync_testing_file_remove("/tmp/testpipe-server");
1061 osync_testing_file_remove("/tmp/testpipe-client");
1063 OSyncError *error = NULL;
1064 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
1065 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
1066 OSyncMessage *message = NULL;
1068 osync_queue_create(server_queue, &error);
1069 fail_unless(error == NULL, NULL);
1071 osync_queue_create(client_queue, &error);
1072 fail_unless(error == NULL, NULL);
1073 char *data = "this is another test string";
1075 GMainContext *context = g_main_context_new();
1076 OSyncThread *thread = osync_thread_new(context, &error);
1078 pid_t cpid = fork();
1079 if (cpid == 0) { //Child
1080 osync_queue_set_message_handler(client_queue, client_handler1, GINT_TO_POINTER(1));
1082 osync_queue_setup_with_gmainloop(client_queue, context);
1084 osync_thread_start(thread);
1086 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
1087 osync_assert(error == NULL);
1088 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
1089 osync_assert(error == NULL);
1091 osync_queue_cross_link(client_queue, server_queue);
1093 message = osync_queue_get_message(server_queue);
1095 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
1096 exit (1);
1099 osync_message_unref(message);
1101 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
1102 exit(1);
1103 osync_queue_unref(server_queue);
1105 osync_assert(osync_queue_disconnect(client_queue, &error));
1106 osync_assert(error == NULL);
1108 osync_thread_stop(thread);
1109 osync_thread_unref(thread);
1111 osync_queue_unref(client_queue);
1113 g_free(testbed);
1115 exit(0);
1116 } else {
1117 osync_queue_set_message_handler(server_queue, server_handler1, GINT_TO_POINTER(1));
1119 osync_queue_setup_with_gmainloop(server_queue, context);
1121 osync_thread_start(thread);
1123 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
1124 fail_unless(error == NULL, NULL);
1126 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
1127 fail_unless(error == NULL, NULL);
1129 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
1130 fail_unless(message != NULL, NULL);
1131 fail_unless(!osync_error_is_set(&error), NULL);
1133 osync_message_write_int(message, 4000000);
1134 osync_message_write_string(message, "this is a test string");
1135 osync_message_write_long_long_int(message, 400000000);
1136 osync_message_write_data(message, data, strlen(data) + 1);
1138 fail_unless(osync_queue_send_message(client_queue, NULL, message, &error), NULL);
1139 fail_unless(!osync_error_is_set(&error), NULL);
1141 osync_message_unref(message);
1143 message = osync_queue_get_message(client_queue);
1145 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
1147 osync_message_unref(message);
1149 osync_queue_disconnect(client_queue, &error);
1150 fail_unless(error == NULL, NULL);
1152 osync_thread_stop(thread);
1153 osync_thread_unref(thread);
1155 int status = 0;
1156 wait(&status);
1157 fail_unless(WEXITSTATUS(status) == 0, NULL);
1160 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
1162 fail_unless(osync_queue_remove(client_queue, &error), NULL);
1163 fail_unless(osync_queue_remove(server_queue, &error), NULL);
1164 fail_unless(!osync_error_is_set(&error), NULL);
1166 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
1168 osync_queue_unref(client_queue);
1169 osync_queue_unref(server_queue);
1171 destroy_testbed(testbed);
1173 END_TEST
1175 int num_msgs = 0;
1176 int req_msgs = 1000;
1178 void server_handler2(OSyncMessage *message, void *user_data)
1180 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
1181 OSyncError *error = NULL;
1182 char *data = "this is another test string";
1184 osync_assert(GPOINTER_TO_INT(user_data) ==1);
1186 num_msgs++;
1187 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
1189 if (num_msgs >= req_msgs) {
1190 osync_queue_disconnect(server_queue, &error);
1191 osync_assert(error == NULL);
1192 } else {
1193 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
1194 osync_assert(message != NULL);
1195 osync_assert(!osync_error_is_set(&error));
1197 osync_message_write_int(message, 4000000);
1198 osync_message_write_string(message, "this is a test string");
1199 osync_message_write_long_long_int(message, 400000000);
1200 osync_message_write_data(message, data, strlen(data) + 1);
1202 osync_assert(osync_queue_send_message(client_queue, NULL, message, &error));
1203 osync_assert(!osync_error_is_set(&error));
1205 osync_message_unref(message);
1208 osync_trace(TRACE_EXIT, "%s", __func__);
1211 void client_handler2(OSyncMessage *message, void *user_data)
1213 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
1214 OSyncError *error = NULL;
1216 osync_assert(GPOINTER_TO_INT(user_data) ==1);
1217 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
1219 int int1;
1220 long long int longint1;
1221 char *string;
1222 void *databuf;
1224 osync_message_read_int(message, &int1);
1225 osync_message_read_const_string(message, &string);
1226 osync_message_read_long_long_int(message, &longint1);
1227 osync_message_read_const_data(message, &databuf, strlen("this is another test string") + 1);
1229 osync_assert(int1 == 4000000);
1230 osync_assert(!strcmp(string, "this is a test string"));
1231 osync_assert(longint1 == 400000000);
1232 osync_assert(!strcmp(databuf, "this is another test string"));
1234 OSyncMessage *reply = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
1236 osync_queue_send_message(server_queue, NULL, reply, &error);
1238 osync_message_unref(reply);
1240 osync_trace(TRACE_EXIT, "%s", __func__);
1243 START_TEST (ipc_loop_stress)
1245 char *testbed = setup_testbed(NULL);
1246 osync_testing_file_remove("/tmp/testpipe-server");
1247 osync_testing_file_remove("/tmp/testpipe-client");
1249 OSyncError *error = NULL;
1250 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
1251 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
1252 OSyncMessage *message = NULL;
1254 osync_queue_create(server_queue, &error);
1255 fail_unless(error == NULL, NULL);
1257 osync_queue_create(client_queue, &error);
1258 fail_unless(error == NULL, NULL);
1259 char *data = "this is another test string";
1261 pid_t cpid = fork();
1262 if (cpid == 0) { //Child
1264 GMainContext *context = g_main_context_new();
1265 OSyncThread *thread = osync_thread_new(context, &error);
1267 osync_queue_set_message_handler(client_queue, client_handler2, GINT_TO_POINTER(1));
1269 osync_queue_setup_with_gmainloop(client_queue, context);
1271 osync_thread_start(thread);
1273 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
1274 osync_assert(error == NULL);
1275 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
1276 osync_assert(error == NULL);
1278 osync_queue_cross_link(client_queue, server_queue);
1280 message = osync_queue_get_message(server_queue);
1282 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
1283 exit (1);
1286 osync_message_unref(message);
1288 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
1289 exit(1);
1290 osync_queue_unref(server_queue);
1292 osync_assert(osync_queue_disconnect(client_queue, &error));
1293 osync_assert(error == NULL);
1295 osync_thread_stop(thread);
1296 osync_thread_unref(thread);
1298 osync_queue_unref(client_queue);
1300 g_free(testbed);
1302 exit(0);
1303 } else {
1304 GMainContext *context = g_main_context_new();
1305 OSyncThread *thread = osync_thread_new(context, &error);
1307 osync_queue_set_message_handler(server_queue, server_handler2, GINT_TO_POINTER(1));
1309 osync_queue_setup_with_gmainloop(server_queue, context);
1311 osync_thread_start(thread);
1313 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
1314 fail_unless(error == NULL, NULL);
1316 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
1317 fail_unless(error == NULL, NULL);
1319 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
1320 fail_unless(message != NULL, NULL);
1321 fail_unless(!osync_error_is_set(&error), NULL);
1323 osync_message_write_int(message, 4000000);
1324 osync_message_write_string(message, "this is a test string");
1325 osync_message_write_long_long_int(message, 400000000);
1326 osync_message_write_data(message, data, strlen(data) + 1);
1328 fail_unless(osync_queue_send_message(client_queue, NULL, message, &error), NULL);
1329 fail_unless(!osync_error_is_set(&error), NULL);
1331 osync_message_unref(message);
1333 message = osync_queue_get_message(client_queue);
1335 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
1337 osync_message_unref(message);
1339 osync_queue_disconnect(client_queue, &error);
1340 fail_unless(error == NULL, NULL);
1342 osync_thread_stop(thread);
1343 osync_thread_unref(thread);
1345 int status = 0;
1346 wait(&status);
1347 fail_unless(WEXITSTATUS(status) == 0, NULL);
1350 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
1352 fail_unless(osync_queue_remove(client_queue, &error), NULL);
1353 fail_unless(osync_queue_remove(server_queue, &error), NULL);
1354 fail_unless(!osync_error_is_set(&error), NULL);
1356 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
1358 osync_queue_unref(client_queue);
1359 osync_queue_unref(server_queue);
1361 destroy_testbed(testbed);
1363 END_TEST
1365 void callback_handler_check_reply(OSyncMessage *message, void *user_data)
1367 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
1368 OSyncError *error = NULL;
1370 osync_assert(GPOINTER_TO_INT(user_data) == 1);
1372 num_msgs++;
1373 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_REPLY);
1375 if (num_msgs >= req_msgs) {
1376 osync_queue_disconnect(server_queue, &error);
1377 osync_assert(error == NULL);
1380 osync_trace(TRACE_EXIT, "%s", __func__);
1383 void server_handler_abort(OSyncMessage *message, void *user_data)
1385 abort();
1388 void client_handler3(OSyncMessage *message, void *user_data)
1390 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
1391 OSyncError *error = NULL;
1393 osync_assert(GPOINTER_TO_INT(user_data) ==1);
1394 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
1396 int int1;
1397 long long int longint1;
1398 char *string;
1399 void *databuf;
1401 osync_message_read_int(message, &int1);
1402 osync_message_read_const_string(message, &string);
1403 osync_message_read_long_long_int(message, &longint1);
1404 osync_message_read_const_data(message, &databuf, strlen("this is another test string") + 1);
1406 osync_assert(int1 == 4000000);
1407 osync_assert(!strcmp(string, "this is a test string"));
1408 osync_assert(longint1 == 400000000);
1409 osync_assert(!strcmp(databuf, "this is another test string"));
1411 OSyncMessage *reply = osync_message_new_reply(message, &error);
1413 osync_queue_send_message(server_queue, NULL, reply, &error);
1415 osync_message_unref(reply);
1417 osync_trace(TRACE_EXIT, "%s", __func__);
1420 START_TEST (ipc_loop_callback)
1422 num_msgs = 0;
1424 char *testbed = setup_testbed(NULL);
1425 osync_testing_file_remove("/tmp/testpipe-server");
1426 osync_testing_file_remove("/tmp/testpipe-client");
1428 OSyncError *error = NULL;
1429 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
1430 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
1431 OSyncMessage *message = NULL;
1433 osync_queue_create(server_queue, &error);
1434 fail_unless(error == NULL, NULL);
1436 osync_queue_create(client_queue, &error);
1437 fail_unless(error == NULL, NULL);
1438 char *data = "this is another test string";
1440 pid_t cpid = fork();
1441 if (cpid == 0) { //Child
1443 GMainContext *context = g_main_context_new();
1444 OSyncThread *thread = osync_thread_new(context, &error);
1446 osync_queue_set_message_handler(client_queue, client_handler3, GINT_TO_POINTER(1));
1448 osync_queue_setup_with_gmainloop(client_queue, context);
1450 osync_thread_start(thread);
1452 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
1453 osync_assert(error == NULL);
1455 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
1456 osync_assert(error == NULL);
1458 osync_queue_cross_link(client_queue, server_queue);
1460 message = osync_queue_get_message(server_queue);
1462 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
1463 exit (1);
1466 osync_message_unref(message);
1468 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
1469 exit(1);
1470 osync_queue_unref(server_queue);
1472 osync_assert(osync_queue_disconnect(client_queue, &error));
1473 osync_assert(error == NULL);
1475 osync_thread_stop(thread);
1476 osync_thread_unref(thread);
1478 osync_queue_unref(client_queue);
1480 g_free(testbed);
1482 exit(0);
1483 } else {
1484 GMainContext *context = g_main_context_new();
1485 OSyncThread *thread = osync_thread_new(context, &error);
1487 osync_queue_set_message_handler(server_queue, server_handler_abort, GINT_TO_POINTER(1));
1489 osync_queue_setup_with_gmainloop(server_queue, context);
1491 osync_thread_start(thread);
1493 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
1494 fail_unless(error == NULL, NULL);
1496 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
1497 fail_unless(error == NULL, NULL);
1499 int i = 0;
1500 for (i = 0; i < req_msgs; i++) {
1501 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
1502 fail_unless(message != NULL, NULL);
1503 fail_unless(!osync_error_is_set(&error), NULL);
1505 osync_message_write_int(message, 4000000);
1506 osync_message_write_string(message, "this is a test string");
1507 osync_message_write_long_long_int(message, 400000000);
1508 osync_message_write_data(message, data, strlen(data) + 1);
1510 osync_message_set_handler(message, callback_handler_check_reply, GINT_TO_POINTER(1));
1512 fail_unless(osync_queue_send_message(client_queue, server_queue, message, &error), NULL);
1513 fail_unless(!osync_error_is_set(&error), NULL);
1515 osync_message_unref(message);
1518 message = osync_queue_get_message(client_queue);
1520 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
1522 osync_message_unref(message);
1524 osync_queue_disconnect(client_queue, &error);
1525 fail_unless(error == NULL, NULL);
1527 osync_thread_stop(thread);
1528 osync_thread_unref(thread);
1530 int status = 0;
1531 wait(&status);
1532 fail_unless(WEXITSTATUS(status) == 0, NULL);
1535 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
1537 fail_unless(osync_queue_remove(client_queue, &error), NULL);
1538 fail_unless(osync_queue_remove(server_queue, &error), NULL);
1539 fail_unless(!osync_error_is_set(&error), NULL);
1541 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
1543 osync_queue_unref(client_queue);
1544 osync_queue_unref(server_queue);
1546 destroy_testbed(testbed);
1548 END_TEST
1550 int stop_after = 500;
1552 void callback_handler2(OSyncMessage *message, void *user_data)
1554 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
1556 osync_assert(GPOINTER_TO_INT(user_data) == 1);
1558 if (num_msgs >= stop_after) {
1559 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_ERRORREPLY);
1560 } else {
1561 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_REPLY);
1564 num_msgs++;
1566 osync_trace(TRACE_EXIT, "%s", __func__);
1569 int num_msgs2 = 0;
1571 void server_handler4(OSyncMessage *message, void *user_data)
1573 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP || osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_ERROR);
1576 void client_handler4(OSyncMessage *message, void *user_data)
1578 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
1579 OSyncError *error = NULL;
1581 osync_assert(GPOINTER_TO_INT(user_data) ==1);
1582 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
1584 int int1;
1585 long long int longint1;
1586 char *string;
1587 void *databuf;
1590 osync_message_read_int(message, &int1);
1591 osync_message_read_const_string(message, &string);
1592 osync_message_read_long_long_int(message, &longint1);
1593 osync_message_read_const_data(message, &databuf, strlen("this is another test string") + 1);
1595 osync_assert(int1 == 4000000);
1596 osync_assert(!strcmp(string, "this is a test string"));
1597 osync_assert(longint1 == 400000000);
1598 osync_assert(!strcmp(databuf, "this is another test string"));
1600 if (num_msgs2 >= stop_after) {
1601 osync_assert(osync_queue_disconnect(client_queue, &error));
1602 osync_assert(error == NULL);
1603 } else {
1604 OSyncMessage *reply = osync_message_new_reply(message, &error);
1606 osync_queue_send_message(server_queue, NULL, reply, &error);
1608 osync_message_unref(reply);
1611 num_msgs2++;
1613 osync_trace(TRACE_EXIT, "%s", __func__);
1616 START_TEST (ipc_callback_break)
1618 num_msgs = 0;
1620 char *testbed = setup_testbed(NULL);
1621 osync_testing_file_remove("/tmp/testpipe-server");
1622 osync_testing_file_remove("/tmp/testpipe-client");
1624 OSyncError *error = NULL;
1625 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
1626 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
1627 OSyncMessage *message = NULL;
1629 osync_queue_create(server_queue, &error);
1630 fail_unless(error == NULL, NULL);
1632 osync_queue_create(client_queue, &error);
1633 fail_unless(error == NULL, NULL);
1634 char *data = "this is another test string";
1636 pid_t cpid = fork();
1637 if (cpid == 0) { //Child
1639 GMainContext *context = g_main_context_new();
1640 OSyncThread *thread = osync_thread_new(context, &error);
1642 osync_queue_set_message_handler(client_queue, client_handler4, GINT_TO_POINTER(1));
1644 osync_queue_setup_with_gmainloop(client_queue, context);
1646 osync_thread_start(thread);
1648 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
1649 osync_assert(error == NULL);
1651 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
1652 osync_assert(error == NULL);
1654 osync_queue_cross_link(client_queue, server_queue);
1656 while (osync_queue_is_connected(client_queue)) { g_usleep(100); }
1658 osync_assert(osync_queue_disconnect(server_queue, &error));
1659 osync_assert(error == NULL);
1661 osync_thread_stop(thread);
1662 osync_thread_unref(thread);
1664 osync_queue_unref(client_queue);
1665 osync_queue_unref(server_queue);
1667 g_free(testbed);
1668 exit(0);
1669 } else {
1670 GMainContext *context = g_main_context_new();
1671 OSyncThread *thread = osync_thread_new(context, &error);
1673 osync_queue_set_message_handler(server_queue, server_handler4, GINT_TO_POINTER(1));
1675 osync_queue_setup_with_gmainloop(server_queue, context);
1677 osync_thread_start(thread);
1679 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
1680 fail_unless(error == NULL, NULL);
1682 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
1683 fail_unless(error == NULL, NULL);
1685 int i = 0;
1686 for (i = 0; i < req_msgs; i++) {
1687 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
1688 fail_unless(message != NULL, NULL);
1689 fail_unless(!osync_error_is_set(&error), NULL);
1691 osync_message_write_int(message, 4000000);
1692 osync_message_write_string(message, "this is a test string");
1693 osync_message_write_long_long_int(message, 400000000);
1694 osync_message_write_data(message, data, strlen(data) + 1);
1696 osync_message_set_handler(message, callback_handler2, GINT_TO_POINTER(1));
1698 fail_unless(osync_queue_send_message(client_queue, server_queue, message, &error), NULL);
1699 fail_unless(!osync_error_is_set(&error), NULL);
1701 osync_message_unref(message);
1704 message = osync_queue_get_message(client_queue);
1706 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
1708 osync_message_unref(message);
1710 while (num_msgs < req_msgs) { g_usleep(100); };
1712 osync_queue_disconnect(client_queue, &error);
1713 fail_unless(error == NULL, NULL);
1715 osync_queue_disconnect(server_queue, &error);
1716 osync_assert(error == NULL);
1718 osync_thread_stop(thread);
1719 osync_thread_unref(thread);
1721 int status = 0;
1722 wait(&status);
1723 fail_unless(WEXITSTATUS(status) == 0, NULL);
1726 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
1728 fail_unless(osync_queue_remove(client_queue, &error), NULL);
1729 fail_unless(osync_queue_remove(server_queue, &error), NULL);
1730 fail_unless(!osync_error_is_set(&error), NULL);
1732 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
1734 osync_queue_unref(client_queue);
1735 osync_queue_unref(server_queue);
1737 destroy_testbed(testbed);
1739 END_TEST
1742 START_TEST (ipc_pipes)
1744 char *testbed = setup_testbed(NULL);
1746 OSyncError *error = NULL;
1747 OSyncQueue *read1 = NULL;
1748 OSyncQueue *write1 = NULL;
1749 char *data = "this is another test string";
1751 osync_assert(osync_queue_new_pipes(&read1, &write1, &error));
1752 osync_assert(error == NULL);
1754 fail_unless(osync_queue_connect(read1, OSYNC_QUEUE_RECEIVER, &error), NULL);
1755 fail_unless(error == NULL, NULL);
1757 fail_unless(osync_queue_connect(write1, OSYNC_QUEUE_SENDER, &error), NULL);
1758 fail_unless(error == NULL, NULL);
1760 OSyncMessage *message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
1761 fail_unless(message != NULL, NULL);
1762 fail_unless(!osync_error_is_set(&error), NULL);
1764 osync_message_write_int(message, 4000000);
1765 osync_message_write_string(message, "this is a test string");
1766 osync_message_write_long_long_int(message, 400000000);
1767 osync_message_write_data(message, data, strlen(data) + 1);
1769 fail_unless(osync_queue_send_message(write1, NULL, message, &error), NULL);
1770 fail_unless(!osync_error_is_set(&error), NULL);
1771 osync_message_unref(message);
1773 message = osync_queue_get_message(read1);
1774 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
1776 int int1;
1777 long long int longint1;
1778 char *string;
1779 void *databuf;
1781 osync_message_read_int(message, &int1);
1782 osync_message_read_const_string(message, &string);
1783 osync_message_read_long_long_int(message, &longint1);
1784 osync_message_read_const_data(message, &databuf, strlen("this is another test string") + 1);
1786 fail_unless(int1 == 4000000, NULL);
1787 fail_unless(!strcmp(string, "this is a test string"), NULL);
1788 fail_unless(longint1 == 400000000, NULL);
1789 fail_unless(!strcmp(databuf, "this is another test string"), NULL);
1791 osync_message_unref(message);
1793 osync_assert(osync_queue_disconnect(read1, &error));
1794 osync_assert(error == NULL);
1796 message = osync_queue_get_message(write1);
1797 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
1798 osync_message_unref(message);
1800 osync_assert(osync_queue_disconnect(write1, &error));
1801 osync_assert(error == NULL);
1804 osync_queue_unref(read1);
1805 osync_queue_unref(write1);
1807 destroy_testbed(testbed);
1809 END_TEST
1811 START_TEST (ipc_pipes_stress)
1813 char *testbed = setup_testbed(NULL);
1815 OSyncError *error = NULL;
1816 OSyncQueue *read1 = NULL;
1817 OSyncQueue *read2 = NULL;
1818 OSyncQueue *write1 = NULL;
1819 OSyncQueue *write2 = NULL;
1822 // First the pipe from the parent to the child
1823 osync_assert(osync_queue_new_pipes(&read1, &write1, &error));
1824 osync_assert(error == NULL);
1826 // Then the pipe from the child to the parent
1827 osync_assert(osync_queue_new_pipes(&read2, &write2, &error));
1828 osync_assert(error == NULL);
1830 OSyncMessage *message = NULL;
1832 char *data = "this is another test string";
1834 pid_t cpid = fork();
1835 if (cpid == 0) { //Child
1837 osync_assert(osync_queue_disconnect(write1, &error));
1838 osync_queue_unref(write1);
1840 osync_assert(osync_queue_disconnect(read2, &error));
1841 osync_queue_unref(read2);
1843 client_queue = read1;
1844 server_queue = write2;
1846 GMainContext *context = g_main_context_new();
1847 OSyncThread *thread = osync_thread_new(context, &error);
1849 osync_queue_set_message_handler(client_queue, client_handler2, GINT_TO_POINTER(1));
1851 osync_queue_setup_with_gmainloop(client_queue, context);
1853 osync_thread_start(thread);
1855 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
1856 osync_assert(error == NULL);
1858 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
1859 osync_assert(error == NULL);
1861 osync_queue_cross_link(client_queue, server_queue);
1863 message = osync_queue_get_message(server_queue);
1864 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
1865 exit (1);
1867 osync_message_unref(message);
1870 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
1871 exit(1);
1872 osync_queue_unref(server_queue);
1874 osync_assert(osync_queue_disconnect(client_queue, &error));
1875 osync_assert(error == NULL);
1877 osync_thread_stop(thread);
1878 osync_thread_unref(thread);
1880 osync_queue_unref(client_queue);
1882 g_free(testbed);
1884 exit(0);
1885 } else {
1887 osync_assert(osync_queue_disconnect(write2, &error));
1888 osync_queue_unref(write2);
1890 osync_assert(osync_queue_disconnect(read1, &error));
1891 osync_queue_unref(read1);
1893 client_queue = write1;
1894 server_queue = read2;
1896 GMainContext *context = g_main_context_new();
1897 OSyncThread *thread = osync_thread_new(context, &error);
1899 osync_queue_set_message_handler(server_queue, server_handler2, GINT_TO_POINTER(1));
1901 osync_queue_setup_with_gmainloop(server_queue, context);
1903 osync_thread_start(thread);
1905 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
1906 fail_unless(error == NULL, NULL);
1908 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
1909 fail_unless(error == NULL, NULL);
1911 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
1912 fail_unless(message != NULL, NULL);
1913 fail_unless(!osync_error_is_set(&error), NULL);
1915 osync_message_write_int(message, 4000000);
1916 osync_message_write_string(message, "this is a test string");
1917 osync_message_write_long_long_int(message, 400000000);
1918 osync_message_write_data(message, data, strlen(data) + 1);
1920 fail_unless(osync_queue_send_message(client_queue, NULL, message, &error), NULL);
1921 fail_unless(!osync_error_is_set(&error), NULL);
1923 osync_message_unref(message);
1925 message = osync_queue_get_message(client_queue);
1926 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
1928 osync_message_unref(message);
1930 osync_queue_disconnect(client_queue, &error);
1931 fail_unless(error == NULL, NULL);
1933 osync_thread_stop(thread);
1934 osync_thread_unref(thread);
1936 int status = 0;
1937 wait(&status);
1938 fail_unless(WEXITSTATUS(status) == 0, NULL);
1941 osync_queue_unref(client_queue);
1942 osync_queue_unref(server_queue);
1944 destroy_testbed(testbed);
1946 END_TEST
1948 START_TEST (ipc_callback_break_pipes)
1950 num_msgs = 0;
1952 char *testbed = setup_testbed(NULL);
1954 OSyncError *error = NULL;
1955 OSyncQueue *read1 = NULL;
1956 OSyncQueue *read2 = NULL;
1957 OSyncQueue *write1 = NULL;
1958 OSyncQueue *write2 = NULL;
1959 OSyncMessage *message = NULL;
1961 // First the pipe from the parent to the child
1962 osync_assert(osync_queue_new_pipes(&read1, &write1, &error));
1963 osync_assert(error == NULL);
1965 // Then the pipe from the child to the parent
1966 osync_assert(osync_queue_new_pipes(&read2, &write2, &error));
1967 osync_assert(error == NULL);
1969 char *data = "this is another test string";
1971 pid_t cpid = fork();
1972 if (cpid == 0) { //Child
1974 osync_assert(osync_queue_disconnect(write1, &error));
1975 osync_queue_unref(write1);
1977 osync_assert(osync_queue_disconnect(read2, &error));
1978 osync_queue_unref(read2);
1980 client_queue = read1;
1981 server_queue = write2;
1983 GMainContext *context = g_main_context_new();
1984 OSyncThread *thread = osync_thread_new(context, &error);
1986 osync_queue_set_message_handler(client_queue, client_handler4, GINT_TO_POINTER(1));
1988 osync_queue_setup_with_gmainloop(client_queue, context);
1990 osync_thread_start(thread);
1992 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
1993 osync_assert(error == NULL);
1995 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
1996 osync_assert(error == NULL);
1998 osync_queue_cross_link(client_queue, server_queue);
2000 while (osync_queue_is_connected(client_queue)) { g_usleep(100); }
2002 osync_assert(osync_queue_disconnect(server_queue, &error));
2003 osync_assert(error == NULL);
2005 osync_thread_stop(thread);
2006 osync_thread_unref(thread);
2008 osync_queue_unref(client_queue);
2009 osync_queue_unref(server_queue);
2011 g_free(testbed);
2012 exit(0);
2013 } else {
2015 osync_assert(osync_queue_disconnect(write2, &error));
2016 osync_queue_unref(write2);
2018 osync_assert(osync_queue_disconnect(read1, &error));
2019 osync_queue_unref(read1);
2021 client_queue = write1;
2022 server_queue = read2;
2024 GMainContext *context = g_main_context_new();
2025 OSyncThread *thread = osync_thread_new(context, &error);
2027 osync_queue_set_message_handler(server_queue, server_handler4, GINT_TO_POINTER(1));
2029 osync_queue_setup_with_gmainloop(server_queue, context);
2031 osync_thread_start(thread);
2033 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
2034 fail_unless(error == NULL, NULL);
2036 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
2037 fail_unless(error == NULL, NULL);
2039 int i = 0;
2040 for (i = 0; i < req_msgs; i++) {
2041 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
2042 fail_unless(message != NULL, NULL);
2043 fail_unless(!osync_error_is_set(&error), NULL);
2045 osync_message_write_int(message, 4000000);
2046 osync_message_write_string(message, "this is a test string");
2047 osync_message_write_long_long_int(message, 400000000);
2048 osync_message_write_data(message, data, strlen(data) + 1);
2050 osync_message_set_handler(message, callback_handler2, GINT_TO_POINTER(1));
2052 fail_unless(osync_queue_send_message(client_queue, server_queue, message, &error), NULL);
2053 fail_unless(!osync_error_is_set(&error), NULL);
2055 osync_message_unref(message);
2058 message = osync_queue_get_message(client_queue);
2060 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
2062 osync_message_unref(message);
2064 while (num_msgs < req_msgs) { g_usleep(100); };
2066 osync_queue_disconnect(client_queue, &error);
2067 fail_unless(error == NULL, NULL);
2069 osync_queue_disconnect(server_queue, &error);
2070 osync_assert(error == NULL);
2072 osync_thread_stop(thread);
2073 osync_thread_unref(thread);
2075 int status = 0;
2076 wait(&status);
2077 fail_unless(WEXITSTATUS(status) == 0, NULL);
2080 osync_queue_unref(client_queue);
2081 osync_queue_unref(server_queue);
2083 destroy_testbed(testbed);
2085 END_TEST
2087 int num_callback_timeout = 0;
2088 int num_callback = 0;
2090 static void _message_handler(OSyncMessage *message, void *user_data)
2092 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
2093 osync_trace(TRACE_INTERNAL, "%s",osync_message_get_commandstr(message));
2094 if (osync_message_is_error(message))
2095 num_callback_timeout++;
2096 else
2097 num_callback++;
2098 osync_trace(TRACE_EXIT, "%s", __func__);
2101 char *data5 = "this is another test string";
2102 void client_handler5(OSyncMessage *message, void *user_data)
2104 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
2105 OSyncError *error = NULL;
2107 osync_assert(GPOINTER_TO_INT(user_data) ==1);
2108 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
2110 int int1;
2111 long long int longint1;
2112 char *string;
2113 char databuf[strlen(data5) + 1];
2116 osync_message_read_int(message, &int1);
2117 osync_message_read_string(message, &string);
2118 osync_message_read_long_long_int(message, &longint1);
2119 osync_message_read_data(message, databuf, strlen(data5) + 1);
2121 osync_assert(int1 == 4000000);
2122 osync_assert(!strcmp(string, "this is a test string"));
2123 osync_assert(longint1 == 400000000);
2124 osync_assert(!strcmp(databuf, data5));
2126 /* TIMEOUT TIMEOUT TIMEOUT (no reply...) */
2128 /* Proper code would reply to this message, but for testing
2129 purposes we don't reply and simulate a "timeout" situation */
2131 osync_trace(TRACE_EXIT, "%s", __func__);
2134 START_TEST (ipc_timeout)
2136 /* This testcase is inteded to test osync_queue_send_message_with_timeout().
2137 Client got forked and listens for messages from Server and replies.
2139 To simulate a "timeout" situation the Client doesn't reply to one of the Server messages.
2141 The timeout handler will call the _message_handler() with an error.
2142 JFYI, every timed out message calls the callback/message_handler with an (timeout) error.
2145 char *testbed = setup_testbed(NULL);
2146 osync_testing_file_remove("/tmp/testpipe-server");
2147 osync_testing_file_remove("/tmp/testpipe-client");
2149 num_callback_timeout = 0;
2150 num_callback = 0;
2152 OSyncError *error = NULL;
2153 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
2154 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
2155 OSyncMessage *message = NULL;
2157 osync_queue_create(server_queue, &error);
2158 fail_unless(error == NULL, NULL);
2160 osync_queue_create(client_queue, &error);
2161 fail_unless(error == NULL, NULL);
2163 pid_t cpid = fork();
2164 if (cpid == 0) { //Child
2166 GMainContext *context = g_main_context_new();
2167 OSyncThread *thread = osync_thread_new(context, &error);
2169 osync_queue_set_message_handler(client_queue, client_handler5, GINT_TO_POINTER(1));
2170 osync_queue_set_pending_limit(client_queue, OSYNC_QUEUE_PENDING_LIMIT);
2172 osync_queue_setup_with_gmainloop(client_queue, context);
2174 osync_thread_start(thread);
2176 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
2177 osync_assert(error == NULL);
2179 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
2180 osync_assert(error == NULL);
2182 osync_queue_cross_link(client_queue, server_queue);
2184 message = osync_queue_get_message(server_queue);
2186 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
2187 exit (1);
2190 osync_message_unref(message);
2192 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
2193 exit(1);
2194 osync_queue_unref(server_queue);
2196 osync_assert(osync_queue_disconnect(client_queue, &error));
2197 osync_assert(error == NULL);
2199 osync_thread_stop(thread);
2200 osync_thread_unref(thread);
2202 osync_queue_unref(client_queue);
2204 g_free(testbed);
2206 exit(0);
2207 } else {
2208 GMainContext *context = g_main_context_new();
2209 OSyncThread *thread = osync_thread_new(context, &error);
2211 osync_queue_set_message_handler(server_queue, server_handler4, GINT_TO_POINTER(1));
2213 osync_queue_setup_with_gmainloop(server_queue, context);
2215 osync_thread_start(thread);
2217 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
2218 fail_unless(error == NULL, NULL);
2220 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
2221 fail_unless(error == NULL, NULL);
2223 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
2224 fail_unless(message != NULL, NULL);
2225 fail_unless(!osync_error_is_set(&error), NULL);
2227 osync_message_set_handler(message, _message_handler, NULL);
2229 osync_message_write_int(message, 4000000);
2230 osync_message_write_string(message, "this is a test string");
2231 osync_message_write_long_long_int(message, 400000000);
2232 osync_message_write_data(message, data5, strlen(data5) + 1);
2234 // Send with timeout of one second
2235 fail_unless(osync_queue_send_message_with_timeout(client_queue, server_queue, message, 1, &error), NULL);
2236 fail_unless(!osync_error_is_set(&error), NULL);
2238 osync_message_unref(message);
2240 // Block
2241 g_usleep(5*G_USEC_PER_SEC);
2243 osync_queue_disconnect(server_queue, &error);
2244 fail_unless(error == NULL, NULL);
2246 while (!(message = osync_queue_get_message(client_queue))) {
2247 g_usleep(10000);
2250 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
2251 exit (1);
2253 osync_message_unref(message);
2255 osync_queue_disconnect(client_queue, &error);
2256 fail_unless(error == NULL, NULL);
2258 int status = 0;
2259 wait(&status);
2260 fail_unless(WEXITSTATUS(status) == 0, NULL);
2263 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
2265 fail_unless(osync_queue_remove(client_queue, &error), NULL);
2266 fail_unless(osync_queue_remove(server_queue, &error), NULL);
2267 fail_unless(!osync_error_is_set(&error), NULL);
2269 /* Check if the timeout handler replied with an error */
2270 fail_unless(num_callback_timeout == 1, NULL);
2271 fail_unless(num_callback == 0, NULL);
2273 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
2275 osync_queue_unref(client_queue);
2276 osync_queue_unref(server_queue);
2278 destroy_testbed(testbed);
2280 END_TEST
2282 int ch_sleep_time = 3; // Seconds
2283 void client_handler_sleep(OSyncMessage *message, void *user_data)
2285 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
2286 OSyncError *error = NULL;
2288 osync_assert(GPOINTER_TO_INT(user_data) ==1);
2289 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
2291 int int1;
2292 long long int longint1;
2293 char *string;
2294 char databuf[strlen(data5) + 1];
2297 osync_message_read_int(message, &int1);
2298 osync_message_read_string(message, &string);
2299 osync_message_read_long_long_int(message, &longint1);
2300 osync_message_read_data(message, databuf, strlen(data5) + 1);
2302 osync_assert(int1 == 4000000);
2303 osync_assert(!strcmp(string, "this is a test string"));
2304 osync_assert(longint1 == 400000000);
2305 osync_assert(!strcmp(databuf, data5));
2307 // Do some time consuming processing
2308 g_usleep(ch_sleep_time*G_USEC_PER_SEC);
2310 OSyncMessage *reply = osync_message_new_reply(message, &error);
2312 osync_queue_send_message(server_queue, NULL, reply, &error);
2314 osync_message_unref(reply);
2316 osync_trace(TRACE_EXIT, "%s", __func__);
2319 START_TEST (ipc_late_reply)
2321 /* This testcase is inteded to test osync_queue_send_message_with_timeout().
2322 Client got forked and listens for messages from Server and replies.
2324 To simulate a "timeout" situation the Client delays 3 seconds and then replies
2326 The timeout handler will call the _message_handler() with an error and the late reply
2327 will be discarded.
2329 JFYI, every timed out message calls the callback/message_handler with an (timeout) error.
2332 char *testbed = setup_testbed(NULL);
2333 osync_testing_file_remove("/tmp/testpipe-server");
2334 osync_testing_file_remove("/tmp/testpipe-client");
2336 num_callback_timeout = 0;
2337 num_callback = 0;
2338 ch_sleep_time = 3;
2340 OSyncError *error = NULL;
2341 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
2342 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
2343 OSyncMessage *message = NULL;
2345 osync_queue_create(server_queue, &error);
2346 fail_unless(error == NULL, NULL);
2348 osync_queue_create(client_queue, &error);
2349 fail_unless(error == NULL, NULL);
2351 pid_t cpid = fork();
2352 if (cpid == 0) { //Child
2354 GMainContext *context = g_main_context_new();
2355 OSyncThread *thread = osync_thread_new(context, &error);
2357 osync_queue_set_message_handler(client_queue, client_handler_sleep, GINT_TO_POINTER(1));
2358 osync_queue_set_pending_limit(client_queue, OSYNC_QUEUE_PENDING_LIMIT);
2360 osync_queue_setup_with_gmainloop(client_queue, context);
2362 osync_thread_start(thread);
2364 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
2365 osync_assert(error == NULL);
2367 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
2368 osync_assert(error == NULL);
2370 osync_queue_cross_link(client_queue, server_queue);
2372 message = osync_queue_get_message(server_queue);
2374 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
2375 exit (1);
2378 osync_message_unref(message);
2380 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
2381 exit(1);
2382 osync_queue_unref(server_queue);
2384 osync_assert(osync_queue_disconnect(client_queue, &error));
2385 osync_assert(error == NULL);
2387 osync_thread_stop(thread);
2388 osync_thread_unref(thread);
2390 osync_queue_unref(client_queue);
2392 g_free(testbed);
2394 exit(0);
2395 } else {
2396 GMainContext *context = g_main_context_new();
2397 OSyncThread *thread = osync_thread_new(context, &error);
2399 osync_queue_set_message_handler(server_queue, server_handler4, GINT_TO_POINTER(1));
2401 osync_queue_setup_with_gmainloop(server_queue, context);
2403 osync_thread_start(thread);
2405 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
2406 fail_unless(error == NULL, NULL);
2408 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
2409 fail_unless(error == NULL, NULL);
2411 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
2412 fail_unless(message != NULL, NULL);
2413 fail_unless(!osync_error_is_set(&error), NULL);
2415 osync_message_set_handler(message, _message_handler, NULL);
2417 osync_message_write_int(message, 4000000);
2418 osync_message_write_string(message, "this is a test string");
2419 osync_message_write_long_long_int(message, 400000000);
2420 osync_message_write_data(message, data5, strlen(data5) + 1);
2422 // Send with timeout of one second
2423 fail_unless(osync_queue_send_message_with_timeout(client_queue, server_queue, message, 1, &error), NULL);
2424 fail_unless(!osync_error_is_set(&error), NULL);
2426 osync_message_unref(message);
2428 // Block
2429 g_usleep(5*G_USEC_PER_SEC);
2431 osync_queue_disconnect(server_queue, &error);
2432 fail_unless(error == NULL, NULL);
2434 while (!(message = osync_queue_get_message(client_queue))) {
2435 g_usleep(10000);
2438 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
2439 exit (1);
2441 osync_message_unref(message);
2443 osync_queue_disconnect(client_queue, &error);
2444 fail_unless(error == NULL, NULL);
2446 int status = 0;
2447 wait(&status);
2448 fail_unless(WEXITSTATUS(status) == 0, NULL);
2451 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
2453 fail_unless(osync_queue_remove(client_queue, &error), NULL);
2454 fail_unless(osync_queue_remove(server_queue, &error), NULL);
2455 fail_unless(!osync_error_is_set(&error), NULL);
2457 /* Check if the timeout handler replied with an error */
2458 fail_unless(num_callback_timeout == 1, NULL);
2459 fail_unless(num_callback == 0, NULL);
2461 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
2463 osync_queue_unref(client_queue);
2464 osync_queue_unref(server_queue);
2466 destroy_testbed(testbed);
2468 END_TEST
2470 START_TEST (ipc_loop_with_timeout)
2473 /* Even though each action takes 1 second, none of these messages should time out
2474 as they are being sent with a timeout of 3 seconds */
2476 num_msgs = 0;
2477 req_msgs = 20;
2478 ch_sleep_time = 1; // Second
2480 char *testbed = setup_testbed(NULL);
2481 osync_testing_file_remove("/tmp/testpipe-server");
2482 osync_testing_file_remove("/tmp/testpipe-client");
2484 OSyncError *error = NULL;
2485 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
2486 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
2487 OSyncMessage *message = NULL;
2489 osync_queue_create(server_queue, &error);
2490 fail_unless(error == NULL, NULL);
2492 osync_queue_create(client_queue, &error);
2493 fail_unless(error == NULL, NULL);
2494 char *data = "this is another test string";
2496 pid_t cpid = fork();
2497 if (cpid == 0) { //Child
2499 GMainContext *context = g_main_context_new();
2500 OSyncThread *thread = osync_thread_new(context, &error);
2502 osync_queue_set_message_handler(client_queue, client_handler_sleep, GINT_TO_POINTER(1));
2503 osync_queue_set_pending_limit(client_queue, OSYNC_QUEUE_PENDING_LIMIT);
2505 osync_queue_setup_with_gmainloop(client_queue, context);
2507 osync_thread_start(thread);
2509 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
2510 osync_assert(error == NULL);
2512 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
2513 osync_assert(error == NULL);
2515 osync_queue_cross_link(client_queue, server_queue);
2517 message = osync_queue_get_message(server_queue);
2519 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
2520 exit (1);
2523 osync_message_unref(message);
2525 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
2526 exit(1);
2527 osync_queue_unref(server_queue);
2529 osync_assert(osync_queue_disconnect(client_queue, &error));
2530 osync_assert(error == NULL);
2532 osync_thread_stop(thread);
2533 osync_thread_unref(thread);
2535 osync_queue_unref(client_queue);
2537 g_free(testbed);
2539 exit(0);
2540 } else {
2541 GMainContext *context = g_main_context_new();
2542 OSyncThread *thread = osync_thread_new(context, &error);
2544 osync_queue_set_message_handler(server_queue, server_handler_abort, GINT_TO_POINTER(1));
2546 osync_queue_setup_with_gmainloop(server_queue, context);
2548 osync_thread_start(thread);
2550 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
2551 fail_unless(error == NULL, NULL);
2553 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
2554 fail_unless(error == NULL, NULL);
2556 int i = 0;
2557 for (i = 0; i < req_msgs; i++) {
2558 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
2559 fail_unless(message != NULL, NULL);
2560 fail_unless(!osync_error_is_set(&error), NULL);
2562 osync_message_write_int(message, 4000000);
2563 osync_message_write_string(message, "this is a test string");
2564 osync_message_write_long_long_int(message, 400000000);
2565 osync_message_write_data(message, data, strlen(data) + 1);
2567 osync_message_set_handler(message, callback_handler_check_reply, GINT_TO_POINTER(1));
2569 fail_unless(osync_queue_send_message_with_timeout(client_queue, server_queue, message, 3, &error), NULL);
2570 fail_unless(!osync_error_is_set(&error), NULL);
2572 osync_message_unref(message);
2575 message = osync_queue_get_message(client_queue);
2577 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
2579 osync_message_unref(message);
2581 osync_queue_disconnect(client_queue, &error);
2582 fail_unless(error == NULL, NULL);
2584 osync_thread_stop(thread);
2585 osync_thread_unref(thread);
2587 int status = 0;
2588 wait(&status);
2589 fail_unless(WEXITSTATUS(status) == 0, NULL);
2592 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
2594 fail_unless(osync_queue_remove(client_queue, &error), NULL);
2595 fail_unless(osync_queue_remove(server_queue, &error), NULL);
2596 fail_unless(!osync_error_is_set(&error), NULL);
2598 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
2600 osync_queue_unref(client_queue);
2601 osync_queue_unref(server_queue);
2603 destroy_testbed(testbed);
2605 END_TEST
2607 GSList *ch_pending = NULL;
2608 void client_handler_first_part(OSyncMessage *message, void *user_data)
2610 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
2611 OSyncError *error = NULL;
2613 osync_assert(GPOINTER_TO_INT(user_data) ==1);
2614 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
2616 int int1;
2617 long long int longint1;
2618 char *string;
2619 char databuf[strlen(data5) + 1];
2622 osync_message_read_int(message, &int1);
2623 osync_message_read_string(message, &string);
2624 osync_message_read_long_long_int(message, &longint1);
2625 osync_message_read_data(message, databuf, strlen(data5) + 1);
2627 osync_assert(int1 == 4000000);
2628 osync_assert(!strcmp(string, "this is a test string"));
2629 osync_assert(longint1 == 400000000);
2630 osync_assert(!strcmp(databuf, data5));
2632 // Put message on pending queue and return
2633 osync_message_ref(message);
2634 ch_pending = g_slist_append(ch_pending, message);
2636 osync_trace(TRACE_EXIT, "%s", __func__);
2638 gboolean client_handler_second_part(gpointer userdata)
2640 OSyncError *error = NULL;
2642 osync_trace(TRACE_ENTRY, "%s(%p)", __func__, userdata);
2644 if (ch_pending) {
2646 OSyncMessage *message = ch_pending->data;
2648 OSyncMessage *reply = osync_message_new_reply(message, &error);
2650 osync_queue_send_message(server_queue, NULL, reply, &error);
2652 osync_message_unref(reply);
2654 ch_pending = g_slist_remove(ch_pending, message);
2655 osync_message_unref(message);
2657 osync_trace(TRACE_EXIT, "%s", __func__);
2658 return TRUE;
2661 osync_trace(TRACE_EXIT, "%s: no more entries", __func__);
2662 return FALSE;
2665 START_TEST (ipc_loop_timeout_with_idle)
2668 /* Same as ipc_loop_with_timeout except that the client handler doesn't sleep,
2669 so the queue dispatchers can run while the operation is waiting.
2670 Even though each action takes 1 second, and might be delayed by 3 seconds
2671 due to the messages already processed on the pending queue, none of these
2672 messages should time out as they are being sent with a timeout of 5 seconds */
2674 num_msgs = 0;
2675 req_msgs = 10;
2677 char *testbed = setup_testbed(NULL);
2678 osync_testing_file_remove("/tmp/testpipe-server");
2679 osync_testing_file_remove("/tmp/testpipe-client");
2681 OSyncError *error = NULL;
2682 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
2683 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
2684 OSyncMessage *message = NULL;
2686 osync_queue_create(server_queue, &error);
2687 fail_unless(error == NULL, NULL);
2689 osync_queue_create(client_queue, &error);
2690 fail_unless(error == NULL, NULL);
2691 char *data = "this is another test string";
2693 pid_t cpid = fork();
2694 if (cpid == 0) { //Child
2696 GMainContext *context = g_main_context_new();
2697 OSyncThread *thread = osync_thread_new(context, &error);
2699 osync_queue_set_message_handler(client_queue, client_handler_first_part, GINT_TO_POINTER(1));
2700 // Set pending limit to 3 so response wil be delayed at most 3 seconds
2701 osync_queue_set_pending_limit(client_queue, 3);
2703 osync_queue_setup_with_gmainloop(client_queue, context);
2705 osync_thread_start(thread);
2707 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
2708 osync_assert(error == NULL);
2710 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
2711 osync_assert(error == NULL);
2713 osync_queue_cross_link(client_queue, server_queue);
2715 GSource *tsource = g_timeout_source_new(1000);
2716 osync_assert(tsource);
2717 g_source_set_callback(tsource, client_handler_second_part, NULL, NULL);
2718 osync_assert(g_source_attach(tsource, context));
2719 g_source_unref(tsource);
2721 message = osync_queue_get_message(server_queue);
2723 if (osync_message_get_command(message) != OSYNC_MESSAGE_QUEUE_HUP) {
2724 exit (1);
2727 osync_message_unref(message);
2729 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
2730 exit(1);
2731 osync_queue_unref(server_queue);
2733 osync_assert(osync_queue_disconnect(client_queue, &error));
2734 osync_assert(error == NULL);
2736 osync_thread_stop(thread);
2737 osync_thread_unref(thread);
2739 osync_queue_unref(client_queue);
2741 g_free(testbed);
2743 exit(0);
2744 } else {
2745 GMainContext *context = g_main_context_new();
2746 OSyncThread *thread = osync_thread_new(context, &error);
2748 osync_queue_set_message_handler(server_queue, server_handler_abort, GINT_TO_POINTER(1));
2750 osync_queue_setup_with_gmainloop(server_queue, context);
2752 osync_thread_start(thread);
2754 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
2755 fail_unless(error == NULL, NULL);
2757 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
2758 fail_unless(error == NULL, NULL);
2760 int i = 0;
2761 for (i = 0; i < req_msgs; i++) {
2762 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
2763 fail_unless(message != NULL, NULL);
2764 fail_unless(!osync_error_is_set(&error), NULL);
2766 osync_message_write_int(message, 4000000);
2767 osync_message_write_string(message, "this is a test string");
2768 osync_message_write_long_long_int(message, 400000000);
2769 osync_message_write_data(message, data, strlen(data) + 1);
2771 osync_message_set_handler(message, callback_handler_check_reply, GINT_TO_POINTER(1));
2773 // Timeout of 5 will do as pending limit is 3
2774 fail_unless(osync_queue_send_message_with_timeout(client_queue, server_queue, message, 5, &error), NULL);
2775 fail_unless(!osync_error_is_set(&error), NULL);
2777 osync_message_unref(message);
2780 message = osync_queue_get_message(client_queue);
2782 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
2784 osync_message_unref(message);
2786 osync_queue_disconnect(client_queue, &error);
2787 fail_unless(error == NULL, NULL);
2789 osync_thread_stop(thread);
2790 osync_thread_unref(thread);
2792 int status = 0;
2793 wait(&status);
2794 fail_unless(WEXITSTATUS(status) == 0, NULL);
2797 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
2799 fail_unless(osync_queue_remove(client_queue, &error), NULL);
2800 fail_unless(osync_queue_remove(server_queue, &error), NULL);
2801 fail_unless(!osync_error_is_set(&error), NULL);
2803 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
2805 osync_queue_unref(client_queue);
2806 osync_queue_unref(server_queue);
2808 destroy_testbed(testbed);
2810 END_TEST
2812 void client_handler6(OSyncMessage *message, void *user_data)
2814 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, message, user_data);
2815 OSyncError *error = NULL;
2817 osync_assert(GPOINTER_TO_INT(user_data) ==1);
2819 if (osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_ERROR) {
2820 osync_queue_disconnect(client_queue, NULL);
2821 osync_trace(TRACE_EXIT, "%s: disconnect", __func__);
2822 return;
2825 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_INITIALIZE);
2827 int int1;
2828 long long int longint1;
2829 char *string;
2830 char databuf[strlen(data5) + 1];
2832 osync_message_read_int(message, &int1);
2833 osync_message_read_string(message, &string);
2834 osync_message_read_long_long_int(message, &longint1);
2835 osync_message_read_data(message, databuf, strlen(data5) + 1);
2837 osync_assert(int1 == 4000000);
2838 osync_assert(!strcmp(string, "this is a test string"));
2839 osync_assert(longint1 == 400000000);
2840 osync_assert(!strcmp(databuf, data5));
2842 /* TIMEOUT TIMEOUT TIMEOUT (no reply...) */
2844 /* Proper code would reply to this message, but for testing
2845 purposes we don't reply and simulate a "timeout" situation */
2847 osync_trace(TRACE_EXIT, "%s", __func__);
2849 START_TEST (ipc_timeout_noreplyq)
2851 /* This testcase is inteded to test timeout before the command and reply queues are cross-linked.
2852 Client got forked and listens for messages from Server and replies.
2854 To simulate a "timeout" situation the Client doesn't reply to one of the Server messages.
2856 As there is no reply queue, an error will be sent to the **client**, who then disconnects
2857 so an error (although not a timeout) ends up sent to the server.
2860 char *testbed = setup_testbed(NULL);
2861 osync_testing_file_remove("/tmp/testpipe-server");
2862 osync_testing_file_remove("/tmp/testpipe-client");
2864 num_callback_timeout = 0;
2865 num_callback = 0;
2867 OSyncError *error = NULL;
2868 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
2869 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
2870 OSyncMessage *message = NULL;
2872 osync_queue_create(server_queue, &error);
2873 fail_unless(error == NULL, NULL);
2875 osync_queue_create(client_queue, &error);
2876 fail_unless(error == NULL, NULL);
2878 pid_t cpid = fork();
2879 if (cpid == 0) { //Child
2881 GMainContext *context = g_main_context_new();
2882 OSyncThread *thread = osync_thread_new(context, &error);
2884 osync_queue_set_message_handler(client_queue, client_handler6, GINT_TO_POINTER(1));
2885 osync_queue_set_pending_limit(client_queue, OSYNC_QUEUE_PENDING_LIMIT);
2887 osync_queue_setup_with_gmainloop(client_queue, context);
2889 osync_thread_start(thread);
2891 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
2892 osync_assert(error == NULL);
2894 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
2895 osync_assert(error == NULL);
2897 /* Do not cross-link */
2898 /*osync_queue_cross_link(client_queue, server_queue);*/
2900 message = osync_queue_get_message(server_queue);
2902 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
2904 osync_message_unref(message);
2906 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
2907 exit(1);
2908 osync_queue_unref(server_queue);
2910 osync_assert(osync_queue_disconnect(client_queue, &error));
2911 osync_assert(error == NULL);
2913 osync_thread_stop(thread);
2914 osync_thread_unref(thread);
2916 osync_queue_unref(client_queue);
2918 g_free(testbed);
2920 exit(0);
2921 } else {
2922 GMainContext *context = g_main_context_new();
2923 OSyncThread *thread = osync_thread_new(context, &error);
2925 osync_queue_set_message_handler(server_queue, server_handler4, GINT_TO_POINTER(1));
2927 osync_queue_setup_with_gmainloop(server_queue, context);
2929 osync_thread_start(thread);
2931 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
2932 fail_unless(error == NULL, NULL);
2934 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
2935 fail_unless(error == NULL, NULL);
2937 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
2938 fail_unless(message != NULL, NULL);
2939 fail_unless(!osync_error_is_set(&error), NULL);
2941 osync_message_set_handler(message, _message_handler, NULL);
2943 osync_message_write_int(message, 4000000);
2944 osync_message_write_string(message, "this is a test string");
2945 osync_message_write_long_long_int(message, 400000000);
2946 osync_message_write_data(message, data5, strlen(data5) + 1);
2948 // Send with timeout of one second
2949 fail_unless(osync_queue_send_message_with_timeout(client_queue, server_queue, message, 1, &error), NULL);
2950 fail_unless(!osync_error_is_set(&error), NULL);
2952 osync_message_unref(message);
2954 while (!(message = osync_queue_get_message(client_queue))) {
2955 g_usleep(10000);
2958 fail_unless(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
2959 osync_message_unref(message);
2961 osync_queue_disconnect(client_queue, &error);
2962 fail_unless(error == NULL, NULL);
2964 osync_queue_disconnect(server_queue, &error);
2965 fail_unless(error == NULL, NULL);
2967 int status = 0;
2968 wait(&status);
2969 fail_unless(WEXITSTATUS(status) == 0, NULL);
2972 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
2974 fail_unless(osync_queue_remove(client_queue, &error), NULL);
2975 fail_unless(osync_queue_remove(server_queue, &error), NULL);
2976 fail_unless(!osync_error_is_set(&error), NULL);
2978 /* Check if the timeout handler replied with an error */
2979 fail_unless(num_callback_timeout == 1, NULL);
2980 fail_unless(num_callback == 0, NULL);
2982 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
2984 osync_queue_unref(client_queue);
2985 osync_queue_unref(server_queue);
2987 destroy_testbed(testbed);
2989 END_TEST
2991 START_TEST (ipc_timeout_noreceiver)
2993 /* This testcase is intended to test the case where the receiver is not even listening,
2994 and so does not run the timeout.
2997 char *testbed = setup_testbed(NULL);
2998 osync_testing_file_remove("/tmp/testpipe-server");
2999 osync_testing_file_remove("/tmp/testpipe-client");
3001 num_callback_timeout = 0;
3002 num_callback = 0;
3004 OSyncError *error = NULL;
3005 server_queue = osync_queue_new("/tmp/testpipe-server", &error);
3006 client_queue = osync_queue_new("/tmp/testpipe-client", &error);
3007 OSyncMessage *message = NULL;
3009 osync_queue_create(server_queue, &error);
3010 fail_unless(error == NULL, NULL);
3012 osync_queue_create(client_queue, &error);
3013 fail_unless(error == NULL, NULL);
3015 pid_t cpid = fork();
3016 if (cpid == 0) { //Child
3018 GMainContext *context = g_main_context_new();
3019 OSyncThread *thread = osync_thread_new(context, &error);
3021 osync_queue_set_message_handler(client_queue, client_handler1, GINT_TO_POINTER(1));
3022 osync_queue_set_pending_limit(client_queue, OSYNC_QUEUE_PENDING_LIMIT);
3024 /* Do not start receiver */
3025 /* osync_queue_setup_with_gmainloop(client_queue, context); */
3027 osync_thread_start(thread);
3029 osync_assert(osync_queue_connect(client_queue, OSYNC_QUEUE_RECEIVER, &error));
3030 osync_assert(error == NULL);
3032 osync_assert(osync_queue_connect(server_queue, OSYNC_QUEUE_SENDER, &error));
3033 osync_assert(error == NULL);
3035 /* Do not cross-link */
3036 osync_queue_cross_link(client_queue, server_queue);
3038 message = osync_queue_get_message(server_queue);
3040 osync_assert(osync_message_get_command(message) == OSYNC_MESSAGE_QUEUE_HUP);
3042 osync_message_unref(message);
3044 if (osync_queue_disconnect(server_queue, &error) != TRUE || error != NULL)
3045 exit(1);
3046 osync_queue_unref(server_queue);
3048 osync_assert(osync_queue_disconnect(client_queue, &error));
3049 osync_assert(error == NULL);
3051 osync_thread_stop(thread);
3052 osync_thread_unref(thread);
3054 osync_queue_unref(client_queue);
3056 g_free(testbed);
3058 exit(0);
3059 } else {
3060 GMainContext *context = g_main_context_new();
3061 OSyncThread *thread = osync_thread_new(context, &error);
3063 osync_queue_set_message_handler(server_queue, server_handler4, GINT_TO_POINTER(1));
3065 osync_queue_setup_with_gmainloop(server_queue, context);
3067 osync_thread_start(thread);
3069 fail_unless(osync_queue_connect(client_queue, OSYNC_QUEUE_SENDER, &error), NULL);
3070 fail_unless(error == NULL, NULL);
3072 fail_unless(osync_queue_connect(server_queue, OSYNC_QUEUE_RECEIVER, &error), NULL);
3073 fail_unless(error == NULL, NULL);
3075 message = osync_message_new(OSYNC_MESSAGE_INITIALIZE, 0, &error);
3076 fail_unless(message != NULL, NULL);
3077 fail_unless(!osync_error_is_set(&error), NULL);
3079 osync_message_set_handler(message, _message_handler, NULL);
3081 osync_message_write_int(message, 4000000);
3082 osync_message_write_string(message, "this is a test string");
3083 osync_message_write_long_long_int(message, 400000000);
3084 osync_message_write_data(message, data5, strlen(data5) + 1);
3086 // Send with timeout of one second
3087 fail_unless(osync_queue_send_message_with_timeout(client_queue, server_queue, message, 1, &error), NULL);
3088 fail_unless(!osync_error_is_set(&error), NULL);
3090 osync_message_unref(message);
3092 /* Note: OSYNC_QUEUE_PENDING_QUEUE_MIN_TIMEOUT is 20 */
3093 g_usleep(25*G_USEC_PER_SEC);
3095 /* Check if the timeout handler replied with an error.
3096 Note: it is important we check **before** we start disconnecting
3097 otherwise we are not testing the right thing */
3098 fail_unless(num_callback_timeout == 1, NULL);
3099 fail_unless(num_callback == 0, NULL);
3101 osync_queue_disconnect(client_queue, &error);
3102 fail_unless(error == NULL, NULL);
3104 osync_queue_disconnect(server_queue, &error);
3105 fail_unless(error == NULL, NULL);
3107 int status = 0;
3108 wait(&status);
3109 fail_unless(WEXITSTATUS(status) == 0, NULL);
3112 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == TRUE, NULL);
3114 fail_unless(osync_queue_remove(client_queue, &error), NULL);
3115 fail_unless(osync_queue_remove(server_queue, &error), NULL);
3116 fail_unless(!osync_error_is_set(&error), NULL);
3118 fail_unless(osync_testing_file_exists("/tmp/testpipe-client") == FALSE, NULL);
3120 osync_queue_unref(client_queue);
3121 osync_queue_unref(server_queue);
3123 destroy_testbed(testbed);
3125 END_TEST
3127 OSYNC_TESTCASE_START("ipc")
3128 OSYNC_TESTCASE_ADD(ipc_new)
3129 OSYNC_TESTCASE_ADD(ipc_ref)
3130 OSYNC_TESTCASE_ADD(ipc_create)
3131 OSYNC_TESTCASE_ADD(ipc_connect)
3132 OSYNC_TESTCASE_ADD(ipc_payload)
3133 OSYNC_TESTCASE_ADD(ipc_payload_wait)
3134 OSYNC_TESTCASE_ADD(ipc_payload_stress)
3135 OSYNC_TESTCASE_ADD(ipc_payload_stress2)
3136 OSYNC_TESTCASE_ADD(ipc_large_payload)
3138 OSYNC_TESTCASE_ADD(ipc_error_no_pipe)
3139 OSYNC_TESTCASE_ADD(ipc_error_perm)
3140 OSYNC_TESTCASE_ADD(ipc_error_rem)
3141 OSYNC_TESTCASE_ADD(ipc_error_rem2)
3143 OSYNC_TESTCASE_ADD(ipc_loop_payload)
3144 OSYNC_TESTCASE_ADD(ipc_loop_stress)
3145 OSYNC_TESTCASE_ADD(ipc_loop_callback)
3146 OSYNC_TESTCASE_ADD(ipc_callback_break)
3148 OSYNC_TESTCASE_ADD(ipc_pipes)
3149 OSYNC_TESTCASE_ADD(ipc_pipes_stress)
3150 OSYNC_TESTCASE_ADD(ipc_callback_break_pipes)
3152 OSYNC_TESTCASE_ADD(ipc_timeout)
3153 OSYNC_TESTCASE_ADD(ipc_late_reply)
3154 OSYNC_TESTCASE_ADD(ipc_loop_with_timeout)
3155 OSYNC_TESTCASE_ADD(ipc_loop_timeout_with_idle)
3156 OSYNC_TESTCASE_ADD(ipc_timeout_noreplyq)
3157 OSYNC_TESTCASE_ADD(ipc_timeout_noreceiver)
3158 OSYNC_TESTCASE_END