test: fix: test raise generic

This commit is contained in:
2025-03-20 18:47:44 +00:00
parent c91b52b448
commit 647155f859
5 changed files with 60 additions and 36 deletions

View File

@@ -0,0 +1,28 @@
{ stdenv, gcc, lib, libhectic }:
stdenv.mkDerivation {
pname = "libhectic";
version = "1.0";
src = ./.;
doCheck = true;
buildInputs = [ libhectic ];
buildPhase = ''
mkdir -p target
${gcc}/bin/cc -Wall -Wextra -g \
-pedantic -fsanitize=address -c hmpl.c \
-l:libhectic.a -o target/libhectic.o
'';
checkPhase = '' '';
installPhase = ''
mkdir -p $out/lib $out/include
'';
meta = {
description = "libhectic";
license = lib.licenses.mit;
};
}

0
package/c/hmpl/hmpl.c Normal file
View File

View File

@@ -81,6 +81,8 @@ typedef enum {
LOG_LEVEL_EXCEPTION
} LogLevel;
void logger_level_reset();
void logger_level(LogLevel level);
LogLevel log_level_from_string(const char *level_str);

View File

@@ -4,46 +4,37 @@
#include <assert.h>
#include "libhectic.h"
// Reusable test function for any raise_* logging function.
// The logging function must have the signature: char* func(const char* message)
void test_raise_generic(const char* (*raise_func)(const char*), LogLevel log_level, const char* level_str) {
FILE *orig_stderr = stderr;
FILE *temp = tmpfile();
char result_buffer[256];
if (!temp) {
perror("tmpfile");
exit(EXIT_FAILURE);
}
stderr = temp;
logger_level(log_level);
int line = __LINE__;
char* time_str = raise_func("message");
logger_level_reset();
fflush(stderr);
fseek(temp, 0, SEEK_SET);
size_t nread = fread(result_buffer, 1, sizeof(result_buffer) - 1, temp);
result_buffer[nread] = '\0';
stderr = orig_stderr;
fclose(temp);
char expected_buffer[256];
sprintf(expected_buffer, "%s %d %s: message\n", time_str, line + 1, level_str, message);
assert(strcmp(result_buffer, expected_buffer) == 0);
}
#define TEST_RAISE_GENERIC(LOG_MACRO, LEVEL, LEVEL_STR) do { \
FILE *orig_stderr = stderr; \
FILE *temp = tmpfile(); \
char result_buffer[256]; \
if (!temp) { perror("tmpfile"); exit(EXIT_FAILURE); } \
stderr = temp; \
logger_level(LEVEL); \
const char* time_str = LOG_MACRO("message"); \
logger_level_reset(); \
fflush(stderr); \
fseek(temp, 0, SEEK_SET); \
size_t nread = fread(result_buffer, 1, sizeof(result_buffer)-1, temp); \
result_buffer[nread] = '\0'; \
stderr = orig_stderr; \
fclose(temp); \
char expected_buffer[256]; \
sprintf(expected_buffer, "%s %d " LEVEL_STR ": message\n", time_str, __LINE__); \
printf("DEBUG: [%s] [%s]\n", result_buffer, expected_buffer); \
assert(strcmp(result_buffer, expected_buffer) == 0); \
} while(0)
int main(void) {
set_output_color_mode(COLOR_MODE_DISABLE);
raise_log("zalupa");
test_raise_generic(raise_log, LOG_LEVEL_LOG, "LOG");
test_raise_generic(raise_debug, LOG_LEVEL_DEBUG, "DEBUG");
test_raise_generic(raise_warn, LOG_LEVEL_INFO, "INFO");
test_raise_generic(raise_notice, LOG_LEVEL_NOTICE, "NOTICE");
test_raise_generic(raise_warn, LOG_LEVEL_WARN, "WARN");
test_raise_generic(raise_exception, LOG_LEVEL_EXCEPTION, "EXCEPTION");
TEST_RAISE_GENERIC(raise_debug, LOG_LEVEL_DEBUG, "DEBUG");
TEST_RAISE_GENERIC(raise_log, LOG_LEVEL_LOG, "LOG");
TEST_RAISE_GENERIC(raise_info, LOG_LEVEL_INFO, "INFO");
TEST_RAISE_GENERIC(raise_notice, LOG_LEVEL_NOTICE, "NOTICE");
TEST_RAISE_GENERIC(raise_warn, LOG_LEVEL_WARN, "WARN");
TEST_RAISE_GENERIC(raise_exception, LOG_LEVEL_EXCEPTION, "EXCEPTION");
return 0;
}