/src/Tests/Microsoft.DotNet.CommandFactory.Tests/GivenAProjectPathCommandResolver.cs

https://gitlab.com/dotnetfoundation/sdk · C# · 258 lines · 193 code · 63 blank · 2 comment · 2 complexity · 6e36b4987bc9ec232142bf6d7ba42a5b MD5 · raw file

  1. // Copyright (c) .NET Foundation and contributors. All rights reserved.
  2. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
  3. using System;
  4. using System.IO;
  5. using System.Runtime.InteropServices;
  6. using FluentAssertions;
  7. using Microsoft.DotNet.Cli.Utils;
  8. using Microsoft.DotNet.CommandFactory;
  9. using Xunit;
  10. namespace Microsoft.DotNet.Tests
  11. {
  12. public class GivenAProjectPathCommandResolver
  13. {
  14. private static readonly string s_testProjectDirectory = Path.Combine(AppContext.BaseDirectory, "testprojectdirectory");
  15. [Fact]
  16. public void It_returns_null_when_CommandName_is_null()
  17. {
  18. var projectPathCommandResolver = SetupPlatformProjectPathCommandResolver(forceGeneric: true);
  19. var commandResolverArguments = new CommandResolverArguments()
  20. {
  21. CommandName = null,
  22. CommandArguments = new string[] { "" },
  23. ProjectDirectory = "/some/directory"
  24. };
  25. var result = projectPathCommandResolver.Resolve(commandResolverArguments);
  26. result.Should().BeNull();
  27. }
  28. [Fact]
  29. public void It_returns_null_when_ProjectDirectory_is_null()
  30. {
  31. var projectPathCommandResolver = SetupPlatformProjectPathCommandResolver(forceGeneric: true);
  32. var commandResolverArguments = new CommandResolverArguments()
  33. {
  34. CommandName = "command",
  35. CommandArguments = new string[] { "" },
  36. ProjectDirectory = null
  37. };
  38. var result = projectPathCommandResolver.Resolve(commandResolverArguments);
  39. result.Should().BeNull();
  40. }
  41. [Fact]
  42. public void It_returns_null_when_CommandName_does_not_exist_in_ProjectDirectory()
  43. {
  44. var projectPathCommandResolver = SetupPlatformProjectPathCommandResolver(forceGeneric: true);
  45. var commandResolverArguments = new CommandResolverArguments()
  46. {
  47. CommandName = "nonexistent-command",
  48. CommandArguments = null,
  49. ProjectDirectory = s_testProjectDirectory
  50. };
  51. var result = projectPathCommandResolver.Resolve(commandResolverArguments);
  52. result.Should().BeNull();
  53. }
  54. [Fact]
  55. public void It_returns_null_when_CommandName_exists_in_a_subdirectory_of_ProjectDirectory()
  56. {
  57. var environment = CommandResolverTestUtils.SetupEnvironmentProviderWhichFindsExtensions(".exe");
  58. var projectPathCommandResolver = SetupPlatformProjectPathCommandResolver(environment, forceGeneric: true);
  59. var testDir = Path.Combine(s_testProjectDirectory, "projectpathtestsubdir");
  60. CommandResolverTestUtils.CreateNonRunnableTestCommand(testDir, "projectpathtestsubdircommand", ".exe");
  61. var commandResolverArguments = new CommandResolverArguments()
  62. {
  63. CommandName = "projectpathtestsubdircommand",
  64. CommandArguments = null,
  65. ProjectDirectory = s_testProjectDirectory
  66. };
  67. var result = projectPathCommandResolver.Resolve(commandResolverArguments);
  68. result.Should().BeNull();
  69. }
  70. [Fact]
  71. public void It_returns_a_CommandSpec_with_CommandName_as_FileName_when_CommandName_exists_in_ProjectDirectory()
  72. {
  73. var environment = CommandResolverTestUtils.SetupEnvironmentProviderWhichFindsExtensions(".exe");
  74. var projectPathCommandResolver = SetupPlatformProjectPathCommandResolver(environment, forceGeneric: true);
  75. CommandResolverTestUtils.CreateNonRunnableTestCommand(s_testProjectDirectory, "projectpathtestcommand1", ".exe");
  76. var commandResolverArguments = new CommandResolverArguments()
  77. {
  78. CommandName = "projectpathtestcommand1",
  79. CommandArguments = null,
  80. ProjectDirectory = s_testProjectDirectory
  81. };
  82. var result = projectPathCommandResolver.Resolve(commandResolverArguments);
  83. result.Should().NotBeNull();
  84. var commandFile = Path.GetFileNameWithoutExtension(result.Path);
  85. commandFile.Should().Be("projectpathtestcommand1");
  86. }
  87. [Fact]
  88. public void It_escapes_CommandArguments_when_returning_a_CommandSpec()
  89. {
  90. var environment = CommandResolverTestUtils.SetupEnvironmentProviderWhichFindsExtensions(".exe");
  91. var projectPathCommandResolver = SetupPlatformProjectPathCommandResolver(environment, forceGeneric: true);
  92. CommandResolverTestUtils.CreateNonRunnableTestCommand(s_testProjectDirectory, "projectpathtestcommand1", ".exe");
  93. var commandResolverArguments = new CommandResolverArguments()
  94. {
  95. CommandName = "projectpathtestcommand1",
  96. CommandArguments = new[] { "arg with space" },
  97. ProjectDirectory = s_testProjectDirectory
  98. };
  99. var result = projectPathCommandResolver.Resolve(commandResolverArguments);
  100. result.Should().NotBeNull();
  101. result.Args.Should().Be("\"arg with space\"");
  102. }
  103. [Fact]
  104. public void It_resolves_commands_with_extensions_defined_in_InferredExtensions()
  105. {
  106. var extensions = new string[] { ".sh", ".cmd", ".foo", ".exe" };
  107. var projectPathCommandResolver = SetupPlatformProjectPathCommandResolver(forceGeneric: true);
  108. foreach (var extension in extensions)
  109. {
  110. var extensionTestDir = Path.Combine(s_testProjectDirectory, "testext" + extension);
  111. CommandResolverTestUtils.CreateNonRunnableTestCommand(extensionTestDir, "projectpathexttest", extension);
  112. var commandResolverArguments = new CommandResolverArguments()
  113. {
  114. CommandName = "projectpathexttest",
  115. CommandArguments = null,
  116. ProjectDirectory = extensionTestDir,
  117. InferredExtensions = extensions
  118. };
  119. var result = projectPathCommandResolver.Resolve(commandResolverArguments);
  120. result.Should().NotBeNull();
  121. var commandFileName = Path.GetFileName(result.Path);
  122. commandFileName.Should().Be("projectpathexttest" + extension);
  123. }
  124. }
  125. [Fact]
  126. public void It_returns_a_CommandSpec_with_Args_as_stringEmpty_when_returning_a_CommandSpec_and_CommandArguments_are_null()
  127. {
  128. var environment = CommandResolverTestUtils.SetupEnvironmentProviderWhichFindsExtensions(".exe");
  129. var projectPathCommandResolver = SetupPlatformProjectPathCommandResolver(environment, forceGeneric: true);
  130. CommandResolverTestUtils.CreateNonRunnableTestCommand(s_testProjectDirectory, "projectpathtestcommand1", ".exe");
  131. var commandResolverArguments = new CommandResolverArguments()
  132. {
  133. CommandName = "projectpathtestcommand1",
  134. CommandArguments = null,
  135. ProjectDirectory = s_testProjectDirectory
  136. };
  137. var result = projectPathCommandResolver.Resolve(commandResolverArguments);
  138. result.Should().NotBeNull();
  139. result.Args.Should().Be(string.Empty);
  140. }
  141. [Fact]
  142. public void It_prefers_EXE_over_CMD_when_two_command_candidates_exist_and_using_WindowsExePreferredCommandSpecFactory()
  143. {
  144. var environment = CommandResolverTestUtils.SetupEnvironmentProviderWhichFindsExtensions(".exe");
  145. var platformCommandSpecFactory = new WindowsExePreferredCommandSpecFactory();
  146. var projectPathCommandResolver = new ProjectPathCommandResolver(environment, platformCommandSpecFactory);
  147. CommandResolverTestUtils.CreateNonRunnableTestCommand(s_testProjectDirectory, "projectpathtestcommand1", ".exe");
  148. CommandResolverTestUtils.CreateNonRunnableTestCommand(s_testProjectDirectory, "projectpathtestcommand1", ".cmd");
  149. var commandResolverArguments = new CommandResolverArguments()
  150. {
  151. CommandName = "projectpathtestcommand1",
  152. CommandArguments = null,
  153. ProjectDirectory = s_testProjectDirectory
  154. };
  155. var result = projectPathCommandResolver.Resolve(commandResolverArguments);
  156. result.Should().NotBeNull();
  157. var commandFile = Path.GetFileName(result.Path);
  158. commandFile.Should().Be("projectpathtestcommand1.exe");
  159. }
  160. [Fact]
  161. public void It_wraps_command_with_CMD_EXE_when_command_has_CMD_Extension_and_using_WindowsExePreferredCommandSpecFactory()
  162. {
  163. var environment = new EnvironmentProvider(new[] { ".cmd" });
  164. var platformCommandSpecFactory = new WindowsExePreferredCommandSpecFactory();
  165. var pathCommandResolver = new ProjectPathCommandResolver(environment, platformCommandSpecFactory);
  166. var testCommandPath =
  167. CommandResolverTestUtils.CreateNonRunnableTestCommand(s_testProjectDirectory, "cmdWrapCommand", ".cmd");
  168. var commandResolverArguments = new CommandResolverArguments()
  169. {
  170. CommandName = "cmdWrapCommand",
  171. CommandArguments = null,
  172. ProjectDirectory = s_testProjectDirectory
  173. };
  174. var result = pathCommandResolver.Resolve(commandResolverArguments);
  175. result.Should().NotBeNull();
  176. var commandFile = Path.GetFileName(result.Path);
  177. commandFile.Should().Be("cmd.exe");
  178. result.Args.Should().Contain(testCommandPath);
  179. }
  180. private ProjectPathCommandResolver SetupPlatformProjectPathCommandResolver(
  181. IEnvironmentProvider environment = null,
  182. bool forceGeneric = false)
  183. {
  184. environment = environment ?? new EnvironmentProvider();
  185. IPlatformCommandSpecFactory platformCommandSpecFactory = new GenericPlatformCommandSpecFactory();
  186. if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
  187. && !forceGeneric)
  188. {
  189. platformCommandSpecFactory = new WindowsExePreferredCommandSpecFactory();
  190. }
  191. var projectPathCommandResolver = new ProjectPathCommandResolver(environment, platformCommandSpecFactory);
  192. return projectPathCommandResolver;
  193. }
  194. }
  195. }