test: add a few tests for signal-safe logging
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
parent
b69536b475
commit
36c1d92ec0
|
@ -26,6 +26,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
|
@ -101,13 +102,113 @@ number_formatting(void)
|
||||||
|
|
||||||
for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
|
for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
|
||||||
assert(check_number_format_test(tests + i));
|
assert(check_number_format_test(tests + i));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void logging_format(void)
|
||||||
|
{
|
||||||
|
const char *log_file_path = "/tmp/Xorg-logging-test.log";
|
||||||
|
const char *str = "%s %d %u %% %p %i";
|
||||||
|
char buf[1024];
|
||||||
|
int i;
|
||||||
|
unsigned int ui;
|
||||||
|
FILE *f;
|
||||||
|
char read_buf[2048];
|
||||||
|
char *logmsg;
|
||||||
|
uintptr_t ptr;
|
||||||
|
|
||||||
|
/* set up buf to contain ".....end" */
|
||||||
|
memset(buf, '.', sizeof(buf));
|
||||||
|
strcpy(&buf[sizeof(buf) - 4], "end");
|
||||||
|
|
||||||
|
LogInit(log_file_path, NULL);
|
||||||
|
assert(f = fopen(log_file_path, "r"));
|
||||||
|
|
||||||
|
#define read_log_msg(msg) \
|
||||||
|
fgets(read_buf, sizeof(read_buf), f); \
|
||||||
|
msg = strchr(read_buf, ']') + 2; /* advance past [time.stamp] */
|
||||||
|
|
||||||
|
/* boring test message */
|
||||||
|
LogMessageVerbSigSafe(X_ERROR, -1, "test message\n");
|
||||||
|
read_log_msg(logmsg);
|
||||||
|
assert(strcmp(logmsg, "(EE) test message\n") == 0);
|
||||||
|
|
||||||
|
/* long buf is truncated to "....en\n" */
|
||||||
|
#pragma GCC diagnostic ignored "-Wformat-security"
|
||||||
|
LogMessageVerbSigSafe(X_ERROR, -1, buf);
|
||||||
|
#pragma GCC diagnostic pop "-Wformat-security"
|
||||||
|
read_log_msg(logmsg);
|
||||||
|
assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
|
||||||
|
|
||||||
|
/* same thing, this time as string substitution */
|
||||||
|
LogMessageVerbSigSafe(X_ERROR, -1, "%s", buf);
|
||||||
|
read_log_msg(logmsg);
|
||||||
|
assert(strcmp(&logmsg[strlen(logmsg) - 3], "en\n") == 0);
|
||||||
|
|
||||||
|
/* strings containing placeholders should just work */
|
||||||
|
LogMessageVerbSigSafe(X_ERROR, -1, "%s\n", str);
|
||||||
|
read_log_msg(logmsg);
|
||||||
|
assert(strcmp(logmsg, "(EE) %s %d %u %% %p %i\n") == 0);
|
||||||
|
|
||||||
|
/* string substitution */
|
||||||
|
LogMessageVerbSigSafe(X_ERROR, -1, "%s\n", "substituted string");
|
||||||
|
read_log_msg(logmsg);
|
||||||
|
assert(strcmp(logmsg, "(EE) substituted string\n") == 0);
|
||||||
|
|
||||||
|
/* number substitution */
|
||||||
|
ui = 0;
|
||||||
|
do {
|
||||||
|
char expected[30];
|
||||||
|
sprintf(expected, "(EE) %u\n", ui);
|
||||||
|
LogMessageVerbSigSafe(X_ERROR, -1, "%u\n", ui);
|
||||||
|
read_log_msg(logmsg);
|
||||||
|
assert(strcmp(logmsg, expected) == 0);
|
||||||
|
if (ui == 0)
|
||||||
|
ui = 1;
|
||||||
|
else
|
||||||
|
ui <<= 1;
|
||||||
|
} while(ui);
|
||||||
|
|
||||||
|
/* hex number substitution */
|
||||||
|
ui = 0;
|
||||||
|
do {
|
||||||
|
char expected[30];
|
||||||
|
sprintf(expected, "(EE) %x\n", ui);
|
||||||
|
LogMessageVerbSigSafe(X_ERROR, -1, "%x\n", ui);
|
||||||
|
read_log_msg(logmsg);
|
||||||
|
assert(strcmp(logmsg, expected) == 0);
|
||||||
|
if (ui == 0)
|
||||||
|
ui = 1;
|
||||||
|
else
|
||||||
|
ui <<= 1;
|
||||||
|
} while(ui);
|
||||||
|
|
||||||
|
/* pointer substitution */
|
||||||
|
/* we print a null-pointer differently to printf */
|
||||||
|
LogMessageVerbSigSafe(X_ERROR, -1, "%p\n", NULL);
|
||||||
|
read_log_msg(logmsg);
|
||||||
|
assert(strcmp(logmsg, "(EE) 0x0\n") == 0);
|
||||||
|
|
||||||
|
ptr = 1;
|
||||||
|
do {
|
||||||
|
char expected[30];
|
||||||
|
sprintf(expected, "(EE) %p\n", (void*)ptr);
|
||||||
|
LogMessageVerbSigSafe(X_ERROR, -1, "%p\n", (void*)ptr);
|
||||||
|
read_log_msg(logmsg);
|
||||||
|
assert(strcmp(logmsg, expected) == 0);
|
||||||
|
ptr <<= 1;
|
||||||
|
} while(ptr);
|
||||||
|
|
||||||
|
LogClose(EXIT_NO_ERROR);
|
||||||
|
unlink(log_file_path);
|
||||||
|
|
||||||
|
#undef read_log_msg
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
number_formatting();
|
number_formatting();
|
||||||
|
logging_format();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue