summaryrefslogtreecommitdiff
path: root/tests/libntp/msyslog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/libntp/msyslog.cpp')
-rw-r--r--tests/libntp/msyslog.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/tests/libntp/msyslog.cpp b/tests/libntp/msyslog.cpp
new file mode 100644
index 0000000..5b00703
--- /dev/null
+++ b/tests/libntp/msyslog.cpp
@@ -0,0 +1,137 @@
+#include "libntptest.h"
+
+extern "C" {
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#ifndef VSNPRINTF_PERCENT_M
+// format_errmsg() is normally private to msyslog.c
+void format_errmsg (char *, size_t, const char *, int);
+#endif
+};
+
+class msyslogTest : public libntptest {
+};
+
+// msnprintf()
+TEST_F(msyslogTest, msnprintf)
+{
+#define FMT_PREFIX "msyslog.cpp ENOENT: "
+ char exp_buf[512];
+ char act_buf[512];
+ int exp_cnt;
+ int act_cnt;
+
+ exp_cnt = snprintf(exp_buf, sizeof(exp_buf), FMT_PREFIX "%s",
+ strerror(ENOENT));
+ errno = ENOENT;
+ act_cnt = msnprintf(act_buf, sizeof(act_buf), FMT_PREFIX "%m");
+ EXPECT_EQ(exp_cnt, act_cnt);
+ EXPECT_STREQ(exp_buf, act_buf);
+}
+
+TEST_F(msyslogTest, msnprintfLiteralPercentm)
+{
+ char exp_buf[32];
+ char act_buf[32];
+ int exp_cnt;
+ int act_cnt;
+
+ exp_cnt = snprintf(exp_buf, sizeof(exp_buf), "%%m");
+ errno = ENOENT;
+ act_cnt = msnprintf(act_buf, sizeof(act_buf), "%%m");
+ EXPECT_EQ(exp_cnt, act_cnt);
+ EXPECT_STREQ(exp_buf, act_buf);
+}
+
+TEST_F(msyslogTest, msnprintfBackslashLiteralPercentm)
+{
+ char exp_buf[32];
+ char act_buf[32];
+ int exp_cnt;
+ int act_cnt;
+
+ exp_cnt = snprintf(exp_buf, sizeof(exp_buf), "\%%m");
+ errno = ENOENT;
+ act_cnt = msnprintf(act_buf, sizeof(act_buf), "\%%m");
+ EXPECT_EQ(exp_cnt, act_cnt);
+ EXPECT_STREQ(exp_buf, act_buf);
+}
+
+TEST_F(msyslogTest, msnprintfBackslashPercent)
+{
+ char exp_buf[32];
+ char act_buf[32];
+ int exp_cnt;
+ int act_cnt;
+
+ exp_cnt = snprintf(exp_buf, sizeof(exp_buf), "\%s",
+ strerror(ENOENT));
+ errno = ENOENT;
+ act_cnt = msnprintf(act_buf, sizeof(act_buf), "\%m");
+ EXPECT_EQ(exp_cnt, act_cnt);
+ EXPECT_STREQ(exp_buf, act_buf);
+}
+
+TEST_F(msyslogTest, msnprintfHangingPercent)
+{
+ static char fmt[] = "percent then nul term then non-nul %\0oops!";
+ char exp_buf[64];
+ char act_buf[64];
+ int exp_cnt;
+ int act_cnt;
+
+ ZERO(exp_buf);
+ ZERO(act_buf);
+ exp_cnt = snprintf(exp_buf, sizeof(exp_buf), fmt);
+ act_cnt = msnprintf(act_buf, sizeof(act_buf), fmt);
+ EXPECT_EQ(exp_cnt, act_cnt);
+ EXPECT_STREQ(exp_buf, act_buf);
+ EXPECT_STREQ("", act_buf + 1 + strlen(act_buf));
+}
+
+#ifndef VSNPRINTF_PERCENT_M
+TEST_F(msyslogTest, format_errmsgHangingPercent)
+{
+ static char fmt[] = "percent then nul term then non-nul %\0oops!";
+ char act_buf[64];
+
+ ZERO(act_buf);
+ format_errmsg(act_buf, sizeof(act_buf), fmt, ENOENT);
+ EXPECT_STREQ(fmt, act_buf);
+ EXPECT_STREQ("", act_buf + 1 + strlen(act_buf));
+}
+#endif
+
+TEST_F(msyslogTest, msnprintfNullTarget)
+{
+ int exp_cnt;
+ int act_cnt;
+
+ exp_cnt = snprintf(NULL, 0, "%d", 123);
+ errno = ENOENT;
+ act_cnt = msnprintf(NULL, 0, "%d", 123);
+ EXPECT_EQ(exp_cnt, act_cnt);
+}
+
+TEST_F(msyslogTest, msnprintfTruncate)
+{
+ char undist[] = "undisturbed";
+ char exp_buf[512];
+ char act_buf[512];
+ int exp_cnt;
+ int act_cnt;
+
+ memcpy(exp_buf + 3, undist, sizeof(undist));
+ memcpy(act_buf + 3, undist, sizeof(undist));
+ exp_cnt = snprintf(exp_buf, 3, "%s", strerror(ENOENT));
+ errno = ENOENT;
+ act_cnt = msnprintf(act_buf, 3, "%m");
+ EXPECT_EQ('\0', exp_buf[2]);
+ EXPECT_EQ('\0', act_buf[2]);
+ EXPECT_TRUE(act_cnt > 0);
+ EXPECT_EQ(exp_cnt, act_cnt);
+ EXPECT_STREQ(exp_buf, act_buf);
+ EXPECT_STREQ(exp_buf + 3, undist);
+ EXPECT_STREQ(act_buf + 3, undist);
+}