public void SurroundWithDoubleQuotesWhenAlreadySurroundedDoesNothing(string input) { var escapedInput = "\"" + input + "\""; var result = TestCommandParser.SurroundWithDoubleQuotes(escapedInput); result.Should().Be(escapedInput); }
public static TestCommand FromArgs(string[] args, string[] settings, string msbuildPath = null) { var parser = Parser.Instance; var result = parser.ParseFrom("dotnet test", args); result.ShowHelpOrErrorIfAppropriate(); var msbuildArgs = new List <string>() { "-target:VSTest", "-nodereuse:false", // workaround for https://github.com/Microsoft/vstest/issues/1503 "-nologo" }; msbuildArgs.AddRange(result.OptionValuesToBeForwarded(TestCommandParser.GetCommand())); msbuildArgs.AddRange(result.ValueForArgument <IReadOnlyCollection <string> >(TestCommandParser.SlnOrProjectArgument) ?? Array.Empty <string>()); if (settings.Any()) { // skip '--' and escape every \ to be \\ and every " to be \" to survive the next hop var escaped = settings.Skip(1).Select(s => s.Replace("\\", "\\\\").Replace("\"", "\\\"")).ToArray(); var runSettingsArg = string.Join(";", escaped); msbuildArgs.Add($"-property:VSTestCLIRunSettings=\"{runSettingsArg}\""); } var verbosityArg = result.ForwardedOptionValues <IReadOnlyCollection <string> >(TestCommandParser.GetCommand(), "verbosity")?.SingleOrDefault() ?? null; if (verbosityArg != null) { var verbosity = verbosityArg.Split(':', 2); if (verbosity.Length == 2) { msbuildArgs.Add($"-property:VSTestVerbosity={verbosity[1]}"); } } bool noRestore = result.HasOption(TestCommandParser.NoRestoreOption) || result.HasOption(TestCommandParser.NoBuildOption); TestCommand testCommand = new TestCommand( msbuildArgs, result.OptionValuesToBeForwarded(TestCommandParser.GetCommand()), result.ValueForArgument <IReadOnlyCollection <string> >(TestCommandParser.SlnOrProjectArgument), noRestore, msbuildPath); // Apply environment variables provided by the user via --environment (-e) parameter, if present SetEnvironmentVariablesFromParameters(testCommand, result); // Set DOTNET_PATH if it isn't already set in the environment as it is required // by the testhost which uses the apphost feature (Windows only). (bool hasRootVariable, string rootVariableName, string rootValue) = VSTestForwardingApp.GetRootVariable(); if (!hasRootVariable) { testCommand.EnvironmentVariable(rootVariableName, rootValue); } return(testCommand); }
private static TestCommand FromParseResult(ParseResult result, string[] settings, string testSessionCorrelationId, string msbuildPath = null) { result.ShowHelpOrErrorIfAppropriate(); var msbuildArgs = new List <string>() { "-target:VSTest", "-nodereuse:false", // workaround for https://github.com/Microsoft/vstest/issues/1503 "-nologo" }; msbuildArgs.AddRange(result.OptionValuesToBeForwarded(TestCommandParser.GetCommand())); msbuildArgs.AddRange(result.GetValueForArgument(TestCommandParser.SlnOrProjectArgument) ?? Array.Empty <string>()); if (settings.Any()) { // skip '--' and escape every \ to be \\ and every " to be \" to survive the next hop string[] escaped = settings.Skip(1).Select(s => s.Replace("\\", "\\\\").Replace("\"", "\\\"")).ToArray(); string runSettingsArg = string.Join(";", escaped); msbuildArgs.Add($"-property:VSTestCLIRunSettings=\"{runSettingsArg}\""); } string verbosityArg = result.ForwardedOptionValues <IReadOnlyCollection <string> >(TestCommandParser.GetCommand(), "verbosity")?.SingleOrDefault() ?? null; if (verbosityArg != null) { string[] verbosity = verbosityArg.Split(':', 2); if (verbosity.Length == 2) { msbuildArgs.Add($"-property:VSTestVerbosity={verbosity[1]}"); } } if (FeatureFlag.Default.IsEnabled(FeatureFlag.ARTIFACTS_POSTPROCESSING)) { // Add artifacts processing mode and test session id for the artifact post-processing msbuildArgs.Add("-property:VSTestArtifactsProcessingMode=collect"); msbuildArgs.Add($"-property:VSTestSessionCorrelationId={testSessionCorrelationId}"); } bool noRestore = result.HasOption(TestCommandParser.NoRestoreOption) || result.HasOption(TestCommandParser.NoBuildOption); TestCommand testCommand = new( msbuildArgs, noRestore, msbuildPath); // Apply environment variables provided by the user via --environment (-e) parameter, if present SetEnvironmentVariablesFromParameters(testCommand, result); // Set DOTNET_PATH if it isn't already set in the environment as it is required // by the testhost which uses the apphost feature (Windows only). (bool hasRootVariable, string rootVariableName, string rootValue) = VSTestForwardingApp.GetRootVariable(); if (!hasRootVariable) { testCommand.EnvironmentVariable(rootVariableName, rootValue); VSTestTrace.SafeWriteTrace(() => $"Root variable set {rootVariableName}:{rootValue}"); } VSTestTrace.SafeWriteTrace(() => $"Starting test using MSBuild with arguments '{testCommand.GetArgumentsToMSBuild()}' custom MSBuild path '{msbuildPath}' norestore '{noRestore}'"); return(testCommand); }
public void SurroundWithDoubleQuotesHandlesCorrectlyOddCountOfTrailingBackslashes(string input) { var result = TestCommandParser.SurroundWithDoubleQuotes(input); result.Should().Be("\"" + input + "\\\""); }
public void SurroundWithDoubleQuotesWhenNotSurroundedSurrounds(string input) { var result = TestCommandParser.SurroundWithDoubleQuotes(input); result.Should().Be("\"" + input + "\""); }
public void SurroundWithDoubleQuotesWithNullThrows() { Assert.Throws <ArgumentNullException>(() => TestCommandParser.SurroundWithDoubleQuotes(null)); }