static void test_log(MuLogger* _self, MuLogEvent* event) { XmlLogger* self = (XmlLogger*) _self; const char* level_str = "unknown"; switch (event->level) { case MU_LEVEL_WARNING: level_str = "warning"; break; case MU_LEVEL_INFO: level_str = "info"; break; case MU_LEVEL_VERBOSE: level_str = "verbose"; break; case MU_LEVEL_DEBUG: level_str = "debug"; break; case MU_LEVEL_TRACE: level_str = "trace"; break; } fprintf(self->out, INDENT_TEST INDENT "<event level=\"%s\"", level_str); fprintf(self->out, " stage=\"%s\"", mu_test_stage_to_string(event->stage)); if (event->file) fprintf(self->out, " file=\"%s\"", basename_pure(event->file)); if (event->line) fprintf(self->out, " line=\"%u\"", event->line); fprintf(self->out, ">"); fprintf(self->out, "<![CDATA[%s]]>", event->message); fprintf(self->out, "</event>\n"); }
static void test_log(MuLogger* _self, MuLogEvent const* event) { JsonLogger* self = (JsonLogger*) _self; const char* level_str = "unknown"; if (event->level > self->loglevel) { return; } if (self->need_events) { key_array_begin(self, "events"); self->need_events = false; } switch (event->level) { case MU_LEVEL_WARNING: level_str = "warning"; break; case MU_LEVEL_INFO: level_str = "info"; break; case MU_LEVEL_VERBOSE: level_str = "verbose"; break; case MU_LEVEL_DEBUG: level_str = "debug"; break; case MU_LEVEL_TRACE: level_str = "trace"; break; } elem_object_begin(self); key_string(self, "level", level_str); key_string(self, "stage", mu_test_stage_to_string(event->stage)); if (event->file) { key_string(self, "file", event->file); } if (event->line) { key_integer(self, "line", event->line); } if (event->message) { key_string(self, "message", event->message); } elem_object_end(self); }
static void test_leave(MuLogger* _self, MuTest* test, MuTestResult* summary) { JsonLogger* self = (JsonLogger*) _self; if (!self->need_events) { key_array_end(self); } key_object_begin(self, "result"); key_string(self, "expected", mu_test_status_to_string(summary->expected)); key_string(self, "status", mu_test_status_to_string(summary->status)); key_string(self, "stage", mu_test_stage_to_string(summary->stage)); if (summary->reason) { key_string(self, "reason", summary->reason); } if (summary->file) { key_string(self, "file", summary->file); } if (summary->line) { key_integer(self, "line", summary->line); } key_object_end(self); if (summary->backtrace) { MuBacktrace* frame; key_array_begin(self, "backtrace"); for (frame = summary->backtrace; frame; frame = frame->up) { elem_object_begin(self); if (frame->file_name) { key_string(self, "binary_file", frame->file_name); } if (frame->func_name && *frame->func_name) { key_string(self, "function", frame->func_name); } if (frame->func_addr) { key_begin(self, "func_addr"); print(self, "\"0x%lx\"", frame->func_addr); key_end(self); } if (frame->return_addr) { key_begin(self, "return_addr"); print(self, "\"0x%lx\"", frame->return_addr); key_end(self); } elem_object_end(self); } key_array_end(self); } elem_object_end(self); }
static void test_leave(MuLogger* _self, MuTest* test, MuTestResult* summary) { XmlLogger* self = (XmlLogger*) _self; const char* stage; FILE* out = self->out; bool result = summary->status == summary->expected; const char* result_str; if (summary->status == MU_STATUS_DEBUG) { result_str = "debug"; } else if (result) { switch (summary->status) { case MU_STATUS_SUCCESS: result_str = "pass"; break; case MU_STATUS_SKIPPED: result_str = "skip"; break; default: result_str = "xfail"; break; } } else { switch (summary->status) { case MU_STATUS_SUCCESS: result_str = "xpass"; break; case MU_STATUS_SKIPPED: result_str = "skip"; break; default: result_str = "fail"; break; } } if (summary->status == MU_STATUS_SUCCESS) { fprintf(out, INDENT_TEST INDENT "<result status=\"%s\"/>\n", result_str); } else { stage = mu_test_stage_to_string(summary->stage); if (summary->reason) { fprintf(out, INDENT_TEST INDENT "<result status=\"%s\" stage=\"%s\"", result_str, stage); if (summary->file) fprintf(out, " file=\"%s\"", basename_pure(summary->file)); if (summary->line) fprintf(out, " line=\"%i\"", summary->line); fprintf(out, ">"); fprintf(out, "<![CDATA[%s]]>", summary->reason); fprintf(out, "</result>\n"); } else { fprintf(out, INDENT_TEST INDENT "<result status=\"fail\" stage=\"%s\"", stage); if (summary->file) fprintf(out, " file=\"%s\"", basename_pure(summary->file)); if (summary->line) fprintf(out, " line=\"%i\"", summary->line); fprintf(out, "/>\n"); } } if (summary->backtrace) { MuBacktrace* frame; fprintf(out, INDENT_TEST INDENT "<backtrace>\n"); for (frame = summary->backtrace; frame; frame = frame->up) { fprintf(out, INDENT_TEST INDENT INDENT "<frame"); if (frame->file_name) { fprintf(out, " binary_file=\"%s\"", frame->file_name); } if (frame->func_name) { fprintf(out, " function=\"%s\"", frame->func_name); } if (frame->func_addr) { fprintf(out, " func_addr=\"%lx\"", frame->func_addr); } if (frame->return_addr) { fprintf(out, " return_addr=\"%lx\"", frame->return_addr); } fprintf(out, "/>\n"); } fprintf(out, INDENT_TEST " </backtrace>\n"); } fprintf(out, INDENT_TEST "</test>\n"); }