#!/usr/bin/python # Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import unittest import cyglog_to_orderfile import os import symbol_extractor import sys sys.path.insert( 0, os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, 'third_party', 'android_platform', 'development', 'scripts')) import symbol class TestCyglogToOrderfile(unittest.TestCase): def testParseLogLines(self): lines = """5086e000-52e92000 r-xp 00000000 b3:02 51276 libchromeview.so secs usecs pid:threadid func START 1314897086 795828 3587:1074648168 0x509e105c 1314897086 795874 3587:1074648168 0x509e0eb4 END""".split('\n') offsets = cyglog_to_orderfile._ParseLogLines(lines) self.assertListEqual( offsets, [0x509e105c - 0x5086e000, 0x509e0eb4 - 0x5086e000]) def testFindSymbolInfosAtOffsetExactMatch(self): offset_map = {0x10: [symbol_extractor.SymbolInfo( name='Symbol', offset=0x10, size=0x13, section='.text')]} functions = cyglog_to_orderfile._FindSymbolInfosAtOffset(offset_map, 0x10) self.assertEquals(len(functions), 1) self.assertEquals(functions[0], offset_map[0x10][0]) def testFindSymbolInfosAtOffsetInexactMatch(self): offset_map = {0x10: [symbol_extractor.SymbolInfo( name='Symbol', offset=0x10, size=0x13, section='.text')]} functions = cyglog_to_orderfile._FindSymbolInfosAtOffset(offset_map, 0x11) self.assertEquals(len(functions), 1) self.assertEquals(functions[0], offset_map[0x10][0]) def testFindSymbolInfosAtOffsetNoMatch(self): offset_map = {0x10: [symbol_extractor.SymbolInfo( name='Symbol', offset=0x10, size=0x13, section='.text')]} self.assertRaises( cyglog_to_orderfile.SymbolNotFoundException, cyglog_to_orderfile._FindSymbolInfosAtOffset, offset_map, 0x12) def testWarnAboutDuplicates(self): offsets = [0x1, 0x2, 0x3] self.assertTrue(cyglog_to_orderfile._WarnAboutDuplicates(offsets)) offsets.append(0x1) self.assertFalse(cyglog_to_orderfile._WarnAboutDuplicates(offsets)) def testSameCtorOrDtorNames(self): if not os.path.exists(symbol.ToolPath('c++filt')): print 'Skipping test dependent on missing c++filt binary.' return self.assertTrue(cyglog_to_orderfile._SameCtorOrDtorNames( '_ZNSt3__119istreambuf_iteratorIcNS_11char_traitsIcEEEC1Ev', '_ZNSt3__119istreambuf_iteratorIcNS_11char_traitsIcEEEC2Ev')) self.assertTrue(cyglog_to_orderfile._SameCtorOrDtorNames( '_ZNSt3__119istreambuf_iteratorIcNS_11char_traitsIcEEED1Ev', '_ZNSt3__119istreambuf_iteratorIcNS_11char_traitsIcEEED2Ev')) self.assertFalse(cyglog_to_orderfile._SameCtorOrDtorNames( '_ZNSt3__119istreambuf_iteratorIcNS_11char_traitsIcEEEC1Ev', '_ZNSt3__119foo_iteratorIcNS_11char_traitsIcEEEC1Ev')) self.assertFalse(cyglog_to_orderfile._SameCtorOrDtorNames( '_ZNSt3__119istreambuf_iteratorIcNS_11char_traitsIcEEE', '_ZNSt3__119istreambuf_iteratorIcNS_11char_traitsIcEEE')) def testOutputOrderfile(self): class FakeOutputFile(object): def __init__(self): self.writes = [] def write(self, data): self.writes.append(data) # One symbol not matched, one with an odd address, one regularly matched # And two symbols aliased to the same address offsets = [0x12, 0x17] offset_to_symbol_infos = { 0x10: [symbol_extractor.SymbolInfo( name='Symbol', offset=0x10, size=0x13, section='dummy')], 0x12: [symbol_extractor.SymbolInfo( name='Symbol2', offset=0x12, size=0x13, section='dummy')], 0x16: [symbol_extractor.SymbolInfo( name='Symbol3', offset=0x16, size=0x13, section='dummy'), symbol_extractor.SymbolInfo( name='Symbol32', offset=0x16, size=0x13, section='dummy'),]} symbol_to_sections_map = { 'Symbol': ['.text.Symbol'], 'Symbol2': ['.text.Symbol2', '.text.hot.Symbol2'], 'Symbol3': ['.text.Symbol3'], 'Symbol32': ['.text.Symbol32']} fake_output = FakeOutputFile() cyglog_to_orderfile._OutputOrderfile( offsets, offset_to_symbol_infos, symbol_to_sections_map, fake_output) expected = """.text.Symbol2 .text.hot.Symbol2 .text.Symbol3 .text.Symbol32 """ self.assertEquals(expected, ''.join(fake_output.writes)) if __name__ == '__main__': unittest.main()