Skip to content

Commit d97b17b

Browse files
authored
Add missing TarFile.CreateFromDirectoryAsync roundtrip tests. (#84303)
1 parent bed0ec0 commit d97b17b

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

src/libraries/System.Formats.Tar/tests/System.Formats.Tar.Tests.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
<Compile Include="SimulatedDataStream.cs" />
1414
<Compile Include="TarEntry\TarEntry.ExtractToFile.Tests.cs" />
1515
<Compile Include="TarEntry\TarEntry.ExtractToFileAsync.Tests.cs" />
16+
<Compile Include="TarFile\TarFile.CreateFromDirectoryAsync.File.Roundtrip.cs" />
1617
<Compile Include="TarFile\TarFile.ExtractToDirectoryAsync.Stream.Tests.cs" />
1718
<Compile Include="TarFile\TarFile.ExtractToDirectoryAsync.File.Tests.cs" />
1819
<Compile Include="TarFile\TarFile.CreateFromDirectoryAsync.Stream.Tests.cs" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.IO;
5+
using System.Threading.Tasks;
6+
using Xunit;
7+
8+
namespace System.Formats.Tar.Tests
9+
{
10+
public class TarFile_CreateFromDirectoryAsync_Roundtrip_Tests : TarTestsBase
11+
{
12+
[ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))]
13+
[InlineData("./file.txt", "subDirectory")]
14+
[InlineData("../file.txt", "subDirectory")]
15+
[InlineData("../file.txt", "subDirectory1/subDirectory1.1")]
16+
[InlineData("./file.txt", "subDirectory1/subDirectory1.1")]
17+
[InlineData("./file.txt", null)]
18+
public async Task SymlinkRelativeTargets_InsideTheArchive_RoundtripsSuccessfully_Async(string symlinkTargetPath, string subDirectory)
19+
{
20+
using TempDirectory root = new TempDirectory();
21+
22+
string destinationArchive = Path.Join(root.Path, "destination.tar");
23+
24+
string sourceDirectoryName = Path.Join(root.Path, "baseDirectory");
25+
Directory.CreateDirectory(sourceDirectoryName);
26+
27+
string destinationDirectoryName = Path.Join(root.Path, "destinationDirectory");
28+
Directory.CreateDirectory(destinationDirectoryName);
29+
30+
string sourceSubDirectory = Path.Join(sourceDirectoryName, subDirectory);
31+
if (subDirectory != null) Directory.CreateDirectory(sourceSubDirectory);
32+
33+
File.Create(Path.Join(sourceDirectoryName, subDirectory, symlinkTargetPath)).Dispose();
34+
File.CreateSymbolicLink(Path.Join(sourceSubDirectory, "linkToFile"), symlinkTargetPath);
35+
36+
await TarFile.CreateFromDirectoryAsync(sourceDirectoryName, destinationArchive, includeBaseDirectory: false);
37+
38+
await using FileStream archiveStream = File.OpenRead(destinationArchive);
39+
await TarFile.ExtractToDirectoryAsync(archiveStream, destinationDirectoryName, overwriteFiles: true);
40+
41+
string destinationSubDirectory = Path.Join(destinationDirectoryName, subDirectory);
42+
string symlinkPath = Path.Join(destinationSubDirectory, "linkToFile");
43+
Assert.True(File.Exists(symlinkPath));
44+
45+
FileInfo? fileInfo = new(symlinkPath);
46+
Assert.Equal(symlinkTargetPath, fileInfo.LinkTarget);
47+
48+
FileSystemInfo? symlinkTarget = File.ResolveLinkTarget(symlinkPath, returnFinalTarget: true);
49+
Assert.True(File.Exists(symlinkTarget.FullName));
50+
}
51+
52+
[ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))]
53+
[InlineData("../file.txt", null)]
54+
[InlineData("../../file.txt", "subDirectory")]
55+
public async Task SymlinkRelativeTargets_OutsideTheArchive_Fails_Async(string symlinkTargetPath, string subDirectory)
56+
{
57+
using TempDirectory root = new TempDirectory();
58+
59+
string destinationArchive = Path.Join(root.Path, "destination.tar");
60+
61+
string sourceDirectoryName = Path.Join(root.Path, "baseDirectory");
62+
Directory.CreateDirectory(sourceDirectoryName);
63+
64+
string destinationDirectoryName = Path.Join(root.Path, "destinationDirectory");
65+
Directory.CreateDirectory(destinationDirectoryName);
66+
67+
string sourceSubDirectory = Path.Join(sourceDirectoryName, subDirectory);
68+
if (subDirectory != null) Directory.CreateDirectory(sourceSubDirectory);
69+
70+
File.CreateSymbolicLink(Path.Join(sourceSubDirectory, "linkToFile"), symlinkTargetPath);
71+
72+
await TarFile.CreateFromDirectoryAsync(sourceDirectoryName, destinationArchive, includeBaseDirectory: false);
73+
74+
using FileStream archiveStream = File.OpenRead(destinationArchive);
75+
Exception exception = await Assert.ThrowsAsync<IOException>(() => TarFile.ExtractToDirectoryAsync(archiveStream, destinationDirectoryName, overwriteFiles: true));
76+
77+
Assert.Equal(SR.Format(SR.TarExtractingResultsLinkOutside, symlinkTargetPath, destinationDirectoryName), exception.Message);
78+
}
79+
}
80+
}

0 commit comments

Comments
 (0)