From a694f575adbe4ca6852cc7c9022101ebcfc3a8d7 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Fri, 31 Jul 2020 00:31:11 +0200 Subject: [PATCH] Add some os.open and os.openat smoke tests --- lib/std/os/test.zig | 90 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig index cfa358ca72..3aa0d0b3be 100644 --- a/lib/std/os/test.zig +++ b/lib/std/os/test.zig @@ -3,6 +3,7 @@ const os = std.os; const testing = std.testing; const expect = testing.expect; const expectEqual = testing.expectEqual; +const expectError = testing.expectError; const io = std.io; const fs = std.fs; const mem = std.mem; @@ -19,6 +20,95 @@ const tmpDir = std.testing.tmpDir; const Dir = std.fs.Dir; const ArenaAllocator = std.heap.ArenaAllocator; +test "open smoke test" { + if (builtin.os.tag == .windows) return error.SkipZigTest; + if (builtin.os.tag == .wasi) return error.SkipZigTest; + + // TODO verify file attributes using `fstat` + + var tmp = tmpDir(.{}); + defer tmp.cleanup(); + + // Get base abs path + var arena = ArenaAllocator.init(testing.allocator); + defer arena.deinit(); + + const base_path = blk: { + const relative_path = try fs.path.join(&arena.allocator, &[_][]const u8{ "zig-cache", "tmp", tmp.sub_path[0..] }); + break :blk try fs.realpathAlloc(&arena.allocator, relative_path); + }; + + var file_path: []u8 = undefined; + var fd: os.fd_t = undefined; + + // Create some file using `open`. + file_path = try fs.path.join(&arena.allocator, &[_][]const u8{ base_path, "some_file" }); + fd = try os.open(file_path, os.O_RDWR | os.O_CREAT | os.O_EXCL, 0o666); + os.close(fd); + + // Try this again with the same flags. This op should fail with error.PathAlreadyExists. + file_path = try fs.path.join(&arena.allocator, &[_][]const u8{ base_path, "some_file" }); + expectError(error.PathAlreadyExists, os.open(file_path, os.O_RDWR | os.O_CREAT | os.O_EXCL, 0o666)); + + // Try opening without `O_EXCL` flag. + file_path = try fs.path.join(&arena.allocator, &[_][]const u8{ base_path, "some_file" }); + fd = try os.open(file_path, os.O_RDWR | os.O_CREAT, 0o666); + os.close(fd); + + // Try opening as a directory which should fail. + file_path = try fs.path.join(&arena.allocator, &[_][]const u8{ base_path, "some_file" }); + expectError(error.NotDir, os.open(file_path, os.O_RDWR | os.O_DIRECTORY, 0o666)); + + // Create some directory + file_path = try fs.path.join(&arena.allocator, &[_][]const u8{ base_path, "some_dir" }); + try os.mkdir(file_path, 0o666); + + // Open dir using `open` + file_path = try fs.path.join(&arena.allocator, &[_][]const u8{ base_path, "some_dir" }); + fd = try os.open(file_path, os.O_RDONLY | os.O_DIRECTORY, 0o666); + os.close(fd); + + // Try opening as file which should fail. + file_path = try fs.path.join(&arena.allocator, &[_][]const u8{ base_path, "some_dir" }); + expectError(error.IsDir, os.open(file_path, os.O_RDWR, 0o666)); +} + +test "openat smoke test" { + if (builtin.os.tag == .windows) return error.SkipZigTest; + if (builtin.os.tag == .wasi) return error.SkipZigTest; + + // TODO verify file attributes using `fstatat` + + var tmp = tmpDir(.{}); + defer tmp.cleanup(); + + var fd: os.fd_t = undefined; + + // Create some file using `openat`. + fd = try os.openat(tmp.dir.fd, "some_file", os.O_RDWR | os.O_CREAT | os.O_EXCL, 0o666); + os.close(fd); + + // Try this again with the same flags. This op should fail with error.PathAlreadyExists. + expectError(error.PathAlreadyExists, os.openat(tmp.dir.fd, "some_file", os.O_RDWR | os.O_CREAT | os.O_EXCL, 0o666)); + + // Try opening without `O_EXCL` flag. + fd = try os.openat(tmp.dir.fd, "some_file", os.O_RDWR | os.O_CREAT, 0o666); + os.close(fd); + + // Try opening as a directory which should fail. + expectError(error.NotDir, os.openat(tmp.dir.fd, "some_file", os.O_RDWR | os.O_DIRECTORY, 0o666)); + + // Create some directory + try os.mkdirat(tmp.dir.fd, "some_dir", 0o666); + + // Open dir using `open` + fd = try os.openat(tmp.dir.fd, "some_dir", os.O_RDONLY | os.O_DIRECTORY, 0o666); + os.close(fd); + + // Try opening as file which should fail. + expectError(error.IsDir, os.openat(tmp.dir.fd, "some_dir", os.O_RDWR, 0o666)); +} + test "symlink with relative paths" { if (builtin.os.tag == .wasi) return error.SkipZigTest;