Skip to content

Add better error messages for dotnet test with file/directory arguments in Microsoft Testing Platform (MTP) #50108

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

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
14 changes: 13 additions & 1 deletion src/Cli/dotnet/Commands/CliCommandStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -2605,4 +2605,16 @@ Proceed?</value>
<value>Tool package download needs confirmation. Run in interactive mode or use the "--yes" command-line option to confirm.</value>
<comment>{Locked="--yes"}</comment>
</data>
</root>
<data name="TestCommandUseSolution" xml:space="preserve">
<value>Specifying a solution for 'dotnet test' should be via '--solution'.</value>
</data>
<data name="TestCommandUseProject" xml:space="preserve">
<value>Specifying a project for 'dotnet test' should be via '--project'.</value>
</data>
<data name="TestCommandUseDirectory" xml:space="preserve">
<value>Specifying a directory for 'dotnet test' should be via '--directory'.</value>
</data>
<data name="TestCommandUseTestModules" xml:space="preserve">
<value>Specifying dlls or executables for 'dotnet test' should be via '--test-modules'.</value>
</data>
</root>
6 changes: 4 additions & 2 deletions src/Cli/dotnet/Commands/Test/TestingPlatformCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
using System.CommandLine;
using Microsoft.DotNet.Cli.Commands.Test.Terminal;
using Microsoft.DotNet.Cli.Extensions;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.TemplateEngine.Cli.Commands;
using Microsoft.TemplateEngine.Cli.Help;

namespace Microsoft.DotNet.Cli.Commands.Test;

internal partial class TestingPlatformCommand : Command, ICustomHelp
internal partial class TestingPlatformCommand : System.CommandLine.Command, ICustomHelp
{
private MSBuildHandler _msBuildHandler;
private TerminalTestReporter _output;
Expand Down Expand Up @@ -45,7 +46,8 @@ public int Run(ParseResult parseResult)
private int RunInternal(ParseResult parseResult)
{
ValidationUtility.ValidateMutuallyExclusiveOptions(parseResult);

ValidationUtility.ValidateSolutionOrProjectOrDirectoryOrModulesArePassedCorrectly(parseResult);

PrepareEnvironment(parseResult, out TestOptions testOptions, out int degreeOfParallelism);

InitializeOutput(degreeOfParallelism, parseResult, testOptions.IsHelp);
Expand Down
42 changes: 42 additions & 0 deletions src/Cli/dotnet/Commands/Test/ValidationUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ static void ValidateOptionsIrrelevantToModulesFilter(ParseResult parseResult)
}
}
}

public static bool ValidateBuildPathOptions(BuildOptions buildPathOptions, TerminalTestReporter output)
{
PathOptions pathOptions = buildPathOptions.PathOptions;
Expand All @@ -76,6 +77,47 @@ public static bool ValidateBuildPathOptions(BuildOptions buildPathOptions, Termi
return true;
}

/// <summary>
/// Validates that arguments requiring specific command-line switches are used correctly for Microsoft.Testing.Platform.
/// Provides helpful error messages when users provide file/directory arguments without proper switches.
/// </summary>
public static void ValidateSolutionOrProjectOrDirectoryOrModulesArePassedCorrectly(ParseResult parseResult)
{
if (Environment.GetEnvironmentVariable("DOTNET_TEST_DISABLE_SWITCH_VALIDATION") is "true" or "1")
{
// In case there is a valid case, users can opt-out.
// Note that the validation here is added to have a "better" error message for scenarios that will already fail.
// So, disabling validation is okay if the user scenario is valid.
return;
}

foreach (string token in parseResult.UnmatchedTokens)
{
// Check for .sln files
if ((token.EndsWith(".sln", StringComparison.OrdinalIgnoreCase) ||
token.EndsWith(".slnx", StringComparison.OrdinalIgnoreCase)) && File.Exists(token))
{
throw new GracefulException(CliCommandStrings.TestCommandUseSolution);
}
else if ((token.EndsWith(".csproj", StringComparison.OrdinalIgnoreCase) ||
token.EndsWith(".vbproj", StringComparison.OrdinalIgnoreCase) ||
token.EndsWith(".fsproj", StringComparison.OrdinalIgnoreCase)) && File.Exists(token))
{
throw new GracefulException(CliCommandStrings.TestCommandUseProject);
}
else if (Directory.Exists(token))
{
throw new GracefulException(CliCommandStrings.TestCommandUseDirectory);
}
else if ((token.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) ||
token.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) &&
File.Exists(token))
{
throw new GracefulException(CliCommandStrings.TestCommandUseTestModules);
}
}
}

private static bool ValidateSolutionFilePath(string filePath, TerminalTestReporter output)
{
if (!CliConstants.SolutionExtensions.Contains(Path.GetExtension(filePath)))
Expand Down
20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.cs.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.de.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.es.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.fr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.it.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.ja.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.ko.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.pl.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.pt-BR.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading