6 #include <opensync/opensync-ipc.h>
7 #include "opensync/ipc/opensync_message_internals.h"
8 #include "opensync/ipc/opensync_queue_internals.h"
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
);
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
);
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
);
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
);
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
)
91 osync_queue_unref(queue
);
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
);
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
);
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";
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
) {
154 long long int longint1
;
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
)
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
) {
185 osync_message_unref(message
);
187 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
189 osync_queue_unref(server_queue
);
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
))) {
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
))) {
230 if (osync_message_get_command(message
) != OSYNC_MESSAGE_QUEUE_HUP
) {
234 osync_message_unref(message
);
236 osync_queue_disconnect(client_queue
, &error
);
237 fail_unless(error
== NULL
, NULL
);
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
);
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";
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
))) {
290 if (osync_message_get_command(message
) != OSYNC_MESSAGE_INITIALIZE
) {
295 long long int longint1
;
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
)
323 osync_queue_unref(client_queue
);
325 while (!(message
= osync_queue_get_message(server_queue
))) {
329 if (osync_message_get_command(message
) != OSYNC_MESSAGE_QUEUE_HUP
) {
333 osync_message_unref(message
);
334 g_usleep(1*G_USEC_PER_SEC
);
336 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
338 osync_queue_unref(server_queue
);
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
))) {
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
))) {
379 if (osync_message_get_command(message
) != OSYNC_MESSAGE_QUEUE_HUP
) {
382 osync_message_unref(message
);
384 osync_queue_disconnect(client_queue
, &error
);
385 fail_unless(error
== NULL
, NULL
);
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
);
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");
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
);
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
) {
446 osync_trace(TRACE_INTERNAL
, "Parsing message");
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
);
466 if (osync_queue_disconnect(client_queue
, &error
) != TRUE
|| error
!= NULL
)
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
) {
476 osync_message_unref(message
);
478 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
480 osync_queue_unref(server_queue
);
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
);
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
) {
526 osync_message_unref(message
);
528 osync_queue_disconnect(client_queue
, &error
);
529 fail_unless(error
== NULL
, NULL
);
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
);
548 destroy_testbed(testbed
);
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");
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
);
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
) {
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
)
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
) {
622 osync_message_unref(message
);
624 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
626 osync_queue_unref(server_queue
);
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
) {
669 osync_message_unref(message
);
671 osync_queue_disconnect(client_queue
, &error
);
672 fail_unless(error
== NULL
, NULL
);
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
);
691 destroy_testbed(testbed
);
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");
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
);
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
) {
734 void *databuf
= NULL
;
735 osync_message_read_const_data(message
, &databuf
, size
);
737 if (memcmp(databuf
, data
, size
))
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
)
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
) {
759 osync_message_unref(message
);
761 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
763 osync_queue_unref(server_queue
);
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
) {
805 osync_message_unref(message
);
807 osync_queue_disconnect(client_queue
, &error
);
808 fail_unless(error
== NULL
, NULL
);
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
);
827 destroy_testbed(testbed
);
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
);
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))
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
);
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
);
895 if (cpid
== 0) { //Child
896 osync_assert(osync_queue_connect(server_queue
, OSYNC_QUEUE_RECEIVER
, &error
));
897 osync_assert(error
== NULL
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
1034 long long int longint1
;
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
) {
1099 osync_message_unref(message
);
1101 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
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
);
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
);
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
);
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);
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
);
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
);
1220 long long int longint1
;
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
) {
1286 osync_message_unref(message
);
1288 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
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
);
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
);
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
);
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);
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
)
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
);
1397 long long int longint1
;
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
)
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
) {
1466 osync_message_unref(message
);
1468 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
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
);
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
);
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
);
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
);
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
);
1561 osync_assert(osync_message_get_command(message
) == OSYNC_MESSAGE_REPLY
);
1566 osync_trace(TRACE_EXIT
, "%s", __func__
);
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
);
1585 long long int longint1
;
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
);
1604 OSyncMessage
*reply
= osync_message_new_reply(message
, &error
);
1606 osync_queue_send_message(server_queue
, NULL
, reply
, &error
);
1608 osync_message_unref(reply
);
1613 osync_trace(TRACE_EXIT
, "%s", __func__
);
1616 START_TEST (ipc_callback_break
)
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
);
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
);
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
);
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
);
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
);
1777 long long int longint1
;
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
);
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
) {
1867 osync_message_unref(message
);
1870 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
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
);
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
);
1938 fail_unless(WEXITSTATUS(status
) == 0, NULL
);
1941 osync_queue_unref(client_queue
);
1942 osync_queue_unref(server_queue
);
1944 destroy_testbed(testbed
);
1948 START_TEST (ipc_callback_break_pipes
)
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
);
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
);
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
);
2077 fail_unless(WEXITSTATUS(status
) == 0, NULL
);
2080 osync_queue_unref(client_queue
);
2081 osync_queue_unref(server_queue
);
2083 destroy_testbed(testbed
);
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
++;
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
);
2111 long long int longint1
;
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;
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
) {
2190 osync_message_unref(message
);
2192 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
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
);
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
);
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
))) {
2250 if (osync_message_get_command(message
) != OSYNC_MESSAGE_QUEUE_HUP
) {
2253 osync_message_unref(message
);
2255 osync_queue_disconnect(client_queue
, &error
);
2256 fail_unless(error
== NULL
, NULL
);
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
);
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
);
2292 long long int longint1
;
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
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;
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
) {
2378 osync_message_unref(message
);
2380 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
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
);
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
);
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
))) {
2438 if (osync_message_get_command(message
) != OSYNC_MESSAGE_QUEUE_HUP
) {
2441 osync_message_unref(message
);
2443 osync_queue_disconnect(client_queue
, &error
);
2444 fail_unless(error
== NULL
, NULL
);
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
);
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 */
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
) {
2523 osync_message_unref(message
);
2525 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
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
);
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
);
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
);
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
);
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
);
2617 long long int longint1
;
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
);
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__
);
2661 osync_trace(TRACE_EXIT
, "%s: no more entries", __func__
);
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 */
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
) {
2727 osync_message_unref(message
);
2729 if (osync_queue_disconnect(server_queue
, &error
) != TRUE
|| error
!= NULL
)
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
);
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
);
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
);
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
);
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__
);
2825 osync_assert(osync_message_get_command(message
) == OSYNC_MESSAGE_INITIALIZE
);
2828 long long int longint1
;
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;
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
)
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
);
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
))) {
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
);
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
);
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;
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
)
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
);
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
);
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
);
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
)