test-printf-format-fix.c revision 8bec19723b39071a1794e76dec35d151473cae5f
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2001-2014 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* Unit tests for printf-format-fix helper */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen static const char *tests[] = {
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen "Hello world",
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen "Embedded %%, %u, %f, etc. are OK",
a34bd633ab201f6a5ad1c00174fb8b0359031d00Timo Sirainen "%%doesn't cause confusion in %%m and %%n",
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int i;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int len;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert_idx(printf_format_fix_get_len(tests[i], &len)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen static const char *tests[] = {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen "OK to have a trailing %m",
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen "%m can appear at the start too",
d22301419109ed4a38351715e6760011421dadecTimo Sirainen "Even %m in the middle with a confusing %%m elsewhere is OK",
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int i;
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen unsigned int needlen;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int len;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int offs;
4542c94adb8910e0174c784754e737cec16af59cTimo Sirainen test_assert_idx(memcmp(chgd, tests[i], offs) == 0, i);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert_idx(memcmp(chgd+offs, needle, needlen) == 0, i);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert_idx(strcmp(chgd+offs+needlen, tests[i]+offs+2) == 0, i);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen chgd = printf_format_fix_get_len(tests[i], &len);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert_idx(memcmp(chgd, tests[i], offs) == 0, i);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert_idx(memcmp(chgd+offs, needle, needlen) == 0, i);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen test_assert_idx(memcmp(chgd+offs+needlen, tests[i]+offs+2, len-needlen-offs) == 0, i);
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen/* Want to test the panics too? go for it! */
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainenenum fatal_test_state fatal_printf_format_fix(int stage)
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen static const char *fatals[] = {
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen "no no no %n's",
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen "%m allowed once, but not twice: %m",
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen "%m must not obscure a later %n",
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen "definitely can't have a tailing %",
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen if((unsigned int)stage >= N_ELEMENTS(fatals)) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* let's crash! */