Mercurial > dovecot > core-2.2
annotate src/lib-mail/test-istream-dot.c @ 14682:d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Checked using a patched clang that adds attribute(warn_unused_result) to all
functions. This commit fixes several error handling mistakes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 25 Jun 2012 01:14:03 +0300 |
parents | ba770cba5598 |
children | 90710c6c3beb |
rev | line source |
---|---|
14133
ba770cba5598
Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
1 /* Copyright (c) 2007-2012 Dovecot authors, see the included COPYING file */ |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
9531 | 4 #include "str.h" |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "istream.h" |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "istream-dot.h" |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "test-common.h" |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 struct dot_test { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 const char *input; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 const char *output; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 const char *parent_input; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 }; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 static void test_istream_dot_one(const struct dot_test *test, |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 bool send_last_lf, bool test_bufsize) |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 struct istream *test_input, *input; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 const unsigned char *data; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 size_t size; |
9531 | 21 unsigned int i, outsize, input_len, output_len; |
22 string_t *str; | |
23 uoff_t offset; | |
24 int ret; | |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 test_input = test_istream_create(test->input); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 input = i_stream_create_dot(test_input, send_last_lf); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
9539 | 29 input_len = strlen(test->input); |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 output_len = strlen(test->output); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 if (!send_last_lf && |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 (test->input[input_len-1] == '\n' || |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 strstr(test->input, "\n.\n") != NULL || |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 strstr(test->input, "\n.\r\n") != NULL)) { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 if (test->output[output_len-1] == '\n') { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 output_len--; |
9539 | 37 if (output_len > 0 && |
38 test->output[output_len-1] == '\r') | |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 output_len--; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 } |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 } |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
9531 | 43 str = t_str_new(256); |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 if (!test_bufsize) { |
9531 | 45 outsize = 1; i = 0; |
46 i_stream_set_max_buffer_size(input, outsize); | |
47 test_istream_set_size(test_input, 1); | |
48 while ((ret = i_stream_read(input)) != -1) { | |
49 switch (ret) { | |
50 case -2: | |
51 i_stream_set_max_buffer_size(input, ++outsize); | |
52 offset = test_input->v_offset; | |
53 /* seek one byte backwards so stream gets | |
54 reset */ | |
55 i_stream_seek(test_input, offset - 1); | |
56 /* go back to original position */ | |
57 test_istream_set_size(test_input, offset); | |
58 i_stream_skip(test_input, 1); | |
59 /* and finally allow reading one more byte */ | |
60 test_istream_set_size(test_input, offset + 1); | |
61 break; | |
62 case 0: | |
63 test_istream_set_size(test_input, ++i); | |
64 break; | |
65 default: | |
66 test_assert(ret > 0); | |
67 | |
68 data = i_stream_get_data(input, &size); | |
69 str_append_n(str, data, size); | |
70 i_stream_skip(input, size); | |
71 } | |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 } |
9531 | 73 test_istream_set_size(test_input, input_len); |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
74 (void)i_stream_read(test_input); |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 } else { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 test_istream_set_size(test_input, input_len); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 size = 0; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 for (i = 1; i < output_len; i++) { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 i_stream_set_max_buffer_size(input, i); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 test_assert(i_stream_read(input) == 1); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 test_assert(i_stream_read(input) == -2); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 data = i_stream_get_data(input, &size); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 test_assert(memcmp(data, test->output, size) == 0); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 i_stream_set_max_buffer_size(input, i+2); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 if (size < output_len) |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 test_assert(i_stream_read(input) == 1); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 test_assert(i_stream_read(input) == -1); |
9531 | 89 |
90 data = i_stream_get_data(input, &size); | |
91 str_append_n(str, data, size); | |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 } |
9531 | 93 test_assert(str_len(str) == output_len); |
9539 | 94 test_assert(memcmp(str_data(str), test->output, output_len) == 0); |
9514
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 data = i_stream_get_data(test_input, &size); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 test_assert(size == strlen(test->parent_input)); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 test_assert(memcmp(data, test->parent_input, size) == 0); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 i_stream_unref(&test_input); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 i_stream_unref(&input); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 } |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 static void test_istream_dot(void) |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 static struct dot_test tests[] = { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 { "..foo\n..\n.foo\n.\nfoo", ".foo\n.\nfoo\n", "foo" }, |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 { "..foo\r\n..\r\n.foo\r\n.\r\nfoo", ".foo\r\n.\r\nfoo\r\n", "foo" }, |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 { "\r\n.\r\n", "\r\n", "" }, |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 { "\n.\r\n", "\n", "" }, |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 { "\n.\n", "\n", "" }, |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 { "\n.", "\n", "" }, |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 { ".", "", "" } |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 }; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 unsigned int i; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 test_begin("dot istream"); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 for (i = 0; i < N_ELEMENTS(tests); i++) { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 test_istream_dot_one(&tests[i], TRUE, TRUE); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 test_istream_dot_one(&tests[i], TRUE, FALSE); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 test_istream_dot_one(&tests[i], FALSE, TRUE); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 test_istream_dot_one(&tests[i], FALSE, FALSE); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 } |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 test_end(); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 } |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 int main(void) |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 static void (*test_functions[])(void) = { |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 test_istream_dot, |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 NULL |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 }; |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 return test_run(test_functions); |
f068c8a19013
Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 } |