/**
   * Summarize the last test results from the passed set of jobs, including the packages of the job.
   * If a job doesn't include any tests, add a 0 summary.
   *
   * @param jobs
   * @return
   */
  public static TestResultSummary getDetailedTestResultSummary(Collection<TopLevelItem> jobs) {
    TestResultSummary summary = new TestResultSummary();

    for (TopLevelItem item : jobs) {
      if (item instanceof Job) {
        Job job = (Job) item;

        // create summary for the last run
        Run run = job.getLastBuild();
        if (run != null) {
          TestResult testResult = TestUtil.getTestResult(job.getLastBuild());
          summary.addTestResult(testResult);

          AbstractTestResultAction tra = run.getAction(AbstractTestResultAction.class);

          if (tra != null) {
            if (tra.getResult() instanceof MetaTabulatedResult) {
              MetaTabulatedResult result = (MetaTabulatedResult) tra.getResult();

              // add test results for the packages
              for (hudson.tasks.test.TestResult child : result.getChildren()) {
                PackageResult sub =
                    new PackageResult(
                        child, child.getTotalCount(), child.getFailCount(), child.getSkipCount());
                testResult.getPackageResults().add(sub);
              }
            }
          }
        }
      }
    }

    return summary;
  }
 private int getTestAge(TestResult result) {
   if (result.isPassed()) return 0;
   else if (result.getOwner() != null) {
     return result.getOwner().getNumber() - result.getFailedSince() + 1;
   } else {
     return 0;
   }
 }
  private int outputTest(
      StringBuilder buffer,
      TestResult failedTest,
      boolean showStack,
      boolean showMessage,
      int lengthLeft) {
    StringBuilder local = new StringBuilder();

    local.append(failedTest.isPassed() ? "PASSED" : "FAILED");
    local.append(":  ");

    if (failedTest instanceof CaseResult) {
      local.append(((CaseResult) failedTest).getClassName());
    } else {
      local.append(failedTest.getFullName());
    }
    local.append(".");

    local.append(failedTest.getDisplayName());
    local.append("\n");

    if (showMessage) {
      local.append("\n");
      local.append("Error Message:\n");
      local.append(failedTest.getErrorDetails());
      local.append("\n");
    }

    if (showStack) {
      local.append("\n");
      local.append("Stack Trace:\n");
      local.append(failedTest.getErrorStackTrace());
      local.append("\n");
    }

    if (showMessage || showStack) {
      local.append("\n");
    }

    if (local.length() > lengthLeft) {
      local.setLength(lengthLeft);
    }

    buffer.append(local.toString());
    return local.length();
  }
 @Override
 public String getTestResultPath(TestResult it) {
   // Prepend Configuration path
   return it.getOwner().getParent().getShortUrl() + super.getTestResultPath(it);
 }