authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-07-15 17:40:39+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-07-22 08:51:22+02:00
loga8a02dfbfaf4b9bd303712c853e202bd07837371
treed415077ae1c6aec8f70ad76f5bd3d575ec88106d
parent30f1176a545111e8bdce3362d6bdbf7ef75dce2a

Add smoke test for dir symlinks


1 files changed, 28 insertions(+), 24 deletions(-)

lib/std/os/test.zig+28-24
...@@ -44,7 +44,7 @@ test "fstatat" {...@@ -44,7 +44,7 @@ test "fstatat" {
44test "readlink" {44test "readlink" {
45 if (builtin.os.tag == .wasi) return error.SkipZigTest;45 if (builtin.os.tag == .wasi) return error.SkipZigTest;
4646
47 // First, try relative paths47 // First, try relative paths in cwd
48 {48 {
49 var cwd = fs.cwd();49 var cwd = fs.cwd();
50 try cwd.writeFile("file.txt", "nonsense");50 try cwd.writeFile("file.txt", "nonsense");
...@@ -58,37 +58,41 @@ test "readlink" {...@@ -58,37 +58,41 @@ test "readlink" {
58 try cwd.deleteFile("symlinked");58 try cwd.deleteFile("symlinked");
59 }59 }
6060
61 // Next, let's try fully-qualified paths61 // Now, let's use tempdir
62 {62 var tmp = tmpDir(.{});
63 var tmp = tmpDir(.{});63 // defer tmp.cleanup();
64 // defer tmp.cleanup();64
6565 // Create some targets
66 // create file66 try tmp.dir.writeFile("file.txt", "nonsense");
67 try tmp.dir.writeFile("file.txt", "nonsense");67 try tmp.dir.makeDir("subdir");
6868
69 // get paths69 // Get base abs path
70 // TODO: use Dir's realpath function once that exists70 var arena = ArenaAllocator.init(testing.allocator);
71 var arena = ArenaAllocator.init(testing.allocator);71 defer arena.deinit();
72 defer arena.deinit();72
7373 const base_path = blk: {
74 const base_path = blk: {74 const relative_path = try fs.path.join(&arena.allocator, &[_][]const u8{ "zig-cache", "tmp", tmp.sub_path[0..] });
75 const relative_path = try fs.path.join(&arena.allocator, &[_][]const u8{ "zig-cache", "tmp", tmp.sub_path[0..] });75 break :blk try fs.realpathAlloc(&arena.allocator, relative_path);
76 break :blk try fs.realpathAlloc(&arena.allocator, relative_path);76 };
77 };77
78 const target_path = try fs.path.join(&arena.allocator, &[_][]const u8{ base_path, "file.txt" });78 try testReadlink(&arena.allocator, base_path, "file.txt", "symlink1", false);
79 const symlink_path = try fs.path.join(&arena.allocator, &[_][]const u8{ base_path, "symlinked" });79 try testReadlink(&arena.allocator, base_path, "subdir", "symlink2", true);
80}
81
82fn testReadlink(allocator: *mem.Allocator, base_path: []const u8, target_name: []const u8, symlink_name: []const u8, is_dir: bool) !void {
83 const target_path = try fs.path.join(allocator, &[_][]const u8{ base_path, target_name });
84 const symlink_path = try fs.path.join(allocator, &[_][]const u8{ base_path, symlink_name });
80 std.debug.warn("\ntarget_path={}\n", .{target_path});85 std.debug.warn("\ntarget_path={}\n", .{target_path});
81 std.debug.warn("symlink_path={}\n", .{symlink_path});86 std.debug.warn("symlink_path={}\n", .{symlink_path});
8287
83 // create symbolic link by path88 // Create symbolic link by path
84 try os.symlink(target_path, symlink_path, .{});89 try os.symlink(target_path, symlink_path, .{ .is_directory = is_dir });
8590
86 // now, read the link and verify91 // Read the link and verify
87 var buffer: [fs.MAX_PATH_BYTES]u8 = undefined;92 var buffer: [fs.MAX_PATH_BYTES]u8 = undefined;
88 const given = try os.readlink(symlink_path, buffer[0..]);93 const given = try os.readlink(symlink_path, buffer[0..]);
89 std.debug.warn("given={}\n", .{given});94 std.debug.warn("given={}\n", .{given});
90 expect(mem.eql(u8, target_path, given));95 expect(mem.eql(u8, target_path, given));
91 }
92}96}
9397
94test "readlinkat" {98test "readlinkat" {