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