blob: 826d85228e6835aafe9c557193faafe9d36cf96d [file] [log] [blame]
[email protected]e8044252013-07-11 16:17:561#!/usr/bin/env python
2#
3# Copyright 2013 The Chromium Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""Unittest for symbolize.py.
8
9This test uses test libraries generated by the Android g++ toolchain.
10
11Should things break you can recreate the libraries and get the updated
12addresses and demangled names by running the following:
13 cd test/symbolize/
14 make
15 nm -gC *.so
16"""
17
[email protected]e8044252013-07-11 16:17:5618import StringIO
19import unittest
20
21import symbolize
22
[email protected]2aca494f2013-07-12 20:17:5423LIB_A_PATH = '/build/android/tests/symbolize/liba.so'
24LIB_B_PATH = '/build/android/tests/symbolize/libb.so'
25
[email protected]e8044252013-07-11 16:17:5626def RunSymbolizer(text):
27 output = StringIO.StringIO()
[email protected]74686ef2013-07-18 21:37:4528 s = symbolize.Symbolizer(output)
29 s.write(text)
[email protected]e8044252013-07-11 16:17:5630 return output.getvalue()
31
32
33class SymbolizerUnittest(unittest.TestCase):
34 def testSingleLineNoMatch(self):
35 # Leading '#' is required.
[email protected]2aca494f2013-07-12 20:17:5436 expected = '00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n'
[email protected]e8044252013-07-11 16:17:5637 self.assertEqual(expected, RunSymbolizer(expected))
38
39 # Whitespace should be exactly one space.
[email protected]2aca494f2013-07-12 20:17:5440 expected = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n'
[email protected]e8044252013-07-11 16:17:5641 self.assertEqual(expected, RunSymbolizer(expected))
[email protected]2aca494f2013-07-12 20:17:5442 expected = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n'
[email protected]e8044252013-07-11 16:17:5643 self.assertEqual(expected, RunSymbolizer(expected))
44
45 # Decimal stack frame numbers are required.
[email protected]2aca494f2013-07-12 20:17:5446 expected = '#0a 0x00000000 ' + LIB_A_PATH + '+0x00000254\n'
[email protected]e8044252013-07-11 16:17:5647 self.assertEqual(expected, RunSymbolizer(expected))
48
49 # Hexadecimal addresses are required.
[email protected]2aca494f2013-07-12 20:17:5450 expected = '#00 0xghijklmn ' + LIB_A_PATH + '+0x00000254\n'
51 self.assertEqual(expected, RunSymbolizer(expected))
52 expected = '#00 0x00000000 ' + LIB_A_PATH + '+0xghijklmn\n'
[email protected]e8044252013-07-11 16:17:5653 self.assertEqual(expected, RunSymbolizer(expected))
54
55 # Addresses must be exactly 8 characters.
[email protected]2aca494f2013-07-12 20:17:5456 expected = '#00 0x0000000 ' + LIB_A_PATH + '+0x00000254\n'
[email protected]e8044252013-07-11 16:17:5657 self.assertEqual(expected, RunSymbolizer(expected))
[email protected]2aca494f2013-07-12 20:17:5458 expected = '#00 0x000000000 ' + LIB_A_PATH + '+0x00000254\n'
[email protected]e8044252013-07-11 16:17:5659 self.assertEqual(expected, RunSymbolizer(expected))
60
[email protected]2aca494f2013-07-12 20:17:5461 expected = '#00 0x0000000 ' + LIB_A_PATH + '+0x0000254\n'
62 self.assertEqual(expected, RunSymbolizer(expected))
63 expected = '#00 0x000000000 ' + LIB_A_PATH + '+0x000000254\n'
64 self.assertEqual(expected, RunSymbolizer(expected))
65
66 # Addresses must be prefixed with '0x'.
67 expected = '#00 00000000 ' + LIB_A_PATH + '+0x00000254\n'
68 self.assertEqual(expected, RunSymbolizer(expected))
69 expected = '#00 0x00000000 ' + LIB_A_PATH + '+00000254\n'
[email protected]e8044252013-07-11 16:17:5670 self.assertEqual(expected, RunSymbolizer(expected))
71
72 # Library name is required.
[email protected]2aca494f2013-07-12 20:17:5473 expected = '#00 0x00000000\n'
74 self.assertEqual(expected, RunSymbolizer(expected))
75 expected = '#00 0x00000000 +0x00000254\n'
76 self.assertEqual(expected, RunSymbolizer(expected))
77
78 # Library name must be followed by offset with no spaces around '+'.
79 expected = '#00 0x00000000 ' + LIB_A_PATH + ' +0x00000254\n'
80 self.assertEqual(expected, RunSymbolizer(expected))
81 expected = '#00 0x00000000 ' + LIB_A_PATH + '+ 0x00000254\n'
82 self.assertEqual(expected, RunSymbolizer(expected))
83 expected = '#00 0x00000000 ' + LIB_A_PATH + ' 0x00000254\n'
84 self.assertEqual(expected, RunSymbolizer(expected))
85 expected = '#00 0x00000000 ' + LIB_A_PATH + '+\n'
[email protected]e8044252013-07-11 16:17:5686 self.assertEqual(expected, RunSymbolizer(expected))
87
88 def testSingleLine(self):
[email protected]2aca494f2013-07-12 20:17:5489 text = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n'
90 expected = '#00 0x00000000 A::Bar(char const*)\n'
[email protected]e8044252013-07-11 16:17:5691 actual = RunSymbolizer(text)
92 self.assertEqual(expected, actual)
93
94 def testSingleLineWithSurroundingText(self):
[email protected]2aca494f2013-07-12 20:17:5495 text = 'LEFT #00 0x00000000 ' + LIB_A_PATH + '+0x00000254 RIGHT\n'
96 expected = 'LEFT #00 0x00000000 A::Bar(char const*) RIGHT\n'
[email protected]e8044252013-07-11 16:17:5697 actual = RunSymbolizer(text)
98 self.assertEqual(expected, actual)
99
100 def testMultipleLinesSameLibrary(self):
[email protected]2aca494f2013-07-12 20:17:54101 text = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n'
102 text += '#01 0x00000000 ' + LIB_A_PATH + '+0x00000234\n'
103 expected = '#00 0x00000000 A::Bar(char const*)\n'
104 expected += '#01 0x00000000 A::Foo(int)\n'
[email protected]e8044252013-07-11 16:17:56105 actual = RunSymbolizer(text)
106 self.assertEqual(expected, actual)
107
108 def testMultipleLinesDifferentLibrary(self):
[email protected]2aca494f2013-07-12 20:17:54109 text = '#00 0x00000000 ' + LIB_A_PATH + '+0x00000254\n'
110 text += '#01 0x00000000 ' + LIB_B_PATH + '+0x00000234\n'
111 expected = '#00 0x00000000 A::Bar(char const*)\n'
112 expected += '#01 0x00000000 B::Baz(float)\n'
[email protected]e8044252013-07-11 16:17:56113 actual = RunSymbolizer(text)
114 self.assertEqual(expected, actual)
115
116 def testMultipleLinesWithSurroundingTextEverywhere(self):
117 text = 'TOP\n'
[email protected]2aca494f2013-07-12 20:17:54118 text += 'LEFT #00 0x00000000 ' + LIB_A_PATH + '+0x00000254 RIGHT\n'
119 text += 'LEFT #01 0x00000000 ' + LIB_B_PATH + '+0x00000234 RIGHT\n'
[email protected]e8044252013-07-11 16:17:56120 text += 'BOTTOM\n'
121 expected = 'TOP\n'
[email protected]2aca494f2013-07-12 20:17:54122 expected += 'LEFT #00 0x00000000 A::Bar(char const*) RIGHT\n'
123 expected += 'LEFT #01 0x00000000 B::Baz(float) RIGHT\n'
[email protected]e8044252013-07-11 16:17:56124 expected += 'BOTTOM\n'
125 actual = RunSymbolizer(text)
126 self.assertEqual(expected, actual)
127
128
129if __name__ == '__main__':
130 unittest.main()