public IXPathNavigable AddRunSettings(IXPathNavigable runSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger logger) { XPathNavigator runSettingsNavigator = runSettingDocument.CreateNavigator(); Debug.Assert(runSettingsNavigator != null, "userRunSettingsNavigator == null!"); if (!runSettingsNavigator.MoveToChild(Constants.RunSettingsName, "")) { logger.Log(MessageLevel.Warning, "RunSettingsDocument does not contain a RunSettings node! Canceling settings merging..."); return(runSettingsNavigator); } var settingsContainer = new RunSettingsContainer(); settingsContainer.SolutionSettings = new RunSettings(); if (CopyToUnsetValues(runSettingsNavigator, settingsContainer)) { runSettingsNavigator.DeleteSelf(); // this node is to be replaced by the final run settings } string solutionRunSettingsFile = GetSolutionSettingsXmlFile(); try { if (File.Exists(solutionRunSettingsFile)) { var solutionRunSettingsDocument = new XPathDocument(solutionRunSettingsFile); XPathNavigator solutionRunSettingsNavigator = solutionRunSettingsDocument.CreateNavigator(); if (solutionRunSettingsNavigator.MoveToChild(Constants.RunSettingsName, "")) { CopyToUnsetValues(solutionRunSettingsNavigator, settingsContainer); } else { logger.Log(MessageLevel.Warning, $"Solution test settings file found at '{solutionRunSettingsFile}', but does not contain {Constants.RunSettingsName} node"); } } } catch (Exception e) { logger.Log(MessageLevel.Warning, $"Solution test settings file could not be parsed, check file: {solutionRunSettingsFile}{Environment.NewLine}Exception: {e}"); } foreach (var projectSettings in settingsContainer.ProjectSettings) { projectSettings.GetUnsetValuesFrom(settingsContainer.SolutionSettings); } GetValuesFromGlobalSettings(settingsContainer); runSettingsNavigator.MoveToChild(Constants.RunSettingsName, ""); runSettingsNavigator.AppendChild(settingsContainer.ToXml().CreateNavigator()); runSettingsNavigator.MoveToRoot(); return(runSettingsNavigator); }
public IXPathNavigable AddRunSettings(IXPathNavigable userRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger logger) { XPathNavigator userRunSettingsNavigator = userRunSettingDocument.CreateNavigator(); Debug.Assert(userRunSettingsNavigator != null, "userRunSettingsNavigator == null!"); if (!userRunSettingsNavigator.MoveToChild("RunSettings", "")) { logger.Log(MessageLevel.Warning, "RunSettingsDocument does not contain a RunSettings node! Canceling settings merging..."); return(userRunSettingsNavigator); } var finalRunSettings = new RunSettings(); if (CopyToUnsetValues(userRunSettingsNavigator, finalRunSettings)) { userRunSettingsNavigator.DeleteSelf(); // this node is to be replaced by the final run settings } string solutionRunSettingsFile = GetSolutionSettingsXmlFile(); try { if (File.Exists(solutionRunSettingsFile)) { var solutionRunSettingsDocument = new XPathDocument(solutionRunSettingsFile); XPathNavigator solutionRunSettingsNavigator = solutionRunSettingsDocument.CreateNavigator(); if (solutionRunSettingsNavigator.MoveToChild("RunSettings", "")) { CopyToUnsetValues(solutionRunSettingsNavigator, finalRunSettings); } } } catch (Exception e) { logger.Log(MessageLevel.Warning, $"Solution test settings file could not be parsed, check file: {solutionRunSettingsFile}"); logger.LogException(e); } finalRunSettings.GetUnsetValuesFrom(globalRunSettings.RunSettings); userRunSettingsNavigator.AppendChild(finalRunSettings.ToXml().CreateNavigator()); userRunSettingsNavigator.MoveToRoot(); return(userRunSettingsNavigator); }
public IXPathNavigable AddRunSettings(IXPathNavigable userRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger logger) { XPathNavigator userRunSettingsNavigator = userRunSettingDocument.CreateNavigator(); Debug.Assert(userRunSettingsNavigator != null, "userRunSettingsNavigator == null!"); if (!userRunSettingsNavigator.MoveToChild("RunSettings", "")) { logger.Log(MessageLevel.Warning, "RunSettingsDocument does not contain a RunSettings node! Canceling settings merging..."); return userRunSettingsNavigator; } var finalRunSettings = new RunSettings(); if (CopyToUnsetValues(userRunSettingsNavigator, finalRunSettings)) { userRunSettingsNavigator.DeleteSelf(); // this node is to be replaced by the final run settings } string solutionRunSettingsFile = GetSolutionSettingsXmlFile(); try { if (File.Exists(solutionRunSettingsFile)) { var solutionRunSettingsDocument = new XPathDocument(solutionRunSettingsFile); XPathNavigator solutionRunSettingsNavigator = solutionRunSettingsDocument.CreateNavigator(); if (solutionRunSettingsNavigator.MoveToChild("RunSettings", "")) { CopyToUnsetValues(solutionRunSettingsNavigator, finalRunSettings); } } } catch (Exception e) { logger.Log(MessageLevel.Warning, $"Solution test settings file could not be parsed, check file: {solutionRunSettingsFile}"); logger.LogException(e); } finalRunSettings.GetUnsetValuesFrom(_globalRunSettings.RunSettings); userRunSettingsNavigator.AppendChild(finalRunSettings.ToXml().CreateNavigator()); userRunSettingsNavigator.MoveToRoot(); return userRunSettingsNavigator; }
public IXPathNavigable AddRunSettings(IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger log) { ValidateArg.NotNull(inputRunSettingDocument, "inputRunSettingDocument"); ValidateArg.NotNull(configurationInfo, "configurationInfo"); var navigator = inputRunSettingDocument.CreateNavigator(); if (navigator.MoveToChild("RunSettings", "")) { if (navigator.MoveToChild(Name, "")) { navigator.DeleteSelf(); } navigator.AppendChild(Settings.Serialize()); } navigator.MoveToRoot(); return navigator; }
public IXPathNavigable AddRunSettings( IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger log) { ValidateArg.NotNull(inputRunSettingDocument, "inputRunSettingDocument"); XPathNavigator navigator = inputRunSettingDocument.CreateNavigator(); if (navigator.MoveToChild("RunSettings", "")) { if (!navigator.MoveToChild(QmlTestAdapterSettings.SettingsName, "")) { navigator.AppendChild(Settings.ToXml().OuterXml); } } navigator.MoveToRoot(); return(navigator); }
public IXPathNavigable AddRunSettings(IXPathNavigable runSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger logger) { XPathNavigator runSettingsNavigator = runSettingDocument.CreateNavigator(); Debug.Assert(runSettingsNavigator != null, "userRunSettingsNavigator == null!"); if (!runSettingsNavigator.MoveToChild(Constants.RunSettingsName, "")) { logger.Log(MessageLevel.Warning, "RunSettingsDocument does not contain a RunSettings node! Canceling settings merging..."); return(runSettingsNavigator); } var settingsContainer = new RunSettingsContainer(); try { if (settingsContainer.GetUnsetValuesFrom(runSettingsNavigator)) { runSettingsNavigator.DeleteSelf(); // this node is to be replaced by the final run settings } } catch (InvalidRunSettingsException e) { logger.Log(MessageLevel.Error, $"Invalid run settings: {e.Message}"); } GetValuesFromSolutionSettingsFile(settingsContainer, logger); foreach (var projectSettings in settingsContainer.ProjectSettings) { projectSettings.GetUnsetValuesFrom(settingsContainer.SolutionSettings); } GetValuesFromGlobalSettings(settingsContainer); runSettingsNavigator.MoveToChild(Constants.RunSettingsName, ""); runSettingsNavigator.AppendChild(settingsContainer.ToXml().CreateNavigator()); runSettingsNavigator.MoveToRoot(); return(runSettingsNavigator); }
public IXPathNavigable AddRunSettings(IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger log) { ValidateArg.NotNull(inputRunSettingDocument, "inputRunSettingDocument"); ValidateArg.NotNull(configurationInfo, "configurationInfo"); var navigator = inputRunSettingDocument.CreateNavigator(); if (navigator.MoveToChild("RunSettings", "")) { if (navigator.MoveToChild(GaugeTestRunSettings.SettingsName, "")) { navigator.DeleteSelf(); } navigator.AppendChild(SerializeGaugeSettings()); } navigator.MoveToRoot(); return(navigator); }
public static bool IsTestExecution(this IRunSettingsConfigurationInfo configurationInfo) { return(configurationInfo.RequestState == RunSettingConfigurationInfoState.Execution); }
public IXPathNavigable AddRunSettings(IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, Microsoft.VisualStudio.TestWindow.Extensibility.ILogger log) { if (configurationInfo.IsTestExecution() && ShouldAddFCCRunSettings()) { return(userRunSettingsService.AddFCCRunSettings(inputRunSettingDocument, configurationInfo, userRunSettingsProjectDetailsLookup, fccMsTestAdapterPath)); } return(null); }
/// <see cref="IRunSettingsService.AddRunSettings"/> public IXPathNavigable AddRunSettings(IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger log) { ValidateArg.NotNull(inputRunSettingDocument, "inputRunSettingDocument"); ValidateArg.NotNull(configurationInfo, "configurationInfo"); var navigator = inputRunSettingDocument.CreateNavigator(); navigator.MoveToRoot(); return(navigator); }
public IXPathNavigable AddRunSettings(IXPathNavigable runSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger logger) { XPathNavigator runSettingsNavigator = runSettingDocument.CreateNavigator(); Debug.Assert(runSettingsNavigator != null, "userRunSettingsNavigator == null!"); if (!runSettingsNavigator.MoveToChild(Constants.RunSettingsName, "")) { logger.Log(MessageLevel.Warning, Resources.RunSettingsMissingNode); return(runSettingsNavigator); } var settingsContainer = new RunSettingsContainer(); settingsContainer.SolutionSettings = new RunSettings(); try { if (CopyToUnsetValues(runSettingsNavigator, settingsContainer)) { runSettingsNavigator.DeleteSelf(); // this node is to be replaced by the final run settings } } catch (InvalidRunSettingsException) { } string solutionRunSettingsFile = GetSolutionSettingsXmlFile(); try { if (File.Exists(solutionRunSettingsFile)) { var settings = new XmlReaderSettings(); // Don't use an object initializer for FxCop to understand. settings.XmlResolver = null; using (var reader = XmlReader.Create(solutionRunSettingsFile, settings)) { var solutionRunSettingsDocument = new XPathDocument(reader); XPathNavigator solutionRunSettingsNavigator = solutionRunSettingsDocument.CreateNavigator(); if (solutionRunSettingsNavigator.MoveToChild(Constants.RunSettingsName, "")) { CopyToUnsetValues(solutionRunSettingsNavigator, settingsContainer); } else { logger.Log(MessageLevel.Warning, string.Format(Resources.SolutionFoundButMissingNode, solutionRunSettingsFile, Constants.RunSettingsName)); } } } } catch (Exception e) { logger.Log(MessageLevel.Warning, string.Format(Resources.CantParseSettings, solutionRunSettingsFile, e)); } foreach (var projectSettings in settingsContainer.ProjectSettings) { projectSettings.GetUnsetValuesFrom(settingsContainer.SolutionSettings); } GetValuesFromGlobalSettings(settingsContainer); runSettingsNavigator.MoveToChild(Constants.RunSettingsName, ""); runSettingsNavigator.AppendChild(settingsContainer.ToXml().CreateNavigator()); runSettingsNavigator.MoveToRoot(); return(runSettingsNavigator); }
public IXPathNavigable AddFCCRunSettings(IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, Dictionary <string, IUserRunSettingsProjectDetails> userRunSettingsProjectDetailsLookup, string fccMsTestAdapterPath) { if (!runSettingsTemplate.FCCGenerated(inputRunSettingDocument)) { return(AddFCCRunSettingsActual(inputRunSettingDocument, configurationInfo, userRunSettingsProjectDetailsLookup, fccMsTestAdapterPath)); } return(null); }
/// <summary> /// Visual studio calls this method on the IRunSettingsService to collect /// run settings for tests adapters. /// /// The settings are serialized as XML, because they need to be passed to the /// test host service across a process boundary. /// </summary> /// <param name="inputRunSettingDocument">Pre-existing run settings. Defaults or from a manually specified runsettings file.</param> /// <param name="configurationInfo">Contextual information on the test run.</param> /// <param name="log">Logger.</param> /// <returns>The entire settings document, as it should be after our modifications.</returns> public IXPathNavigable AddRunSettings( IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger log) { // This shall contain the merged settings. CatchAdapterSettings settings = new CatchAdapterSettings(); // Try to find an existing catch configuration node. var settingsFromContext = MaybeReadSettingsFromXml(inputRunSettingDocument); XPathNavigator navigator = inputRunSettingDocument.CreateNavigator(); if (settingsFromContext == null) { // Note that explicit runsettings for catch were not provided. log.Log(MessageLevel.Informational, $"No '{CatchAdapterSettings.XmlRoot}' node in explicit runsettings (or no explicit runsettins at all). " + "Searching for runsettings in solution directory and above."); // Read settings from files. foreach (var file in FindSettingsInFoldersAbove(Path.GetDirectoryName(dte.Solution.FullName), log)) { try { // Try to find settings from the file. var settingsFromFile = MaybeReadSettingsFromFile(file); if (settingsFromFile != null) { log.Log(MessageLevel.Informational, $"Reading test run settings from {file}."); settings.MergeFrom(settingsFromFile); } } catch (IOException ex) { log.Log(MessageLevel.Warning, $"Failed to read test run settings from file '{file}'. Exception: {ex.ToString()}"); } } } else { // Merge the settings from the context. settings.MergeFrom(settingsFromContext); // Erase the original. if (navigator.MoveToFollowing(CatchAdapterSettings.XmlRoot, "")) { navigator.DeleteSelf(); } } // Write the resolved settings to the xml. XPathNavigator settingsAsXml = settings.ToXml().CreateNavigator(); navigator.MoveToRoot(); navigator.MoveToFirstChild(); navigator.AppendChild(settingsAsXml); // Clean up the navigator. navigator.MoveToRoot(); return(navigator); }
public IXPathNavigable AddRunSettings(IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger log) { XPathNavigator navigator = inputRunSettingDocument.CreateNavigator(); var python = navigator.Select("/RunSettings"); if (python.MoveNext()) { using (var writer = python.Current.AppendChild()) { var pyContainers = configurationInfo.TestContainers .OfType<TestContainer>() .GroupBy(x => x.Project); writer.WriteStartElement("Python"); writer.WriteStartElement("TestCases"); foreach (var project in pyContainers) { foreach (var container in project) { writer.WriteStartElement("Project"); writer.WriteAttributeString("home", project.Key.ProjectHome); LaunchConfiguration config = null; string nativeCode = "", djangoSettings = ""; _dispatcher.Invoke(() => { try { config = project.Key.GetLaunchConfigurationOrThrow(); } catch { } nativeCode = project.Key.GetProperty(PythonConstants.EnableNativeCodeDebugging); djangoSettings = project.Key.GetProperty("DjangoSettingsModule"); }); if (config == null) { log.Log( MessageLevel.Warning, Strings.TestDiscoveryFailedMissingLaunchConfiguration.FormatUI(project.Key.ProjectHome) ); continue; } writer.WriteAttributeString("nativeDebugging", nativeCode); writer.WriteAttributeString("djangoSettingsModule", djangoSettings); writer.WriteAttributeString("workingDir", config.WorkingDirectory); writer.WriteAttributeString("interpreter", config.GetInterpreterPath()); writer.WriteAttributeString("pathEnv", config.Interpreter.PathEnvironmentVariable); writer.WriteStartElement("Environment"); foreach (var keyValue in config.Environment) { writer.WriteStartElement("Variable"); writer.WriteAttributeString("name", keyValue.Key); writer.WriteAttributeString("value", keyValue.Value); writer.WriteEndElement(); } writer.WriteEndElement(); // Environment writer.WriteStartElement("SearchPaths"); foreach (var path in config.SearchPaths) { writer.WriteStartElement("Search"); writer.WriteAttributeString("value", path); writer.WriteEndElement(); } writer.WriteEndElement(); // SearchPaths foreach (var test in container.TestCases) { writer.WriteStartElement("Test"); writer.WriteAttributeString("className", test.ClassName); writer.WriteAttributeString("file", test.Filename); writer.WriteAttributeString("line", test.StartLine.ToString()); writer.WriteAttributeString("column", test.StartColumn.ToString()); writer.WriteAttributeString("method", test.MethodName); writer.WriteEndElement(); // Test } writer.WriteEndElement(); // Project } } writer.WriteEndElement(); // TestCases writer.WriteEndElement(); // Python } } // We only care about tweaking the settings for execution... if (configurationInfo.RequestState != RunSettingConfigurationInfoState.Execution) { return inputRunSettingDocument; } // And we also only care about doing it when we're all Python containers #pragma warning disable CS0219 // Variable is assigned but its value is never used bool allPython = true, anyPython = false; #pragma warning restore CS0219 // Variable is assigned but its value is never used foreach (var container in configurationInfo.TestContainers) { if (container is TestContainer) { anyPython = true; } else { allPython = false; } } if (!anyPython) { // Don't mess with code coverage settings if we're not running Python tests return inputRunSettingDocument; } if (CodeCoverageEnabled) { // Code coverage is currently enabled. We don't want it adding it's data // collector if ICodeCoverageSettingsService IRunSettingsService runs // after ours. So we tell it that it's been disabled to prevent that // from happening. navigator = inputRunSettingDocument.CreateNavigator(); var pythonNode = navigator.Select("/RunSettings/Python"); if (pythonNode.MoveNext()) { pythonNode.Current.AppendChild("<EnableCoverage>true</EnableCoverage>"); } if (allPython) { // Disable normal code coverage... CodeCoverageEnabled = false; XPathNodeIterator nodes = navigator.Select("/RunSettings/DataCollectionRunSettings/DataCollectors/DataCollector"); XPathNavigator codeCoverageNode = null; foreach (XPathNavigator dataCollectorNavigator in nodes) { string uri = dataCollectorNavigator.GetAttribute("uri", string.Empty); if (string.Equals(CodeCoverageUriString, uri, StringComparison.OrdinalIgnoreCase)) { codeCoverageNode = dataCollectorNavigator; break; } } if (codeCoverageNode != null && String.IsNullOrWhiteSpace(codeCoverageNode.GetAttribute("x-keep-ptvs", null))) { // Code coverage has been added, which means we (likely) came after // ICodeCoverageSettingsService in the MEF import order. Let's remove // the node (we allow the user to define x-keep-ptvs to prevent us // from doing this if they've manually patched their runsettings file) codeCoverageNode.DeleteSelf(); } } } return inputRunSettingDocument; }
public IXPathNavigable AddRunSettings(IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger log) { XPathNavigator navigator = inputRunSettingDocument.CreateNavigator(); var python = navigator.Select("/RunSettings"); if (python.MoveNext()) { using (var writer = python.Current.AppendChild()) { var pyContainersByProject = configurationInfo.TestContainers .OfType <TestContainer>() .GroupBy(x => x.Project); writer.WriteStartElement("Python"); writer.WriteStartElement("TestCases"); foreach (var projectContainers in pyContainersByProject) { if (WriteProjectInfoForContainer(writer, projectContainers.FirstOrDefault(), log)) { foreach (var container in projectContainers) { writer.WriteStartElement("Test"); writer.WriteAttributeString("file", container.Source); writer.WriteEndElement(); // Test } writer.WriteEndElement(); // Project } } writer.WriteEndElement(); // TestCases writer.WriteEndElement(); // Python } } // We only care about tweaking the settings for execution... if (configurationInfo.RequestState != RunSettingConfigurationInfoState.Execution) { return(inputRunSettingDocument); } // And we also only care about doing it when we're all Python containers #pragma warning disable CS0219 // Variable is assigned but its value is never used bool allPython = true, anyPython = false; #pragma warning restore CS0219 // Variable is assigned but its value is never used foreach (var container in configurationInfo.TestContainers) { if (container is TestContainer) { anyPython = true; } else { allPython = false; } } if (!anyPython) { // Don't mess with code coverage settings if we're not running Python tests return(inputRunSettingDocument); } if (CodeCoverageEnabled) { // Code coverage is currently enabled. We don't want it adding it's data // collector if ICodeCoverageSettingsService IRunSettingsService runs // after ours. So we tell it that it's been disabled to prevent that // from happening. navigator = inputRunSettingDocument.CreateNavigator(); var pythonNode = navigator.Select("/RunSettings/Python"); if (pythonNode.MoveNext()) { pythonNode.Current.AppendChild("<EnableCoverage>true</EnableCoverage>"); } if (allPython) { // Disable normal code coverage... CodeCoverageEnabled = false; XPathNodeIterator nodes = navigator.Select("/RunSettings/DataCollectionRunSettings/DataCollectors/DataCollector"); XPathNavigator codeCoverageNode = null; foreach (XPathNavigator dataCollectorNavigator in nodes) { string uri = dataCollectorNavigator.GetAttribute("uri", string.Empty); if (string.Equals(CodeCoverageUriString, uri, StringComparison.OrdinalIgnoreCase)) { codeCoverageNode = dataCollectorNavigator; break; } } if (codeCoverageNode != null && String.IsNullOrWhiteSpace(codeCoverageNode.GetAttribute("x-keep-ptvs", null))) { // Code coverage has been added, which means we (likely) came after // ICodeCoverageSettingsService in the MEF import order. Let's remove // the node (we allow the user to define x-keep-ptvs to prevent us // from doing this if they've manually patched their runsettings file) codeCoverageNode.DeleteSelf(); } } } return(inputRunSettingDocument); }
public IXPathNavigable AddRunSettings(IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, ILogger log) { XPathNavigator navigator = inputRunSettingDocument.CreateNavigator(); var python = navigator.Select("/RunSettings"); if (python.MoveNext()) { using (var writer = python.Current.AppendChild()) { var pyContainers = configurationInfo.TestContainers .OfType <TestContainer>() .GroupBy(x => x.Project); writer.WriteStartElement("Python"); writer.WriteStartElement("TestCases"); foreach (var project in pyContainers) { foreach (var container in project) { writer.WriteStartElement("Project"); writer.WriteAttributeString("home", project.Key.ProjectHome); LaunchConfiguration config = null; string nativeCode = "", djangoSettings = ""; ThreadHelper.JoinableTaskFactory.Run(async() => { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); try { config = project.Key.GetLaunchConfigurationOrThrow(); } catch { } nativeCode = project.Key.GetProperty(PythonConstants.EnableNativeCodeDebugging); djangoSettings = project.Key.GetProperty("DjangoSettingsModule"); }); if (config == null) { log.Log( MessageLevel.Warning, Strings.TestDiscoveryFailedMissingLaunchConfiguration.FormatUI(project.Key.ProjectHome) ); continue; } writer.WriteAttributeString("nativeDebugging", nativeCode); writer.WriteAttributeString("djangoSettingsModule", djangoSettings); writer.WriteAttributeString("workingDir", config.WorkingDirectory); writer.WriteAttributeString("interpreter", config.GetInterpreterPath()); writer.WriteAttributeString("pathEnv", config.Interpreter.PathEnvironmentVariable); writer.WriteStartElement("Environment"); foreach (var keyValue in config.Environment) { writer.WriteStartElement("Variable"); writer.WriteAttributeString("name", keyValue.Key); writer.WriteAttributeString("value", keyValue.Value); writer.WriteEndElement(); } writer.WriteEndElement(); // Environment writer.WriteStartElement("SearchPaths"); foreach (var path in config.SearchPaths) { writer.WriteStartElement("Search"); writer.WriteAttributeString("value", path); writer.WriteEndElement(); } writer.WriteEndElement(); // SearchPaths foreach (var test in container.TestCases) { writer.WriteStartElement("Test"); writer.WriteAttributeString("className", test.ClassName); writer.WriteAttributeString("file", test.Filename); writer.WriteAttributeString("line", test.StartLine.ToString()); writer.WriteAttributeString("column", test.StartColumn.ToString()); writer.WriteAttributeString("method", test.MethodName); writer.WriteEndElement(); // Test } writer.WriteEndElement(); // Project } } writer.WriteEndElement(); // TestCases writer.WriteEndElement(); // Python } } // We only care about tweaking the settings for execution... if (configurationInfo.RequestState != RunSettingConfigurationInfoState.Execution) { return(inputRunSettingDocument); } // And we also only care about doing it when we're all Python containers #pragma warning disable CS0219 // Variable is assigned but its value is never used bool allPython = true, anyPython = false; #pragma warning restore CS0219 // Variable is assigned but its value is never used foreach (var container in configurationInfo.TestContainers) { if (container is TestContainer) { anyPython = true; } else { allPython = false; } } if (!anyPython) { // Don't mess with code coverage settings if we're not running Python tests return(inputRunSettingDocument); } if (CodeCoverageEnabled) { // Code coverage is currently enabled. We don't want it adding it's data // collector if ICodeCoverageSettingsService IRunSettingsService runs // after ours. So we tell it that it's been disabled to prevent that // from happening. navigator = inputRunSettingDocument.CreateNavigator(); var pythonNode = navigator.Select("/RunSettings/Python"); if (pythonNode.MoveNext()) { pythonNode.Current.AppendChild("<EnableCoverage>true</EnableCoverage>"); } if (allPython) { // Disable normal code coverage... CodeCoverageEnabled = false; XPathNodeIterator nodes = navigator.Select("/RunSettings/DataCollectionRunSettings/DataCollectors/DataCollector"); XPathNavigator codeCoverageNode = null; foreach (XPathNavigator dataCollectorNavigator in nodes) { string uri = dataCollectorNavigator.GetAttribute("uri", string.Empty); if (string.Equals(CodeCoverageUriString, uri, StringComparison.OrdinalIgnoreCase)) { codeCoverageNode = dataCollectorNavigator; break; } } if (codeCoverageNode != null && String.IsNullOrWhiteSpace(codeCoverageNode.GetAttribute("x-keep-ptvs", null))) { // Code coverage has been added, which means we (likely) came after // ICodeCoverageSettingsService in the MEF import order. Let's remove // the node (we allow the user to define x-keep-ptvs to prevent us // from doing this if they've manually patched their runsettings file) codeCoverageNode.DeleteSelf(); } } } return(inputRunSettingDocument); }
private IXPathNavigable AddFCCRunSettingsActual(IXPathNavigable inputRunSettingDocument, IRunSettingsConfigurationInfo configurationInfo, Dictionary <string, IUserRunSettingsProjectDetails> userRunSettingsProjectDetailsLookup, string fccMsTestAdapterPath) { var navigator = inputRunSettingDocument.CreateNavigator(); navigator.MoveToFirstChild(); var clonedNavigator = navigator.Clone(); var replacements = runSettingsTemplateReplacementsFactory.Create( configurationInfo.TestContainers, userRunSettingsProjectDetailsLookup, fccMsTestAdapterPath ); EnsureTestAdaptersPathsAndReplace(navigator, replacements); EnsureCorrectMsDataCollectorAndReplace(clonedNavigator, replacements); return(navigator); }