public void setParentAction(SuiteGroupResultAction parentAction) {
    if (this.parentAction == parentAction) {
      return;
    }

    this.parentAction = parentAction;
    // Tell all of our children about the parent action, too.
    for (TestResult group : childrenBySuiteName.values()) {
      group.setParentAction(parentAction);
    }
  }
  private void updateCache() {
    failedTestsBySuiteName.clear();
    skippedTestsBySuiteName.clear();
    passedTestsBySuiteName.clear();
    allFailedTests.clear();
    allPassedTests.clear();
    allSkippedTests.clear();
    passCount = 0;
    failCount = 0;
    skipCount = 0;
    float durationAccum = 0.0f;

    Collection<String> suiteNames = childrenBySuiteName.keySet();
    for (String l : suiteNames) {
      TestResult testResult = childrenBySuiteName.get(l);
      testResult.setParentAction(parentAction);
      testResult.tally();
      passCount += testResult.getPassCount();
      failCount += testResult.getFailCount();
      skipCount += testResult.getSkipCount();

      durationAccum += testResult.getDuration();
      if (testResult.isPassed()) {
        storeInCache(l, passedTestsBySuiteName, testResult);
        allPassedTests.add(testResult);
      } else if (testResult.getFailCount() > 0) {
        storeInCache(l, failedTestsBySuiteName, testResult);
        allFailedTests.add(testResult);
      } else {
        storeInCache(l, skippedTestsBySuiteName, testResult);
        allSkippedTests.add(testResult);
      }
    }

    duration = durationAccum;
    totalCount = passCount + failCount + skipCount;

    cacheDirty = false;
  }