improve error reports in tests

This commit is contained in:
Nikita Smith
2026-06-02 12:10:58 -07:00
committed by Ryan Fleury
parent fe2778133f
commit e3fa8e4830
2 changed files with 69 additions and 19 deletions
+9 -3
View File
@@ -243,12 +243,18 @@ t_run(T_Test *test, String8 user_data)
{ {
T_RunCtx ctx = { .test = test, .user_data = user_data, .result.status = T_RunStatus_Fail }; T_RunCtx ctx = { .test = test, .user_data = user_data, .result.status = T_RunStatus_Fail };
t_run_caller(&ctx); t_run_caller(&ctx);
if (ctx.result.status == T_RunStatus_Fail || ctx.result.status == T_RunStatus_Crash) {
if (g_output.size > 0 || g_errors.size > 0) {
t_errorf("Last captured output:\n");
if (g_output.size) { t_errorf("%S\n", g_output); }
if (g_errors.size) { t_errorf("%S\n", g_errors); }
}
}
fflush(stdout); fflush(stdout);
fflush(stderr); fflush(stderr);
if (ctx.result.status == T_RunStatus_Fail || ctx.result.status == T_RunStatus_Crash) {
fprintf(stderr, "Last captured output:\n%.*s\n", str8_varg(g_output));
}
return ctx.result; return ctx.result;
} }
+60 -16
View File
@@ -280,18 +280,33 @@ SKIP(d2r_line_table)
for EachElement(i, test_table) { for EachElement(i, test_table) {
for EachIndex(k, test_table[i].line_size) { for EachIndex(k, test_table[i].line_size) {
t_invoke_radbin("-voff2line -voff:0x%llx a.rdi", test_table[i].voff + k); String8 cmdl = str8f(arena, "-voff2line -voff:0x%llx %S", test_table[i].voff + k, t_make_file_path(arena, str8_lit("a.rdi")));
T_Ok(g_last_exit_code == 0); t_invoke_radbin(cmdl.str);
if (g_last_exit_code != 0) {
t_errorf("radbin exited with %llu on \"%S\"\n", (unsigned long long)g_last_exit_code, cmdl);
T_Ok(0);
}
if ( ! t_match_linef(&g_output, "%S:%llu", test_table[i].file->path, test_table[i].ln)) { if ( ! t_match_linef(&g_output, "%S:%llu", test_table[i].file->path, test_table[i].ln)) {
t_errorf("ERROR: conversion produced unexpected output for \"radbin %S\"\n" \
" Expected: %S:%llu\n" \
" Got: %S\n",
cmdl,
test_table[i].file->path, (unsigned long long)test_table[i].ln,
g_output);
fprintf(stderr, if (g_verbose) {
"ERROR: conversion produced unexpected lines for voff 0x%llx\n" \ t_invoke_radbin("-dump -only:line_tables a.rdi");
"\tExpected: %.*s:%llu\n" \ t_errorf("\n================================================================================\n");
"\tGot: %.*s\n", t_errorf("RDI:\n%S\n", g_output);
(unsigned long long)test_table[i].voff,
str8_varg(test_table[i].file->path), (unsigned long long)test_table[i].ln, t_errorf("================================================================================\n");
str8_varg(g_output)); t_invoke_radbin("-dump -only:debug_line a.exe");
t_errorf("DWARF:\n%S\n", g_output);
g_output = str8_zero();
}
T_Ok(0); T_Ok(0);
} }
@@ -305,6 +320,8 @@ SKIP(d2r_checksums)
{ {
DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64); DW_Writer *writer = dw_writer_begin(DW_Format_32Bit, DW_Version_5, DW_CompUnitKind_Compile, Arch_x64);
B32 is_ok = 0;
DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/c/devel/foo.c")); DW_WriterFile *foo_file = dw_writer_new_file(writer, str8_lit("/mnt/c/devel/foo.c"));
DW_WriterFile *comp_file = dw_writer_new_file(writer, str8_lit("/home/main.c")); DW_WriterFile *comp_file = dw_writer_new_file(writer, str8_lit("/home/main.c"));
foo_file->md5 = *(U128 *)&(U8[16]){ 0x04, 0x70, 0xe9, 0x6b, 0xa3, 0x05, 0x2c, 0xc8, 0x2d, 0x70, 0xc5, 0xe9, 0x80, 0x8e, 0x8a, 0x4e, }; foo_file->md5 = *(U128 *)&(U8[16]){ 0x04, 0x70, 0xe9, 0x6b, 0xa3, 0x05, 0x2c, 0xc8, 0x2d, 0x70, 0xc5, 0xe9, 0x80, 0x8e, 0x8a, 0x4e, };
@@ -321,18 +338,45 @@ SKIP(d2r_checksums)
RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer); RDI_Parsed *rdi = d2r_rdi_from_dwarf_writer(arena, writer);
U64 checksum_count = 0; U64 checksum_count = 0;
RDI_MD5 *checksums = rdi_table_from_name(rdi, MD5Checksums, &checksum_count); RDI_MD5 *checksums = rdi_table_from_name(rdi, MD5Checksums, &checksum_count);
T_Ok(checksum_count == writer->line.file_count + 1); if (checksum_count != writer->line.file_count + 1) { goto exit; }
RDI_SourceFile *foo_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)foo_file->path.str); RDI_SourceFile *foo_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)foo_file->path.str);
T_Ok(foo_src_file); if (foo_src_file == 0) {
T_Ok(foo_src_file->checksum_kind == RDI_ChecksumKind_MD5); t_errorf("ERROR: RDI is missing file %S\n", foo_file->path);
T_Ok(MemoryMatch(&foo_file->md5, &checksums[foo_src_file->checksum_idx], sizeof(U128))); goto exit;
}
if (foo_src_file->checksum_kind != RDI_ChecksumKind_MD5) {
t_errorf("ERROR: File %S has unexpected checksum value %u, expected %u\n", foo_file->path, foo_src_file->checksum_kind, RDI_ChecksumKind_MD5);
goto exit;
}
if (MemoryMatch(&foo_file->md5, &checksums[foo_src_file->checksum_idx], sizeof(U128)) != 1) {
t_errorf("ERROR mismatched checksum in file %S\n", foo_file->path);
goto exit;
}
RDI_SourceFile *comp_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)comp_file->path.str); RDI_SourceFile *comp_src_file = rdi_source_file_from_normal_path_cstr(rdi, (char *)comp_file->path.str);
T_Ok(comp_src_file); if (comp_src_file == 0) {
T_Ok(comp_src_file->checksum_kind == RDI_ChecksumKind_MD5); t_errorf("ERROR: RDI is missing file %S\n", comp_file->path);
T_Ok(MemoryMatch(&comp_file->md5, &checksums[comp_src_file->checksum_idx], sizeof(U128))); goto exit;
}
if (comp_src_file->checksum_kind != RDI_ChecksumKind_MD5) {
t_errorf("ERROR: File %S has unexpected checksum value %u, expected %u\n", comp_file->path, comp_src_file->checksum_kind, RDI_ChecksumKind_MD5);
goto exit;
}
if (MemoryMatch(&comp_file->md5, &checksums[comp_src_file->checksum_idx], sizeof(U128)) != 1) {
t_errorf("ERROR mismatched checksum in file %S\n", comp_file->path);
goto exit;
}
is_ok = 1;
exit:;
if ( ! is_ok) {
t_errorf("Converter repro: \"radbin -rdi %S\"\n", t_make_file_path(arena, str8_lit("a.exe")));
t_invoke(t_radbin_path(), str8_lit("-dump -only:source_files a.rdi"), max_U64);
t_errorf("RDI:\n%S\n", g_output);
t_invoke(t_radbin_path(), str8_lit("-dump -only:debug_line a.exe"), max_U64);
t_errorf("DWARF:\n%S\n", g_output);
}
dw_writer_end(&writer); dw_writer_end(&writer);
} }