/// <inheritdoc />
 protected override void RunTest(StatusBuilder statusBuilder)
 {
     foreach (var nodeName in NodeNames)
     {
         statusBuilder.MessageBuilder.AppendLine($"Node: \"{nodeName}\":");
         RunTest(nodeName, statusBuilder);
     }
 }
        /// <summary>
        /// Wraps call to protected method RunTest(). Handles exceptions and execution timer.
        /// </summary>
        /// <returns>Status object for RunTest()-call</returns>
        public Status GetStatus(bool isPrivileged = true)
        {
            var statusBuilder = new StatusBuilder(this, isPrivileged);

            try
            {
                RunTest(statusBuilder);
            }
            catch (Exception e)
            {
                statusBuilder.Passed    = false;
                statusBuilder.Exception = e;
                HandleException(e, statusBuilder);
            }

            return(statusBuilder.Status);
        }
        /// <summary>
        /// Wraps call to protected method RunTest(nodeName). Handles exceptions and execution timer.
        /// </summary>
        /// <returns>Status object for RunTest(nodeName)-call</returns>
        public Status GetStatus(string nodeName, bool isPrivileged = true)
        {
            if (!NodeNames.Contains(nodeName))
            {
                throw new KeyNotFoundException($"No node name : {nodeName}");
            }

            var statusBuilder = new StatusBuilder(this, isPrivileged);

            try
            {
                RunTest(nodeName, statusBuilder);
            }
            catch (Exception e)
            {
                statusBuilder.Passed    = false;
                statusBuilder.Exception = e;
                HandleException(e, statusBuilder);
            }
            return(statusBuilder.Status);
        }
 /// <summary>
 /// Must be implemented by derived classes. May throw exceptions. Should merge status in statusBuilder.
 /// </summary>
 protected abstract void RunTest(string node, StatusBuilder statusBuilder);
 /// <summary>
 /// Must be implemented by derived classes. May throw exceptions.
 /// </summary>
 protected abstract void RunTest(StatusBuilder statusBuilder);
 /// <summary>
 /// Optionally implemented by derived classes to handle exceptions thrown during GetStatus().
 /// </summary>
 protected virtual void HandleException(Exception ex, StatusBuilder statusBuilder)
 {
 }