/// <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()));
 }
예제 #2
0
        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;
        }
예제 #7
0
    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));
 }