]> git.scottworley.com Git - tl-append/blobdiff - tl-append-test.c
appease clang-tidy: Don't do unnecessary size_t→int narrowing conversion
[tl-append] / tl-append-test.c
index 7e8455de6b4c6f23a63c21579a4744d006d15f0a..08cf8002b24154468e7d06581684c9daa1d97d64 100644 (file)
@@ -3,6 +3,7 @@
 #include <assert.h>
 #include <ctype.h>
 #include <errno.h>
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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)