test-printf-format-fix.c revision 1d940afbc02516d8c3d016780e1223a779844a1e
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2001-2014 Dovecot authors, see the included COPYING file */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen/* Unit tests for printf-format-fix helper */
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "test-lib.h"
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen#include "printf-format-fix.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include <string.h>
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstruct format_fix_rewrites {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char *input;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen const char *output;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen size_t length;
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen};
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainen
a8284e999d091cd29210fa75ecdc8076376a7345Timo Sirainenstatic void test_unchanged()
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen{
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen static const char *tests[] = {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen "Hello world",
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen "Embedded %%, %u, %f, etc. are OK",
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen "%%doesn't cause confusion in %%m and %%n",
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen };
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen unsigned int i;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen test_begin("printf_format_fix(safe)");
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen for (i = 0; i < N_ELEMENTS(tests); ++i) {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen unsigned int len;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen T_BEGIN {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen test_assert_idx(printf_format_fix(tests[i])
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen == tests[i], i);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen test_assert_idx(printf_format_fix_get_len(tests[i], &len)
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen == tests[i], i);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen test_assert_idx(len == strlen(tests[i]), i);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen } T_END;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen }
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen test_end();
cab0827de053c8b58c6528eb430c089576a49ca9Timo Sirainen}
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainenstatic void test_ok_changes()
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen{
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen static const char *tests[] = {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen "OK to have a trailing %m",
d09e4ee15faa7b6f1804b78f15d8778030401b4cTimo Sirainen "%m can appear at the start too",
98348e3f27a2f59c2f02cd67974004b4cd595c8cTimo Sirainen "Even %m in the middle with a confusing %%m elsewhere is OK",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen };
93a7d1ee4b518b5c85f9721dc6539e4dab6aae00Timo Sirainen unsigned int i;
f7f25f9e1a38678d0e97d2e609beac16285fac6bTimo Sirainen const char *needle;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen unsigned int needlen;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen int old_errno = errno;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen test_begin("printf_format_fix(rewrites)");
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen errno = EINVAL;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen needle = strerror(errno);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen test_assert(needle != NULL);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen needlen = strlen(needle);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen for (i = 0; i < N_ELEMENTS(tests); ++i) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen unsigned int len;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen char const *chgd;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen char const *insert;
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainen unsigned int offs;
4f7987384f306ea93b0258623a4cdd69601f2d0eTimo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen T_BEGIN {
61618d4c58080570f689614fec204ae14e90cef2Timo Sirainen chgd = printf_format_fix(tests[i]);
50e20db49f29917fe9adcf1b56b11badf28bd0e4Timo Sirainen test_assert_idx(chgd != tests[i], i);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen insert = strstr(chgd, needle);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen test_assert_idx(insert != NULL, i);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen offs = insert - chgd;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen test_assert_idx(memcmp(chgd, tests[i], offs) == 0, i);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen test_assert_idx(memcmp(chgd+offs, needle, needlen) == 0, i);
02c75e04c6ff80726bb59e3ea34a7995ad1f6f7cTimo Sirainen test_assert_idx(strcmp(chgd+offs+needlen, tests[i]+offs+2) == 0, i);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch chgd = printf_format_fix_get_len(tests[i], &len);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch test_assert_idx(chgd != tests[i], i);
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch test_assert_idx(len == strlen(chgd), i);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen insert = strstr(chgd, needle);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen test_assert_idx(insert != NULL, i);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen offs = insert - chgd;
7744586e3e0fd60158abfbb03a233d3bd8d6c48bTimo Sirainen test_assert_idx(memcmp(chgd, tests[i], offs) == 0, i);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen test_assert_idx(memcmp(chgd+offs, needle, needlen) == 0, i);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen test_assert_idx(memcmp(chgd+offs+needlen, tests[i]+offs+2, len-needlen-offs) == 0, i);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen } T_END;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen }
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen errno = old_errno;
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen test_end();
01c7ba8366ceafdbc0752d93079bbe785bebc9e1Timo Sirainen}
33efc9521ee845a4c8a582e9102fe011bdada9beTimo Sirainen
13eb655174f3857b38f4e3ac8658c82184715fd4Timo Sirainenvoid test_printf_format_fix()
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch{
02c75e04c6ff80726bb59e3ea34a7995ad1f6f7cTimo Sirainen test_unchanged();
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch test_ok_changes();
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch /* want to test the panics too */
f9511e684858bf5f6ac77ab12254b85b737beae8Stephan Bosch}
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen