17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#!/usr/bin/env python 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Use of this source code is governed by a BSD-style license that can be 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# found in the LICENSE file. 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch"""Unittest for symbolize.py. 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochThis test uses test libraries generated by the Android g++ toolchain. 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochShould things break you can recreate the libraries and get the updated 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochaddresses and demangled names by running the following: 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cd test/symbolize/ 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch make 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch nm -gC *.so 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch""" 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport StringIO 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport unittest 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport symbolize 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochLIB_A_PATH = '/build/android/tests/symbolize/liba.so' 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochLIB_B_PATH = '/build/android/tests/symbolize/libb.so' 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef RunSymbolizer(text): 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch output = StringIO.StringIO() 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch s = symbolize.Symbolizer(output) 29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch s.write(text) 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return output.getvalue() 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass SymbolizerUnittest(unittest.TestCase): 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def testSingleLineNoMatch(self): 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # Leading '#' is required. 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n' 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # Whitespace should be exactly one space. 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n' 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n' 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # Decimal stack frame numbers are required. 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#0a 0x00000000 ' + LIB_A_PATH + '+0x00000254\n' 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # Hexadecimal addresses are required. 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0xghijklmn ' + LIB_A_PATH + '+0x00000254\n' 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 ' + LIB_A_PATH + '+0xghijklmn\n' 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # Addresses must be exactly 8 characters. 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x0000000 ' + LIB_A_PATH + '+0x00000254\n' 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x000000000 ' + LIB_A_PATH + '+0x00000254\n' 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x0000000 ' + LIB_A_PATH + '+0x0000254\n' 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x000000000 ' + LIB_A_PATH + '+0x000000254\n' 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # Addresses must be prefixed with '0x'. 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 00000000 ' + LIB_A_PATH + '+0x00000254\n' 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 ' + LIB_A_PATH + '+00000254\n' 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # Library name is required. 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000\n' 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 +0x00000254\n' 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # Library name must be followed by offset with no spaces around '+'. 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 ' + LIB_A_PATH + ' +0x00000254\n' 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 ' + LIB_A_PATH + '+ 0x00000254\n' 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 ' + LIB_A_PATH + ' 0x00000254\n' 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 ' + LIB_A_PATH + '+\n' 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, RunSymbolizer(expected)) 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def testSingleLine(self): 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n' 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 A::Bar(char const*)\n' 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch actual = RunSymbolizer(text) 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, actual) 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def testSingleLineWithSurroundingText(self): 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text = 'LEFT #00 0x00000000 ' + LIB_A_PATH + '+0x00000254 RIGHT\n' 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = 'LEFT #00 0x00000000 A::Bar(char const*) RIGHT\n' 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch actual = RunSymbolizer(text) 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, actual) 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def testMultipleLinesSameLibrary(self): 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n' 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text += '#01 0x00000000 ' + LIB_A_PATH + '+0x00000234\n' 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 A::Bar(char const*)\n' 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected += '#01 0x00000000 A::Foo(int)\n' 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch actual = RunSymbolizer(text) 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, actual) 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def testMultipleLinesDifferentLibrary(self): 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n' 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text += '#01 0x00000000 ' + LIB_B_PATH + '+0x00000234\n' 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = '#00 0x00000000 A::Bar(char const*)\n' 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected += '#01 0x00000000 B::Baz(float)\n' 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch actual = RunSymbolizer(text) 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, actual) 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch def testMultipleLinesWithSurroundingTextEverywhere(self): 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text = 'TOP\n' 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text += 'LEFT #00 0x00000000 ' + LIB_A_PATH + '+0x00000254 RIGHT\n' 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text += 'LEFT #01 0x00000000 ' + LIB_B_PATH + '+0x00000234 RIGHT\n' 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text += 'BOTTOM\n' 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected = 'TOP\n' 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected += 'LEFT #00 0x00000000 A::Bar(char const*) RIGHT\n' 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected += 'LEFT #01 0x00000000 B::Baz(float) RIGHT\n' 1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected += 'BOTTOM\n' 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch actual = RunSymbolizer(text) 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch self.assertEqual(expected, actual) 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochif __name__ == '__main__': 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch unittest.main() 131