summaryrefslogtreecommitdiff
path: root/src/logging
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-06-14 11:31:00 -0500
committersanine <sanine.not@pm.me>2022-06-14 11:31:00 -0500
commitd36b59bb1e501ec018faba3d9a60dbfb2b58114a (patch)
tree5f9021e2e4ec708df2409c03c7e01f091e63c274 /src/logging
parent432bc96457244c18afe9473729dc52604ec03a9c (diff)
add basic logging function
Diffstat (limited to 'src/logging')
-rw-r--r--src/logging/.logging.h.swpbin0 -> 12288 bytes
-rw-r--r--src/logging/logging.c13
-rw-r--r--src/logging/logging.h22
-rw-r--r--src/logging/logging.test.c110
4 files changed, 145 insertions, 0 deletions
diff --git a/src/logging/.logging.h.swp b/src/logging/.logging.h.swp
new file mode 100644
index 0000000..e2c510a
--- /dev/null
+++ b/src/logging/.logging.h.swp
Binary files differ
diff --git a/src/logging/logging.c b/src/logging/logging.c
new file mode 100644
index 0000000..4f717cb
--- /dev/null
+++ b/src/logging/logging.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include "logging/logging.h"
+
+int _honey_log_level = HONEY_WARN;
+
+void honey_log(int level, const char *fmt, ...) {
+ //if (level > _honey_log_level) return;
+
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
diff --git a/src/logging/logging.h b/src/logging/logging.h
new file mode 100644
index 0000000..2618d2b
--- /dev/null
+++ b/src/logging/logging.h
@@ -0,0 +1,22 @@
+#ifndef HONEY_LOGGING_H
+#define HONEY_LOGGING_H
+
+#define HONEY_FATAL 0
+#define HONEY_ERROR 1
+#define HONEY_WARN 2
+#define HONEY_INFO 3
+#define HONEY_DEBUG 4
+#define HONEY_TRACE 5
+
+extern int _honey_log_level;
+
+void honey_log(int level, const char *fmt, ...);
+
+#define honey_fatal(...) honey_log(HONEY_FATAL, "[FATAL] "__VA_ARGS__)
+#define honey_error(...) honey_log(HONEY_ERROR, "[ERROR] "__VA_ARGS__)
+#define honey_warn(...) honey_log(HONEY_WARN, "[WARN] " __VA_ARGS__)
+#define honey_info(...) honey_log(HONEY_INFO, "[INFO] " __VA_ARGS__)
+#define honey_debug(...) honey_log(HONEY_DEBUG, "[DEBUG] "__VA_ARGS__)
+#define honey_trace(...) honey_log(HONEY_TRACE, "[TRACE] "__VA_ARGS__)
+
+#endif
diff --git a/src/logging/logging.test.c b/src/logging/logging.test.c
new file mode 100644
index 0000000..e227381
--- /dev/null
+++ b/src/logging/logging.test.c
@@ -0,0 +1,110 @@
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "test/lily-test.h"
+#include "test/honey-test.h"
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * include C file and declare mocks
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#define vfprintf(file, fmt, vl) mock_vfprintf(file, fmt, vl)
+void mock_vfprintf(FILE*, const char*, va_list vl);
+#include "logging.c"
+#undef vfprintf
+
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * define mock functions
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+lily_mock_t *vfprintf_mock_data;
+void mock_vfprintf(FILE *file, const char *fmt, va_list vl)
+{
+ /* to avoid basically just re-implementing printf parsing here,
+ i am limiting this function to be able to receive strings only */
+
+ /* count format specifiers */
+ char *ptr = strchr(fmt, '%');
+ int n_args = 0;
+ while (ptr != NULL) {
+ n_args += 1;
+ ptr = strchr(ptr+1, '%');
+ }
+
+ /* store arguments */
+ struct lily_mock_arg_t args[] = {
+ { sizeof(FILE*), &file },
+ { sizeof(const char*), &fmt },
+ { sizeof(int), &n_args },
+ };
+ lily_mock_call(vfprintf_mock_data, args);
+
+ /* store format arguments */
+ lily_queue_t *queue = vfprintf_mock_data->values;
+ for (int i=0; i<n_args; i++) {
+ char *str = va_arg(vl, char*);
+ lily_enqueue(queue, char*, str);
+ }
+}
+
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * declare tests and define suite
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+void clean_mock(lily_mock_t **m)
+{
+ if (*m != NULL) {
+ lily_mock_destroy(*m);
+ *m = NULL;
+ }
+}
+
+void test_log_fatal_succeeds();
+
+void suite_logging()
+{
+ vfprintf_mock_data = NULL;
+ lily_run_test(test_log_fatal_succeeds);
+ if (vfprintf_mock_data != NULL)
+ lily_mock_destroy(vfprintf_mock_data);
+}
+
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * define tests
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+void test_log_fatal_succeeds()
+{
+ clean_mock(&vfprintf_mock_data);
+ vfprintf_mock_data = lily_mock_create();
+
+ honey_fatal("some message");
+ lily_assert_int_equal(vfprintf_mock_data->n_calls, 1);
+
+ FILE *file; const char *fmt; int n_strings;
+ struct lily_mock_arg_t args[] = {
+ { sizeof(FILE*), &file },
+ { sizeof(const char*), &fmt },
+ { sizeof(int), &n_strings },
+ };
+ lily_get_call(vfprintf_mock_data, args, 0);
+
+ lily_assert_ptr_equal(file, stderr);
+ lily_assert_string_equal(fmt, "[FATAL] some message");
+ lily_assert_int_equal(n_strings, 0);
+}