test-printf-format-fix.c revision ba1a5db879b08d2fefcb42160af67853cdfe7687
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2001-2017 Dovecot authors, see the included COPYING file */
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen/* Unit tests for printf-format-fix helper */
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen static const char *tests[] = {
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen "Hello world",
0cb5a9bfbf40b3b323956792aa13d342a459585eTimo Sirainen "Embedded %%, %u, %f, %s, etc. are OK",
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen "Allow %#0- +s flags",
0cb5a9bfbf40b3b323956792aa13d342a459585eTimo Sirainen "duplicate flags in different args %0-123s %0-123s",
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen "Minimum length %9999s",
9ddd3d7d8651985e373a6c48e0ddc76b8a4ef1c7Timo Sirainen "Minimum length parameter %*s",
9ddd3d7d8651985e373a6c48e0ddc76b8a4ef1c7Timo Sirainen "Precision %.9999s",
a272994d43de80a306a8ed1f2983960d1f3102d0Timo Sirainen "Precision %1.9999s",
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen "Precision parameter %1.*s %.*s",
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen "Length modifiers %hd %hhd %ld %lld %Lg %jd %zd %td",
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen "Specifiers %s %u %d %c %i %x %X %p %o %e %E %f %F %g %G %a %A",
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen "%%doesn't cause confusion in %%m and %%n",
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen unsigned int i;
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen test_assert_idx(printf_format_fix_get_len(tests[i], &len)
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen static const char *tests[] = {
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen "OK to have a trailing %m",
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen "%m can appear at the start too",
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen "Even %m in the middle with a confusing %%m elsewhere is OK",
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen unsigned int i;
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen unsigned int needlen;
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen unsigned int offs;
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen test_assert_idx(memcmp(chgd, tests[i], offs) == 0, i);
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen test_assert_idx(memcmp(chgd+offs, needle, needlen) == 0, i);
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen test_assert_idx(strcmp(chgd+offs+needlen, tests[i]+offs+2) == 0, i);
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen chgd = printf_format_fix_get_len(tests[i], &len);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen test_assert_idx(memcmp(chgd, tests[i], offs) == 0, i);
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen test_assert_idx(memcmp(chgd+offs, needle, needlen) == 0, i);
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen test_assert_idx(memcmp(chgd+offs+needlen, tests[i]+offs+2, len-needlen-offs) == 0, i);
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainen/* Want to test the panics too? go for it! */
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainenenum fatal_test_state fatal_printf_format_fix(unsigned int stage)
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainen static const struct {
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen { "no no no %-1234567890123n's with extra stuff", "Too large minimum field width" },
e2ae85924b0ef1a7c97e021a3b901b498f599c18Timo Sirainen { "%m allowed once, but not twice: %m", "%m used twice" },
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen { "%m must not obscure a later %n", "%n modifier used" },
e2ae85924b0ef1a7c97e021a3b901b498f599c18Timo Sirainen { "definitely can't have a tailing %", "Missing % specifier" },
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainen { "Evil %**%n", "Unsupported 0x2a specifier" },
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainen { "Evil %*#%99999$s", "Unsupported 0x23 specifier" },
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainen { "No weird %% with %0%", "Unsupported 0x25 specifier" },
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainen { "No duplicate modifiers %00s", "Duplicate % flag '0'" },
e2ae85924b0ef1a7c97e021a3b901b498f599c18Timo Sirainen { "Minimum length can't be too long %10000s", "Too large minimum field width" },
0d1b8b6bec79746c5d89d57dd8c1688946bd9237Josef 'Jeff' Sipek { "Minimum length doesn't support %*1$s", "Unsupported 0x31 specifier" },
0cb5a9bfbf40b3b323956792aa13d342a459585eTimo Sirainen { "Precision can't be too long %.10000s", "Too large precision" },
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen { "Precision can't be too long %1.10000s", "Too large precision" },
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen { "Precision doesn't support %1.-1s", "Unsupported 0x2d specifier" },
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen /* let's crash! */
9137c55411aa39d41c1e705ddc34d5bd26c65021Timo Sirainen test_expect_fatal_string(fatals[stage].expected_fatal);