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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
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
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
21 unsigned int i, outsize, input_len, output_len;
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
22 string_t *str;
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
23 uoff_t offset;
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
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
7e4fe0c07661 istream dot unit test fixes.
Timo Sirainen <tss@iki.fi>
parents: 9531
diff changeset
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
7e4fe0c07661 istream dot unit test fixes.
Timo Sirainen <tss@iki.fi>
parents: 9531
diff changeset
37 if (output_len > 0 &&
7e4fe0c07661 istream dot unit test fixes.
Timo Sirainen <tss@iki.fi>
parents: 9531
diff changeset
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
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
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
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
45 outsize = 1; i = 0;
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
46 i_stream_set_max_buffer_size(input, outsize);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
47 test_istream_set_size(test_input, 1);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
48 while ((ret = i_stream_read(input)) != -1) {
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
49 switch (ret) {
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
50 case -2:
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
51 i_stream_set_max_buffer_size(input, ++outsize);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
52 offset = test_input->v_offset;
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
53 /* seek one byte backwards so stream gets
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
54 reset */
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
55 i_stream_seek(test_input, offset - 1);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
56 /* go back to original position */
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
57 test_istream_set_size(test_input, offset);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
58 i_stream_skip(test_input, 1);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
59 /* and finally allow reading one more byte */
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
60 test_istream_set_size(test_input, offset + 1);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
61 break;
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
62 case 0:
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
63 test_istream_set_size(test_input, ++i);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
64 break;
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
65 default:
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
66 test_assert(ret > 0);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
67
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
68 data = i_stream_get_data(input, &size);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
69 str_append_n(str, data, size);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
70 i_stream_skip(input, size);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
71 }
9514
f068c8a19013 Added dot istream for reading SMTP DATA-style input.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 }
9531
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
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
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
89
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
90 data = i_stream_get_data(input, &size);
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
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
cdd6ef3c356c Improved test istream.
Timo Sirainen <tss@iki.fi>
parents: 9514
diff changeset
93 test_assert(str_len(str) == output_len);
9539
7e4fe0c07661 istream dot unit test fixes.
Timo Sirainen <tss@iki.fi>
parents: 9531
diff changeset
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 }