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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }