OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
| 6 import unittest |
| 7 |
6 import patch_orderfile | 8 import patch_orderfile |
7 import unittest | 9 import symbol_extractor |
8 | 10 |
9 | 11 |
10 class TestPatchOrderFile(unittest.TestCase): | 12 class TestPatchOrderFile(unittest.TestCase): |
11 def testRemoveClone(self): | 13 def testRemoveClone(self): |
12 no_clone = "this.does.not.contain.clone" | 14 no_clone = "this.does.not.contain.clone" |
13 self.assertEquals(no_clone, patch_orderfile._RemoveClone(no_clone)) | 15 self.assertEquals(no_clone, patch_orderfile._RemoveClone(no_clone)) |
14 with_clone = "this.does.contain.clone." | 16 with_clone = "this.does.contain.clone." |
15 self.assertEquals( | 17 self.assertEquals( |
16 "this.does.contain", patch_orderfile._RemoveClone(with_clone)) | 18 "this.does.contain", patch_orderfile._RemoveClone(with_clone)) |
17 | 19 |
18 def testGetSymbolInfosFromStreamWithSize(self): | 20 def testAliasClonedSymbols(self): |
19 lines = [ | 21 symbol_infos = [ |
20 "00210d59 00000002 t _ZN34BrowserPluginHostMsg_Attach_ParamsD2Ev"] | 22 symbol_extractor.SymbolInfo(name='aSymbol', offset=0x42, size=0x12, |
21 test_name = "_ZN34BrowserPluginHostMsg_Attach_ParamsD2Ev" | 23 section='.text'), |
22 test_offset = 0x210d59 | 24 symbol_extractor.SymbolInfo(name='aSymbol.clone.', offset=8, size=1, |
| 25 section='.text')] |
23 (offset_to_symbol_infos, name_to_symbol_infos) = \ | 26 (offset_to_symbol_infos, name_to_symbol_infos) = \ |
24 patch_orderfile._GetSymbolInfosFromStream(lines) | 27 patch_orderfile._GroupSymbolInfos(symbol_infos) |
| 28 self.assertEquals(len(offset_to_symbol_infos), 2) |
| 29 for i in range(2): |
| 30 s = symbol_infos[i] |
| 31 matching = offset_to_symbol_infos[s.offset][0] |
| 32 self.assertEquals(matching.offset, s.offset) |
| 33 self.assertEquals(matching.size, s.size) |
| 34 self.assertEquals(len(name_to_symbol_infos), 1) |
| 35 self.assertEquals(len(name_to_symbol_infos['aSymbol']), 2) |
| 36 |
| 37 def testGroupSymbolsByOffset(self): |
| 38 symbol_infos = ( |
| 39 symbol_extractor.SymbolInfo(name='aSymbol', offset=0x42, size=0x12, |
| 40 section='.text'), |
| 41 symbol_extractor.SymbolInfo(name='anotherSymbol', offset=0x42, size=1, |
| 42 section='.text')) |
| 43 (offset_to_symbol_infos, _) = \ |
| 44 patch_orderfile._GroupSymbolInfos(symbol_infos) |
25 self.assertEquals(len(offset_to_symbol_infos), 1) | 45 self.assertEquals(len(offset_to_symbol_infos), 1) |
26 self.assertEquals(len(name_to_symbol_infos), 1) | 46 self.assertEquals(tuple(offset_to_symbol_infos[0x42]), symbol_infos) |
27 self.assertIn(test_name, name_to_symbol_infos) | |
28 self.assertIn(test_offset, offset_to_symbol_infos) | |
29 | |
30 self.assertEquals(len(name_to_symbol_infos[test_name]), 1) | |
31 s = name_to_symbol_infos[test_name][0] | |
32 self.assertEquals(test_offset, s.offset) | |
33 self.assertEquals(2, s.size) | |
34 self.assertEquals(test_name, s.name) | |
35 | |
36 self.assertEquals(len(offset_to_symbol_infos[test_offset]), 1) | |
37 s = offset_to_symbol_infos[test_offset][0] | |
38 self.assertEquals(test_offset, s.offset) | |
39 self.assertEquals(2, s.size) | |
40 self.assertEquals(test_name, s.name) | |
41 | |
42 def testGetSymbolInfosFromStreamWithoutSize(self): | |
43 lines = [ | |
44 "0070ee8c T WebRtcSpl_ComplexBitReverse"] | |
45 test_name = "WebRtcSpl_ComplexBitReverse" | |
46 test_offset = 0x70ee8c | |
47 (offset_to_symbol_infos, name_to_symbol_infos) = \ | |
48 patch_orderfile._GetSymbolInfosFromStream(lines) | |
49 self.assertEquals(len(offset_to_symbol_infos), 1) | |
50 self.assertEquals(len(name_to_symbol_infos), 1) | |
51 self.assertIn(test_name, name_to_symbol_infos) | |
52 self.assertIn(test_offset, offset_to_symbol_infos) | |
53 | |
54 self.assertEquals(len(name_to_symbol_infos[test_name]), 1) | |
55 s = name_to_symbol_infos[test_name][0] | |
56 self.assertEquals(test_offset, s.offset) | |
57 self.assertEquals(-1, s.size) | |
58 self.assertEquals(test_name, s.name) | |
59 | |
60 self.assertEquals(len(offset_to_symbol_infos[test_offset]), 1) | |
61 s = offset_to_symbol_infos[test_offset][0] | |
62 self.assertEquals(test_offset, s.offset) | |
63 self.assertEquals(-1, s.size) | |
64 self.assertEquals(test_name, s.name) | |
65 | |
66 def testGetSymbolsFromStream(self): | |
67 lines = [".text.startup.", | |
68 ".text.with.a.prefix", | |
69 "", | |
70 "_ZN2v88internal33HEnvironmentLivenessAnalysisPhase3RunEv", | |
71 ".text", | |
72 ".text.*"] | |
73 names = patch_orderfile._GetSymbolsFromStream(lines) | |
74 self.assertEquals(len(names), 2) | |
75 self.assertEquals( | |
76 names[0], "with.a.prefix") | |
77 self.assertEquals( | |
78 names[1], "_ZN2v88internal33HEnvironmentLivenessAnalysisPhase3RunEv") | |
79 | |
80 | 47 |
81 def testExpandSymbols(self): | 48 def testExpandSymbols(self): |
82 symbol_name = "dummySymbol" | 49 symbol_name = "dummySymbol" |
83 symbol_name2 = "other" | 50 symbol_name2 = "other" |
84 profiled_symbol_names = [symbol_name, "symbolThatShouldntMatch"] | 51 profiled_symbol_names = [symbol_name, "symbolThatShouldntMatch"] |
85 name_to_symbol_infos = {symbol_name: [ | 52 name_to_symbol_infos = {symbol_name: [ |
86 patch_orderfile.SymbolInfo(0x42, 0x12, symbol_name)]} | 53 symbol_extractor.SymbolInfo(symbol_name, 0x42, 0x12, |
| 54 section='.text')]} |
87 offset_to_symbol_infos = { | 55 offset_to_symbol_infos = { |
88 0x42: [patch_orderfile.SymbolInfo(0x42, 0x12, symbol_name), | 56 0x42: [symbol_extractor.SymbolInfo(symbol_name, 0x42, 0x12, |
89 patch_orderfile.SymbolInfo(0x42, 0x12, symbol_name2)]} | 57 section='.text'), |
| 58 symbol_extractor.SymbolInfo(symbol_name2, 0x42, 0x12, |
| 59 section='.text')]} |
90 symbol_names = patch_orderfile._ExpandSymbols( | 60 symbol_names = patch_orderfile._ExpandSymbols( |
91 profiled_symbol_names, name_to_symbol_infos, offset_to_symbol_infos) | 61 profiled_symbol_names, name_to_symbol_infos, offset_to_symbol_infos) |
92 self.assertEquals(len(symbol_names), 3) | 62 self.assertEquals(len(symbol_names), 3) |
93 self.assertEquals(symbol_names[0], symbol_name) | 63 self.assertEquals(symbol_names[0], symbol_name) |
94 self.assertEquals(symbol_names[1], symbol_name2) | 64 self.assertEquals(symbol_names[1], symbol_name2) |
95 self.assertEquals(symbol_names[2], "symbolThatShouldntMatch") | 65 self.assertEquals(symbol_names[2], "symbolThatShouldntMatch") |
96 | 66 |
97 def testPrintSymbolWithPrefixes(self): | 67 def testPrintSymbolWithPrefixes(self): |
98 class FakeOutputFile(object): | 68 class FakeOutputFile(object): |
99 def __init__(self): | 69 def __init__(self): |
100 self.output = '' | 70 self.output = '' |
101 def write(self, s): | 71 def write(self, s): |
102 self.output = self.output + s | 72 self.output = self.output + s |
103 test_symbol = "dummySymbol" | 73 test_symbol = "dummySymbol" |
104 symbol_names = [test_symbol] | 74 symbol_names = [test_symbol] |
105 fake_output = FakeOutputFile() | 75 fake_output = FakeOutputFile() |
106 patch_orderfile._PrintSymbolsWithPrefixes(symbol_names, fake_output) | 76 patch_orderfile._PrintSymbolsWithPrefixes(symbol_names, fake_output) |
107 expected_output = """.text.startup.dummySymbol | 77 expected_output = """.text.startup.dummySymbol |
108 .text.hot.dummySymbol | 78 .text.hot.dummySymbol |
109 .text.unlikely.dummySymbol | 79 .text.unlikely.dummySymbol |
110 .text.dummySymbol | 80 .text.dummySymbol |
111 """ | 81 """ |
112 self.assertEquals(fake_output.output, expected_output) | 82 self.assertEquals(fake_output.output, expected_output) |
113 | 83 |
114 | 84 |
115 if __name__ == "__main__": | 85 if __name__ == "__main__": |
116 unittest.main() | 86 unittest.main() |
OLD | NEW |