internal static void AddDataCollectorToRunSettings(string argument, IRunSettingsProvider runSettingsManager) { EnabledDataCollectors.Add(argument.ToLower()); var settings = runSettingsManager.ActiveRunSettings?.SettingsXml; if (settings == null) { runSettingsManager.AddDefaultRunSettings(); settings = runSettingsManager.ActiveRunSettings?.SettingsXml; } var dataCollectionRunSettings = XmlRunSettingsUtilities.GetDataCollectionRunSettings(settings); if (dataCollectionRunSettings == null) { dataCollectionRunSettings = new DataCollectionRunSettings(); } else { // By default, all data collectors present in run settings are enabled, if enabled attribute is not specified. // So explicitely disable those data collectors and enable those which are specified. DisableUnConfiguredDataCollectors(dataCollectionRunSettings); } // Add data collectors if not already present, enable if already present. EnableDataCollectorUsingFriendlyName(argument, dataCollectionRunSettings); runSettingsManager.UpdateRunSettingsNodeInnerXml(Constants.DataCollectionRunSettingsName, dataCollectionRunSettings.ToXml().InnerXml); }
public static DataCollectionRunSettings GetInProcDataCollectionRunSettings(string runSettingsXml) { // use XmlReader to avoid loading of the plugins in client code (mainly from VS). if (!string.IsNullOrWhiteSpace(runSettingsXml)) { runSettingsXml = runSettingsXml.Trim(); using (StringReader stringReader1 = new StringReader(runSettingsXml)) { XmlReader reader = XmlReader.Create(stringReader1, ReaderSettings); // read to the fist child XmlReaderUtilities.ReadToRootNode(reader); reader.ReadToNextElement(); // Read till we reach In Proc IDC element or reach EOF while (!string.Equals(reader.Name, Constants.InProcDataCollectionRunSettingsName) && !reader.EOF) { reader.SkipToNextElement(); } // If reached EOF => IDC element not there if (reader.EOF) { return(null); } // Reached here => In Proc IDC element present. return(DataCollectionRunSettings.FromXml(reader, Constants.InProcDataCollectionRunSettingsName, Constants.InProcDataCollectorsSettingName, Constants.InProcDataCollectorSettingName)); } } return(null); }
/// <summary> /// Initialize blame. /// </summary> /// <param name="enableDump">Enable dump.</param> /// <param name="blameParameters">Blame parameters.</param> private void InitializeBlame(bool enableDump, Dictionary <string, string> collectDumpParameters) { // Add Blame Logger LoggerUtilities.AddLoggerToRunSettings(BlameFriendlyName, null, this.runSettingsManager); // Add Blame Data Collector CollectArgumentExecutor.AddDataCollectorToRunSettings(BlameFriendlyName, this.runSettingsManager, this.fileHelper); // Add default run settings if required. if (this.runSettingsManager.ActiveRunSettings?.SettingsXml == null) { this.runSettingsManager.AddDefaultRunSettings();; } var settings = this.runSettingsManager.ActiveRunSettings?.SettingsXml; // Get results directory from RunSettingsManager var resultsDirectory = GetResultsDirectory(settings); // Get data collection run settings. Create if not present. var dataCollectionRunSettings = XmlRunSettingsUtilities.GetDataCollectionRunSettings(settings); if (dataCollectionRunSettings == null) { dataCollectionRunSettings = new DataCollectionRunSettings(); } // Create blame configuration element. var XmlDocument = new XmlDocument(); var outernode = XmlDocument.CreateElement("Configuration"); var node = XmlDocument.CreateElement("ResultsDirectory"); outernode.AppendChild(node); node.InnerText = resultsDirectory; // Add collect dump node in configuration element. if (enableDump) { AddCollectDumpNode(collectDumpParameters, XmlDocument, outernode); } // Add blame configuration element to blame collector. foreach (var item in dataCollectionRunSettings.DataCollectorSettingsList) { if (item.FriendlyName.Equals(BlameFriendlyName)) { item.Configuration = outernode; } } // Update run settings. runSettingsManager.UpdateRunSettingsNodeInnerXml(Constants.DataCollectionRunSettingsName, dataCollectionRunSettings.ToXml().InnerXml); }
private static void DisableUnConfiguredDataCollectors(DataCollectionRunSettings dataCollectionRunSettings) { foreach (var dataCollectorSetting in dataCollectionRunSettings.DataCollectorSettingsList) { if (EnabledDataCollectors.Contains(dataCollectorSetting.FriendlyName.ToLower())) { dataCollectorSetting.IsEnabled = true; } else { dataCollectorSetting.IsEnabled = false; } } }
protected virtual DataCollectorSettings ParseRunSettings(string runSettingsFile) { try { using FileStream settingsFileStream = new FileStream(runSettingsFile, FileMode.Open); using StreamReader reader = new StreamReader(settingsFileStream); string xml = reader.ReadToEnd(); DataCollectionRunSettings runSettings = XmlRunSettingsUtilities.GetDataCollectionRunSettings(xml); return(runSettings.DataCollectorSettingsList.FirstOrDefault( s => s.FriendlyName == provider.RunSettingsDataCollectorFriendlyName && s.IsEnabled)); } catch { return(null); } }
private static bool DoesDataCollectorSettingsExist(string friendlyName, DataCollectionRunSettings dataCollectionRunSettings, out DataCollectorSettings dataCollectorSettings) { dataCollectorSettings = null; foreach (var dataCollectorSetting in dataCollectionRunSettings.DataCollectorSettingsList) { if (dataCollectorSetting.FriendlyName.Equals(friendlyName, StringComparison.OrdinalIgnoreCase)) { dataCollectorSettings = dataCollectorSetting; return(true); } } return(false); }
internal static void EnableDataCollectorUsingFriendlyName(string argument, DataCollectionRunSettings dataCollectionRunSettings) { DataCollectorSettings dataCollectorSettings = null; if (!DoesDataCollectorSettingsExist(argument, dataCollectionRunSettings, out dataCollectorSettings)) { dataCollectorSettings = new DataCollectorSettings(); dataCollectorSettings.FriendlyName = argument; dataCollectorSettings.IsEnabled = true; dataCollectionRunSettings.DataCollectorSettingsList.Add(dataCollectorSettings); } else { dataCollectorSettings.IsEnabled = true; } }
public static DataCollectionRunSettings GetDataCollectionRunSettings(string runSettingsXml) { // use XmlReader to avoid loading of the plugins in client code (mainly from VS). if (string.IsNullOrWhiteSpace(runSettingsXml)) { return(null); } try { using (var stringReader = new StringReader(runSettingsXml)) { var reader = XmlReader.Create(stringReader, ReaderSettings); // read to the fist child XmlReaderUtilities.ReadToRootNode(reader); reader.ReadToNextElement(); // Read till we reach DC element or reach EOF while (!string.Equals(reader.Name, Constants.DataCollectionRunSettingsName) && !reader.EOF) { reader.SkipToNextElement(); } // If reached EOF => DC element not there if (reader.EOF) { return(null); } // Reached here => DC element present. return(DataCollectionRunSettings.FromXml(reader)); } } catch (XmlException ex) { throw new SettingsException( string.Format(CultureInfo.CurrentCulture, "{0} {1}", Resources.CommonResources.MalformedRunSettingsFile, ex.Message), ex); } }
/// <inheritdoc /> public void Initialize(string argument) { // 1. Disable all other data collectors. Enable only those data collectors that are explicitely specified by user. // 2. Check if Code Coverage Data Collector is specified in runsettings, if not add it and also set enable to true. // if argument is null or doesn't contain any element, don't do anything. if (string.IsNullOrWhiteSpace(argument)) { throw new CommandLineException( string.Format( CultureInfo.CurrentUICulture, CommandLineResources.DataCollectorFriendlyNameInvalid, argument)); } EnabledDataCollectors.Add(argument.ToLower()); var settings = this.runSettingsManager.ActiveRunSettings?.SettingsXml; if (settings == null) { this.runSettingsManager.AddDefaultRunSettings(); settings = this.runSettingsManager.ActiveRunSettings?.SettingsXml; } var dataCollectionRunSettings = XmlRunSettingsUtilities.GetDataCollectionRunSettings(settings); if (dataCollectionRunSettings == null) { dataCollectionRunSettings = new DataCollectionRunSettings(); } else { // By default, all data collectors present in run settings are enabled, if enabled attribute is not specified. // So explicitely disable those data collectors and enable those which are specified. DisableUnConfiguredDataCollectors(dataCollectionRunSettings); } // Add data collectors if not already present, enable if already present. EnableDataCollectorUsingFriendlyName(argument, dataCollectionRunSettings); this.runSettingsManager.UpdateRunSettingsNodeInnerXml(Constants.DataCollectionRunSettingsName, dataCollectionRunSettings.ToXml().InnerXml); }
/// <summary> /// Finds data collector enabled for the run in data collection settings. /// </summary> /// <param name="dataCollectionSettings">data collection settings</param> /// <returns>List of enabled data collectors</returns> private List <DataCollectorSettings> GetDataCollectorsEnabledForRun(DataCollectionRunSettings dataCollectionSettings) { var runEnabledDataCollectors = new List <DataCollectorSettings>(); foreach (var settings in dataCollectionSettings.DataCollectorSettingsList) { if (settings.IsEnabled) { if (runEnabledDataCollectors.Any(dcSettings => string.Equals(dcSettings.FriendlyName, settings.FriendlyName, StringComparison.OrdinalIgnoreCase))) { // If Uri or assembly qualified type name is repeated, consider data collector as duplicate and ignore it. this.LogWarning(string.Format(CultureInfo.CurrentUICulture, Resources.Resources.IgnoredDuplicateConfiguration, settings.FriendlyName)); continue; } runEnabledDataCollectors.Add(settings); } } return(runEnabledDataCollectors); }
/// <summary> /// Enables coverlet in-proc datacollector /// </summary> internal static void EnableCoverletInProcDataCollector(string argument, DataCollectionRunSettings dataCollectionRunSettings, IRunSettingsProvider runSettingProvider, IFileHelper fileHelper) { DataCollectorSettings dataCollectorSettings = null; if (!DoesDataCollectorSettingsExist(argument, dataCollectionRunSettings, out dataCollectorSettings)) { // Create a new setting with default values dataCollectorSettings = new DataCollectorSettings(); dataCollectorSettings.FriendlyName = argument; dataCollectorSettings.AssemblyQualifiedName = CoverletConstants.CoverletDataCollectorAssemblyQualifiedName; dataCollectorSettings.CodeBase = GetCoverletCodeBasePath(runSettingProvider, fileHelper) ?? CoverletConstants.CoverletDataCollectorCodebase; dataCollectorSettings.IsEnabled = true; dataCollectionRunSettings.DataCollectorSettingsList.Add(dataCollectorSettings); } else { // Set Assembly qualified name and code base if not already set dataCollectorSettings.AssemblyQualifiedName = dataCollectorSettings.AssemblyQualifiedName ?? CoverletConstants.CoverletDataCollectorAssemblyQualifiedName; dataCollectorSettings.CodeBase = (dataCollectorSettings.CodeBase ?? GetCoverletCodeBasePath(runSettingProvider, fileHelper)) ?? CoverletConstants.CoverletDataCollectorCodebase; dataCollectorSettings.IsEnabled = true; } }
internal static void AddDataCollectorToRunSettings(string argument, IRunSettingsProvider runSettingsManager) { EnabledDataCollectors.Add(argument.ToLower()); var settings = runSettingsManager.ActiveRunSettings?.SettingsXml; if (settings == null) { runSettingsManager.AddDefaultRunSettings(); settings = runSettingsManager.ActiveRunSettings?.SettingsXml; } var dataCollectionRunSettings = XmlRunSettingsUtilities.GetDataCollectionRunSettings(settings); if (dataCollectionRunSettings == null) { dataCollectionRunSettings = new DataCollectionRunSettings(); } // Add data collectors if not already present, enable if already present. EnableDataCollectorUsingFriendlyName(argument, dataCollectionRunSettings); runSettingsManager.UpdateRunSettingsNodeInnerXml(Constants.DataCollectionRunSettingsName, dataCollectionRunSettings.ToXml().InnerXml); }
/// <inheritdoc /> public void Initialize(string argument) { // Add this enabled data collectors list, this will ensure Code Coverage isn't disabled when other DCs are configured using /Collect. CollectArgumentExecutor.EnabledDataCollectors.Add(FriendlyName.ToLower()); var settings = this.runSettingsManager.ActiveRunSettings?.SettingsXml; if (settings == null) { this.runSettingsManager.AddDefaultRunSettings(); settings = this.runSettingsManager.ActiveRunSettings?.SettingsXml; } var dataCollectionRunSettings = XmlRunSettingsUtilities.GetDataCollectionRunSettings(settings); if (dataCollectionRunSettings == null) { dataCollectionRunSettings = new DataCollectionRunSettings(); } CollectArgumentExecutor.EnableDataCollectorUsingFriendlyName(FriendlyName, dataCollectionRunSettings); this.runSettingsManager.UpdateRunSettingsNodeInnerXml(Constants.DataCollectionRunSettingsName, dataCollectionRunSettings.ToXml().InnerXml); }
/// <summary> /// Initializes with the argument that was provided with the command. /// </summary> /// <param name="argument">Argument that was provided with the command.</param> public void Initialize(string argument) { // Add Blame Logger this.loggerManager.UpdateLoggerList(BlameFriendlyName, BlameFriendlyName, null); // Add Blame Data Collector CollectArgumentExecutor.AddDataCollectorToRunSettings(BlameFriendlyName, this.runSettingsManager); // Get results directory from RunSettingsManager var runSettings = this.runSettingsManager.ActiveRunSettings; string resultsDirectory = null; if (runSettings != null) { try { RunConfiguration runConfiguration = XmlRunSettingsUtilities.GetRunConfigurationNode(runSettings.SettingsXml); resultsDirectory = RunSettingsUtilities.GetTestResultsDirectory(runConfiguration); } catch (SettingsException se) { if (EqtTrace.IsErrorEnabled) { EqtTrace.Error("EnableBlameArgumentProcessor: Unable to get the test results directory: Error {0}", se); } } } // Add configuration element var settings = runSettings?.SettingsXml; if (settings == null) { runSettingsManager.AddDefaultRunSettings(); settings = runSettings?.SettingsXml; } var dataCollectionRunSettings = XmlRunSettingsUtilities.GetDataCollectionRunSettings(settings); if (dataCollectionRunSettings == null) { dataCollectionRunSettings = new DataCollectionRunSettings(); } var XmlDocument = new XmlDocument(); var outernode = XmlDocument.CreateElement("Configuration"); var node = XmlDocument.CreateElement("ResultsDirectory"); outernode.AppendChild(node); node.InnerText = resultsDirectory; foreach (var item in dataCollectionRunSettings.DataCollectorSettingsList) { if (item.FriendlyName.Equals(BlameFriendlyName)) { item.Configuration = outernode; } } runSettingsManager.UpdateRunSettingsNodeInnerXml(Constants.DataCollectionRunSettingsName, dataCollectionRunSettings.ToXml().InnerXml); }
/// <summary> /// Initialize blame. /// </summary> /// <param name="enableCrashDump">Enable dump.</param> /// <param name="blameParameters">Blame parameters.</param> private void InitializeBlame(bool enableCrashDump, bool enableHangDump, Dictionary <string, string> collectDumpParameters) { // Add Blame Logger LoggerUtilities.AddLoggerToRunSettings(BlameFriendlyName, null, this.runSettingsManager); // Add Blame Data Collector CollectArgumentExecutor.AddDataCollectorToRunSettings(BlameFriendlyName, this.runSettingsManager, this.fileHelper); // Add default run settings if required. if (this.runSettingsManager.ActiveRunSettings?.SettingsXml == null) { this.runSettingsManager.AddDefaultRunSettings();; } var settings = this.runSettingsManager.ActiveRunSettings?.SettingsXml; // Get results directory from RunSettingsManager var resultsDirectory = GetResultsDirectory(settings); // Get data collection run settings. Create if not present. var dataCollectionRunSettings = XmlRunSettingsUtilities.GetDataCollectionRunSettings(settings); if (dataCollectionRunSettings == null) { dataCollectionRunSettings = new DataCollectionRunSettings(); } // Create blame configuration element. var XmlDocument = new XmlDocument(); var outernode = XmlDocument.CreateElement("Configuration"); var node = XmlDocument.CreateElement("ResultsDirectory"); outernode.AppendChild(node); node.InnerText = resultsDirectory; // Add collect dump node in configuration element. if (enableCrashDump) { var dumpParameters = collectDumpParameters .Where(p => new[] { "CollectAlways", "DumpType" }.Contains(p.Key)) .ToDictionary(p => p.Key, p => p.Value); if (!dumpParameters.ContainsKey("DumpType")) { dumpParameters.Add("DumpType", "Full"); } AddCollectDumpNode(dumpParameters, XmlDocument, outernode); } // Add collect hang dump node in configuration element. if (enableHangDump) { var hangDumpParameters = collectDumpParameters .Where(p => new[] { "TestTimeout", "HangDumpType" }.Contains(p.Key)) .ToDictionary(p => p.Key, p => p.Value); if (!hangDumpParameters.ContainsKey("TestTimeout")) { hangDumpParameters.Add("TestTimeout", TimeSpan.FromHours(1).TotalMilliseconds.ToString()); } if (!hangDumpParameters.ContainsKey("HangDumpType")) { hangDumpParameters.Add("HangDumpType", "Full"); } AddCollectHangDumpNode(hangDumpParameters, XmlDocument, outernode); } // Add blame configuration element to blame collector. foreach (var item in dataCollectionRunSettings.DataCollectorSettingsList) { if (item.FriendlyName.Equals(BlameFriendlyName)) { item.Configuration = outernode; } } // Update run settings. runSettingsManager.UpdateRunSettingsNodeInnerXml(Constants.DataCollectionRunSettingsName, dataCollectionRunSettings.ToXml().InnerXml); }
/// <summary> /// Initializes with the argument that was provided with the command. /// </summary> /// <param name="argument">Argument that was provided with the command.</param> public void Initialize(string argument) { bool isDumpEnabled = false; if (!string.IsNullOrWhiteSpace(argument) && argument.Equals(Constants.BlameCollectDumpKey, StringComparison.OrdinalIgnoreCase)) { if (this.environment.OperatingSystem == PlatformOperatingSystem.Windows && this.environment.Architecture != PlatformArchitecture.ARM64 && this.environment.Architecture != PlatformArchitecture.ARM) { isDumpEnabled = true; } else { Output.Warning(false, CommandLineResources.BlameCollectDumpNotSupportedForPlatform); } } // Add Blame Logger EnableLoggerArgumentExecutor.AddLoggerToRunSettings(BlameFriendlyName, this.runSettingsManager); // Add Blame Data Collector CollectArgumentExecutor.AddDataCollectorToRunSettings(BlameFriendlyName, this.runSettingsManager); // Get results directory from RunSettingsManager var runSettings = this.runSettingsManager.ActiveRunSettings; string resultsDirectory = null; if (runSettings != null) { try { RunConfiguration runConfiguration = XmlRunSettingsUtilities.GetRunConfigurationNode(runSettings.SettingsXml); resultsDirectory = RunSettingsUtilities.GetTestResultsDirectory(runConfiguration); } catch (SettingsException se) { if (EqtTrace.IsErrorEnabled) { EqtTrace.Error("EnableBlameArgumentProcessor: Unable to get the test results directory: Error {0}", se); } } } // Add configuration element var settings = runSettings?.SettingsXml; if (settings == null) { runSettingsManager.AddDefaultRunSettings(); settings = runSettings?.SettingsXml; } var dataCollectionRunSettings = XmlRunSettingsUtilities.GetDataCollectionRunSettings(settings); if (dataCollectionRunSettings == null) { dataCollectionRunSettings = new DataCollectionRunSettings(); } var XmlDocument = new XmlDocument(); var outernode = XmlDocument.CreateElement("Configuration"); var node = XmlDocument.CreateElement("ResultsDirectory"); outernode.AppendChild(node); node.InnerText = resultsDirectory; if (isDumpEnabled) { var dumpNode = XmlDocument.CreateElement(Constants.BlameCollectDumpKey); outernode.AppendChild(dumpNode); } foreach (var item in dataCollectionRunSettings.DataCollectorSettingsList) { if (item.FriendlyName.Equals(BlameFriendlyName)) { item.Configuration = outernode; } } runSettingsManager.UpdateRunSettingsNodeInnerXml(Constants.DataCollectionRunSettingsName, dataCollectionRunSettings.ToXml().InnerXml); }