/// <summary> /// Gets a hash code for this instance. /// Calculated as recommended at http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx /// </summary> /// <returns></returns> public override int GetHashCode() { return (MethodName.GetHashCode() ^ (DetailedMessage == null ? 0 : DetailedMessage.GetHashCode()) ^ (Message == null ? 0 : Message.GetHashCode())); }
public override void Process(IInstanceResourceContext data, ITestOutputContext output) { var duplicates = new Map <List <string> >(); var resultConfig = data.SitecoreInfo.Configuration; var configurations = resultConfig.SelectElements(ContentSearchXPath + "/*").Select(x => x.Name).Distinct().ToArray(); foreach (var configuration in configurations) { var configurationElements = resultConfig.SelectElements($"{ContentSearchXPath}/{configuration}"); if (configurationElements.Length > 1) { var list = duplicates.GetOrAdd(configuration, new List <string>()); list.AddRange(configurationElements.Select(x => x.ToString(XmlPrintMode.HeaderOnly))); } } if (duplicates.Any()) { var shortMessage = "There are duplicates in ContentSearch configuration nodes that may lead to unpredictable behavior."; var detailed = new DetailedMessage( new Text("The following ContentSearch configurations are duplicated:"), new BulletedList(duplicates.Select(x => new Container( new Text(x.Key), new BulletedList(x.Value.Select(z => new Code(z))) ))), new Text("To resolve, rewise the configuration files and check the difference between defintions.")); output.Warning(shortMessage, null, detailed); } }
public static IOperationResult Failed(string operationType, string message, DetailedMessage detailedMessages = null) { if (string.IsNullOrWhiteSpace(message)) throw new ArgumentNullException("message"); return Failed(operationType, new[] { message }, detailedMessages: detailedMessages); }
public void Debug(Exception ex, DetailedMessage message) { Assert.ArgumentNotNull(ex, nameof(ex)); Assert.ArgumentNotNull(message, nameof(message)); Debug(new DetailedMessage(message.Items.Concat(new[] { new Text(". Exception:"), new CodeBlock(ex.PrintException()) }))); }
public TestOutput(TestResultState state, [NotNull] ShortMessage message, Uri link = null, DetailedMessage data = null, string instanceName = null) { Assert.ArgumentNotNull(message, nameof(message)); State = state; Message = message; Link = link; Detailed = data; Instance = instanceName; }
public static IOperationResult Failed(string operationType, ICollection<string> messages, DetailedMessage detailedMessages = null) { if (string.IsNullOrWhiteSpace(operationType)) throw new ArgumentNullException("operationType"); var result = new OperationResult { OperationType = operationType, Success = false, Messages = messages ?? new string[0], DetailedMessages = detailedMessages ?? new DetailedMessage(), }; return result; }
protected DetailedMessage GetMessage(Map<Map<CacheSizeDetails>> result) { var rows = result .Where(x => x.Value.Any()) .SelectMany(d => d.Value.Select(c => new TableRow( new Pair("Cache", $"{d.Key}[{c.Key}]"), new Pair("Size", c.Value.Value.Value.ToString()), new Pair("Comment", c.Value.Comment) ))) .ToArray(); var message = new DetailedMessage( new Table(rows), new Text("Read more in CMS Performance Tuning Guide on how to adjust cache settings.")); return message; }
public override void Process(ISolutionResourceContext data, ITestOutputContext output) { var numberOfSearchEnabledInstances = data.Values.Count(x => x.SitecoreInfo.ContentSearchIndexes.Any()); if (numberOfSearchEnabledInstances < 2) { // if total number of Sitecore instances that actually use search is 1 or 0, we don't need to offer Solr return; } var index2instances = new Map <List <string> >(); foreach (var instance in data.Values) { var luceneIndexes = instance.SitecoreInfo.ContentSearchIndexes.Values.Where(i => i.SearchProvider == SearchProvider.Lucene).ToArray(); foreach (var index in luceneIndexes) { var instances = index2instances.GetOrAdd(index.Id, new List <string>()); Assert.IsNotNull(instances); instances.Add(instance.SitecoreInfo.InstanceName); } } if (index2instances.Any()) { var rows = new List <TableRow>(); foreach (var indexName in index2instances.Keys) { var instances = index2instances[indexName]; rows.Add(new TableRow(new[] { new Pair("Index", indexName) } .Concat(instances.Select(z => new Pair(z, "Lucene"))))); } var text = "The solution is configured to use Lucene search engine for the number of Content Search indexes listed below. It is highly " + "recommended to consider upgrading your solution to use Solr, as Lucene cannot deliver acceptable level of stability, consistency and maintainability."; var message = new ShortMessage(new Text(text)); var detailed = new DetailedMessage(new Table(rows.ToArray())); output.Warning(message, detailed: detailed); } }
public override void Process(IInstanceResourceContext data, ITestOutputContext output) { var obsoleteConfigurations = GetObsoleteConfigurations(data).ToArray(); foreach (var configuration in obsoleteConfigurations) { var configurationName = configuration.Name; var configurationFiles = configuration.Files; foreach (var configurationFile in data.SitecoreInfo.IncludeFiles.Values) { var configurationElements = configurationFile.Configuration.SelectElements($"{ContentSearchXPath}/{configurationName}"); if (configurationElements.Any(x => TypeRef.Parse(x.GetAttribute("type")) == configuration.Type)) { configurationFiles.Add(configurationFile.FilePath.Substring(configurationFile.FilePath.IndexOf("App_Config"))); } } } if (obsoleteConfigurations.Any(x => x.Files.Any())) { var defaultType = TypeRef.Parse(data.SitecoreInfo.SitecoreDefaults.Configuration.SelectSingleElement($"{ContentSearchXPath}/configuration").GetAttribute("type")); Assert.IsNotNull(defaultType); var shortMessage = "ContentSearch configuration uses obsolete LuceneSearchConfiguration that may lead to unpredictable behavior."; var detailed = new DetailedMessage( new Text("The following ContentSearch configurations are obsolete:"), new BulletedList(obsoleteConfigurations.Select(x => new Container( new Code(x.Definition.ToString(XmlPrintMode.HeaderOnly)), new BulletedList(x.Files)))), new Text("To resolve, change configuration type either to "), new Code(defaultType.ToString()), new Text(", or to a custom class that inherits from it.")); output.Warning(shortMessage, null, detailed); } }
public void Warning(ShortMessage message, Uri url = null, DetailedMessage detailed = null, string instanceName = null) { Inner.Warning(message, url, detailed, instanceName ?? InstanceName); }
private void AddResult(TestResultState state, [CanBeNull] Uri link, [NotNull] ShortMessage message, [CanBeNull] DetailedMessage detailed, [CanBeNull] string instanceName) { Assert.ArgumentNotNull(message, nameof(message)); Log.Info($"Test output: {state}, {message}{(link != null ? ", " + link.AbsoluteUri : null)}"); Results.Add(new TestOutput(state, message, link, detailed, instanceName)); }
public void Debug(DetailedMessage message) { Assert.ArgumentNotNull(message, nameof(message)); Results.DebugLogs.Add(message); }
public void CannotRun(ShortMessage message, Uri url, DetailedMessage detailed, string instanceName) { Assert.ArgumentNotNull(message, nameof(message)); AddResult(TestResultState.CannotRun, url, message, detailed, instanceName); }
public void Debug(Exception exception, DetailedMessage detailed) { Inner.Debug(exception, detailed); }
public void Debug(DetailedMessage detailed) { Inner.Debug(detailed); }
public void CannotRun(ShortMessage message, Uri url = null, DetailedMessage detailed = null, string instanceName = null) { Inner.CannotRun(message, url, detailed, instanceName ?? InstanceName); }
public static Task<IOperationResult> FailedAsync(string operationType, string message, DetailedMessage detailedMessages = null) { return Task.FromResult(Failed(operationType, message, detailedMessages)); }