authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-08-25 14:59:10-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-08-25 15:36:25-07:00
log750998eef62a70dbea8c3ba1d44245f506370911
treefc9ba6494b79385aefa644a23f4523f8d8b03b98
parent4403008cabdb0d6cdff5cdadf4311e3d73b38a3f

Build: fail tests that log errors, like `zig test` does


4 files changed, 25 insertions(+), 10 deletions(-)

lib/std/Build/Step.zig+2-1
......@@ -45,10 +45,11 @@ pub const TestResults = struct {
4545 fail_count: u32 = 0,
4646 skip_count: u32 = 0,
4747 leak_count: u32 = 0,
48 log_err_count: u32 = 0,
4849 test_count: u32 = 0,
4950
5051 pub fn isSuccess(tr: TestResults) bool {
51 return tr.fail_count == 0 and tr.leak_count == 0;
52 return tr.fail_count == 0 and tr.leak_count == 0 and tr.log_err_count == 0;
5253 }
5354
5455 pub fn passCount(tr: TestResults) u32 {
lib/std/Build/Step/Run.zig+15-5
......@@ -1048,6 +1048,7 @@ fn evalZigTest(
10481048 var skip_count: u32 = 0;
10491049 var leak_count: u32 = 0;
10501050 var test_count: u32 = 0;
1051 var log_err_count: u32 = 0;
10511052
10521053 var metadata: ?TestMetadata = null;
10531054
......@@ -1112,14 +1113,22 @@ fn evalZigTest(
11121113
11131114 const TrHdr = std.zig.Server.Message.TestResults;
11141115 const tr_hdr = @as(*align(1) const TrHdr, @ptrCast(body));
1115 fail_count += @intFromBool(tr_hdr.flags.fail);
1116 skip_count += @intFromBool(tr_hdr.flags.skip);
1117 leak_count += @intFromBool(tr_hdr.flags.leak);
1116 fail_count +|= @intFromBool(tr_hdr.flags.fail);
1117 skip_count +|= @intFromBool(tr_hdr.flags.skip);
1118 leak_count +|= @intFromBool(tr_hdr.flags.leak);
1119 log_err_count +|= tr_hdr.flags.log_err_count;
11181120
1119 if (tr_hdr.flags.fail or tr_hdr.flags.leak) {
1121 if (tr_hdr.flags.fail or tr_hdr.flags.leak or tr_hdr.flags.log_err_count > 0) {
11201122 const name = std.mem.sliceTo(md.string_bytes[md.names[tr_hdr.index]..], 0);
11211123 const msg = std.mem.trim(u8, stderr.readableSlice(0), "\n");
1122 const label = if (tr_hdr.flags.fail) "failed" else "leaked";
1124 const label = if (tr_hdr.flags.fail)
1125 "failed"
1126 else if (tr_hdr.flags.leak)
1127 "leaked"
1128 else if (tr_hdr.flags.log_err_count > 0)
1129 "logged errors"
1130 else
1131 unreachable;
11231132 if (msg.len > 0) {
11241133 try self.step.addError("'{s}' {s}: {s}", .{ name, label, msg });
11251134 } else {
......@@ -1153,6 +1162,7 @@ fn evalZigTest(
11531162 .fail_count = fail_count,
11541163 .skip_count = skip_count,
11551164 .leak_count = leak_count,
1165 .log_err_count = log_err_count,
11561166 },
11571167 .test_metadata = metadata,
11581168 };
lib/std/zig/Server.zig+2-3
......@@ -53,12 +53,11 @@ pub const Message = struct {
5353 index: u32,
5454 flags: Flags,
5555
56 pub const Flags = packed struct(u8) {
56 pub const Flags = packed struct(u32) {
5757 fail: bool,
5858 skip: bool,
5959 leak: bool,
60
61 reserved: u5 = 0,
60 log_err_count: u29 = 0,
6261 };
6362 };
6463
lib/test_runner.zig+6-1
......@@ -90,6 +90,7 @@ fn mainServer() !void {
9090
9191 .run_test => {
9292 std.testing.allocator_instance = .{};
93 log_err_count = 0;
9394 const index = try server.receiveBody_u32();
9495 const test_fn = builtin.test_functions[index];
9596 if (test_fn.async_frame_size != null)
......@@ -113,6 +114,10 @@ fn mainServer() !void {
113114 .fail = fail,
114115 .skip = skip,
115116 .leak = leak,
117 .log_err_count = std.math.lossyCast(std.meta.FieldType(
118 std.zig.Server.Message.TestResults.Flags,
119 .log_err_count,
120 ), log_err_count),
116121 },
117122 });
118123 },
......@@ -218,7 +223,7 @@ pub fn log(
218223 args: anytype,
219224) void {
220225 if (@intFromEnum(message_level) <= @intFromEnum(std.log.Level.err)) {
221 log_err_count += 1;
226 log_err_count +|= 1;
222227 }
223228 if (@intFromEnum(message_level) <= @intFromEnum(std.testing.log_level)) {
224229 std.debug.print(