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,