Mercurial > dovecot > core-2.2
annotate src/lib/test-istream-sized.c @ 22664:fea53c2725c0
director: Fix director_max_parallel_moves/kicks type
Should be uint, not time.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 09 Nov 2017 12:24:16 +0200 |
parents | bc16d43aed49 |
children | cb108f786fb4 |
rev | line source |
---|---|
21685
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2016 Dovecot authors, see the included COPYING file */ |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
2 |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
3 #include "test-lib.h" |
21687
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
4 #include "istream.h" |
21685
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
5 #include "istream-sized.h" |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
6 |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
7 static const struct { |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
8 const char *input; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
9 uoff_t size; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
10 int stream_errno; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
11 } tests[] = { |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
12 { "", 0, 0 }, |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
13 { "", 1, EPIPE }, |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
14 { "a", 1, 0 }, |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
15 { "ab", 1, EINVAL }, |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
16 { "ab", 0, EINVAL }, |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
17 { "ab", (uoff_t)-1, EPIPE }, |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
18 }; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
19 |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
20 static void |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
21 run_test(const char *sized_input, uoff_t sized_size, int stream_errno) |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
22 { |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
23 unsigned int sized_input_len = strlen(sized_input); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
24 struct istream *input_data, *input; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
25 const unsigned char *data; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
26 size_t i, size; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
27 int ret = 0; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
28 |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
29 input_data = test_istream_create_data(sized_input, sized_input_len); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
30 test_istream_set_allow_eof(input_data, FALSE); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
31 input = i_stream_create_sized(input_data, sized_size); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
32 |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
33 for (i = 1; i < sized_input_len; i++) { |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
34 test_istream_set_size(input_data, i); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
35 while ((ret = i_stream_read(input)) > 0) ; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
36 if (ret == -1 && stream_errno != 0) |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
37 break; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
38 test_assert(ret == 0); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
39 } |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
40 if (ret == 0) { |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
41 test_istream_set_allow_eof(input_data, TRUE); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
42 test_istream_set_size(input_data, i); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
43 while ((ret = i_stream_read(input)) > 0) ; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
44 } |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
45 test_assert(ret == -1); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
46 test_assert(input->stream_errno == stream_errno); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
47 |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
48 data = i_stream_get_data(input, &size); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
49 test_assert(size == I_MIN(sized_input_len, sized_size)); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
50 if (size > 0) |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
51 test_assert(memcmp(data, sized_input, size) == 0); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
52 i_stream_unref(&input); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
53 i_stream_unref(&input_data); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
54 } |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
55 |
21687
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
56 static void test_istream_sized_full(bool exact) |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
57 { |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
58 const unsigned char test_data[10] = "1234567890"; |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
59 struct istream *test_input, *input; |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
60 unsigned int i, j; |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
61 int expected_errno; |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
62 |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
63 for (i = 1; i < sizeof(test_data)*2; i++) { |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
64 test_input = test_istream_create_data(test_data, sizeof(test_data)); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
65 test_istream_set_allow_eof(test_input, FALSE); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
66 test_istream_set_size(test_input, 0); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
67 |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
68 if (exact) |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
69 input = i_stream_create_sized(test_input, i); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
70 else |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
71 input = i_stream_create_min_sized(test_input, i); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
72 for (j = 1; j <= I_MIN(i, sizeof(test_data)); j++) { |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
73 test_assert_idx(i_stream_read(input) == 0, j); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
74 test_istream_set_size(test_input, j); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
75 test_assert_idx(i_stream_read(input) == 1, j); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
76 } |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
77 test_assert_idx(i_stream_read(input) == 0, i); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
78 if (j <= sizeof(test_data)) |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
79 test_istream_set_size(test_input, j); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
80 else |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
81 test_istream_set_allow_eof(test_input, TRUE); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
82 test_assert_idx(i_stream_read(input) == -1 && input->eof, i); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
83 if (i > sizeof(test_data)) |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
84 expected_errno = EPIPE; |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
85 else if (i < sizeof(test_data) && exact) |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
86 expected_errno = EINVAL; |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
87 else |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
88 expected_errno = 0; |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
89 test_assert_idx(input->stream_errno == expected_errno, i); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
90 i_stream_unref(&input); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
91 i_stream_unref(&test_input); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
92 } |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
93 } |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
94 |
21685
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
95 void test_istream_sized(void) |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
96 { |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
97 unsigned int i; |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
98 |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
99 for (i = 0; i < N_ELEMENTS(tests); i++) { |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
100 test_begin(t_strdup_printf("istream sized %u", i+1)); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
101 run_test(tests[i].input, tests[i].size, tests[i].stream_errno); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
102 test_end(); |
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
103 } |
21687
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
104 test_begin("istream sized"); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
105 test_istream_sized_full(TRUE); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
106 test_end(); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
107 |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
108 test_begin("istream sized min"); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
109 test_istream_sized_full(FALSE); |
bc16d43aed49
lib: Added i_stream_create_min_sized*()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21685
diff
changeset
|
110 test_end(); |
21685
5eb922a4fdf6
lib: istream-sized - set stream_errno=EPIPE if stream is too small
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
111 } |