public IList <TestCase> CreateTestCases(Action <TestCase> reportTestCase = null) { if (_settings.UseNewTestExecutionFramework) { return(NewCreateTestcases(reportTestCase)); } string workingDir = _settings.GetWorkingDirForDiscovery(_executable); string finalParams = GetDiscoveryParams(); List <string> standardOutput = new List <string>(); try { int processExitCode = 0; ProcessLauncher launcher = null; var listTestsTask = new Task(() => { launcher = new ProcessLauncher(_logger, _settings.GetPathExtension(_executable), null); standardOutput = launcher.GetOutputOfCommand(workingDir, _executable, finalParams, false, false, out processExitCode); }, TaskCreationOptions.AttachedToParent); listTestsTask.Start(); if (!listTestsTask.Wait(TimeSpan.FromSeconds(_settings.TestDiscoveryTimeoutInSeconds))) { launcher?.Cancel(); LogTimeoutError(workingDir, finalParams); return(new List <TestCase>()); } if (!CheckProcessExitCode(processExitCode, standardOutput, workingDir, finalParams)) { return(new List <TestCase>()); } } catch (Exception e) { SequentialTestRunner.LogExecutionError(_logger, _executable, workingDir, finalParams, e); return(new List <TestCase>()); } IList <TestCaseDescriptor> testCaseDescriptors = new ListTestsParser(_settings.TestNameSeparator).ParseListTestsOutput(standardOutput); var resolver = new TestCaseResolver(_executable, _settings.GetPathExtension(_executable), _settings.GetAdditionalPdbs(_executable), _diaResolverFactory, _settings.ParseSymbolInformation, _logger); IList <TestCase> testCases = new List <TestCase>(); IDictionary <string, ISet <TestCase> > suite2TestCases = new Dictionary <string, ISet <TestCase> >(); foreach (var descriptor in testCaseDescriptors) { var testCase = _settings.ParseSymbolInformation ? CreateTestCase(descriptor, resolver) : CreateTestCase(descriptor); ISet <TestCase> testCasesInSuite; if (!suite2TestCases.TryGetValue(descriptor.Suite, out testCasesInSuite)) { suite2TestCases.Add(descriptor.Suite, testCasesInSuite = new HashSet <TestCase>()); } testCasesInSuite.Add(testCase); testCases.Add(testCase); } foreach (var suiteTestCasesPair in suite2TestCases) { foreach (var testCase in suiteTestCasesPair.Value) { testCase.Properties.Add(new TestCaseMetaDataProperty(suiteTestCasesPair.Value.Count, testCases.Count)); } } if (reportTestCase != null) { foreach (var testCase in testCases) { reportTestCase(testCase); } } return(testCases); }
public IList <TestCase> CreateTestCases(Action <TestCase> reportTestCase = null) { var standardOutput = new List <string>(); var testCases = new List <TestCase>(); var resolver = new TestCaseResolver(_executable, _diaResolverFactory, _settings, _logger); var suite2TestCases = new Dictionary <string, ISet <TestCase> >(); var parser = new StreamingListTestsParser(_settings.TestNameSeparator); parser.TestCaseDescriptorCreated += (sender, args) => { TestCase testCase; if (_settings.ParseSymbolInformation) { TestCaseLocation testCaseLocation = resolver.FindTestCaseLocation( _signatureCreator.GetTestMethodSignatures(args.TestCaseDescriptor).ToList()); testCase = CreateTestCase(args.TestCaseDescriptor, testCaseLocation); } else { testCase = CreateTestCase(args.TestCaseDescriptor); } testCases.Add(testCase); if (!suite2TestCases.TryGetValue(args.TestCaseDescriptor.Suite, out var testCasesOfSuite)) { suite2TestCases.Add(args.TestCaseDescriptor.Suite, testCasesOfSuite = new HashSet <TestCase>()); } testCasesOfSuite.Add(testCase); }; string workingDir = _settings.GetWorkingDirForDiscovery(_executable); var finalParams = GetDiscoveryParams(); try { int processExitCode = ExecutionFailed; IProcessExecutor executor = null; void OnReportOutputLine(string line) { standardOutput.Add(line); parser.ReportLine(line); } var listAndParseTestsTask = Task.Run(() => { _logger.VerboseInfo($"Starting test discovery for {_executable}"); executor = _processExecutorFactory.CreateExecutor(false, _logger); processExitCode = executor.ExecuteCommandBlocking( _executable, finalParams, workingDir, _settings.GetPathExtension(_executable), OnReportOutputLine); _logger.VerboseInfo($"Finished execution of {_executable}"); }); _logger.VerboseInfo($"Scheduled test discovery for {_executable}"); if (!listAndParseTestsTask.Wait(TimeSpan.FromSeconds(_settings.TestDiscoveryTimeoutInSeconds))) { executor?.Cancel(); LogTimeoutError(workingDir, finalParams, standardOutput); return(new List <TestCase>()); } foreach (var suiteTestCasesPair in suite2TestCases) { foreach (var testCase in suiteTestCasesPair.Value) { testCase.Properties.Add(new TestCaseMetaDataProperty(suiteTestCasesPair.Value.Count, testCases.Count)); reportTestCase?.Invoke(testCase); } } if (!string.IsNullOrWhiteSpace(_settings.ExitCodeTestCase)) { var exitCodeTestCase = ExitCodeTestsReporter.CreateExitCodeTestCase(_settings, _executable, resolver.MainMethodLocation); testCases.Add(exitCodeTestCase); reportTestCase?.Invoke(exitCodeTestCase); _logger.DebugInfo($"Exit code of executable '{_executable}' is ignored for test discovery because option '{SettingsWrapper.OptionExitCodeTestCase}' is set"); } else if (!CheckProcessExitCode(processExitCode, standardOutput, workingDir, finalParams)) { return(new List <TestCase>()); } } catch (Exception e) { SequentialTestRunner.LogExecutionError(_logger, _executable, workingDir, finalParams, e); return(new List <TestCase>()); } return(testCases); }
public IList <TestCase> CreateTestCases(Action <TestCase> reportTestCase = null) { var standardOutput = new List <string>(); var testCases = new List <TestCase>(); var resolver = new TestCaseResolver( _executable, _settings.GetPathExtension(_executable), _settings.GetAdditionalPdbs(_executable), _diaResolverFactory, _settings.ParseSymbolInformation, _logger); var suite2TestCases = new Dictionary <string, ISet <TestCase> >(); var parser = new StreamingListTestsParser(_settings.TestNameSeparator); parser.TestCaseDescriptorCreated += (sender, args) => { TestCase testCase; if (_settings.ParseSymbolInformation) { TestCaseLocation testCaseLocation = resolver.FindTestCaseLocation( _signatureCreator.GetTestMethodSignatures(args.TestCaseDescriptor).ToList()); testCase = CreateTestCase(args.TestCaseDescriptor, testCaseLocation); } else { testCase = CreateTestCase(args.TestCaseDescriptor); } testCases.Add(testCase); ISet <TestCase> testCasesOfSuite; if (!suite2TestCases.TryGetValue(args.TestCaseDescriptor.Suite, out testCasesOfSuite)) { suite2TestCases.Add(args.TestCaseDescriptor.Suite, testCasesOfSuite = new HashSet <TestCase>()); } testCasesOfSuite.Add(testCase); }; string workingDir = _settings.GetWorkingDirForDiscovery(_executable); var finalParams = GetDiscoveryParams(); try { int processExitCode = ExecutionFailed; IProcessExecutor executor = null; void OnReportOutputLine(string line) { standardOutput.Add(line); parser.ReportLine(line); } var listAndParseTestsTask = new Task(() => { executor = _processExecutorFactory.CreateExecutor(false, _logger); processExitCode = executor.ExecuteCommandBlocking( _executable, finalParams, workingDir, _settings.GetPathExtension(_executable), OnReportOutputLine); }, TaskCreationOptions.AttachedToParent); listAndParseTestsTask.Start(); if (!listAndParseTestsTask.Wait(TimeSpan.FromSeconds(_settings.TestDiscoveryTimeoutInSeconds))) { executor?.Cancel(); LogTimeoutError(workingDir, finalParams, standardOutput); return(new List <TestCase>()); } foreach (var suiteTestCasesPair in suite2TestCases) { foreach (var testCase in suiteTestCasesPair.Value) { testCase.Properties.Add(new TestCaseMetaDataProperty(suiteTestCasesPair.Value.Count, testCases.Count)); reportTestCase?.Invoke(testCase); } } if (!CheckProcessExitCode(processExitCode, standardOutput, workingDir, finalParams)) { return(new List <TestCase>()); } } catch (Exception e) { SequentialTestRunner.LogExecutionError(_logger, _executable, workingDir, finalParams, e); return(new List <TestCase>()); } return(testCases); }