diff --git a/lib/compiler/test_runner.zig b/lib/compiler/test_runner.zig index 8b60a75399..b6787dfc7c 100644 --- a/lib/compiler/test_runner.zig +++ b/lib/compiler/test_runner.zig @@ -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; diff --git a/lib/std/Io/test.zig b/lib/std/Io/test.zig index bf14f0c24c..023cff1b06 100644 --- a/lib/std/Io/test.zig +++ b/lib/std/Io/test.zig @@ -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; +} diff --git a/lib/std/testing.zig b/lib/std/testing.zig index f9027a4f47..7904a4ffd0 100644 --- a/lib/std/testing.zig +++ b/lib/std/testing.zig @@ -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;