diff --git a/src/dotnet/ToolPackage/ToolPackageInstance.cs b/src/dotnet/ToolPackage/ToolPackageInstance.cs index 9a8041582b..5580e8a290 100644 --- a/src/dotnet/ToolPackage/ToolPackageInstance.cs +++ b/src/dotnet/ToolPackage/ToolPackageInstance.cs @@ -255,7 +255,7 @@ private LockFileTargetLibrary FindLibraryInLockFile(LockFile lockFile) return lockFile ?.Targets?.SingleOrDefault(t => t.RuntimeIdentifier != null) ?.Libraries?.SingleOrDefault(l => - string.Compare(l.Name, Id.ToString(), StringComparison.CurrentCultureIgnoreCase) == 0); + string.Compare(l.Name, Id.ToString(), StringComparison.OrdinalIgnoreCase) == 0); } private static LockFileItem FindItemInTargetLibrary(LockFileTargetLibrary library, string targetRelativeFilePath) diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/Microsoft.DotNet.ToolPackage.Tests.csproj b/test/Microsoft.DotNet.ToolPackage.Tests/Microsoft.DotNet.ToolPackage.Tests.csproj index d60eb79a7f..3f55fd37af 100644 --- a/test/Microsoft.DotNet.ToolPackage.Tests/Microsoft.DotNet.ToolPackage.Tests.csproj +++ b/test/Microsoft.DotNet.ToolPackage.Tests/Microsoft.DotNet.ToolPackage.Tests.csproj @@ -50,6 +50,11 @@ + + + + + @@ -67,6 +72,19 @@ + + + $(BaseOutputPath)/TestAsset/SampleGlobalToolWithDifferentCasing + + + + + + + + + + $(BaseOutputPath)/TestAsset/SampleGlobalToolWithShim diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/ConsoleDemoWithCasing.csproj b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/ConsoleDemoWithCasing.csproj new file mode 100644 index 0000000000..ffd96353d9 --- /dev/null +++ b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/ConsoleDemoWithCasing.csproj @@ -0,0 +1,7 @@ + + + Exe + netcoreapp2.1 + ConsoleDemoWithCasing + + diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/DotnetToolSettings.xml b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/DotnetToolSettings.xml new file mode 100644 index 0000000000..98734a9d56 --- /dev/null +++ b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/DotnetToolSettings.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/Program.cs b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/Program.cs new file mode 100644 index 0000000000..f0da2f2350 --- /dev/null +++ b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/Program.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace ConsoleDemoWithCasing +{ + class Program + { + static void Main(string[] args) + { + var greeting = "Hello World from Global Tool"; + Console.WriteLine(greeting); + } + } +} diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/includepublish.nuspec b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/includepublish.nuspec new file mode 100644 index 0000000000..db3b0787c0 --- /dev/null +++ b/test/Microsoft.DotNet.ToolPackage.Tests/SampleGlobalToolWithDifferentCasing/includepublish.nuspec @@ -0,0 +1,16 @@ + + + + Global.Tool.Console.Demo.With.Casing + 2.0.4 + test app + testauthor + + + + + + + + + diff --git a/test/Microsoft.DotNet.ToolPackage.Tests/ToolPackageInstallerTests.cs b/test/Microsoft.DotNet.ToolPackage.Tests/ToolPackageInstallerTests.cs index 226dcf69de..2f3a1b8c28 100644 --- a/test/Microsoft.DotNet.ToolPackage.Tests/ToolPackageInstallerTests.cs +++ b/test/Microsoft.DotNet.ToolPackage.Tests/ToolPackageInstallerTests.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Reflection; using System.Transactions; +using System.Threading; using FluentAssertions; using Microsoft.DotNet.Tools.Test.Utilities; using Microsoft.DotNet.Cli; @@ -669,6 +670,59 @@ public void GivenAComplexVersionRangeInstallSucceeds(bool testMockBehaviorIsInSy package.Uninstall(); } + [NonWindowsOnlyTheory] + [InlineData(false)] + [InlineData(true)] + // repro https://github.com/dotnet/cli/issues/10101 + public void GivenAPackageWithCasingAndenUSPOSIXInstallSucceeds(bool testMockBehaviorIsInSync) + { + var nugetConfigPath = WriteNugetConfigFileToPointToTheFeed(); + var emptySource = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + Directory.CreateDirectory(emptySource); + + var packageId = new PackageId("Global.Tool.Console.Demo.With.Casing"); + var packageVersion = "2.0.4"; + var feed = new MockFeed + { + Type = MockFeedType.ImplicitAdditionalFeed, + Uri = nugetConfigPath.Value, + Packages = new List + { + new MockFeedPackage + { + PackageId = packageId.ToString(), + Version = packageVersion, + } + } + }; + + var (store, installer, reporter, fileSystem) = Setup( + useMock: testMockBehaviorIsInSync, + feeds: new[] { feed }); + + CultureInfo currentCultureBefore = CultureInfo.CurrentCulture; + try + { + CultureInfo.CurrentCulture = new CultureInfo("en-US-POSIX"); + IToolPackage package = null; + Action action = () => package = installer.InstallPackage( + packageId: packageId, + versionRange: VersionRange.Parse(packageVersion), + targetFramework: _testTargetframework, + nugetConfig: nugetConfigPath, additionalFeeds: new[] { emptySource }); + + action.ShouldNotThrow(); + + fileSystem.File.Exists(package.Commands[0].Executable.Value).Should().BeTrue($"{package.Commands[0].Executable.Value} should exist"); + + package.Uninstall(); + } + finally + { + CultureInfo.CurrentCulture = currentCultureBefore; + } + } + private static void AssertPackageInstall( BufferedReporter reporter, IFileSystem fileSystem,