in src/vstest.console/CommandLine/Executor.cs [92:181]
internal int Execute(params string[] args)
{
_testPlatformEventSource.VsTestConsoleStart();
var isDiag = args != null && args.Any(arg => arg.StartsWith("--diag", StringComparison.OrdinalIgnoreCase));
// If User specifies --nologo via dotnet, do not print splat screen
if (args != null && args.Length != 0 && args.Contains("--nologo"))
{
// Sanitizing this list, as I don't think we should write Argument processor for this.
args = args.Where(val => val != "--nologo").ToArray();
}
else
{
PrintSplashScreen(isDiag);
}
int exitCode = 0;
// If we have no arguments, set exit code to 1, add a message, and include the help processor in the args.
if (args == null || args.Length == 0 || args.Any(string.IsNullOrWhiteSpace))
{
Output.Error(true, CommandLineResources.NoArgumentsProvided);
args = new string[] { HelpArgumentProcessor.CommandName };
exitCode = 1;
}
if (!isDiag)
{
// This takes a path to log directory and log.txt file. Same as the --diag parameter, e.g. VSTEST_DIAG="logs\log.txt"
var diag = Environment.GetEnvironmentVariable("VSTEST_DIAG");
// This takes Verbose, Info (not Information), Warning, and Error.
var diagVerbosity = Environment.GetEnvironmentVariable("VSTEST_DIAG_VERBOSITY");
if (!string.IsNullOrWhiteSpace(diag))
{
var verbosity = TraceLevel.Verbose;
if (diagVerbosity != null)
{
if (Enum.TryParse<TraceLevel>(diagVerbosity, ignoreCase: true, out var parsedVerbosity))
{
verbosity = parsedVerbosity;
}
}
args = args.Concat(new[] { $"--diag:{diag};TraceLevel={verbosity}" }).ToArray();
}
}
// Flatten arguments and process response files.
exitCode |= FlattenArguments(args, out var flattenedArguments);
// Get the argument processors for the arguments.
exitCode |= GetArgumentProcessors(flattenedArguments, out List<IArgumentProcessor> argumentProcessors);
// Verify that the arguments are valid.
exitCode |= IdentifyDuplicateArguments(argumentProcessors);
// Quick exit for syntax error
if (exitCode == 1
&& argumentProcessors.All(
processor => processor.Metadata.Value.CommandName != HelpArgumentProcessor.CommandName))
{
_testPlatformEventSource.VsTestConsoleStop();
return exitCode;
}
// Execute all argument processors
foreach (var processor in argumentProcessors)
{
if (!ExecuteArgumentProcessor(processor, ref exitCode))
{
break;
}
}
// Use the test run result aggregator to update the exit code.
exitCode |= (TestRunResultAggregator.Instance.Outcome == TestOutcome.Passed) ? 0 : 1;
EqtTrace.Verbose("Executor.Execute: Exiting with exit code of {0}", exitCode);
_testPlatformEventSource.VsTestConsoleStop();
_testPlatformEventSource.MetricsDisposeStart();
// Disposing Metrics Publisher when VsTestConsole ends
TestRequestManager.Instance.Dispose();
_testPlatformEventSource.MetricsDisposeStop();
return exitCode;
}