Mercurial > dovecot > core-2.2
annotate src/lib/test-istream-multiplex.c @ 22596:1a7bbda6284b
iostream-multiplex: Check return values in tests
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Fri, 06 Oct 2017 08:52:18 +0300 |
parents | c6c9c24d6182 |
children | cb108f786fb4 |
rev | line source |
---|---|
22553
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2016-2017 Dovecot authors, see the included COPYING file */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
2 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
3 #include "test-lib.h" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
22577
c6c9c24d6182
lib: iostream-multiplex tests - Fix hangs by setting the pipe fds non-blocking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22553
diff
changeset
|
5 #include "fd-set-nonblock.h" |
22553
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
6 #include "str.h" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
7 #include "crc32.h" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
8 #include "randgen.h" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
9 #include "istream-private.h" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
10 #include "istream-multiplex.h" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
11 #include "ostream.h" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
12 #include <unistd.h> |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
13 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
14 static void test_istream_multiplex_simple(void) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
15 { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
16 test_begin("istream multiplex (simple)"); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
17 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
18 static const char data[] = "\x00\x00\x00\x00\x06Hello\x00" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
19 "\x01\x00\x00\x00\x03Wor" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
20 "\x00\x00\x00\x00\x00" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
21 "\x01\x00\x00\x00\x03ld\x00"; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
22 static const size_t data_len = sizeof(data)-1; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
23 struct istream *input = test_istream_create_data(data, data_len); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
24 size_t siz; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
25 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
26 struct istream *chan0 = i_stream_create_multiplex(input, (size_t)-1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
27 struct istream *chan1 = i_stream_multiplex_add_channel(chan0, 1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
28 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
29 /* nothing to read until the first byte */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
30 for (size_t i = 0; i <= 1+4; i++) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
31 test_istream_set_size(input, i); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
32 test_assert(i_stream_read(chan0) == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
33 test_assert(i_stream_read(chan1) == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
34 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
35 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
36 /* partial read of the first packet */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
37 size_t input_max = 1+4+3; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
38 test_istream_set_size(input, input_max); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
39 test_assert(i_stream_read(chan0) == 3); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
40 test_assert(memcmp(i_stream_get_data(chan0, &siz), "Hel", 3) == 0 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
41 siz == 3); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
42 test_assert(i_stream_read(chan1) == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
43 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
44 /* read the rest of the first packet and the second packet. |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
45 read chan1 before chan0 to see that it works. */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
46 input_max += 3 + 1+4+3; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
47 test_istream_set_size(input, input_max); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
48 test_assert(i_stream_read(chan1) == 3); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
49 test_assert(i_stream_read(chan0) == 3); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
50 test_assert(memcmp(i_stream_get_data(chan0, &siz), "Hello\0", 6) == 0 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
51 siz == 6); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
52 test_assert(memcmp(i_stream_get_data(chan1, &siz), "Wor", 3) == 0 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
53 siz == 3); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
54 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
55 /* 0-sized packet is ignored */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
56 input_max += 1+4; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
57 test_istream_set_size(input, input_max); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
58 test_assert(i_stream_read(chan0) == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
59 test_assert(i_stream_read(chan1) == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
60 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
61 /* read the final packet */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
62 input_max += 1+4+3; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
63 i_assert(input_max == data_len); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
64 test_istream_set_size(input, input_max); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
65 test_assert(i_stream_read(chan0) == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
66 test_assert(i_stream_read(chan1) == 3); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
67 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
68 /* we should have the final data in all channels now */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
69 test_assert(memcmp(i_stream_get_data(chan0, &siz), "Hello\0", 6) == 0 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
70 siz == 6); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
71 test_assert(memcmp(i_stream_get_data(chan1, &siz), "World\0", 6) == 0 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
72 siz == 6); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
73 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
74 /* all channels should return EOF */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
75 test_assert(i_stream_read(chan0) == -1 && chan0->stream_errno == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
76 i_stream_unref(&chan0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
77 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
78 test_assert(i_stream_read(chan1) == -1 && chan1->stream_errno == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
79 i_stream_unref(&chan1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
80 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
81 i_stream_unref(&input); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
82 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
83 test_end(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
84 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
85 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
86 static void test_istream_multiplex_maxbuf(void) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
87 { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
88 test_begin("istream multiplex (maxbuf)"); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
89 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
90 static const char data[] = "\x00\x00\x00\x00\x06Hello\x00" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
91 "\x01\x00\x00\x00\x06World\x00"; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
92 static const size_t data_len = sizeof(data)-1; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
93 struct istream *input = test_istream_create_data(data, data_len); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
94 size_t siz; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
95 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
96 struct istream *chan0 = i_stream_create_multiplex(input, 5); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
97 struct istream *chan1 = i_stream_multiplex_add_channel(chan0, 1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
98 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
99 /* we get data for channel 0 and congest */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
100 test_assert(i_stream_read(chan1) == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
101 /* we read data for channel 0 */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
102 test_assert(i_stream_read(chan0) == 5); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
103 /* and now it's congested */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
104 test_assert(i_stream_read(chan0) == -2); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
105 test_assert(memcmp(i_stream_get_data(chan0, &siz), "Hello", 5) == 0 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
106 siz == 5); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
107 /* consume data */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
108 i_stream_skip(chan0, 5); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
109 /* we read data for channel 1 */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
110 test_assert(i_stream_read(chan1) == 5); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
111 test_assert(memcmp(i_stream_get_data(chan1, &siz), "World", 5) == 0 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
112 siz == 5); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
113 /* consume data */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
114 i_stream_skip(chan1, 5); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
115 /* read last byte */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
116 test_assert(i_stream_read(chan0) == 1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
117 /* now we get byte for channel 1 */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
118 test_assert(i_stream_read(chan0) == 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
119 /* now we read byte for channel 1 */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
120 test_assert(i_stream_read(chan1) == 1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
121 /* and everything should return EOF now */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
122 test_assert(i_stream_read(chan1) == -1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
123 test_assert(i_stream_read(chan0) == -1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
124 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
125 i_stream_unref(&chan0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
126 i_stream_unref(&chan1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
127 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
128 i_stream_unref(&input); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
129 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
130 test_end(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
131 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
132 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
133 static void test_istream_multiplex_random(void) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
134 { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
135 const unsigned int max_channel = 6; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
136 const unsigned int packets_count = 30; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
137 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
138 test_begin("istream multiplex (random)"); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
139 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
140 unsigned int i; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
141 uoff_t bytes_written = 0, bytes_read = 0; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
142 buffer_t *buf = buffer_create_dynamic(default_pool, 10240); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
143 uint32_t input_crc[max_channel]; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
144 uint32_t output_crc[max_channel]; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
145 memset(input_crc, 0, sizeof(input_crc)); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
146 memset(output_crc, 0, sizeof(output_crc)); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
147 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
148 for (i = 0; i < packets_count; i++) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
149 unsigned int len = 1 + rand() % 1024; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
150 unsigned char packet_data[len]; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
151 uint32_t len_be = cpu32_to_be(len); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
152 unsigned int channel = rand() % max_channel; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
153 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
154 random_fill(packet_data, len); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
155 input_crc[channel] = |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
156 crc32_data_more(input_crc[channel], packet_data, len); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
157 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
158 buffer_append_c(buf, channel); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
159 buffer_append(buf, &len_be, sizeof(len_be)); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
160 buffer_append(buf, packet_data, len); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
161 bytes_written += len; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
162 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
163 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
164 struct istream *input = test_istream_create_data(buf->data, buf->used); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
165 struct istream *chan[max_channel]; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
166 chan[0] = i_stream_create_multiplex(input, 1024/4); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
167 for (i = 1; i < max_channel; i++) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
168 chan[i] = i_stream_multiplex_add_channel(chan[0], i); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
169 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
170 test_istream_set_size(input, 0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
171 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
172 /* read from each stream, 1 byte at a time */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
173 size_t input_size = 0; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
174 int max_ret = -3; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
175 unsigned int read_max_channel = max_channel/2; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
176 bool something_read = FALSE; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
177 for (i = 0;;) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
178 ssize_t ret = i_stream_read(chan[i]); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
179 if (max_ret < ret) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
180 max_ret = ret; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
181 if (ret > 0) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
182 size_t size; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
183 const unsigned char *data = |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
184 i_stream_get_data(chan[i], &size); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
185 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
186 output_crc[i] = crc32_data_more(output_crc[i], data, size); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
187 bytes_read += size; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
188 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
189 test_assert((size_t)ret == size); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
190 i_stream_skip(chan[i], size); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
191 something_read = TRUE; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
192 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
193 if (++i < read_max_channel) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
194 ; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
195 else if (max_ret == 0 && !something_read && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
196 read_max_channel < max_channel) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
197 read_max_channel++; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
198 } else { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
199 if (max_ret <= -1) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
200 test_assert(max_ret == -1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
201 break; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
202 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
203 if (max_ret == 0) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
204 test_istream_set_size(input, ++input_size); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
205 i = 0; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
206 max_ret = -3; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
207 something_read = FALSE; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
208 read_max_channel = max_channel/2; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
209 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
210 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
211 test_assert(bytes_read == bytes_written); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
212 for (i = 0; i < max_channel; i++) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
213 test_assert_idx(input_crc[i] == output_crc[i], i); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
214 test_assert_idx(i_stream_read(chan[i]) == -1 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
215 chan[i]->stream_errno == 0, i); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
216 i_stream_unref(&chan[i]); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
217 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
218 i_stream_unref(&input); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
219 buffer_free(&buf); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
220 test_end(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
221 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
222 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
223 static unsigned int channel_counter[2] = {0, 0}; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
224 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
225 static const char *msgs[] = { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
226 "", |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
227 "a", |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
228 "bb", |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
229 "ccc", |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
230 "dddd", |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
231 "eeeee", |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
232 "ffffff" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
233 }; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
234 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
235 static void test_istream_multiplex_stream_read(struct istream *channel) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
236 { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
237 uint8_t cid = i_stream_multiplex_get_channel_id(channel); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
238 const char *line; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
239 size_t siz; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
240 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
241 if (i_stream_read(channel) < 0) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
242 return; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
243 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
244 while((line = i_stream_next_line(channel)) != NULL) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
245 siz = strlen(line); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
246 test_assert_idx(siz > 0 && siz < N_ELEMENTS(msgs), |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
247 channel_counter[cid]); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
248 if (siz > 0 && siz < N_ELEMENTS(msgs)) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
249 test_assert_idx(strcmp(line, msgs[siz]) == 0, |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
250 channel_counter[cid]); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
251 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
252 channel_counter[cid]++; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
253 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
254 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
255 if (channel_counter[0] > 100 && channel_counter[1] > 100) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
256 io_loop_stop(current_ioloop); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
257 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
258 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
259 static void test_send_msg(struct ostream *os, uint8_t cid, const char *msg) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
260 { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
261 uint32_t len = cpu32_to_be(strlen(msg) + 1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
262 const struct const_iovec iov[] = { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
263 { &cid, sizeof(cid) }, |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
264 { &len, sizeof(len) }, |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
265 { msg, strlen(msg) }, |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
266 { "\n", 1 } /* newline added for i_stream_next_line */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
267 }; |
22596
1a7bbda6284b
iostream-multiplex: Check return values in tests
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22577
diff
changeset
|
268 o_stream_nsendv(os, iov, N_ELEMENTS(iov)); |
22553
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
269 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
270 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
271 static void test_istream_multiplex_stream_write(struct ostream *channel) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
272 { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
273 size_t rounds = rand() % 10; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
274 for(size_t i = 0; i < rounds; i++) { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
275 uint8_t cid = rand() % 2; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
276 test_send_msg(channel, cid, msgs[1 + rand() % (N_ELEMENTS(msgs) - 1)]); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
277 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
278 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
279 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
280 static void test_istream_multiplex_stream(void) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
281 { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
282 test_begin("istream multiplex (stream)"); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
283 struct ioloop *ioloop = io_loop_create(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
284 io_loop_set_current(ioloop); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
285 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
286 int fds[2]; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
287 test_assert(pipe(fds) == 0); |
22577
c6c9c24d6182
lib: iostream-multiplex tests - Fix hangs by setting the pipe fds non-blocking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22553
diff
changeset
|
288 fd_set_nonblock(fds[0], TRUE); |
c6c9c24d6182
lib: iostream-multiplex tests - Fix hangs by setting the pipe fds non-blocking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22553
diff
changeset
|
289 fd_set_nonblock(fds[1], TRUE); |
22553
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
290 struct ostream *os = o_stream_create_fd(fds[1], (size_t)-1, FALSE); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
291 struct istream *is = i_stream_create_fd(fds[0], 10 + rand() % 10, FALSE); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
292 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
293 struct istream *chan0 = i_stream_create_multiplex(is, (size_t)-1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
294 struct istream *chan1 = i_stream_multiplex_add_channel(chan0, 1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
295 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
296 struct io *io0 = |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
297 io_add_istream(chan0, test_istream_multiplex_stream_read, chan0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
298 struct io *io1 = |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
299 io_add_istream(chan1, test_istream_multiplex_stream_read, chan1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
300 struct io *io2 = |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
301 io_add(fds[1], IO_WRITE, test_istream_multiplex_stream_write, os); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
302 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
303 io_loop_run(current_ioloop); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
304 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
305 io_remove(&io0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
306 io_remove(&io1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
307 io_remove(&io2); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
308 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
309 i_stream_unref(&chan1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
310 i_stream_unref(&chan0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
311 i_stream_unref(&is); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
312 |
22596
1a7bbda6284b
iostream-multiplex: Check return values in tests
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
22577
diff
changeset
|
313 test_assert(o_stream_nfinish(os) == 0); |
22553
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
314 o_stream_unref(&os); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
315 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
316 io_loop_destroy(&ioloop); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
317 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
318 i_close_fd(&fds[0]); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
319 i_close_fd(&fds[1]); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
320 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
321 test_end(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
322 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
323 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
324 static void test_istream_multiplex_close_channel(void) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
325 { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
326 test_begin("istream multiplex (close channel)"); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
327 static const char *data = "\x00\x00\x00\x00\x06Hello\x00" |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
328 "\x01\x00\x00\x00\x06World\x00"; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
329 static const size_t data_len = 22; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
330 struct istream *input = test_istream_create_data(data, data_len); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
331 size_t siz; |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
332 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
333 struct istream *chan0 = i_stream_create_multiplex(input, (size_t)-1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
334 struct istream *chan1 = i_stream_multiplex_add_channel(chan0, 1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
335 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
336 i_stream_unref(&chan1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
337 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
338 test_assert(i_stream_read(chan0) == 6); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
339 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
340 test_assert(memcmp(i_stream_get_data(chan0, &siz), "Hello\0", 6) == 0 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
341 siz == 6); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
342 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
343 i_stream_unref(&chan0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
344 i_stream_unref(&input); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
345 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
346 input = test_istream_create_data(data, data_len); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
347 chan0 = i_stream_create_multiplex(input, (size_t)-1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
348 chan1 = i_stream_multiplex_add_channel(chan0, 1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
349 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
350 /* this is needed to populate chan1 data */ |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
351 (void)i_stream_read(chan0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
352 i_stream_unref(&chan0); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
353 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
354 test_assert(i_stream_read(chan1) == 6); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
355 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
356 test_assert(memcmp(i_stream_get_data(chan1, &siz), "World\0", 6) == 0 && |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
357 siz == 6); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
358 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
359 i_stream_unref(&chan1); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
360 i_stream_unref(&input); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
361 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
362 test_end(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
363 } |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
364 |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
365 void test_istream_multiplex(void) |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
366 { |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
367 random_init(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
368 test_istream_multiplex_simple(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
369 test_istream_multiplex_maxbuf(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
370 test_istream_multiplex_random(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
371 test_istream_multiplex_stream(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
372 test_istream_multiplex_close_channel(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
373 random_deinit(); |
7db517071db5
lib: Add multiplex stream support
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
374 } |