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