blob: 9ea0d182107d5b9432ee5e211f9cbdca93eeb3fd [file] [log] [blame]
#!/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()