2 * Copyright (c) 2015-2020 Red Hat, Inc.
6 * Author: Jan Friesse (jfriesse@redhat.com)
8 * This software licensed under BSD license, the text of which follows:
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions are met:
13 * - Redistributions of source code must retain the above copyright notice,
14 * this list of conditions and the following disclaimer.
15 * - Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
18 * - Neither the name of the Red Hat, Inc. nor the names of its
19 * contributors may be used to endorse or promote products derived from this
20 * software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32 * THE POSSIBILITY OF SUCH DAMAGE.
41 #include "pr-poll-loop.h"
44 * Needed for creating nspr handle from unix fd
46 #include <private/pprio.h>
50 #define TIMER_TIMEOUT 10000
51 #define TIMER_TEST_TIMEOUT 100
53 * Must be smaller than BUF_SIZE
55 #define READ_STR "test"
57 static int fd_set_events_cb1_return_called
= -1;
58 static int fd_set_events_cb2_return_called
= -1;
59 static int fd_read_cb1_called
= -1;
60 static int fd_read_cb2_called
= -1;
61 static int fd_write_cb1_called
= -1;
62 static int fd_err_cb1_called
= -1;
63 static int timeout_cb_called
= -1;
65 static int prfd_set_events_cb1_return_called
= -1;
66 static int prfd_set_events_cb2_return_called
= -1;
67 static int prfd_read_cb1_called
= -1;
68 static int prfd_read_cb2_called
= -1;
69 static int prfd_write_cb1_called
= -1;
70 static int prfd_err_cb1_called
= -1;
72 static int test_complex_state
= -1;
73 static int test_complex_set_events_pipe1_read_called
= -1;
74 static int test_complex_read_pipe1_read_called
= -1;
75 static int test_complex_set_events_pipe1_write_called
= -1;
76 static int test_complex_write_pipe1_write_called
= -1;
77 static int test_complex_set_events_pipe2_read_called
= -1;
78 static int test_complex_read_pipe2_read_called
= -1;
79 static int test_complex_set_events_pipe2_write_called
= -1;
80 static int test_complex_write_pipe2_write_called
= -1;
81 static int test_complex_read_pipe1_fd
= -1;
83 static int pre_poll_cb1_called
= -1;
84 static int pre_poll_cb2_called
= -1;
85 static int pre_poll_cb_return_called
= -1;
88 timeout_cb(void *data1
, void *data2
)
91 timeout_cb_called
= 1;
97 fd_set_events_cb1_return(int fd
, short *events
, void *user_data1
, void *user_data2
)
100 fd_set_events_cb1_return_called
++;
102 assert(user_data1
== &fd_set_events_cb1_return_called
);
103 assert(user_data2
== NULL
);
109 fd_set_events_cb2_return(int fd
, short *events
, void *user_data1
, void *user_data2
)
112 fd_set_events_cb2_return_called
++;
114 assert(user_data1
== NULL
);
115 assert(user_data2
== &fd_set_events_cb2_return_called
);
121 fd_read_cb1(int fd
, void *user_data1
, void *user_data2
)
125 assert(user_data1
== &fd_read_cb1_called
);
126 assert(user_data2
== fd_read_cb1
);
128 fd_read_cb1_called
++;
130 assert(read(fd
, buf
, BUF_SIZE
) == strlen(READ_STR
) + 1);
131 assert(memcmp(buf
, READ_STR
, strlen(READ_STR
) + 1) == 0);
137 fd_read_cb2(int fd
, void *user_data1
, void *user_data2
)
141 assert(user_data1
== &fd_read_cb2_called
);
142 assert(user_data2
== fd_read_cb2
);
144 fd_read_cb2_called
++;
146 assert(read(fd
, buf
, BUF_SIZE
) == strlen(READ_STR
) + 1);
147 assert(memcmp(buf
, READ_STR
, strlen(READ_STR
) + 1) == 0);
153 fd_write_cb1(int fd
, void *user_data1
, void *user_data2
)
156 assert(user_data1
== &fd_write_cb1_called
);
157 assert(user_data2
== fd_write_cb1
);
159 fd_write_cb1_called
++;
165 fd_err_cb1(int fd
, short revents
, void *user_data1
, void *user_data2
)
168 assert(user_data1
== &fd_err_cb1_called
);
169 assert(user_data2
== fd_err_cb1
);
177 prfd_set_events_cb1_return(PRFileDesc
*prfd
, short *events
, void *user_data1
, void *user_data2
)
180 prfd_set_events_cb1_return_called
++;
182 assert(user_data1
== &prfd_set_events_cb1_return_called
);
183 assert(user_data2
== NULL
);
189 prfd_set_events_cb2_return(PRFileDesc
*prfd
, short *events
, void *user_data1
, void *user_data2
)
192 prfd_set_events_cb2_return_called
++;
194 assert(user_data1
== NULL
);
195 assert(user_data2
== &prfd_set_events_cb2_return_called
);
201 prfd_read_cb1(PRFileDesc
*prfd
, const PRPollDesc
*pd
, void *user_data1
, void *user_data2
)
205 assert(user_data1
== &prfd_read_cb1_called
);
206 assert(user_data2
== prfd_read_cb1
);
208 prfd_read_cb1_called
++;
210 assert(PR_Read(prfd
, buf
, BUF_SIZE
) == strlen(READ_STR
) + 1);
211 assert(memcmp(buf
, READ_STR
, strlen(READ_STR
) + 1) == 0);
217 prfd_read_cb2(PRFileDesc
*prfd
, const PRPollDesc
*pd
, void *user_data1
, void *user_data2
)
221 assert(user_data1
== &prfd_read_cb2_called
);
222 assert(user_data2
== prfd_read_cb2
);
224 prfd_read_cb2_called
++;
226 assert(PR_Read(prfd
, buf
, BUF_SIZE
) == strlen(READ_STR
) + 1);
227 assert(memcmp(buf
, READ_STR
, strlen(READ_STR
) + 1) == 0);
233 prfd_write_cb1(PRFileDesc
*prfd
, const PRPollDesc
*pd
, void *user_data1
, void *user_data2
)
236 assert(user_data1
== &prfd_write_cb1_called
);
237 assert(user_data2
== prfd_write_cb1
);
239 prfd_write_cb1_called
++;
245 prfd_err_cb1(PRFileDesc
*prfd
, short revents
, const PRPollDesc
*pd
, void *user_data1
, void *user_data2
)
248 assert(user_data1
== &prfd_err_cb1_called
);
249 assert(user_data2
== prfd_err_cb1
);
251 prfd_err_cb1_called
++;
257 test_complex_set_events_pipe1_read_cb(PRFileDesc
*prfd
, short *events
, void *user_data1
, void *user_data2
)
260 test_complex_set_events_pipe1_read_called
++;
262 assert(user_data1
== &test_complex_set_events_pipe1_read_called
);
263 assert(user_data2
== test_complex_set_events_pipe1_read_cb
);
264 assert(*events
== 0);
266 if (test_complex_state
== 2) {
274 test_complex_read_pipe1_read_cb(PRFileDesc
*prfd
, const PRPollDesc
*pd
, void *user_data1
, void *user_data2
)
278 assert(user_data1
== &test_complex_set_events_pipe1_read_called
);
279 assert(user_data2
== test_complex_set_events_pipe1_read_cb
);
281 test_complex_read_pipe1_read_called
++;
284 * prfd for this case is just a wrapper, we need to use real fd
286 assert(read(test_complex_read_pipe1_fd
, buf
, BUF_SIZE
) == strlen(READ_STR
) + 1);
287 assert(memcmp(buf
, READ_STR
, strlen(READ_STR
) + 1) == 0);
293 test_complex_write_pipe1_read_cb(PRFileDesc
*prfd
, const PRPollDesc
*pd
, void *user_data1
, void *user_data2
)
302 test_complex_set_events_pipe1_write_cb(int fd
, short *events
, void *user_data1
, void *user_data2
)
305 test_complex_set_events_pipe1_write_called
++;
307 assert(user_data1
== &test_complex_set_events_pipe1_write_called
);
308 assert(user_data2
== test_complex_set_events_pipe1_write_cb
);
309 assert(*events
== 0);
311 if (test_complex_state
== 1) {
319 test_complex_read_pipe1_write_cb(int fd
, void *user_data1
, void *user_data2
)
328 test_complex_write_pipe1_write_cb(int fd
, void *user_data1
, void *user_data2
)
331 assert(user_data1
== &test_complex_set_events_pipe1_write_called
);
332 assert(user_data2
== test_complex_set_events_pipe1_write_cb
);
333 test_complex_write_pipe1_write_called
++;
339 test_complex_set_events_pipe2_read_cb(int fd
, short *events
, void *user_data1
, void *user_data2
)
342 test_complex_set_events_pipe2_read_called
++;
344 assert(user_data1
== &test_complex_set_events_pipe2_read_called
);
345 assert(user_data2
== test_complex_set_events_pipe2_read_cb
);
346 assert(*events
== POLLIN
);
352 test_complex_read_pipe2_read_cb(int fd
, void *user_data1
, void *user_data2
)
356 assert(user_data1
== &test_complex_set_events_pipe2_read_called
);
357 assert(user_data2
== test_complex_set_events_pipe2_read_cb
);
359 test_complex_read_pipe2_read_called
++;
361 assert(read(fd
, buf
, BUF_SIZE
) == strlen(READ_STR
) + 1);
362 assert(memcmp(buf
, READ_STR
, strlen(READ_STR
) + 1) == 0);
368 test_complex_write_pipe2_read_cb(int fd
, void *user_data1
, void *user_data2
)
377 test_complex_set_events_pipe2_write_cb(PRFileDesc
*prfd
, short *events
, void *user_data1
, void *user_data2
)
380 test_complex_set_events_pipe2_write_called
++;
382 assert(user_data1
== &test_complex_set_events_pipe2_write_called
);
383 assert(user_data2
== test_complex_set_events_pipe2_write_cb
);
384 assert(*events
== POLLOUT
);
390 test_complex_read_pipe2_write_cb(PRFileDesc
*prfd
, const PRPollDesc
*pd
, void *user_data1
, void *user_data2
)
399 test_complex_write_pipe2_write_cb(PRFileDesc
*prfd
, const PRPollDesc
*pd
, void *user_data1
, void *user_data2
)
402 assert(user_data1
== &test_complex_set_events_pipe2_write_called
);
403 assert(user_data2
== test_complex_set_events_pipe2_write_cb
);
404 test_complex_write_pipe2_write_called
++;
410 test_pre_poll_cb1(void *user_data1
, void *user_data2
)
413 assert(user_data1
== &pre_poll_cb1_called
);
414 assert(user_data2
== test_pre_poll_cb1
);
415 pre_poll_cb1_called
++;
421 test_pre_poll_cb2(void *user_data1
, void *user_data2
)
424 assert(user_data1
== &pre_poll_cb2_called
);
425 assert(user_data2
== test_pre_poll_cb2
);
426 pre_poll_cb2_called
++;
432 test_pre_poll_cb_return(void *user_data1
, void *user_data2
)
435 assert(user_data1
== &pre_poll_cb_return_called
);
436 assert(user_data2
== test_pre_poll_cb_return
);
437 pre_poll_cb_return_called
++;
443 init_global_vars(void)
445 fd_set_events_cb1_return_called
= -1;
446 fd_set_events_cb2_return_called
= -1;
447 fd_read_cb1_called
= -1;
448 fd_read_cb2_called
= -1;
449 fd_write_cb1_called
= -1;
450 fd_err_cb1_called
= -1;
451 timeout_cb_called
= -1;
453 prfd_set_events_cb1_return_called
= -1;
454 prfd_set_events_cb2_return_called
= -1;
455 prfd_read_cb1_called
= -1;
456 prfd_read_cb2_called
= -1;
457 prfd_write_cb1_called
= -1;
458 prfd_err_cb1_called
= -1;
460 test_complex_set_events_pipe1_read_called
= -1;
461 test_complex_read_pipe1_read_called
= -1;
462 test_complex_set_events_pipe1_write_called
= -1;
463 test_complex_write_pipe1_write_called
= -1;
464 test_complex_set_events_pipe2_read_called
= -1;
465 test_complex_read_pipe2_read_called
= -1;
466 test_complex_set_events_pipe2_write_called
= -1;
467 test_complex_write_pipe2_write_called
= -1;
468 test_complex_read_pipe1_fd
= -1;
472 test_fd_basics(struct pr_poll_loop
*poll_loop
)
475 struct timer_list_entry
*timeout_timer
;
479 assert(pipe(pipe_fd1
) == 0);
482 * Add POLLNVAL -> failure
484 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[0], POLLNVAL
, NULL
, NULL
, NULL
, NULL
,
487 * Del non-existing fdL -> failure
489 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[0]) == -1);
492 * Add and delete fd twice
494 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[0], 0, NULL
, NULL
, NULL
, NULL
,
496 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[0], 0, NULL
, NULL
, NULL
, NULL
,
498 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[0]) == 0);
499 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[0]) == -1);
505 assert((timeout_timer
= timer_list_add(
506 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
507 timeout_cb_called
= 0;
508 assert(pr_poll_loop_exec(poll_loop
) == 0);
509 assert(timeout_cb_called
== 1);
512 * Test user_data passing
514 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[0], POLLIN
, fd_set_events_cb1_return
,
515 NULL
, NULL
, NULL
, (void *)&fd_set_events_cb1_return_called
, NULL
) == 0);
517 fd_set_events_cb1_return_called
= 0;
519 assert((timeout_timer
= timer_list_add(
520 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
521 assert(pr_poll_loop_exec(poll_loop
) == -1);
523 assert(fd_set_events_cb1_return_called
== 1);
524 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
527 * Remove entry and try with zero events and -2 return callback
529 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[0]) == 0);
530 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[0], 0, fd_set_events_cb1_return
,
531 NULL
, NULL
, NULL
, (void *)&fd_set_events_cb1_return_called
, NULL
) == 0);
533 fd_set_events_cb1_return_called
= 0;
535 assert((timeout_timer
= timer_list_add(
536 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
537 assert(pr_poll_loop_exec(poll_loop
) == -1);
539 assert(fd_set_events_cb1_return_called
== 1);
540 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
543 * Remove entry and try different cb
545 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[0]) == 0);
546 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[1], POLLOUT
, fd_set_events_cb2_return
,
547 NULL
, NULL
, NULL
, NULL
, (void *)&fd_set_events_cb2_return_called
) == 0);
549 fd_set_events_cb1_return_called
= 0;
550 fd_set_events_cb2_return_called
= 0;
552 assert((timeout_timer
= timer_list_add(
553 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
554 assert(pr_poll_loop_exec(poll_loop
) == -1);
556 assert(fd_set_events_cb1_return_called
== 0);
557 assert(fd_set_events_cb2_return_called
== 1);
558 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
561 * Delete entry and try timeout again
563 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[0]) == -1);
564 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[1]) == 0);
566 assert((timeout_timer
= timer_list_add(
567 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
568 timeout_cb_called
= 0;
569 assert(pr_poll_loop_exec(poll_loop
) == 0);
570 assert(timeout_cb_called
== 1);
575 assert(write(pipe_fd1
[1], READ_STR
, strlen(READ_STR
) + 1) == strlen(READ_STR
) + 1);
577 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[0], POLLIN
, NULL
,
578 fd_read_cb1
, NULL
, NULL
,
579 &fd_read_cb1_called
, fd_read_cb1
) == 0);
581 fd_read_cb1_called
= 0;
582 timeout_cb_called
= 0;
584 assert((timeout_timer
= timer_list_add(
585 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
586 assert(pr_poll_loop_exec(poll_loop
) == 0);
588 assert(fd_read_cb1_called
== 1);
589 assert(timeout_cb_called
== 0);
590 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
593 * Try timeout with valid entry
595 assert((timeout_timer
= timer_list_add(
596 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
597 timeout_cb_called
= 0;
598 fd_read_cb1_called
= 0;
600 assert(pr_poll_loop_exec(poll_loop
) == 0);
602 assert(timeout_cb_called
== 1);
603 assert(fd_read_cb1_called
== 0);
606 * Try reading where cb returns err
608 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[0]) == 0);
609 assert(write(pipe_fd1
[1], READ_STR
, strlen(READ_STR
) + 1) == strlen(READ_STR
) + 1);
611 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[0], POLLIN
, NULL
,
612 fd_read_cb2
, NULL
, NULL
,
613 &fd_read_cb2_called
, fd_read_cb2
) == 0);
615 fd_read_cb1_called
= 0;
616 fd_read_cb2_called
= 0;
617 timeout_cb_called
= 0;
619 assert((timeout_timer
= timer_list_add(
620 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
621 assert(pr_poll_loop_exec(poll_loop
) == -1);
623 assert(fd_read_cb1_called
== 0);
624 assert(fd_read_cb2_called
== 1);
625 assert(timeout_cb_called
== 0);
626 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
631 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[0]) == 0);
633 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[1], POLLOUT
, NULL
,
634 NULL
, fd_write_cb1
, NULL
,
635 &fd_write_cb1_called
, fd_write_cb1
) == 0);
637 fd_write_cb1_called
= 0;
638 timeout_cb_called
= 0;
640 assert((timeout_timer
= timer_list_add(
641 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
642 assert(pr_poll_loop_exec(poll_loop
) == 0);
644 assert(fd_write_cb1_called
== 1);
645 assert(timeout_cb_called
== 0);
646 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
651 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[1]) == 0);
653 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[0], POLLIN
, NULL
,
654 NULL
, NULL
, fd_err_cb1
,
655 &fd_err_cb1_called
, fd_err_cb1
) == 0);
657 assert(close(pipe_fd1
[0]) == 0);
658 assert(close(pipe_fd1
[1]) == 0);
659 fd_err_cb1_called
= 0;
660 timeout_cb_called
= 0;
661 fd_write_cb1_called
= 0;
663 assert((timeout_timer
= timer_list_add(
664 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
665 assert(pr_poll_loop_exec(poll_loop
) == 0);
667 assert(fd_err_cb1_called
== 1);
668 assert(fd_write_cb1_called
== 0);
669 assert(timeout_cb_called
== 0);
670 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[0]) == 0);
671 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
675 test_prfd_basics(struct pr_poll_loop
*poll_loop
)
677 PRFileDesc
*read_pipe
;
678 PRFileDesc
*write_pipe
;
679 struct timer_list_entry
*timeout_timer
;
684 assert(PR_CreatePipe(&read_pipe
, &write_pipe
) == PR_SUCCESS
);
687 * Add POLLNVAL -> failure
689 assert(pr_poll_loop_add_prfd(poll_loop
, read_pipe
, POLLNVAL
, NULL
, NULL
, NULL
, NULL
,
692 * Del non-existing fdL -> failure
694 assert(pr_poll_loop_del_prfd(poll_loop
, read_pipe
) == -1);
697 * Add and delete fd twice
699 assert(pr_poll_loop_add_prfd(poll_loop
, read_pipe
, 0, NULL
, NULL
, NULL
, NULL
,
701 assert(pr_poll_loop_add_prfd(poll_loop
, read_pipe
, 0, NULL
, NULL
, NULL
, NULL
,
703 assert(pr_poll_loop_del_prfd(poll_loop
, read_pipe
) == 0);
704 assert(pr_poll_loop_del_prfd(poll_loop
, read_pipe
) == -1);
707 * Test user_data passing
709 assert(pr_poll_loop_add_prfd(poll_loop
, read_pipe
, POLLIN
, prfd_set_events_cb1_return
,
710 NULL
, NULL
, NULL
, (void *)&prfd_set_events_cb1_return_called
, NULL
) == 0);
712 prfd_set_events_cb1_return_called
= 0;
714 assert((timeout_timer
= timer_list_add(
715 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
716 assert(pr_poll_loop_exec(poll_loop
) == -1);
718 assert(prfd_set_events_cb1_return_called
== 1);
719 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
722 * Remove entry and try different cb
724 assert(pr_poll_loop_del_prfd(poll_loop
, read_pipe
) == 0);
725 assert(pr_poll_loop_add_prfd(poll_loop
, write_pipe
, POLLOUT
, prfd_set_events_cb2_return
,
726 NULL
, NULL
, NULL
, NULL
, (void *)&prfd_set_events_cb2_return_called
) == 0);
728 prfd_set_events_cb1_return_called
= 0;
729 prfd_set_events_cb2_return_called
= 0;
731 assert((timeout_timer
= timer_list_add(
732 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
733 assert(pr_poll_loop_exec(poll_loop
) == -1);
735 assert(prfd_set_events_cb1_return_called
== 0);
736 assert(prfd_set_events_cb2_return_called
== 1);
737 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
740 * Delete entry and try timeout again
742 assert(pr_poll_loop_del_prfd(poll_loop
, read_pipe
) == -1);
743 assert(pr_poll_loop_del_prfd(poll_loop
, write_pipe
) == 0);
745 assert((timeout_timer
= timer_list_add(
746 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
747 timeout_cb_called
= 0;
748 assert(pr_poll_loop_exec(poll_loop
) == 0);
749 assert(timeout_cb_called
== 1);
754 assert(PR_Write(write_pipe
, READ_STR
, strlen(READ_STR
) + 1) == strlen(READ_STR
) + 1);
756 assert(pr_poll_loop_add_prfd(poll_loop
, read_pipe
, POLLIN
, NULL
,
757 prfd_read_cb1
, NULL
, NULL
,
758 &prfd_read_cb1_called
, prfd_read_cb1
) == 0);
760 prfd_read_cb1_called
= 0;
761 timeout_cb_called
= 0;
763 assert((timeout_timer
= timer_list_add(
764 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
765 assert(pr_poll_loop_exec(poll_loop
) == 0);
767 assert(prfd_read_cb1_called
== 1);
768 assert(timeout_cb_called
== 0);
769 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
772 * Try timeout with valid entry
774 assert((timeout_timer
= timer_list_add(
775 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
776 timeout_cb_called
= 0;
777 prfd_read_cb1_called
= 0;
779 assert(pr_poll_loop_exec(poll_loop
) == 0);
781 assert(timeout_cb_called
== 1);
782 assert(prfd_read_cb1_called
== 0);
785 * Try reading where cb returns err
787 assert(pr_poll_loop_del_prfd(poll_loop
, read_pipe
) == 0);
788 assert(PR_Write(write_pipe
, READ_STR
, strlen(READ_STR
) + 1) == strlen(READ_STR
) + 1);
790 assert(pr_poll_loop_add_prfd(poll_loop
, read_pipe
, POLLIN
, NULL
,
791 prfd_read_cb2
, NULL
, NULL
,
792 &prfd_read_cb2_called
, prfd_read_cb2
) == 0);
794 prfd_read_cb1_called
= 0;
795 prfd_read_cb2_called
= 0;
796 timeout_cb_called
= 0;
798 assert((timeout_timer
= timer_list_add(
799 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
800 assert(pr_poll_loop_exec(poll_loop
) == -1);
802 assert(prfd_read_cb1_called
== 0);
803 assert(prfd_read_cb2_called
== 1);
804 assert(timeout_cb_called
== 0);
805 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
810 assert(pr_poll_loop_del_prfd(poll_loop
, read_pipe
) == 0);
812 assert(pr_poll_loop_add_prfd(poll_loop
, write_pipe
, POLLOUT
, NULL
,
813 NULL
, prfd_write_cb1
, NULL
,
814 &prfd_write_cb1_called
, prfd_write_cb1
) == 0);
816 prfd_write_cb1_called
= 0;
817 timeout_cb_called
= 0;
819 assert((timeout_timer
= timer_list_add(
820 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
821 assert(pr_poll_loop_exec(poll_loop
) == 0);
823 assert(prfd_write_cb1_called
== 1);
824 assert(timeout_cb_called
== 0);
825 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
827 assert(PR_Close(read_pipe
) == 0);
828 assert(PR_Close(write_pipe
) == 0);
833 assert(pr_poll_loop_del_prfd(poll_loop
, write_pipe
) == 0);
836 * Must use native pipe, because PR_Close deallocate PRFileDesc completelly
838 assert(pipe(pipe_fd1
) == 0);
839 assert((read_pipe
= PR_CreateSocketPollFd(pipe_fd1
[0])) != NULL
);
841 assert(close(pipe_fd1
[0]) == 0);
842 assert(close(pipe_fd1
[1]) == 0);
844 assert(pr_poll_loop_add_prfd(poll_loop
, read_pipe
, POLLIN
, NULL
,
845 NULL
, NULL
, prfd_err_cb1
,
846 &prfd_err_cb1_called
, prfd_err_cb1
) == 0);
848 prfd_err_cb1_called
= 0;
849 timeout_cb_called
= 0;
850 prfd_write_cb1_called
= 0;
852 assert((timeout_timer
= timer_list_add(
853 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
854 assert(pr_poll_loop_exec(poll_loop
) == 0);
856 assert(prfd_err_cb1_called
== 1);
857 assert(prfd_write_cb1_called
== 0);
858 assert(timeout_cb_called
== 0);
859 assert(pr_poll_loop_del_prfd(poll_loop
, read_pipe
) == 0);
860 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
862 assert(PR_DestroySocketPollFd(read_pipe
) == PR_SUCCESS
);
866 test_complex(struct pr_poll_loop
*poll_loop
)
868 int pipe_fd1
[2], pipe_fd2
[2];
869 PRFileDesc
*read_pipe1
;
870 PRFileDesc
*write_pipe2
;
871 struct timer_list_entry
*timeout_timer
;
875 assert(pipe(pipe_fd1
) == 0);
876 assert(pipe(pipe_fd2
) == 0);
878 test_complex_read_pipe1_fd
= pipe_fd1
[0];
883 assert(pr_poll_loop_add_pre_poll_cb(poll_loop
, test_pre_poll_cb1
,
884 &pre_poll_cb1_called
, test_pre_poll_cb1
) == 0);
886 assert((read_pipe1
= PR_CreateSocketPollFd(pipe_fd1
[0])) != NULL
);
887 assert((write_pipe2
= PR_CreateSocketPollFd(pipe_fd2
[1])) != NULL
);
889 assert(pr_poll_loop_add_prfd(poll_loop
, read_pipe1
, 0, test_complex_set_events_pipe1_read_cb
,
890 test_complex_read_pipe1_read_cb
, test_complex_write_pipe1_read_cb
, NULL
,
891 &test_complex_set_events_pipe1_read_called
, test_complex_set_events_pipe1_read_cb
) == 0);
893 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd1
[1], 0, test_complex_set_events_pipe1_write_cb
,
894 test_complex_read_pipe1_write_cb
, test_complex_write_pipe1_write_cb
, NULL
,
895 &test_complex_set_events_pipe1_write_called
, test_complex_set_events_pipe1_write_cb
) == 0);
897 assert(pr_poll_loop_add_fd(poll_loop
, pipe_fd2
[0], POLLIN
, test_complex_set_events_pipe2_read_cb
,
898 test_complex_read_pipe2_read_cb
, test_complex_write_pipe2_read_cb
, NULL
,
899 &test_complex_set_events_pipe2_read_called
, test_complex_set_events_pipe2_read_cb
) == 0);
901 assert(pr_poll_loop_add_prfd(poll_loop
, write_pipe2
, POLLOUT
, test_complex_set_events_pipe2_write_cb
,
902 test_complex_read_pipe2_write_cb
, test_complex_write_pipe2_write_cb
, NULL
,
903 &test_complex_set_events_pipe2_write_called
, test_complex_set_events_pipe2_write_cb
) == 0);
905 timeout_cb_called
= 0;
906 test_complex_set_events_pipe1_read_called
= 0;
907 test_complex_read_pipe1_read_called
= 0;
908 test_complex_set_events_pipe1_write_called
= 0;
909 test_complex_write_pipe1_write_called
= 0;
910 test_complex_set_events_pipe2_read_called
= 0;
911 test_complex_read_pipe2_read_called
= 0;
912 test_complex_set_events_pipe2_write_called
= 0;
913 test_complex_write_pipe2_write_called
= 0;
914 pre_poll_cb1_called
= 0;
915 pre_poll_cb2_called
= 0;
918 * Call for first time -> all set_events should be called and pipe2_write should be called
920 assert((timeout_timer
= timer_list_add(
921 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
922 assert(pr_poll_loop_exec(poll_loop
) == 0);
924 assert(pre_poll_cb1_called
== 1);
925 assert(pre_poll_cb2_called
== 0);
926 assert(test_complex_set_events_pipe1_read_called
== 1);
927 assert(test_complex_read_pipe1_read_called
== 0);
928 assert(test_complex_set_events_pipe1_write_called
== 1);
929 assert(test_complex_write_pipe1_write_called
== 0);
930 assert(test_complex_set_events_pipe2_read_called
== 1);
931 assert(test_complex_read_pipe2_read_called
== 0);
932 assert(test_complex_set_events_pipe2_write_called
== 1);
933 assert(test_complex_write_pipe2_write_called
== 1);
935 assert(timeout_cb_called
== 0);
936 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
939 * Call for second time -> same as first time
941 assert((timeout_timer
= timer_list_add(
942 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
943 assert(pr_poll_loop_exec(poll_loop
) == 0);
945 assert(pre_poll_cb1_called
== 2);
946 assert(pre_poll_cb2_called
== 0);
947 assert(test_complex_set_events_pipe1_read_called
== 2);
948 assert(test_complex_read_pipe1_read_called
== 0);
949 assert(test_complex_set_events_pipe1_write_called
== 2);
950 assert(test_complex_write_pipe1_write_called
== 0);
951 assert(test_complex_set_events_pipe2_read_called
== 2);
952 assert(test_complex_read_pipe2_read_called
== 0);
953 assert(test_complex_set_events_pipe2_write_called
== 2);
954 assert(test_complex_write_pipe2_write_called
== 2);
956 assert(timeout_cb_called
== 0);
957 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
960 * Change state to prepare for writing
962 test_complex_state
= 1;
963 assert((timeout_timer
= timer_list_add(
964 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
965 assert(pr_poll_loop_exec(poll_loop
) == 0);
967 assert(pre_poll_cb1_called
== 3);
968 assert(pre_poll_cb2_called
== 0);
969 assert(test_complex_set_events_pipe1_read_called
== 3);
970 assert(test_complex_read_pipe1_read_called
== 0);
971 assert(test_complex_set_events_pipe1_write_called
== 3);
972 assert(test_complex_write_pipe1_write_called
== 1);
973 assert(test_complex_set_events_pipe2_read_called
== 3);
974 assert(test_complex_read_pipe2_read_called
== 0);
975 assert(test_complex_set_events_pipe2_write_called
== 3);
976 assert(test_complex_write_pipe2_write_called
== 3);
978 assert(timeout_cb_called
== 0);
979 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
982 * Write to first pipe
984 assert(write(pipe_fd1
[1], READ_STR
, strlen(READ_STR
) + 1) == strlen(READ_STR
) + 1);
986 assert((timeout_timer
= timer_list_add(
987 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
988 assert(pr_poll_loop_exec(poll_loop
) == 0);
990 assert(pre_poll_cb1_called
== 4);
991 assert(pre_poll_cb2_called
== 0);
992 assert(test_complex_set_events_pipe1_read_called
== 4);
993 assert(test_complex_read_pipe1_read_called
== 0);
994 assert(test_complex_set_events_pipe1_write_called
== 4);
995 assert(test_complex_write_pipe1_write_called
== 2);
996 assert(test_complex_set_events_pipe2_read_called
== 4);
997 assert(test_complex_read_pipe2_read_called
== 0);
998 assert(test_complex_set_events_pipe2_write_called
== 4);
999 assert(test_complex_write_pipe2_write_called
== 4);
1001 assert(timeout_cb_called
== 0);
1002 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
1005 * Delete pre poll cb
1007 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb1
) == 0);
1010 * Change state so write can propagate
1012 test_complex_state
= 2;
1013 assert((timeout_timer
= timer_list_add(
1014 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1015 assert(pr_poll_loop_exec(poll_loop
) == 0);
1017 assert(pre_poll_cb1_called
== 4);
1018 assert(pre_poll_cb2_called
== 0);
1019 assert(test_complex_set_events_pipe1_read_called
== 5);
1020 assert(test_complex_read_pipe1_read_called
== 1);
1021 assert(test_complex_set_events_pipe1_write_called
== 5);
1022 assert(test_complex_write_pipe1_write_called
== 2);
1023 assert(test_complex_set_events_pipe2_read_called
== 5);
1024 assert(test_complex_read_pipe2_read_called
== 0);
1025 assert(test_complex_set_events_pipe2_write_called
== 5);
1026 assert(test_complex_write_pipe2_write_called
== 5);
1028 assert(timeout_cb_called
== 0);
1029 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
1032 * Add pre poll cb 1 and 2
1034 assert(pr_poll_loop_add_pre_poll_cb(poll_loop
, test_pre_poll_cb1
,
1035 &pre_poll_cb1_called
, test_pre_poll_cb1
) == 0);
1036 assert(pr_poll_loop_add_pre_poll_cb(poll_loop
, test_pre_poll_cb2
,
1037 &pre_poll_cb2_called
, test_pre_poll_cb2
) == 0);
1040 * Change state so pipe1 events are not called any longer
1042 test_complex_state
= 4;
1043 assert((timeout_timer
= timer_list_add(
1044 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1045 assert(pr_poll_loop_exec(poll_loop
) == 0);
1047 assert(pre_poll_cb1_called
== 5);
1048 assert(pre_poll_cb2_called
== 1);
1049 assert(test_complex_set_events_pipe1_read_called
== 6);
1050 assert(test_complex_read_pipe1_read_called
== 1);
1051 assert(test_complex_set_events_pipe1_write_called
== 6);
1052 assert(test_complex_write_pipe1_write_called
== 2);
1053 assert(test_complex_set_events_pipe2_read_called
== 6);
1054 assert(test_complex_read_pipe2_read_called
== 0);
1055 assert(test_complex_set_events_pipe2_write_called
== 6);
1056 assert(test_complex_write_pipe2_write_called
== 6);
1058 assert(timeout_cb_called
== 0);
1059 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
1062 * Write to second pipe
1064 assert(write(pipe_fd2
[1], READ_STR
, strlen(READ_STR
) + 1) == strlen(READ_STR
) + 1);
1066 assert((timeout_timer
= timer_list_add(
1067 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1068 assert(pr_poll_loop_exec(poll_loop
) == 0);
1070 assert(pre_poll_cb1_called
== 6);
1071 assert(pre_poll_cb2_called
== 2);
1072 assert(test_complex_set_events_pipe1_read_called
== 7);
1073 assert(test_complex_read_pipe1_read_called
== 1);
1074 assert(test_complex_set_events_pipe1_write_called
== 7);
1075 assert(test_complex_write_pipe1_write_called
== 2);
1076 assert(test_complex_set_events_pipe2_read_called
== 7);
1077 assert(test_complex_read_pipe2_read_called
== 1);
1078 assert(test_complex_set_events_pipe2_write_called
== 7);
1079 assert(test_complex_write_pipe2_write_called
== 7);
1081 assert(timeout_cb_called
== 0);
1082 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
1087 assert((timeout_timer
= timer_list_add(
1088 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1089 assert(pr_poll_loop_exec(poll_loop
) == 0);
1091 assert(pre_poll_cb1_called
== 7);
1092 assert(pre_poll_cb2_called
== 3);
1093 assert(test_complex_set_events_pipe1_read_called
== 8);
1094 assert(test_complex_read_pipe1_read_called
== 1);
1095 assert(test_complex_set_events_pipe1_write_called
== 8);
1096 assert(test_complex_write_pipe1_write_called
== 2);
1097 assert(test_complex_set_events_pipe2_read_called
== 8);
1098 assert(test_complex_read_pipe2_read_called
== 1);
1099 assert(test_complex_set_events_pipe2_write_called
== 8);
1100 assert(test_complex_write_pipe2_write_called
== 8);
1102 assert(timeout_cb_called
== 0);
1103 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
1105 assert(PR_DestroySocketPollFd(read_pipe1
) == PR_SUCCESS
);
1106 assert(PR_DestroySocketPollFd(write_pipe2
) == PR_SUCCESS
);
1108 assert(close(pipe_fd1
[0]) == 0);
1109 assert(close(pipe_fd1
[1]) == 0);
1111 assert(close(pipe_fd2
[0]) == 0);
1112 assert(close(pipe_fd2
[1]) == 0);
1114 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb1
) == 0);
1115 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb2
) == 0);
1117 assert(pr_poll_loop_del_prfd(poll_loop
, read_pipe1
) == 0);
1118 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd1
[1]) == 0);
1119 assert(pr_poll_loop_del_fd(poll_loop
, pipe_fd2
[0]) == 0);
1120 assert(pr_poll_loop_del_prfd(poll_loop
, write_pipe2
) == 0);
1124 test_pre_poll_cb(struct pr_poll_loop
*poll_loop
)
1126 struct timer_list_entry
*timeout_timer
;
1130 assert(pr_poll_loop_add_pre_poll_cb(poll_loop
, test_pre_poll_cb1
,
1131 &pre_poll_cb1_called
, test_pre_poll_cb1
) == 0);
1132 assert(pr_poll_loop_add_pre_poll_cb(poll_loop
, test_pre_poll_cb1
,
1133 &pre_poll_cb1_called
, test_pre_poll_cb1
) == -1);
1135 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb1
) == 0);
1136 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb1
) == -1);
1137 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb2
) == -1);
1140 * Just one pre poll cb
1142 pre_poll_cb1_called
= 0;
1143 pre_poll_cb2_called
= 0;
1144 pre_poll_cb_return_called
= 0;
1146 assert(pr_poll_loop_add_pre_poll_cb(poll_loop
, test_pre_poll_cb1
,
1147 &pre_poll_cb1_called
, test_pre_poll_cb1
) == 0);
1149 assert((timeout_timer
= timer_list_add(
1150 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1151 timeout_cb_called
= 0;
1153 assert(pr_poll_loop_exec(poll_loop
) == 0);
1154 assert(timeout_cb_called
== 1);
1155 assert(pre_poll_cb1_called
== 1);
1156 assert(pre_poll_cb2_called
== 0);
1157 assert(pre_poll_cb_return_called
== 0);
1162 assert((timeout_timer
= timer_list_add(
1163 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1164 timeout_cb_called
= 0;
1166 assert(pr_poll_loop_exec(poll_loop
) == 0);
1167 assert(timeout_cb_called
== 1);
1168 assert(pre_poll_cb1_called
== 2);
1169 assert(pre_poll_cb2_called
== 0);
1170 assert(pre_poll_cb_return_called
== 0);
1175 assert(pr_poll_loop_add_pre_poll_cb(poll_loop
, test_pre_poll_cb2
,
1176 &pre_poll_cb2_called
, test_pre_poll_cb2
) == 0);
1178 assert((timeout_timer
= timer_list_add(
1179 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1180 timeout_cb_called
= 0;
1182 assert(pr_poll_loop_exec(poll_loop
) == 0);
1183 assert(timeout_cb_called
== 1);
1184 assert(pre_poll_cb1_called
== 3);
1185 assert(pre_poll_cb2_called
== 1);
1186 assert(pre_poll_cb_return_called
== 0);
1191 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb1
) == 0);
1193 assert((timeout_timer
= timer_list_add(
1194 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1195 timeout_cb_called
= 0;
1197 assert(pr_poll_loop_exec(poll_loop
) == 0);
1198 assert(timeout_cb_called
== 1);
1199 assert(pre_poll_cb1_called
== 3);
1200 assert(pre_poll_cb2_called
== 2);
1201 assert(pre_poll_cb_return_called
== 0);
1204 * Add cb1 and cb return
1206 assert(pr_poll_loop_add_pre_poll_cb(poll_loop
, test_pre_poll_cb1
,
1207 &pre_poll_cb1_called
, test_pre_poll_cb1
) == 0);
1208 assert(pr_poll_loop_add_pre_poll_cb(poll_loop
, test_pre_poll_cb_return
,
1209 &pre_poll_cb_return_called
, test_pre_poll_cb_return
) == 0);
1211 assert((timeout_timer
= timer_list_add(
1212 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1213 timeout_cb_called
= 0;
1215 assert(pr_poll_loop_exec(poll_loop
) == -1);
1216 assert(timeout_cb_called
== 0);
1217 assert(pre_poll_cb1_called
== 4);
1218 assert(pre_poll_cb2_called
== 3);
1219 assert(pre_poll_cb_return_called
== 1);
1220 timer_list_delete(pr_poll_loop_get_timer_list(poll_loop
), timeout_timer
);
1225 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb_return
) == 0);
1227 assert((timeout_timer
= timer_list_add(
1228 pr_poll_loop_get_timer_list(poll_loop
), TIMER_TEST_TIMEOUT
, timeout_cb
, NULL
, NULL
)) != NULL
);
1229 timeout_cb_called
= 0;
1231 assert(pr_poll_loop_exec(poll_loop
) == 0);
1233 assert(timeout_cb_called
== 1);
1234 assert(pre_poll_cb1_called
== 5);
1235 assert(pre_poll_cb2_called
== 4);
1236 assert(pre_poll_cb_return_called
== 1);
1241 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb1
) == 0);
1242 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb2
) == 0);
1243 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb_return
) == -1);
1244 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb1
) == -1);
1245 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb2
) == -1);
1246 assert(pr_poll_loop_del_pre_poll_cb(poll_loop
, test_pre_poll_cb_return
) == -1);
1252 struct pr_poll_loop poll_loop
;
1254 PR_Init(PR_USER_THREAD
, PR_PRIORITY_NORMAL
, 0);
1256 pr_poll_loop_init(&poll_loop
);
1258 test_fd_basics(&poll_loop
);
1260 test_prfd_basics(&poll_loop
);
1262 test_pre_poll_cb(&poll_loop
);
1264 test_complex(&poll_loop
);
1266 pr_poll_loop_destroy(&poll_loop
);
1268 assert(PR_Cleanup() == PR_SUCCESS
);