| ... | @@ -999,6 +999,57 @@ test "openSelfExe" { | ... | @@ -999,6 +999,57 @@ test "openSelfExe" { |
| 999 | self_exe_file.close(); | 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 | test "makePath, put some files in it, deleteTree" { | 1053 | test "makePath, put some files in it, deleteTree" { |
| 1003 | try testWithAllSupportedPathTypes(struct { | 1054 | try testWithAllSupportedPathTypes(struct { |
| 1004 | fn impl(ctx: *TestContext) !void { | 1055 | fn impl(ctx: *TestContext) !void { |