Mercurial > dovecot > core-2.2
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 |
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 } |