| ... | ... | @@ -949,85 +949,86 @@ fn evalZigTest( |
| 949 | 949 | var sub_prog_node: ?std.Progress.Node = null; |
| 950 | 950 | defer if (sub_prog_node) |*n| n.end(); |
| 951 | 951 | |
| 952 | | poll: while (try poller.poll()) { |
| 953 | | while (true) { |
| 954 | | const buf = stdout.readableSlice(0); |
| 955 | | assert(stdout.readableLength() == buf.len); |
| 956 | | if (buf.len < @sizeOf(Header)) continue :poll; |
| 957 | | const header = @ptrCast(*align(1) const Header, buf[0..@sizeOf(Header)]); |
| 958 | | const header_and_msg_len = header.bytes_len + @sizeOf(Header); |
| 959 | | if (buf.len < header_and_msg_len) continue :poll; |
| 960 | | const body = buf[@sizeOf(Header)..][0..header.bytes_len]; |
| 961 | | switch (header.tag) { |
| 962 | | .zig_version => { |
| 963 | | if (!std.mem.eql(u8, builtin.zig_version_string, body)) { |
| 964 | | return self.step.fail( |
| 965 | | "zig version mismatch build runner vs compiler: '{s}' vs '{s}'", |
| 966 | | .{ builtin.zig_version_string, body }, |
| 967 | | ); |
| 968 | | } |
| 969 | | }, |
| 970 | | .test_metadata => { |
| 971 | | const TmHdr = std.zig.Server.Message.TestMetadata; |
| 972 | | const tm_hdr = @ptrCast(*align(1) const TmHdr, body); |
| 973 | | test_count = tm_hdr.tests_len; |
| 974 | | |
| 975 | | const names_bytes = body[@sizeOf(TmHdr)..][0 .. test_count * @sizeOf(u32)]; |
| 976 | | const async_frame_lens_bytes = body[@sizeOf(TmHdr) + names_bytes.len ..][0 .. test_count * @sizeOf(u32)]; |
| 977 | | const expected_panic_msgs_bytes = body[@sizeOf(TmHdr) + names_bytes.len + async_frame_lens_bytes.len ..][0 .. test_count * @sizeOf(u32)]; |
| 978 | | const string_bytes = body[@sizeOf(TmHdr) + names_bytes.len + async_frame_lens_bytes.len + expected_panic_msgs_bytes.len ..][0..tm_hdr.string_bytes_len]; |
| 979 | | |
| 980 | | const names = std.mem.bytesAsSlice(u32, names_bytes); |
| 981 | | const async_frame_lens = std.mem.bytesAsSlice(u32, async_frame_lens_bytes); |
| 982 | | const expected_panic_msgs = std.mem.bytesAsSlice(u32, expected_panic_msgs_bytes); |
| 983 | | const names_aligned = try arena.alloc(u32, names.len); |
| 984 | | for (names_aligned, names) |*dest, src| dest.* = src; |
| 985 | | |
| 986 | | const async_frame_lens_aligned = try arena.alloc(u32, async_frame_lens.len); |
| 987 | | for (async_frame_lens_aligned, async_frame_lens) |*dest, src| dest.* = src; |
| 988 | | |
| 989 | | const expected_panic_msgs_aligned = try arena.alloc(u32, expected_panic_msgs.len); |
| 990 | | for (expected_panic_msgs_aligned, expected_panic_msgs) |*dest, src| dest.* = src; |
| 991 | | |
| 992 | | prog_node.setEstimatedTotalItems(names.len); |
| 993 | | metadata = .{ |
| 994 | | .string_bytes = try arena.dupe(u8, string_bytes), |
| 995 | | .names = names_aligned, |
| 996 | | .async_frame_lens = async_frame_lens_aligned, |
| 997 | | .expected_panic_msgs = expected_panic_msgs_aligned, |
| 998 | | .next_index = 0, |
| 999 | | .prog_node = prog_node, |
| 1000 | | }; |
| 1001 | | |
| 1002 | | try requestNextTest(child.stdin.?, &metadata.?, &sub_prog_node); |
| 1003 | | }, |
| 1004 | | .test_results => { |
| 1005 | | const md = metadata.?; |
| 1006 | | |
| 1007 | | const TrHdr = std.zig.Server.Message.TestResults; |
| 1008 | | const tr_hdr = @ptrCast(*align(1) const TrHdr, body); |
| 1009 | | fail_count += @boolToInt(tr_hdr.flags.fail); |
| 1010 | | skip_count += @boolToInt(tr_hdr.flags.skip); |
| 1011 | | leak_count += @boolToInt(tr_hdr.flags.leak); |
| 1012 | | |
| 1013 | | if (tr_hdr.flags.fail or tr_hdr.flags.leak) { |
| 1014 | | const name = std.mem.sliceTo(md.string_bytes[md.names[tr_hdr.index]..], 0); |
| 1015 | | const msg = std.mem.trim(u8, stderr.readableSlice(0), "\n"); |
| 1016 | | const label = if (tr_hdr.flags.fail) "failed" else "leaked"; |
| 1017 | | if (msg.len > 0) { |
| 1018 | | try self.step.addError("'{s}' {s}: {s}", .{ name, label, msg }); |
| 1019 | | } else { |
| 1020 | | try self.step.addError("'{s}' {s}", .{ name, label }); |
| 1021 | | } |
| 1022 | | stderr.discard(msg.len); |
| 952 | poll: while (true) { |
| 953 | while (stdout.readableLength() < @sizeOf(Header)) { |
| 954 | if (!(try poller.poll())) break :poll; |
| 955 | } |
| 956 | const header = stdout.reader().readStruct(Header) catch unreachable; |
| 957 | while (stdout.readableLength() < header.bytes_len) { |
| 958 | if (!(try poller.poll())) break :poll; |
| 959 | } |
| 960 | const body = stdout.readableSliceOfLen(header.bytes_len); |
| 961 | |
| 962 | switch (header.tag) { |
| 963 | .zig_version => { |
| 964 | if (!std.mem.eql(u8, builtin.zig_version_string, body)) { |
| 965 | return self.step.fail( |
| 966 | "zig version mismatch build runner vs compiler: '{s}' vs '{s}'", |
| 967 | .{ builtin.zig_version_string, body }, |
| 968 | ); |
| 969 | } |
| 970 | }, |
| 971 | .test_metadata => { |
| 972 | const TmHdr = std.zig.Server.Message.TestMetadata; |
| 973 | const tm_hdr = @ptrCast(*align(1) const TmHdr, body); |
| 974 | test_count = tm_hdr.tests_len; |
| 975 | |
| 976 | const names_bytes = body[@sizeOf(TmHdr)..][0 .. test_count * @sizeOf(u32)]; |
| 977 | const async_frame_lens_bytes = body[@sizeOf(TmHdr) + names_bytes.len ..][0 .. test_count * @sizeOf(u32)]; |
| 978 | const expected_panic_msgs_bytes = body[@sizeOf(TmHdr) + names_bytes.len + async_frame_lens_bytes.len ..][0 .. test_count * @sizeOf(u32)]; |
| 979 | const string_bytes = body[@sizeOf(TmHdr) + names_bytes.len + async_frame_lens_bytes.len + expected_panic_msgs_bytes.len ..][0..tm_hdr.string_bytes_len]; |
| 980 | |
| 981 | const names = std.mem.bytesAsSlice(u32, names_bytes); |
| 982 | const async_frame_lens = std.mem.bytesAsSlice(u32, async_frame_lens_bytes); |
| 983 | const expected_panic_msgs = std.mem.bytesAsSlice(u32, expected_panic_msgs_bytes); |
| 984 | const names_aligned = try arena.alloc(u32, names.len); |
| 985 | for (names_aligned, names) |*dest, src| dest.* = src; |
| 986 | |
| 987 | const async_frame_lens_aligned = try arena.alloc(u32, async_frame_lens.len); |
| 988 | for (async_frame_lens_aligned, async_frame_lens) |*dest, src| dest.* = src; |
| 989 | |
| 990 | const expected_panic_msgs_aligned = try arena.alloc(u32, expected_panic_msgs.len); |
| 991 | for (expected_panic_msgs_aligned, expected_panic_msgs) |*dest, src| dest.* = src; |
| 992 | |
| 993 | prog_node.setEstimatedTotalItems(names.len); |
| 994 | metadata = .{ |
| 995 | .string_bytes = try arena.dupe(u8, string_bytes), |
| 996 | .names = names_aligned, |
| 997 | .async_frame_lens = async_frame_lens_aligned, |
| 998 | .expected_panic_msgs = expected_panic_msgs_aligned, |
| 999 | .next_index = 0, |
| 1000 | .prog_node = prog_node, |
| 1001 | }; |
| 1002 | |
| 1003 | try requestNextTest(child.stdin.?, &metadata.?, &sub_prog_node); |
| 1004 | }, |
| 1005 | .test_results => { |
| 1006 | const md = metadata.?; |
| 1007 | |
| 1008 | const TrHdr = std.zig.Server.Message.TestResults; |
| 1009 | const tr_hdr = @ptrCast(*align(1) const TrHdr, body); |
| 1010 | fail_count += @boolToInt(tr_hdr.flags.fail); |
| 1011 | skip_count += @boolToInt(tr_hdr.flags.skip); |
| 1012 | leak_count += @boolToInt(tr_hdr.flags.leak); |
| 1013 | |
| 1014 | if (tr_hdr.flags.fail or tr_hdr.flags.leak) { |
| 1015 | const name = std.mem.sliceTo(md.string_bytes[md.names[tr_hdr.index]..], 0); |
| 1016 | const msg = std.mem.trim(u8, stderr.readableSlice(0), "\n"); |
| 1017 | const label = if (tr_hdr.flags.fail) "failed" else "leaked"; |
| 1018 | if (msg.len > 0) { |
| 1019 | try self.step.addError("'{s}' {s}: {s}", .{ name, label, msg }); |
| 1020 | } else { |
| 1021 | try self.step.addError("'{s}' {s}", .{ name, label }); |
| 1023 | 1022 | } |
| 1023 | stderr.discard(msg.len); |
| 1024 | } |
| 1024 | 1025 | |
| 1025 | | try requestNextTest(child.stdin.?, &metadata.?, &sub_prog_node); |
| 1026 | | }, |
| 1027 | | else => {}, // ignore other messages |
| 1028 | | } |
| 1029 | | stdout.discard(header_and_msg_len); |
| 1026 | try requestNextTest(child.stdin.?, &metadata.?, &sub_prog_node); |
| 1027 | }, |
| 1028 | else => {}, // ignore other messages |
| 1030 | 1029 | } |
| 1030 | |
| 1031 | stdout.discard(body.len); |
| 1031 | 1032 | } |
| 1032 | 1033 | |
| 1033 | 1034 | if (stderr.readableLength() > 0) { |