annotate src/lib/test-ioloop.c @ 22955:812e5c961328

fts: Indexing virtual mailbox didn't always index the last mails
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 03 May 2018 18:33:00 +0300
parents cb108f786fb4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
1 /* Copyright (c) 2015-2018 Dovecot authors, see the included COPYING file */
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
2
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
3 #include "test-lib.h"
19354
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
4 #include "net.h"
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
5 #include "time-util.h"
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
6 #include "ioloop.h"
20771
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
7 #include "istream.h"
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
8
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
9 #include <unistd.h>
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
10
20944
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
11 struct test_ctx {
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
12 bool got_left;
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
13 bool got_right;
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
14 bool got_to;
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
15 };
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
16
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
17 static void timeout_callback(struct timeval *tv)
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
18 {
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
19 if (gettimeofday(tv, NULL) < 0)
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
20 i_fatal("gettimeofday() failed: %m");
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
21 io_loop_stop(current_ioloop);
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
22 }
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
23
20944
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
24 static void test_ioloop_fd_cb_left(struct test_ctx *ctx)
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
25 {
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
26 ctx->got_left = TRUE;
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
27 if (ctx->got_left && ctx->got_right)
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
28 io_loop_stop(current_ioloop);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
29 }
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
30
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
31 static void test_ioloop_fd_cb_right(struct test_ctx *ctx)
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
32 {
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
33 ctx->got_right = TRUE;
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
34 if (ctx->got_left && ctx->got_right)
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
35 io_loop_stop(current_ioloop);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
36 }
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
37
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
38 static void test_ioloop_fd_to(struct test_ctx *ctx)
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
39 {
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
40 ctx->got_to = TRUE;
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
41 io_loop_stop(current_ioloop);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
42 }
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
43
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
44 static void test_ioloop_fd(void)
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
45 {
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
46 test_begin("ioloop fd");
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
47
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
48 struct test_ctx test_ctx;
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
49 int fds[2];
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
50 int ret = socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
51
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
52 test_assert(ret == 0);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
53 if (ret < 0) {
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
54 i_error("socketpair() failed: %m");
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
55 test_end();
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
56 return;
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
57 }
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
58
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 20952
diff changeset
59 i_zero(&test_ctx);
20944
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
60
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
61 struct ioloop *ioloop = io_loop_create();
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
62
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
63 struct io *io_left =
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
64 io_add(fds[0], IO_READ,
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
65 test_ioloop_fd_cb_left, &test_ctx);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
66 struct io *io_right =
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
67 io_add(fds[1], IO_READ,
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
68 test_ioloop_fd_cb_right, &test_ctx);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
69
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
70 struct timeout *to = timeout_add(2000, test_ioloop_fd_to, &test_ctx);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
71
20952
99b7f460f1c0 lib: Fix compiler warnings in test-ioloop
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20944
diff changeset
72 if (write(fds[0], "ltr", 3) != 3 ||
99b7f460f1c0 lib: Fix compiler warnings in test-ioloop
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20944
diff changeset
73 write(fds[1], "rtl", 3) != 3)
99b7f460f1c0 lib: Fix compiler warnings in test-ioloop
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20944
diff changeset
74 i_fatal("write() failed: %m");
20944
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
75
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
76 io_loop_run(ioloop);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
77
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
78 timeout_remove(&to);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
79 io_remove(&io_left);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
80 io_remove(&io_right);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
81
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
82 test_assert(test_ctx.got_to == FALSE);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
83 test_assert(test_ctx.got_left == TRUE);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
84 test_assert(test_ctx.got_right == TRUE);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
85
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
86 io_loop_destroy(&ioloop);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
87 i_close_fd(&fds[0]);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
88 i_close_fd(&fds[1]);
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
89
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
90 test_end();
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
91 }
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
92
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
93 static void test_ioloop_timeout(void)
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
94 {
19025
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
95 struct ioloop *ioloop, *ioloop2;
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
96 struct timeout *to, *to2;
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
97 struct timeval tv_start, tv_callback;
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
98
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
99 test_begin("ioloop timeout");
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
100
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
101 ioloop = io_loop_create();
19025
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
102
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
103 /* add a timeout by moving it from another ioloop */
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
104 ioloop2 = io_loop_create();
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
105 to2 = timeout_add(1000, timeout_callback, &tv_callback);
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
106 io_loop_set_current(ioloop);
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
107 to2 = io_loop_move_timeout(&to2);
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
108 io_loop_set_current(ioloop2);
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
109 io_loop_destroy(&ioloop2);
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
110
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
111 sleep(1);
19025
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
112
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
113 /* add & remove immediately */
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
114 to = timeout_add(1000, timeout_callback, &tv_callback);
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
115 timeout_remove(&to);
19025
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
116
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
117 /* add the timeout we're actually testing below */
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
118 to = timeout_add(1000, timeout_callback, &tv_callback);
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
119 if (gettimeofday(&tv_start, NULL) < 0)
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
120 i_fatal("gettimeofday() failed: %m");
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
121 io_loop_run(ioloop);
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
122 test_assert(timeval_diff_msecs(&tv_callback, &tv_start) >= 500);
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
123 timeout_remove(&to);
19025
5423ae859f15 lib: Try fixing ec6e672a6e32 (ioloop timeout fixing)
Timo Sirainen <tss@iki.fi>
parents: 19019
diff changeset
124 timeout_remove(&to2);
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
125 io_loop_destroy(&ioloop);
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
126
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
127 test_end();
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
128 }
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
129
19354
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
130 static void io_callback(void *context ATTR_UNUSED)
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
131 {
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
132 }
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
133
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
134 static void test_ioloop_find_fd_conditions(void)
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
135 {
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
136 struct {
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
137 enum io_condition condition;
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
138 int fd[2];
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
139 struct io *io;
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
140 } tests[] = {
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
141 { IO_ERROR, { -1, -1 }, NULL },
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
142 { IO_READ, { -1, -1 }, NULL },
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
143 { IO_WRITE, { -1, -1 }, NULL },
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
144 { IO_READ | IO_WRITE, { -1, -1 }, NULL },
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
145 { IO_READ, { -1, -1 }, NULL } /* read+write as separate ios */
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
146 };
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
147 struct ioloop *ioloop;
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
148 struct io *io;
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
149 unsigned int i;
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
150
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
151 test_begin("ioloop find fd conditions");
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
152
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
153 ioloop = io_loop_create();
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
154
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
155 for (i = 0; i < N_ELEMENTS(tests); i++) {
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
156 if (socketpair(AF_UNIX, SOCK_STREAM, 0, tests[i].fd) < 0)
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
157 i_fatal("socketpair() failed: %m");
19426
2ddbdf05b19b lib: Fixed compiling unit test in systems where NULL isn't of type void*
Timo Sirainen <tss@iki.fi>
parents: 19354
diff changeset
158 tests[i].io = io_add(tests[i].fd[0], tests[i].condition, io_callback, (void *)NULL);
19354
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
159 }
19426
2ddbdf05b19b lib: Fixed compiling unit test in systems where NULL isn't of type void*
Timo Sirainen <tss@iki.fi>
parents: 19354
diff changeset
160 io = io_add(tests[i-1].fd[0], IO_WRITE, io_callback, (void *)NULL);
19354
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
161 tests[i-1].condition |= IO_WRITE;
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
162
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
163 for (i = 0; i < N_ELEMENTS(tests); i++)
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
164 test_assert_idx(io_loop_find_fd_conditions(ioloop, tests[i].fd[0]) == tests[i].condition, i);
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
165
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
166 io_remove(&io);
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
167 for (i = 0; i < N_ELEMENTS(tests); i++) {
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
168 io_remove(&tests[i].io);
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
169 i_close_fd(&tests[i].fd[0]);
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
170 i_close_fd(&tests[i].fd[1]);
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
171 }
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
172 io_loop_destroy(&ioloop);
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
173
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
174 test_end();
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
175 }
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
176
20771
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
177 static void io_callback_pending_io(void *context ATTR_UNUSED)
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
178 {
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
179 io_loop_stop(current_ioloop);
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
180 }
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
181
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
182 static void test_ioloop_pending_io(void)
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
183 {
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
184 test_begin("ioloop pending io");
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
185
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
186 struct istream *is = i_stream_create_from_data("data", 4);
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
187 struct ioloop *ioloop = io_loop_create();
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
188 struct io *io = io_add_istream(is, io_callback_pending_io, NULL);
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
189 io_loop_set_current(ioloop);
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
190 io_set_pending(io);
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
191 io_loop_run(ioloop);
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
192 io_remove(&io);
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
193 i_stream_unref(&is);
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
194 io_loop_destroy(&ioloop);
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
195
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
196 test_end();
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
197 }
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
198
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
199 void test_ioloop(void)
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
200 {
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
201 test_ioloop_timeout();
19354
2f3b58470752 lib: Added io_loop_find_fd_conditions()
Timo Sirainen <tss@iki.fi>
parents: 19025
diff changeset
202 test_ioloop_find_fd_conditions();
20771
40904517fc91 lib: Add test for pending io without timeouts
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 19552
diff changeset
203 test_ioloop_pending_io();
20944
62ffcd1b9739 lib: Add test for ioloop fd polling
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20771
diff changeset
204 test_ioloop_fd();
19019
ec6e672a6e32 ioloop: Delay actual start of a new normal timeout until the next io_loop_run() cycle.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
205 }