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