Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
 public static bool IsTestExecution(this IRunSettingsConfigurationInfo configurationInfo)
 {
     return(configurationInfo.RequestState == RunSettingConfigurationInfoState.Execution);
 }
Esempio n. 9
0
 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);
 }
Esempio n. 10
0
        /// <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);
        }
Esempio n. 14
0
        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;
        }
Esempio n. 15
0
        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);
        }
Esempio n. 16
0
        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);
        }