| ... | ... | @@ -999,6 +999,57 @@ test "openSelfExe" { |
| 999 | 999 | self_exe_file.close(); |
| 1000 | 1000 | } |
| 1001 | 1001 | |
| 1002 | test "deleteTree does not follow symlinks" { |
| 1003 | var tmp = tmpDir(.{}); |
| 1004 | defer tmp.cleanup(); |
| 1005 | |
| 1006 | try tmp.dir.makePath("b"); |
| 1007 | { |
| 1008 | var a = try tmp.dir.makeOpenPath("a", .{}); |
| 1009 | defer a.close(); |
| 1010 | |
| 1011 | a.symLink("../b", "b", .{ .is_directory = true }) catch |err| switch (err) { |
| 1012 | // Symlink requires admin privileges on windows, so this test can legitimately fail. |
| 1013 | error.AccessDenied => return error.SkipZigTest, |
| 1014 | else => return err, |
| 1015 | }; |
| 1016 | } |
| 1017 | |
| 1018 | try tmp.dir.deleteTree("a"); |
| 1019 | |
| 1020 | try testing.expectError(error.FileNotFound, tmp.dir.access("a", .{})); |
| 1021 | try tmp.dir.access("b", .{}); |
| 1022 | } |
| 1023 | |
| 1024 | test "deleteTree on a symlink" { |
| 1025 | var tmp = tmpDir(.{}); |
| 1026 | defer tmp.cleanup(); |
| 1027 | |
| 1028 | // Symlink to a file |
| 1029 | try tmp.dir.writeFile("file", ""); |
| 1030 | tmp.dir.symLink("file", "filelink", .{}) catch |err| switch (err) { |
| 1031 | // Symlink requires admin privileges on windows, so this test can legitimately fail. |
| 1032 | error.AccessDenied => return error.SkipZigTest, |
| 1033 | else => return err, |
| 1034 | }; |
| 1035 | |
| 1036 | try tmp.dir.deleteTree("filelink"); |
| 1037 | try testing.expectError(error.FileNotFound, tmp.dir.access("filelink", .{})); |
| 1038 | try tmp.dir.access("file", .{}); |
| 1039 | |
| 1040 | // Symlink to a directory |
| 1041 | try tmp.dir.makePath("dir"); |
| 1042 | tmp.dir.symLink("dir", "dirlink", .{ .is_directory = true }) catch |err| switch (err) { |
| 1043 | // Symlink requires admin privileges on windows, so this test can legitimately fail. |
| 1044 | error.AccessDenied => return error.SkipZigTest, |
| 1045 | else => return err, |
| 1046 | }; |
| 1047 | |
| 1048 | try tmp.dir.deleteTree("dirlink"); |
| 1049 | try testing.expectError(error.FileNotFound, tmp.dir.access("dirlink", .{})); |
| 1050 | try tmp.dir.access("dir", .{}); |
| 1051 | } |
| 1052 | |
| 1002 | 1053 | test "makePath, put some files in it, deleteTree" { |
| 1003 | 1054 | try testWithAllSupportedPathTypes(struct { |
| 1004 | 1055 | fn impl(ctx: *TestContext) !void { |