@Override
  public Result getResultThresholdNumber(
      XUnitLog log,
      AbstractBuild<?, ?> build,
      TestResultAction testResultAction,
      TestResultAction previousTestResultAction) {

    int failedCount = testResultAction.getFailCount();

    int previousFailedCount = 0;
    if (previousTestResultAction != null) {
      previousFailedCount = previousTestResultAction.getFailCount();
    }
    int newFailedCount = failedCount - previousFailedCount;

    return getResultThresholdNumber(log, failedCount, newFailedCount);
  }
  /**
   * Record the test results into the current build.
   *
   * @param junitFilePattern
   * @param build
   * @param listener
   * @return
   * @throws InterruptedException
   * @throws IOException
   */
  private boolean recordTestResult(
      String junitFilePattern, AbstractBuild<?, ?> build, BuildListener listener)
      throws InterruptedException, IOException {
    TestResultAction existingAction = build.getAction(TestResultAction.class);
    TestResultAction action;

    try {
      final long buildTime = build.getTimestamp().getTimeInMillis();

      TestResult existingTestResults = null;
      if (existingAction != null) {
        existingTestResults = existingAction.getResult();
      }
      TestResult result = getTestResult(junitFilePattern, build, existingTestResults, buildTime);

      if (existingAction == null) {
        action = new TestResultAction(build, result, listener);
      } else {
        action = existingAction;
        action.setResult(result, listener);
      }
      if (result.getPassCount() == 0 && result.getFailCount() == 0)
        new AbortException("None of the test reports contained any result");
    } catch (AbortException e) {
      if (build.getResult() == Result.FAILURE)
        // most likely a build failed before it gets to the test phase.
        // don't report confusing error message.
        return true;

      listener.getLogger().println(e.getMessage());
      build.setResult(Result.FAILURE);
      return true;
    }

    if (existingAction == null) {
      build.getActions().add(action);
    }

    if (action.getResult().getFailCount() > 0) build.setResult(Result.UNSTABLE);

    return true;
  }
  @Override
  public Result getResultThresholdPercent(
      XUnitLog log,
      AbstractBuild<?, ?> build,
      TestResultAction testResultAction,
      TestResultAction previousTestResultAction) {

    double count = testResultAction.getTotalCount();

    double failedCount = testResultAction.getFailCount();
    double percentFailed = (failedCount / count) * 100;

    double previousFailedCount = 0;
    if (previousTestResultAction != null) {
      previousFailedCount = previousTestResultAction.getFailCount();
    }
    double newFailedCount = failedCount - previousFailedCount;
    double percentNewFailed = (newFailedCount / count) * 100;

    return getResultThresholdPercent(log, percentFailed, percentNewFailed);
  }