diff options
Diffstat (limited to 'src/logging')
-rw-r--r-- | src/logging/logging.c | 27 | ||||
-rw-r--r-- | src/logging/logging.test.c | 44 |
2 files changed, 69 insertions, 2 deletions
diff --git a/src/logging/logging.c b/src/logging/logging.c index db4611a..0dcf47b 100644 --- a/src/logging/logging.c +++ b/src/logging/logging.c @@ -9,12 +9,37 @@ void honey_set_log_level(int level) _honey_log_level = level; } +int log_fatal(lua_State *L) +{ + //validate arguments + int count = lua_gettop(L); + if (count == 0) { + hs_throw_error(L, "no arguments provided"); + } + if (!lua_isstring(L, 1)) { + hs_throw_error(L, "first argument must be a string"); + } + lua_getglobal(L, "string"); + if (lua_isnil(L, -1)) hs_throw_error(L, "'string' table is nil!"); + lua_getfield(L, -1, "format"); //pushed string.format (function) to the lua stack + for (int i = 1; i <= count; i++) { + lua_pushvalue(L, i); + } + lua_call(L, count, 1); + const char *str = lua_tostring(L, -1); //getting result into a string + honey_log(HONEY_FATAL, "[FATAL] %s\n", str); + lua_pop(L, 2); //cleaned up stack + return 0; +} 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.test.c b/src/logging/logging.test.c index 7e53074..01c8b20 100644 --- a/src/logging/logging.test.c +++ b/src/logging/logging.test.c @@ -1,7 +1,10 @@ #include <string.h> #include <stdarg.h> #include <stdio.h> - +#include <lua.h> +#include <lualib.h> +#include <lauxlib.h> +#include <honeysuckle.h> #include "test/honey-test.h" /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -70,11 +73,14 @@ void clean_mock(lily_mock_t **m) void level_fatal_log_fatal_succeeds(); void level_neg_log_fatal_fails(); +void test_honey_log_fatal(); +void test_honey_log_fatal_fail(); void suite_logging() { lily_run_test(level_neg_log_fatal_fails); lily_run_test(level_fatal_log_fatal_succeeds); + lily_run_test(test_honey_log_fatal); CLEAN_MOCK(mock_vfprintf); } @@ -117,3 +123,39 @@ void level_neg_log_fatal_fails() honey_log_fatal("some message"); lily_assert_int_equal(mock_vfprintf_data->n_calls, 0); } + +//error logging test functions +void test_honey_log_fatal() +{ + USE_MOCK(mock_vfprintf); + //first test (with no error surpressions) + lua_State *L = luaL_newstate(); + luaL_openlibs(L); + lua_pushcfunction(L, log_fatal); //function is on the stack + lua_pushstring(L, "fatal error test"); + int result = hs_call(L, 1, 0); + if (result != 0) { + const char *error = lua_tostring(L, -1); + fprintf(stderr, "%s", error); + } + lily_assert_int_equal(result, 0); //testing that error function got string pushed to it + lily_assert_int_equal(mock_vfprintf_data->n_calls, 1); //testing that error printing function works +} + +void test_honey_log_fatal_fail() +{ + USE_MOCK(mock_vfprintf); + honey_set_log_level(-1); + lua_State *L = luaL_newstate(); + luaL_openlibs(L); + lua_pushcfunction(L, log_fatal); + lua_pushstring(L, "fatal error test"); + int result = hs_call(L, 1, 0); + if (result != 0) { + const char *error = lua_tostring(L, -1); + fprintf(stderr, "%s", error); + } + lily_assert_int_equal(result, 0); + lily_assert_int_equal(mock_vfprintf_data->n_calls, 0); +} + |