test-ostream-multiplex.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2017-2018 Dovecot authors, see the included COPYING file */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic void test_ostream_multiplex_simple(void)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen const unsigned char expected[] = {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen '\x00','\x00','\x00','\x00','\x05','\x68','\x65',
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen '\x6c','\x6c','\x6f','\x01','\x00','\x00','\x00',
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct ostream *os = test_ostream_create(result);
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainen struct ostream *os2 = o_stream_create_multiplex(os, (size_t)-1);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct ostream *os3 = o_stream_multiplex_add_channel(os2, 1);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen test_assert(o_stream_send_str(os2, "hello") == 5);
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen test_assert(o_stream_send_str(os3, "world") == 5);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen test_assert(sizeof(expected) == result->used);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen test_assert(memcmp(result->data, expected, I_MIN(sizeof(expected),
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainenstatic unsigned int channel_counter[2] = {0, 0};
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainenstatic const char *msgs[] = {
8f32e59200da904613506f5649ffa4d9f5989cebTimo Sirainenstatic void test_ostream_multiplex_stream_read(struct istream *is)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const unsigned char *data;
c9bf63e9094761767a63ac6b189bcf60bcffdc44Timo Sirainen /* parse stream */
c9bf63e9094761767a63ac6b189bcf60bcffdc44Timo Sirainen } else if (dlen == 0) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen test_assert_idx(data[pos] < 2, channel_counter[cid]);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen test_assert(dlen > 0 && dlen < N_ELEMENTS(msgs));
c9bf63e9094761767a63ac6b189bcf60bcffdc44Timo Sirainen if (channel_counter[0] > 100 && channel_counter[1] > 100)
8f32e59200da904613506f5649ffa4d9f5989cebTimo Sirainenstatic void test_ostream_multiplex_stream_write(struct ostream *channel ATTR_UNUSED)
6cc0546c058f3e6253c6f99727b28dd602712974Timo Sirainen o_stream_nsend_str(chan1, msgs[i_rand() % N_ELEMENTS(msgs)]);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen o_stream_nsend_str(chan0, msgs[i_rand() % N_ELEMENTS(msgs)]);
252db51b6c0a605163326b3ea5d09e9936ca3b29Timo Sirainenstatic void test_ostream_multiplex_stream(void)
68a4946b12583b88fa802e52ebee45cd96056772Timo Sirainen struct ostream *os = o_stream_create_fd(fds[1], (size_t)-1);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct istream *is = i_stream_create_fd(fds[0], (size_t)-1);
8f32e59200da904613506f5649ffa4d9f5989cebTimo Sirainen chan0 = o_stream_create_multiplex(os, (size_t)-1);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen chan1 = o_stream_multiplex_add_channel(chan0, 1);
de954ff15b495be13007a8aca2c09fd1d356a283Timo Sirainen io_add_istream(is, test_ostream_multiplex_stream_read, is);