testing/unexpected_passes_common/data_types.py
def SplitByStaleness(self):
    """Separates stored data based on expectation staleness.

    Returns:
      Three TestExpectationMaps (stale_dict, semi_stale_dict, active_dict). All
      three combined contain the information of |self|. |stale_dict| contains
      entries for expectations that are no longer being helpful,
      |semi_stale_dict| contains entries for expectations that might be
      removable or modifiable, but have at least one failed test run.
      |active_dict| contains entries for expectations that are preventing
      failures on all builders they're active on, and thus shouldn't be removed.
    """
    stale_dict = TestExpectationMap()
    semi_stale_dict = TestExpectationMap()
    active_dict = TestExpectationMap()

    # This initially looks like a good target for using
    # TestExpectationMap's iterators since there are many nested loops.
    # However, we need to reset state in different loops, and the alternative of
    # keeping all the state outside the loop and resetting under certain
    # conditions ends up being less readable than just using nested loops.
    for expectation_file, expectation_map in self.items():
      for expectation, builder_map in expectation_map.items():
        # A temporary map to hold data so we can later determine whether an
        # expectation is stale, semi-stale, or active.
        tmp_map = {
            FULL_PASS: BuilderStepMap(),
            NEVER_PASS: BuilderStepMap(),
            PARTIAL_PASS: BuilderStepMap(),
        }

        split_stats_map = builder_map.SplitBuildStatsByPass(expectation)
        for builder_name, (fully_passed, never_passed,
                           partially_passed) in split_stats_map.items():
          if fully_passed:
            tmp_map[FULL_PASS][builder_name] = fully_passed
          if never_passed:
            tmp_map[NEVER_PASS][builder_name] = never_passed
          if partially_passed:
            tmp_map[PARTIAL_PASS][builder_name] = partially_passed

        def _CopyPassesIntoBuilderMap(builder_map, pass_types):
          for pt in pass_types:
            for builder, steps in tmp_map[pt].items():
              builder_map.setdefault(builder, StepBuildStatsMap()).update(steps)

        # Handle the case of a stale expectation.
        if not (tmp_map[NEVER_PASS] or tmp_map[PARTIAL_PASS]):
          builder_map = stale_dict.setdefault(
              expectation_file,
              ExpectationBuilderMap()).setdefault(expectation, BuilderStepMap())
          _CopyPassesIntoBuilderMap(builder_map, [FULL_PASS])
        # Handle the case of an active expectation.
        elif not tmp_map[FULL_PASS]:
          builder_map = active_dict.setdefault(
              expectation_file,
              ExpectationBuilderMap()).setdefault(expectation, BuilderStepMap())
          _CopyPassesIntoBuilderMap(builder_map, [NEVER_PASS, PARTIAL_PASS])
        # Handle the case of a semi-stale expectation.
        else:
          # TODO(crbug.com/998329): Sort by pass percentage so it's easier to
          # find problematic builders without highlighting.
          builder_map = semi_stale_dict.setdefault(
              expectation_file,
              ExpectationBuilderMap()).setdefault(expectation, BuilderStepMap())
          _CopyPassesIntoBuilderMap(builder_map,
                                    [FULL_PASS, PARTIAL_PASS, NEVER_PASS])
    return stale_dict, semi_stale_dict, active_dict
Separates stored data based on expectation staleness.

    Returns:
      Three TestExpectationMaps (stale_dict, semi_stale_dict, active_dict). All
      three combined contain the information of |self|. |stale_dict| contains
      entries for expectations that are no longer being helpful,
      |semi_stale_dict| contains entries for expectations that might be
      removable or modifiable, but have at least one failed test run.
      |active_dict| contains entries for expectations that are preventing
      failures on all builders they're active on, and thus shouldn't be removed.
    
Separates stored data based on expectation staleness.
Separates stored data based on expectation staleness .
def SplitByStaleness(self):
    stale_dict = TestExpectationMap()
    semi_stale_dict = TestExpectationMap()
    active_dict = TestExpectationMap()
    for expectation_file, expectation_map in self.items():
      for expectation, builder_map in expectation_map.items():
        tmp_map = {
            FULL_PASS: BuilderStepMap(),
            NEVER_PASS: BuilderStepMap(),
            PARTIAL_PASS: BuilderStepMap(),
        }
        split_stats_map = builder_map.SplitBuildStatsByPass(expectation)
        for builder_name, (fully_passed, never_passed,
                           partially_passed) in split_stats_map.items():
          if fully_passed:
            tmp_map[FULL_PASS][builder_name] = fully_passed
          if never_passed:
            tmp_map[NEVER_PASS][builder_name] = never_passed
          if partially_passed:
            tmp_map[PARTIAL_PASS][builder_name] = partially_passed
        def _CopyPassesIntoBuilderMap(builder_map, pass_types):
          for pt in pass_types:
            for builder, steps in tmp_map[pt].items():
              builder_map.setdefault(builder, StepBuildStatsMap()).update(steps)
        if not (tmp_map[NEVER_PASS] or tmp_map[PARTIAL_PASS]):
          builder_map = stale_dict.setdefault(
              expectation_file,
              ExpectationBuilderMap()).setdefault(expectation, BuilderStepMap())
          _CopyPassesIntoBuilderMap(builder_map, [FULL_PASS])
        elif not tmp_map[FULL_PASS]:
          builder_map = active_dict.setdefault(
              expectation_file,
              ExpectationBuilderMap()).setdefault(expectation, BuilderStepMap())
          _CopyPassesIntoBuilderMap(builder_map, [NEVER_PASS, PARTIAL_PASS])
        else:
          builder_map = semi_stale_dict.setdefault(
              expectation_file,
              ExpectationBuilderMap()).setdefault(expectation, BuilderStepMap())
          _CopyPassesIntoBuilderMap(builder_map,
                                    [FULL_PASS, PARTIAL_PASS, NEVER_PASS])
    return stale_dict, semi_stale_dict, active_dict
