test-istream-sized.c revision 574d36db88f15662529fb65da6fc8c5e4c8f12fa
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (c) 2016 Dovecot authors, see the included COPYING file */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "test-lib.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "str.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "istream-private.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "istream-sized.h"
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic const struct {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const char *input;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher uoff_t size;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int stream_errno;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher} tests[] = {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { "", 0, 0 },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher { "", 1, EPIPE },
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher { "a", 1, 0 },
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose { "ab", 1, EINVAL },
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher { "ab", 0, EINVAL },
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose { "ab", (uoff_t)-1, EPIPE },
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher};
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagherrun_test(const char *sized_input, uoff_t sized_size, int stream_errno)
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher{
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher unsigned int sized_input_len = strlen(sized_input);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct istream *input_data, *input;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const unsigned char *data;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher size_t i, size;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher int ret = 0;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher input_data = test_istream_create_data(sized_input, sized_input_len);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_istream_set_allow_eof(input_data, FALSE);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher input = i_stream_create_sized(input_data, sized_size);
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagher
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagher for (i = 1; i < sized_input_len; i++) {
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher test_istream_set_size(input_data, i);
cc98edd9479d4622634a1275c98058916c14059aStephen Gallagher while ((ret = i_stream_read(input)) > 0) ;
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher if (ret == -1 && stream_errno != 0)
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher break;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_assert(ret == 0);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (ret == 0) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_istream_set_allow_eof(input_data, TRUE);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_istream_set_size(input_data, i);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher while ((ret = i_stream_read(input)) > 0) ;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_assert(ret == -1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_assert(input->stream_errno == stream_errno);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher data = i_stream_get_data(input, &size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_assert(size == I_MIN(sized_input_len, sized_size));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (size > 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_assert(memcmp(data, sized_input, size) == 0);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_stream_unref(&input);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_stream_unref(&input_data);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghervoid test_istream_sized(void)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher{
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < N_ELEMENTS(tests); i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_begin(t_strdup_printf("istream sized %u", i+1));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher run_test(tests[i].input, tests[i].size, tests[i].stream_errno);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher test_end();
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher }
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher}
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher