test-istream-seekable.c revision a05250bd599fca0cb8b761c4fd69f91bc1c3667e
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2009-2017 Dovecot authors, see the included COPYING file */
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainenstatic int fd_callback(const char **path_r, void *context ATTR_UNUSED)
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen fd = open(*path_r, O_RDWR | O_CREAT | O_TRUNC, 0600);
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainenstatic void test_istream_seekable_one(unsigned int buffer_size)
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen const unsigned char *data;
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen unsigned int i, j;
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen for (i = 0; i < STREAM_COUNT; i++) {
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen streams[i] = test_istream_create(input_string);
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen input = i_stream_create_seekable(streams, buffer_size, fd_callback, NULL);
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen for (i = 0; i/STREAM_BYTES < STREAM_COUNT; i++) {
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen test_istream_set_size(streams[i/STREAM_BYTES], (i%STREAM_BYTES) + 1);
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen for (j = 0; j < size; j++) {
4efba37e4f27b93832f6147c3a353d6d22c855c7Timo Sirainen test_assert((char)data[j] == input_string[(input->v_offset + j) % STREAM_BYTES]);
96af3e787c15929853b77bac0451b7b8f343510cTimo Sirainen for (i = 0; i < STREAM_COUNT; i++) {
a05250bd599fca0cb8b761c4fd69f91bc1c3667eTimo Sirainen test_assert(streams[i]->eof && streams[i]->stream_errno == 0);
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen const unsigned char *data;
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen unsigned char *w_data;
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen unsigned int i, j, offset, stream_count, data_len, buffer_size;
191153d1a5b0eb0c129139570e3aa5212f28d2acJosef 'Jeff' Sipek stream_count = i_rand_minmax(2, 10 + 2 - 1);
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen streams = t_new(struct istream *, stream_count + 1);
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen for (i = 0, offset = 0; i < stream_count; i++) {
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen for (j = 0; j < data_len; j++)
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen streams[i] = test_istream_create_data(w_data, data_len);
191153d1a5b0eb0c129139570e3aa5212f28d2acJosef 'Jeff' Sipek buffer_size = i_rand_minmax(1, 100); size = 0;
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen input = i_stream_create_seekable(streams, buffer_size, fd_callback, NULL);
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen /* first read it through */
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen for (i = 0; i < 100; i++) {
191153d1a5b0eb0c129139570e3aa5212f28d2acJosef 'Jeff' Sipek i_stream_seek(input, i_rand_limit(offset));
191153d1a5b0eb0c129139570e3aa5212f28d2acJosef 'Jeff' Sipek i_stream_skip(input, i_rand_limit(ret + 1));
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen for (j = 0; j < size; j++) {
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen test_assert(data[j] == (input->v_offset + j) % 256);
96af3e787c15929853b77bac0451b7b8f343510cTimo Sirainen for (i = 0; i < stream_count; i++) {
a05250bd599fca0cb8b761c4fd69f91bc1c3667eTimo Sirainen test_assert(streams[i]->eof && streams[i]->stream_errno == 0);
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen const unsigned char *data;
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen streams[0] = i_stream_create_from_data(in_str, in_str_len);
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen input = i_stream_create_seekable(streams, in_str_len, fd_callback, NULL);
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen test_assert(i_stream_read(input) == (ssize_t)in_str_len);
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen test_assert(memcmp(data, in_str, in_str_len) == 0);
7bcb308d0e13dfa48b483b0addccd889a77bb598Timo Sirainen test_assert(memcmp(data, in_str, in_str_len) == 0);
96af3e787c15929853b77bac0451b7b8f343510cTimo Sirainen test_assert(streams[0]->v_offset == in_str_len);
96af3e787c15929853b77bac0451b7b8f343510cTimo Sirainenstatic void test_istream_seekable_early_end(void)
96af3e787c15929853b77bac0451b7b8f343510cTimo Sirainen test_istream_set_allow_eof(streams[0], FALSE);
96af3e787c15929853b77bac0451b7b8f343510cTimo Sirainen input = i_stream_create_seekable(streams, 1000, fd_callback, NULL);
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen unsigned int i;
7d548d4984752d74bfea8dc4bf1781a8996f43e7Timo Sirainen for (i = 1; i <= STREAM_BYTES*STREAM_COUNT; i++)