mirror of
https://github.com/ziglang/zig.git
synced 2025-12-17 19:53:06 +00:00
std: Add more tests, fix broken code
It turns out that nothing in the test suite was exercising preadv/pwritev and so the previous commits silently broke them. Adding tests revealed readvAll and preadvAll were also broken and not covered by any test.
This commit is contained in:
parent
31f1cc9a0d
commit
c065e12dbe
@ -482,7 +482,7 @@ pub const File = struct {
|
|||||||
/// order to handle partial reads from the underlying OS layer.
|
/// order to handle partial reads from the underlying OS layer.
|
||||||
/// See https://github.com/ziglang/zig/issues/7699
|
/// See https://github.com/ziglang/zig/issues/7699
|
||||||
pub fn readvAll(self: File, iovecs: []os.iovec) ReadError!usize {
|
pub fn readvAll(self: File, iovecs: []os.iovec) ReadError!usize {
|
||||||
if (iovecs.len == 0) return;
|
if (iovecs.len == 0) return 0;
|
||||||
|
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
var off: usize = 0;
|
var off: usize = 0;
|
||||||
@ -524,8 +524,8 @@ pub const File = struct {
|
|||||||
/// The `iovecs` parameter is mutable because this function needs to mutate the fields in
|
/// The `iovecs` parameter is mutable because this function needs to mutate the fields in
|
||||||
/// order to handle partial reads from the underlying OS layer.
|
/// order to handle partial reads from the underlying OS layer.
|
||||||
/// See https://github.com/ziglang/zig/issues/7699
|
/// See https://github.com/ziglang/zig/issues/7699
|
||||||
pub fn preadvAll(self: File, iovecs: []const os.iovec, offset: u64) PReadError!void {
|
pub fn preadvAll(self: File, iovecs: []os.iovec, offset: u64) PReadError!usize {
|
||||||
if (iovecs.len == 0) return;
|
if (iovecs.len == 0) return 0;
|
||||||
|
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
var off: usize = 0;
|
var off: usize = 0;
|
||||||
|
|||||||
@ -520,6 +520,89 @@ test "makePath, put some files in it, deleteTree" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "writev, readv" {
|
||||||
|
var tmp = tmpDir(.{});
|
||||||
|
defer tmp.cleanup();
|
||||||
|
|
||||||
|
const line1 = "line1\n";
|
||||||
|
const line2 = "line2\n";
|
||||||
|
|
||||||
|
var buf1: [line1.len]u8 = undefined;
|
||||||
|
var buf2: [line2.len]u8 = undefined;
|
||||||
|
var write_vecs = [_]std.os.iovec_const{
|
||||||
|
.{
|
||||||
|
.iov_base = line1,
|
||||||
|
.iov_len = line1.len,
|
||||||
|
},
|
||||||
|
.{
|
||||||
|
.iov_base = line2,
|
||||||
|
.iov_len = line2.len,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
var read_vecs = [_]std.os.iovec{
|
||||||
|
.{
|
||||||
|
.iov_base = &buf2,
|
||||||
|
.iov_len = buf2.len,
|
||||||
|
},
|
||||||
|
.{
|
||||||
|
.iov_base = &buf1,
|
||||||
|
.iov_len = buf1.len,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
var src_file = try tmp.dir.createFile("test.txt", .{ .read = true });
|
||||||
|
defer src_file.close();
|
||||||
|
|
||||||
|
try src_file.writevAll(&write_vecs);
|
||||||
|
try testing.expectEqual(@as(u64, line1.len + line2.len), try src_file.getEndPos());
|
||||||
|
try src_file.seekTo(0);
|
||||||
|
const read = try src_file.readvAll(&read_vecs);
|
||||||
|
try testing.expectEqual(@as(usize, line1.len + line2.len), read);
|
||||||
|
try testing.expectEqualStrings(&buf1, "line2\n");
|
||||||
|
try testing.expectEqualStrings(&buf2, "line1\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
test "pwritev, preadv" {
|
||||||
|
var tmp = tmpDir(.{});
|
||||||
|
defer tmp.cleanup();
|
||||||
|
|
||||||
|
const line1 = "line1\n";
|
||||||
|
const line2 = "line2\n";
|
||||||
|
|
||||||
|
var buf1: [line1.len]u8 = undefined;
|
||||||
|
var buf2: [line2.len]u8 = undefined;
|
||||||
|
var write_vecs = [_]std.os.iovec_const{
|
||||||
|
.{
|
||||||
|
.iov_base = line1,
|
||||||
|
.iov_len = line1.len,
|
||||||
|
},
|
||||||
|
.{
|
||||||
|
.iov_base = line2,
|
||||||
|
.iov_len = line2.len,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
var read_vecs = [_]std.os.iovec{
|
||||||
|
.{
|
||||||
|
.iov_base = &buf2,
|
||||||
|
.iov_len = buf2.len,
|
||||||
|
},
|
||||||
|
.{
|
||||||
|
.iov_base = &buf1,
|
||||||
|
.iov_len = buf1.len,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
var src_file = try tmp.dir.createFile("test.txt", .{ .read = true });
|
||||||
|
defer src_file.close();
|
||||||
|
|
||||||
|
try src_file.pwritevAll(&write_vecs, 16);
|
||||||
|
try testing.expectEqual(@as(u64, 16 + line1.len + line2.len), try src_file.getEndPos());
|
||||||
|
const read = try src_file.preadvAll(&read_vecs, 16);
|
||||||
|
try testing.expectEqual(@as(usize, line1.len + line2.len), read);
|
||||||
|
try testing.expectEqualStrings(&buf1, "line2\n");
|
||||||
|
try testing.expectEqualStrings(&buf2, "line1\n");
|
||||||
|
}
|
||||||
|
|
||||||
test "access file" {
|
test "access file" {
|
||||||
if (builtin.os.tag == .wasi) return error.SkipZigTest;
|
if (builtin.os.tag == .wasi) return error.SkipZigTest;
|
||||||
|
|
||||||
|
|||||||
@ -646,8 +646,9 @@ pub fn preadv(fd: fd_t, iov: []const iovec, offset: u64) PReadError!usize {
|
|||||||
else
|
else
|
||||||
system.preadv;
|
system.preadv;
|
||||||
|
|
||||||
|
const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
|
||||||
while (true) {
|
while (true) {
|
||||||
const rc = preadv_sym(fd, iov.ptr, iov_count, offset);
|
const rc = preadv_sym(fd, iov.ptr, iov_count, ioffset);
|
||||||
switch (errno(rc)) {
|
switch (errno(rc)) {
|
||||||
0 => return @bitCast(usize, rc),
|
0 => return @bitCast(usize, rc),
|
||||||
EINTR => continue,
|
EINTR => continue,
|
||||||
@ -998,8 +999,9 @@ pub fn pwritev(fd: fd_t, iov: []const iovec_const, offset: u64) PWriteError!usiz
|
|||||||
system.pwritev;
|
system.pwritev;
|
||||||
|
|
||||||
const iov_count = math.cast(u31, iov.len) catch math.maxInt(u31);
|
const iov_count = math.cast(u31, iov.len) catch math.maxInt(u31);
|
||||||
|
const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
|
||||||
while (true) {
|
while (true) {
|
||||||
const rc = pwritev_sym(fd, iov.ptr, iov_count, offset);
|
const rc = pwritev_sym(fd, iov.ptr, iov_count, ioffset);
|
||||||
switch (errno(rc)) {
|
switch (errno(rc)) {
|
||||||
0 => return @intCast(usize, rc),
|
0 => return @intCast(usize, rc),
|
||||||
EINTR => continue,
|
EINTR => continue,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user