def SplitByStaleness ( self ) : stale_dict = TestExpectationMap ( ) semi_stale_dict = TestExpectationMap ( ) active_dict = TestExpectationMap ( ) for expectation_file , expectation_map in self . items ( ) : for expectation , builder_map in expectation_map . items ( ) : tmp_map = { FULL_PASS : BuilderStepMap ( ) , NEVER_PASS : BuilderStepMap ( ) , PARTIAL_PASS : BuilderStepMap ( ) , } split_stats_map = builder_map . SplitBuildStatsByPass ( expectation ) for builder_name , ( fully_passed , never_passed , partially_passed ) in split_stats_map . items ( ) : if fully_passed : tmp_map [ FULL_PASS ] [ builder_name ] = fully_passed if never_passed : tmp_map [ NEVER_PASS ] [ builder_name ] = never_passed if partially_passed : tmp_map [ PARTIAL_PASS ] [ builder_name ] = partially_passed def _CopyPassesIntoBuilderMap ( builder_map , pass_types ) : for pt in pass_types : for builder , steps in tmp_map [ pt ] . items ( ) : builder_map . setdefault ( builder , StepBuildStatsMap ( ) ) . update ( steps ) if not ( tmp_map [ NEVER_PASS ] or tmp_map [ PARTIAL_PASS ] ) : builder_map = stale_dict . setdefault ( expectation_file , ExpectationBuilderMap ( ) ) . setdefault ( expectation , BuilderStepMap ( ) ) _CopyPassesIntoBuilderMap ( builder_map , [ FULL_PASS ] ) elif not tmp_map [ FULL_PASS ] : builder_map = active_dict . setdefault ( expectation_file , ExpectationBuilderMap ( ) ) . setdefault ( expectation , BuilderStepMap ( ) ) _CopyPassesIntoBuilderMap ( builder_map , [ NEVER_PASS , PARTIAL_PASS ] ) else : builder_map = semi_stale_dict . setdefault ( expectation_file , ExpectationBuilderMap ( ) ) . setdefault ( expectation , BuilderStepMap ( ) ) _CopyPassesIntoBuilderMap ( builder_map , [ FULL_PASS , PARTIAL_PASS , NEVER_PASS ] ) return stale_dict , semi_stale_dict , active_dict
Separates stored data based on expectation staleness.
Separates stored data based on expectation staleness .
"""Separates stored data based on expectation staleness.

    Returns:
      Three TestExpectationMaps (stale_dict, semi_stale_dict, active_dict). All
      three combined contain the information of |self|. |stale_dict| contains
      entries for expectations that are no longer being helpful,
      |semi_stale_dict| contains entries for expectations that might be
      removable or modifiable, but have at least one failed test run.
      |active_dict| contains entries for expectations that are preventing
      failures on all builders they're active on, and thus shouldn't be removed.
    """ # This initially looks like a good target for using # TestExpectationMap's iterators since there are many nested loops. # However, we need to reset state in different loops, and the alternative of # keeping all the state outside the loop and resetting under certain # conditions ends up being less readable than just using nested loops. # A temporary map to hold data so we can later determine whether an # expectation is stale, semi-stale, or active. # Handle the case of a stale expectation. # Handle the case of an active expectation. # Handle the case of a semi-stale expectation. # TODO(crbug.com/998329): Sort by pass percentage so it's easier to # find problematic builders without highlighting.
Three TestExpectationMaps (stale_dict, semi_stale_dict, active_dict). All
three combined contain the information of |self|. |stale_dict| contains
entries for expectations that are no longer being helpful,
|semi_stale_dict| contains entries for expectations that might be
removable or modifiable, but have at least one failed test run.
|active_dict| contains entries for expectations that are preventing
failures on all builders they're active on, and thus shouldn't be removed.
Three TestExpectationMaps ( stale_dict semi_stale_dict active_dict ) . All three combined contain the information of |self| . |stale_dict| contains entries for expectations that are no longer being helpful |semi_stale_dict| contains entries for expectations that might be removable or modifiable but have at least one failed test run . |active_dict| contains entries for expectations that are preventing failures on all builders they ' re active on and thus shouldn ' t be removed .
self