X-Git-Url: http://git.scottworley.com/tl-append/blobdiff_plain/bab98a3a230bcc2161254e5796ec97e1391b4907..90df84eb2e05926351cc7df661712c97779c9163:/tl-append-test.c diff --git a/tl-append-test.c b/tl-append-test.c index 7e8455d..08cf800 100644 --- a/tl-append-test.c +++ b/tl-append-test.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -10,6 +11,8 @@ #include "common.h" +const size_t TIMESTAMP_LEN = 19; + typedef struct expectation { time_t a, b; const char *message; @@ -51,20 +54,50 @@ static ex_t write_to_tl_append(const char *content) { return expectation(start, end, content); } +static void verify_timestamp(const ex_t *ex, const char *line) { + struct tm tm; + + /* localtime_r to set tm's timezone */ + time_t now_time = time(NULL); + if (localtime_r(&now_time, &tm) == NULL) + die_err("Can't unpack current time?"); + + const char *strptime_result = strptime(line, "%Y %m %d %H %M %S", &tm); + if (strptime_result == NULL || strptime_result != &line[TIMESTAMP_LEN]) + die("Wrong contents in log file: Couldn't parse timestamp"); + time_t t = mktime(&tm); + int t_in_range = ex->a <= t && t <= ex->b; + if (!t_in_range) + die("Wrong contents in log file: Wrong time"); +} + +static void verify_line(const ex_t *ex, const char *line) { + size_t line_len = strlen(line); + if (line_len < TIMESTAMP_LEN + 1) + die("Wrong contents in log file: Line too short"); + verify_timestamp(ex, line); + if (line[TIMESTAMP_LEN] != ' ') + die("Wrong contents in log file: Bad format"); + if (strncmp(ex->message, &line[TIMESTAMP_LEN + 1], strlen(ex->message) + 1) != + 0) + die("Wrong contents in log file"); +} + static void verify_log_contents(ex_t exps[]) { FILE *f = fopen(FILENAME, "r"); if (f == NULL) die_err("Error opening log file"); for (size_t i = 0; !is_end(exps[i]); i++) { - size_t len = strlen(exps[i].message); + size_t len = TIMESTAMP_LEN + 1 + strlen(exps[i].message); + if (len > INT_MAX - 1) + die("message too long"); char *buf = (char *)malloc(len + 2); if (fgets(buf, len + 1, f) == NULL) die("Error reading log file"); if (ferror(f)) die("Error reading log file"); - if (strncmp(exps[i].message, buf, len + 1) != 0) - die("Wrong contents in log file"); + verify_line(&exps[i], buf); free(buf); } if (fclose(f) != 0)