add std.testing.io

This commit is contained in:
Andrew Kelley 2025-07-19 22:10:27 -07:00
parent b70f12fc40
commit 8bcc91c15e
3 changed files with 27 additions and 14 deletions

View file

@ -120,6 +120,7 @@ fn mainServer() !void {
.run_test => {
testing.allocator_instance = .{};
testing.io_instance = .init(fba.allocator());
log_err_count = 0;
const index = try server.receiveBody_u32();
const test_fn = builtin.test_functions[index];
@ -135,6 +136,8 @@ fn mainServer() !void {
}
},
};
testing.io_instance.deinit();
fba.reset();
const leak = testing.allocator_instance.deinit() == .leak;
try server.serveTestResults(.{
.index = index,
@ -194,18 +197,14 @@ fn mainTerminal() void {
});
const have_tty = std.fs.File.stderr().isTty();
var async_frame_buffer: []align(builtin.target.stackAlignment()) u8 = undefined;
// TODO this is on the next line (using `undefined` above) because otherwise zig incorrectly
// ignores the alignment of the slice.
async_frame_buffer = &[_]u8{};
var leaks: usize = 0;
for (test_fn_list, 0..) |test_fn, i| {
testing.allocator_instance = .{};
testing.io_instance = .init(fba.allocator());
defer {
if (testing.allocator_instance.deinit() == .leak) {
leaks += 1;
}
if (testing.allocator_instance.deinit() == .leak) leaks += 1;
testing.io_instance.deinit();
fba.reset();
}
testing.log_level = .warn;

View file

@ -1,5 +1,5 @@
const std = @import("std");
const io = std.io;
const Io = std.Io;
const DefaultPrng = std.Random.DefaultPrng;
const expect = std.testing.expect;
const expectEqual = std.testing.expectEqual;
@ -24,7 +24,7 @@ test "write a file, read it, then delete it" {
var file = try tmp.dir.createFile(tmp_file_name, .{});
defer file.close();
var buf_stream = io.bufferedWriter(file.deprecatedWriter());
var buf_stream = Io.bufferedWriter(file.deprecatedWriter());
const st = buf_stream.writer();
try st.print("begin", .{});
try st.writeAll(data[0..]);
@ -45,7 +45,7 @@ test "write a file, read it, then delete it" {
const expected_file_size: u64 = "begin".len + data.len + "end".len;
try expectEqual(expected_file_size, file_size);
var buf_stream = io.bufferedReader(file.deprecatedReader());
var buf_stream = Io.bufferedReader(file.deprecatedReader());
const st = buf_stream.reader();
const contents = try st.readAllAlloc(std.testing.allocator, 2 * 1024);
defer std.testing.allocator.free(contents);
@ -66,7 +66,7 @@ test "BitStreams with File Stream" {
var file = try tmp.dir.createFile(tmp_file_name, .{});
defer file.close();
var bit_stream = io.bitWriter(native_endian, file.deprecatedWriter());
var bit_stream = Io.bitWriter(native_endian, file.deprecatedWriter());
try bit_stream.writeBits(@as(u2, 1), 1);
try bit_stream.writeBits(@as(u5, 2), 2);
@ -80,7 +80,7 @@ test "BitStreams with File Stream" {
var file = try tmp.dir.openFile(tmp_file_name, .{});
defer file.close();
var bit_stream = io.bitReader(native_endian, file.deprecatedReader());
var bit_stream = Io.bitReader(native_endian, file.deprecatedReader());
var out_bits: u16 = undefined;
@ -170,7 +170,7 @@ test "updateTimes" {
test "GenericReader methods can return error.EndOfStream" {
// https://github.com/ziglang/zig/issues/17733
var fbs = std.io.fixedBufferStream("");
var fbs = std.Io.fixedBufferStream("");
try std.testing.expectError(
error.EndOfStream,
fbs.reader().readEnum(enum(u8) { a, b }, .little),
@ -180,3 +180,14 @@ test "GenericReader methods can return error.EndOfStream" {
fbs.reader().isBytes("foo"),
);
}
test "Io instance provided by unit tester async/await" {
const io = std.testing.io;
var future1 = io.async(silly, .{1});
var future2 = io.async(silly, .{2});
try std.testing.expectEqual(3, future1.await(io) + future2.await(io));
}
fn silly(n: usize) usize {
return n;
}

View file

@ -28,6 +28,9 @@ pub var allocator_instance: std.heap.GeneralPurposeAllocator(.{
break :b .init;
};
pub var io_instance: std.Io.ThreadPool = undefined;
pub const io = io_instance.io();
/// TODO https://github.com/ziglang/zig/issues/5738
pub var log_level = std.log.Level.warn;