diff --git a/test/eierpecken.c b/test/eierpecken.c index 72f068d..a13d627 100644 --- a/test/eierpecken.c +++ b/test/eierpecken.c @@ -50,6 +50,14 @@ static bool enable_sigalarm; DEFINE_TRISTATE(yes, no, unset); +struct peck_log_capture { + bool enabled; + char **debug; + char **info; + char **warning; + char **error; +}; + struct peck { struct object object; struct ei *ei; @@ -88,6 +96,9 @@ struct peck { uint64_t ei_time_offset; uint64_t eis_time_offset; + + struct peck_log_capture ei_log_capture; + struct peck_log_capture eis_log_capture; }; static const uint32_t INDENTATION = 4; @@ -181,6 +192,16 @@ peck_destroy(struct peck *peck) setitimer(ITIMER_REAL, &timer, 0); sigaction(SIGALRM, &peck->sigact, NULL); } + + strv_free(peck->ei_log_capture.debug); + strv_free(peck->ei_log_capture.info); + strv_free(peck->ei_log_capture.warning); + strv_free(peck->ei_log_capture.error); + + strv_free(peck->eis_log_capture.debug); + strv_free(peck->eis_log_capture.info); + strv_free(peck->eis_log_capture.warning); + strv_free(peck->eis_log_capture.error); } void @@ -214,6 +235,64 @@ peck_drop_ei(struct peck *peck) peck->ei = NULL; } +char ** +peck_ei_get_log_capture(struct peck *peck, enum ei_log_priority priority) +{ + switch (priority) { + case EI_LOG_PRIORITY_ERROR: + return peck->ei_log_capture.error; + case EI_LOG_PRIORITY_WARNING: + return peck->ei_log_capture.warning; + case EI_LOG_PRIORITY_INFO: + return peck->ei_log_capture.info; + case EI_LOG_PRIORITY_DEBUG: + return peck->ei_log_capture.debug; + default: + abort(); + } +} + +void +peck_ei_enable_log_capture(struct peck *peck) +{ + peck->ei_log_capture.enabled = true; +} + +void +peck_ei_disable_log_capture(struct peck *peck) +{ + peck->ei_log_capture.enabled = true; +} + +char ** +peck_eis_get_log_capture(struct peck *peck, enum eis_log_priority priority) +{ + switch (priority) { + case EIS_LOG_PRIORITY_ERROR: + return peck->eis_log_capture.error; + case EIS_LOG_PRIORITY_WARNING: + return peck->eis_log_capture.warning; + case EIS_LOG_PRIORITY_INFO: + return peck->eis_log_capture.info; + case EIS_LOG_PRIORITY_DEBUG: + return peck->eis_log_capture.debug; + default: + abort(); + } +} + +void +peck_eis_enable_log_capture(struct peck *peck) +{ + peck->eis_log_capture.enabled = true; +} + +void +peck_eis_disable_log_capture(struct peck *peck) +{ + peck->eis_log_capture.enabled = true; +} + struct eis_client * peck_eis_get_default_client(struct peck *peck) { @@ -360,6 +439,32 @@ peck_eis_enable_fatal_bug(struct peck *peck) peck->eis_fatal_bugs = true; } +static void +peck_capture_log(struct peck_log_capture *capture, + enum ei_log_priority priority, + const char *message) +{ + if (!capture->enabled) + return; + + switch (priority) { + case EI_LOG_PRIORITY_ERROR: + capture->error = strv_append_strdup(capture->error, message); + break; + case EI_LOG_PRIORITY_WARNING: + capture->info = strv_append_strdup(capture->info, message); + break; + case EI_LOG_PRIORITY_INFO: + capture->info = strv_append_strdup(capture->info, message); + break; + case EI_LOG_PRIORITY_DEBUG: + capture->debug = strv_append_strdup(capture->debug, message); + break; + default: + abort(); + } +} + static void peck_ei_log_handler(struct ei *ei, enum ei_log_priority priority, @@ -390,6 +495,8 @@ peck_ei_log_handler(struct ei *ei, assert(!strstr(message, "🪳")); assert(!strstr(message, "🪲")); } + + peck_capture_log(&peck->ei_log_capture, priority, message); } static void @@ -422,6 +529,8 @@ peck_eis_log_handler(struct eis *eis, assert(!strstr(message, "🪳")); assert(!strstr(message, "🪲")); } + + peck_capture_log(&peck->eis_log_capture, (enum ei_log_priority)priority, message); } _printf_(7, 0) diff --git a/test/eierpecken.h b/test/eierpecken.h index c5d787e..ba49abe 100644 --- a/test/eierpecken.h +++ b/test/eierpecken.h @@ -184,6 +184,26 @@ peck_enable_eis_behavior(struct peck *peck, enum peck_eis_behavior behavior); void peck_enable_ei_behavior(struct peck *peck, enum peck_ei_behavior behavior); +void +peck_ei_enable_log_capture(struct peck *peck); + +void +peck_ei_disable_log_capture(struct peck *peck); + +char ** +peck_ei_get_log_capture(struct peck *peck, + enum ei_log_priority priority); + +void +peck_eis_enable_log_capture(struct peck *peck); + +void +peck_eis_disable_log_capture(struct peck *peck); + +char ** +peck_eis_get_log_capture(struct peck *peck, + enum eis_log_priority priority); + struct ei * peck_get_ei(struct peck *peck);