test: add ability to capture logs

Part-of: <https://gitlab.freedesktop.org/libinput/libei/-/merge_requests/337>
This commit is contained in:
Peter Hutterer 2025-06-13 16:34:01 +10:00
parent dbeff9a90d
commit 98e445ebdb
2 changed files with 129 additions and 0 deletions

View file

@ -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)

View file

@ -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);