Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 32
Fix PathUtils.IsSymlink throwing on common lstat failures#183
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -38,6 +38,9 @@ | ||
| <ItemGroup Condition=" '$(TargetFramework)' != 'netstandard2.0' "> | ||
| <Compile Remove="NullableAttributes.cs" /> | ||
| </ItemGroup> | ||
| <ItemGroup> | ||
| <InternalsVisibleTo Include="tests" /> | ||
| </ItemGroup> | ||
rmarinho marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| <ItemGroup> | ||
| <PackageReference Include="System.Text.Json" Version="8.0.5" Condition=" '$(TargetFramework)' == 'netstandard2.0' " /> | ||
| </ItemGroup> | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,105 @@ | ||
| // Copyright (c) Microsoft Corporation. | ||
| // Licensed under the MIT License. | ||
| #nullable enable | ||
| using System.IO; | ||
| using NUnit.Framework; | ||
| using Xamarin.MacDev; | ||
| namespace tests { | ||
| [TestFixture] | ||
| public class PathUtilsTests { | ||
| [Test] | ||
| [Platform ("MacOsX")] | ||
| public void IsSymlink_ReturnsFalse_ForNonExistentFile () | ||
| { | ||
| var path = Path.Combine (Path.GetTempPath (), Path.GetRandomFileName ()); | ||
| // Should not throw; returns false for ENOENT | ||
| Assert.That (PathUtils.IsSymlink (path), Is.False); | ||
| } | ||
| [Test] | ||
| [Platform ("MacOsX")] | ||
| public void IsSymlink_ReturnsFalse_ForRegularFile () | ||
| { | ||
| var path = Path.GetTempFileName (); | ||
| try { | ||
| Assert.That (PathUtils.IsSymlink (path), Is.False); | ||
| } finally { | ||
| File.Delete (path); | ||
| } | ||
| } | ||
| [Test] | ||
| [Platform ("MacOsX")] | ||
| public void IsSymlink_ReturnsTrue_ForSymlink () | ||
| { | ||
| var target = Path.GetTempFileName (); | ||
| var link = target + ".link"; | ||
| try { | ||
| #if NET | ||
| File.CreateSymbolicLink (link, target); | ||
| #else | ||
| // File.CreateSymbolicLink is not available on net472. | ||
| // Use a shell command to create the symlink on macOS. | ||
| var psi = new System.Diagnostics.ProcessStartInfo ("ln", $"-s \"{target}\" \"{link}\"") { | ||
| UseShellExecute = false, | ||
| }; | ||
| System.Diagnostics.Process.Start (psi)!.WaitForExit (); | ||
| #endif | ||
| Assert.That (PathUtils.IsSymlink (link), Is.True); | ||
| } finally { | ||
| File.Delete (link); | ||
| File.Delete (target); | ||
| } | ||
| } | ||
rmarinho marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| [Test] | ||
| [Platform ("MacOsX")] | ||
| public void IsSymlinkOrHasParentSymlink_ReturnsFalse_ForNonExistentPath () | ||
| { | ||
| var path = Path.Combine (Path.GetTempPath (), Path.GetRandomFileName ()); | ||
| Assert.That (PathUtils.IsSymlinkOrHasParentSymlink (path), Is.False); | ||
| } | ||
rmarinho marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| [Test] | ||
| [Platform ("MacOsX")] | ||
| public void IsSymlink_ReturnsFalse_WhenPathComponentIsNotDirectory () | ||
| { | ||
| // /etc/hosts is a file, so /etc/hosts/bogus triggers ENOTDIR | ||
| var path = Path.Combine ("/etc/hosts", "bogus"); | ||
| Assert.That (PathUtils.IsSymlink (path), Is.False); | ||
| } | ||
| [Test] | ||
| [Platform ("MacOsX")] | ||
| public void IsSymlinkOrHasParentSymlink_ReturnsTrue_WhenParentIsSymlink () | ||
| { | ||
| var realDir = Path.Combine (Path.GetTempPath (), Path.GetRandomFileName ()); | ||
| Directory.CreateDirectory (realDir); | ||
| var childDir = Path.Combine (realDir, "subdir"); | ||
| Directory.CreateDirectory (childDir); | ||
| var linkDir = Path.Combine (Path.GetTempPath (), Path.GetRandomFileName ()); | ||
| try { | ||
| #if NET | ||
| Directory.CreateSymbolicLink (linkDir, realDir); | ||
| #else | ||
| var psi = new System.Diagnostics.ProcessStartInfo ("ln", $"-s \"{realDir}\" \"{linkDir}\"") { | ||
| UseShellExecute = false, | ||
| }; | ||
| System.Diagnostics.Process.Start (psi)!.WaitForExit (); | ||
| #endif | ||
| var childViaLink = Path.Combine (linkDir, "subdir"); | ||
| Assert.That (PathUtils.IsSymlinkOrHasParentSymlink (childViaLink), Is.True); | ||
| } finally { | ||
| if (Directory.Exists (linkDir)) | ||
| Directory.Delete (linkDir); | ||
| Directory.Delete (realDir, recursive: true); | ||
| } | ||
| } | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.