libsyslogp/src/tests/regr.c

231 lines
5.7 KiB
C

/* libsyslogp/src/tests/regr.c
*
* (c)2009, Laurence Withers, <l@lwithers.me.uk>.
* Released under the GNU GPLv3. See file COPYING or
* http://www.gnu.org/copyleft/gpl.html for details.
*/
#include "syslogp.h"
#include <stdio.h>
#include <string.h>
#include <syslog.h>
#include <iso8601.h>
#define ISO_DAY_20081106 (733717)
#define ISO_SEC_1700 (17 * 3600)
const struct syslog_msg exp_simplecron = {
.level = LOG_NOTICE,
.facility = LOG_USER,
.timestamp = {
.day = ISO_DAY_20081106,
.sec = ISO_SEC_1700,
},
.hostname = "amethyst",
.tag = "cron",
.id = "31311",
.msg = "(root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)",
};
const struct syslog_msg exp_rfc5424cron = {
.level = LOG_NOTICE,
.facility = LOG_USER,
.timestamp = {
.day = ISO_DAY_20081106,
.sec = ISO_SEC_1700,
},
.hostname = "amethyst",
.tag = "cron",
.id = "31311",
.msg = "- (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)",
};
struct test {
const char* name;
const char* orig;
char* string;
const struct syslog_msg* exp;
};
struct test
tests[] = {
{
.name = "bsd",
.orig = "<13>Nov 6 17:00:00 amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)",
.exp = &exp_simplecron,
},
{
.name = "space_bsd",
.orig = "<13> Nov 6 17:00:00 amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)",
.exp = &exp_simplecron,
},
{
.name = "bsd_newline",
.orig = "<13>Nov 6 17:00:00 amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_simplecron,
},
{
.name = "nopri_bsd_newline",
.orig = "Nov 6 17:00:00 amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_simplecron,
},
{
.name = "bsd_secfrac",
.orig = "<13>Nov 6 17:00:00.000 amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_simplecron,
},
{
.name = "linksys",
.orig = "<13>Nov 6 17:00:00 2008 amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_simplecron,
},
{
.name = "space_linksys",
.orig = "<13> Nov 6 17:00:00 2008 amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_simplecron,
},
{
.name = "pix",
.orig = "<13>Nov 6 2008 17:00:00 amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_simplecron,
},
{
.name = "space_pix",
.orig = "<13> Nov 6 2008 17:00:00 amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_simplecron,
},
{
.name = "iso",
.orig = "<13>2008-11-06T17:00:00Z amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_simplecron,
},
{
.name = "_iso",
.orig = "<13> 2008-11-06T17:00:00Z amethyst cron[31311]: (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_simplecron,
},
{
.name = "rfc5424",
.orig = "<13>1 2008-11-06T17:00:00Z amethyst cron 31311 - (root) CMD (rm -f /var/spool/cron/lastrun/cron.hourly)\n",
.exp = &exp_rfc5424cron,
},
{
.name = 0,
}
};
int
compare_msg(const struct syslog_msg* a, const struct syslog_msg* b)
{
if(a->level != b->level) return -1;
if(a->facility != b->facility) return -1;
if(iso8601_cmp(&a->timestamp, &b->timestamp)) return -1;
#define CMP_STR(str) do { \
if((a->str && !b->str) || (b->str && !a->str)) return -1; \
if(a->str && strcmp(a->str, b->str)) return -1; \
}while(0)
CMP_STR(hostname);
CMP_STR(tag);
CMP_STR(id);
CMP_STR(msg);
#undef CMP_STR
return 0;
}
struct iso8601_details
iso_details = {
.date_prec = iso8601_prec_day,
.time_prec = iso8601_prec_secfrac,
.extended = 1,
};
void
dump_msg(const char* label, const struct syslog_msg* msg)
{
char isodate[40];
printf("======== %s ========\n"
"Level : %d (%s)\n"
"Facility : %d (%s)\n"
"Timestamp: %s\n"
"Hostname : '%s'\n"
"Tag : '%s'\n"
"ID : '%s'\n"
"Message : “%s”\n\n",
label,
msg->level, syslog_level_name(msg->level),
msg->facility, syslog_facility_name(msg->facility),
iso8601_print(isodate, sizeof(isodate), &msg->timestamp, &iso_details),
msg->hostname, msg->tag, msg->id, msg->msg
);
}
int main(int argc, char* argv[])
{
int ret = 0;
struct test* test;
struct syslog_msg msg_result;
if(argc == 2 && !strcmp(argv[1], "--print-summary")) {
fputs("Automated regression test.\n", stdout);
return 0;
}
syslog_parse_set_implied_year(2008);
for(test = tests; test->name; ++test) {
/* operate on a copy of the string (constant is read only) */
test->string = strdup(test->orig);
syslog_parse(&msg_result, test->string);
/* compare the result, testing for and dumping errors */
ret = compare_msg(&msg_result, test->exp);
printf("%s: %s\n", test->name, ret ? "FAILED" : "passed");
if(ret) {
printf("*** Test failed while parsing:\n“%s”\n\n", test->orig);
dump_msg("Expected result", test->exp);
dump_msg("Actual result", &msg_result);
break;
}
}
return ret;
}
/* options for text editors
kate: replace-trailing-space-save true; space-indent true; tab-width 4;
vim: expandtab:ts=4:sw=4
*/