def testCreateNameToSymbolInfo(self):
     name_to_symbol_info = symbol_extractor.CreateNameToSymbolInfo(
         self.symbol_infos)
     self.assertEquals(len(name_to_symbol_info), 3)
     for i in range(3):
         name = self.symbol_infos[i].name
         self.assertIn(name, name_to_symbol_info)
         self.assertEquals(self.symbol_infos[i], name_to_symbol_info[name])
    def testSymbolCollisions(self):
        symbol_infos_with_collision = list(self.symbol_infos)
        symbol_infos_with_collision.append(
            symbol_extractor.SymbolInfo('secondNameAtOffset', 0x84, 42,
                                        '.text'))

        # The symbol added above should not affect the output.
        name_to_symbol_info = symbol_extractor.CreateNameToSymbolInfo(
            self.symbol_infos)
        self.assertEquals(len(name_to_symbol_info), 3)
        for i in range(3):
            name = self.symbol_infos[i].name
            self.assertIn(name, name_to_symbol_info)
            self.assertEquals(self.symbol_infos[i], name_to_symbol_info[name])
def _CountMisorderedSymbols(symbols, symbol_infos):
    """Count the number of misordered symbols, and log them.

  Args:
    symbols: ordered sequence of symbols from the orderfile
    symbol_infos: ordered list of SymbolInfo from the binary

  Returns:
    (misordered_pairs_count, matched_symbols_count, unmatched_symbols_count)
  """
    name_to_symbol_info = symbol_extractor.CreateNameToSymbolInfo(symbol_infos)
    matched_symbol_infos = []
    missing_count = 0
    misordered_count = 0

    # Find the SymbolInfo matching the orderfile symbols in the binary.
    for symbol in symbols:
        if symbol in name_to_symbol_info:
            matched_symbol_infos.append(name_to_symbol_info[symbol])
        else:
            missing_count += 1
            if missing_count < _MAX_WARNINGS_TO_PRINT:
                logging.warning(
                    'Symbol "%s" is in the orderfile, not in the binary' %
                    symbol)
    logging.info(
        '%d matched symbols, %d un-matched (Only the first %d unmatched'
        ' symbols are shown)' %
        (len(matched_symbol_infos), missing_count, _MAX_WARNINGS_TO_PRINT))

    # In the order of the orderfile, find all the symbols that are at an offset
    # smaller than their immediate predecessor, and record the pair.
    previous_symbol_info = symbol_extractor.SymbolInfo(name='',
                                                       offset=-1,
                                                       size=0,
                                                       section='')
    for symbol_info in matched_symbol_infos:
        if symbol_info.offset < previous_symbol_info.offset and not (
                _IsSameMethod(symbol_info.name, previous_symbol_info.name)):
            logging.warning('Misordered pair: %s - %s' %
                            (str(previous_symbol_info), str(symbol_info)))
            misordered_count += 1
        previous_symbol_info = symbol_info
    return (misordered_count, len(matched_symbol_infos), missing_count)