msyslog.c revision 290001
1#include "config.h" 2 3#include "ntp_stdlib.h" 4 5#include "unity.h" 6 7#ifndef VSNPRINTF_PERCENT_M 8// format_errmsg() is normally private to msyslog.c 9void format_errmsg(char *, size_t, const char *, int); 10#endif 11 12 13void test_msnprintf(void); 14void test_msnprintfLiteralPercentm(void); 15void test_msnprintfBackslashLiteralPercentm(void); 16void test_msnprintfBackslashPercent(void); 17void test_msnprintfHangingPercent(void); 18void test_format_errmsgHangingPercent(void); 19void test_msnprintfNullTarget(void); 20void test_msnprintfTruncate(void); 21 22 23void 24test_msnprintf(void) { 25#define FMT_PREFIX "msyslog.cpp ENOENT: " 26 char exp_buf[512]; 27 char act_buf[512]; 28 int exp_cnt; 29 int act_cnt; 30 31 exp_cnt = snprintf(exp_buf, sizeof(exp_buf), FMT_PREFIX "%s", 32 strerror(ENOENT)); 33 errno = ENOENT; 34 act_cnt = msnprintf(act_buf, sizeof(act_buf), FMT_PREFIX "%m"); 35 36 TEST_ASSERT_EQUAL(exp_cnt, act_cnt); 37 TEST_ASSERT_EQUAL_STRING(exp_buf, act_buf); 38} 39 40void 41test_msnprintfLiteralPercentm(void) 42{ 43 char exp_buf[32]; 44 char act_buf[32]; 45 int exp_cnt; 46 int act_cnt; 47 48 exp_cnt = snprintf(exp_buf, sizeof(exp_buf), "%%m"); 49 errno = ENOENT; 50 act_cnt = msnprintf(act_buf, sizeof(act_buf), "%%m"); 51 52 TEST_ASSERT_EQUAL(exp_cnt, act_cnt); 53 TEST_ASSERT_EQUAL_STRING(exp_buf, act_buf); 54} 55 56void 57test_msnprintfBackslashLiteralPercentm(void) { 58 char exp_buf[32]; 59 char act_buf[32]; 60 int exp_cnt; 61 int act_cnt; 62 63 exp_cnt = snprintf(exp_buf, sizeof(exp_buf), "\%%m"); 64 errno = ENOENT; 65 act_cnt = msnprintf(act_buf, sizeof(act_buf), "\%%m"); 66 67 TEST_ASSERT_EQUAL(exp_cnt, act_cnt); 68 TEST_ASSERT_EQUAL_STRING(exp_buf, act_buf); 69} 70 71void 72test_msnprintfBackslashPercent(void) { 73 char exp_buf[32]; 74 char act_buf[32]; 75 int exp_cnt; 76 int act_cnt; 77 78 exp_cnt = snprintf(exp_buf, sizeof(exp_buf), "\%s", 79 strerror(ENOENT)); 80 errno = ENOENT; 81 act_cnt = msnprintf(act_buf, sizeof(act_buf), "\%m"); 82 83 TEST_ASSERT_EQUAL(exp_cnt, act_cnt); 84 TEST_ASSERT_EQUAL_STRING(exp_buf, act_buf); 85} 86 87void 88test_msnprintfHangingPercent(void) { 89 static char fmt[] = "percent then nul term then non-nul %\0oops!"; 90 char exp_buf[64]; 91 char act_buf[64]; 92 int exp_cnt; 93 int act_cnt; 94 95 ZERO(exp_buf); 96 ZERO(act_buf); 97 exp_cnt = snprintf(exp_buf, sizeof(exp_buf), "%s", fmt); 98 act_cnt = msnprintf(act_buf, sizeof(act_buf), "%s", fmt); 99 100 TEST_ASSERT_EQUAL(exp_cnt, act_cnt); 101 TEST_ASSERT_EQUAL_STRING(exp_buf, act_buf); 102 TEST_ASSERT_EQUAL_STRING("", act_buf + 1 + strlen(act_buf)); 103} 104 105void 106test_format_errmsgHangingPercent(void) { 107#ifndef VSNPRINTF_PERCENT_M 108 static char fmt[] = "percent then nul term then non-nul %\0oops!"; 109 char act_buf[64]; 110 111 ZERO(act_buf); 112 format_errmsg(act_buf, sizeof(act_buf), fmt, ENOENT); 113 114 TEST_ASSERT_EQUAL_STRING(fmt, act_buf); 115 TEST_ASSERT_EQUAL_STRING("", act_buf + 1 + strlen(act_buf)); 116#else 117 TEST_IGNORE_MESSAGE("VSNPRINTF_PERCENT_M is defined") 118#endif 119} 120 121void 122test_msnprintfNullTarget(void) { 123 int exp_cnt; 124 int act_cnt; 125 126 exp_cnt = snprintf(NULL, 0, "%d", 123); 127 errno = ENOENT; 128 act_cnt = msnprintf(NULL, 0, "%d", 123); 129 130 TEST_ASSERT_EQUAL(exp_cnt, act_cnt); 131} 132 133void 134test_msnprintfTruncate(void) { 135 char undist[] = "undisturbed"; 136 char exp_buf[512]; 137 char act_buf[512]; 138 int exp_cnt; 139 int act_cnt; 140 141 memcpy(exp_buf + 3, undist, sizeof(undist)); 142 memcpy(act_buf + 3, undist, sizeof(undist)); 143 exp_cnt = snprintf(exp_buf, 3, "%s", strerror(ENOENT)); 144 errno = ENOENT; 145 act_cnt = msnprintf(act_buf, 3, "%m"); 146 147 TEST_ASSERT_EQUAL('\0', exp_buf[2]); 148 TEST_ASSERT_EQUAL('\0', act_buf[2]); 149 TEST_ASSERT_TRUE(act_cnt > 0); 150 TEST_ASSERT_EQUAL(exp_cnt, act_cnt); 151 TEST_ASSERT_EQUAL_STRING(exp_buf, act_buf); 152 TEST_ASSERT_EQUAL_STRING(exp_buf + 3, undist); 153 TEST_ASSERT_EQUAL_STRING(act_buf + 3, undist); 154} 155