blob: af99c49c8a061e3a9efa998e2e0beaefe833909f [file] [log] [blame]
Mike Frysingere58c0e22017-10-04 15:43:30 -04001# -*- coding: utf-8 -*-
Mike Frysinger69cb41d2013-08-11 20:08:19 -04002# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
Don Garrett25f309a2014-03-19 14:02:12 -07006"""Test cros_generate_breakpad_symbols."""
7
Mike Frysinger383367e2014-09-16 15:06:17 -04008from __future__ import print_function
9
Mike Frysinger69cb41d2013-08-11 20:08:19 -040010import ctypes
Mike Frysinger69cb41d2013-08-11 20:08:19 -040011import os
Mike Frysinger69cb41d2013-08-11 20:08:19 -040012
Mike Frysinger6db648e2018-07-24 19:57:58 -040013import mock
Mike Frysingerfd544572019-09-06 16:35:50 -040014from six.moves import StringIO
Mike Frysinger6db648e2018-07-24 19:57:58 -040015
Mike Frysinger69cb41d2013-08-11 20:08:19 -040016from chromite.lib import cros_test_lib
17from chromite.lib import osutils
18from chromite.lib import parallel
19from chromite.lib import parallel_unittest
20from chromite.lib import partial_mock
21from chromite.scripts import cros_generate_breakpad_symbols
22
Mike Frysinger69cb41d2013-08-11 20:08:19 -040023
24class FindDebugDirMock(partial_mock.PartialMock):
25 """Mock out the DebugDir helper so we can point it to a tempdir."""
26
27 TARGET = 'chromite.scripts.cros_generate_breakpad_symbols'
28 ATTRS = ('FindDebugDir',)
29 DEFAULT_ATTR = 'FindDebugDir'
30
Mike Frysingerc15efa52013-12-12 01:13:56 -050031 def __init__(self, path, *args, **kwargs):
Mike Frysinger69cb41d2013-08-11 20:08:19 -040032 self.path = path
Mike Frysingerc15efa52013-12-12 01:13:56 -050033 super(FindDebugDirMock, self).__init__(*args, **kwargs)
Mike Frysinger69cb41d2013-08-11 20:08:19 -040034
Mike Frysinger3f571af2016-08-31 23:56:53 -040035 # pylint: disable=unused-argument
36 def FindDebugDir(self, _board, sysroot=None):
Mike Frysinger69cb41d2013-08-11 20:08:19 -040037 return self.path
38
39
Mike Frysinger3ef6d972019-08-24 20:07:42 -040040# This long decorator triggers a false positive in the docstring test.
41# https://github.com/PyCQA/pylint/issues/3077
42# pylint: disable=bad-docstring-quotes
Mike Frysinger69cb41d2013-08-11 20:08:19 -040043@mock.patch('chromite.scripts.cros_generate_breakpad_symbols.'
44 'GenerateBreakpadSymbol')
45class GenerateSymbolsTest(cros_test_lib.MockTempDirTestCase):
Don Garrettf8bf7842014-03-20 17:03:42 -070046 """Test GenerateBreakpadSymbols."""
Mike Frysinger69cb41d2013-08-11 20:08:19 -040047
48 def setUp(self):
49 self.board = 'monkey-board'
50 self.board_dir = os.path.join(self.tempdir, 'build', self.board)
51 self.debug_dir = os.path.join(self.board_dir, 'usr', 'lib', 'debug')
52 self.breakpad_dir = os.path.join(self.debug_dir, 'breakpad')
53
54 # Generate a tree of files which we'll scan through.
55 elf_files = [
56 'bin/elf',
57 'iii/large-elf',
58 # Need some kernel modules (with & without matching .debug).
59 'lib/modules/3.10/module.ko',
60 'lib/modules/3.10/module-no-debug.ko',
61 # Need a file which has an ELF only, but not a .debug.
62 'usr/bin/elf-only',
63 'usr/sbin/elf',
64 ]
65 debug_files = [
66 'bin/bad-file',
67 'bin/elf.debug',
68 'iii/large-elf.debug',
69 'lib/modules/3.10/module.ko.debug',
70 # Need a file which has a .debug only, but not an ELF.
71 'sbin/debug-only.debug',
72 'usr/sbin/elf.debug',
73 ]
74 for f in ([os.path.join(self.board_dir, x) for x in elf_files] +
75 [os.path.join(self.debug_dir, x) for x in debug_files]):
76 osutils.Touch(f, makedirs=True)
77
78 # Set up random build dirs and symlinks.
79 buildid = os.path.join(self.debug_dir, '.build-id', '00')
80 osutils.SafeMakedirs(buildid)
81 os.symlink('/asdf', os.path.join(buildid, 'foo'))
82 os.symlink('/bin/sh', os.path.join(buildid, 'foo.debug'))
83 os.symlink('/bin/sh', os.path.join(self.debug_dir, 'file.debug'))
84 osutils.WriteFile(os.path.join(self.debug_dir, 'iii', 'large-elf.debug'),
85 'just some content')
86
87 self.StartPatcher(FindDebugDirMock(self.debug_dir))
88
89 def testNormal(self, gen_mock):
90 """Verify all the files we expect to get generated do"""
91 with parallel_unittest.ParallelMock():
92 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
93 self.board, sysroot=self.board_dir)
Mike Frysinger2d589a12019-08-25 14:15:12 -040094 self.assertEqual(ret, 0)
95 self.assertEqual(gen_mock.call_count, 3)
Mike Frysinger69cb41d2013-08-11 20:08:19 -040096
97 # The largest ELF should be processed first.
98 call1 = (os.path.join(self.board_dir, 'iii/large-elf'),
99 os.path.join(self.debug_dir, 'iii/large-elf.debug'))
Mike Frysinger2d589a12019-08-25 14:15:12 -0400100 self.assertEqual(gen_mock.call_args_list[0][0], call1)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400101
102 # The other ELFs can be called in any order.
103 call2 = (os.path.join(self.board_dir, 'bin/elf'),
104 os.path.join(self.debug_dir, 'bin/elf.debug'))
105 call3 = (os.path.join(self.board_dir, 'usr/sbin/elf'),
106 os.path.join(self.debug_dir, 'usr/sbin/elf.debug'))
107 exp_calls = set((call2, call3))
108 actual_calls = set((gen_mock.call_args_list[1][0],
109 gen_mock.call_args_list[2][0]))
Mike Frysinger2d589a12019-08-25 14:15:12 -0400110 self.assertEqual(exp_calls, actual_calls)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400111
Prathmesh Prabhu9995e9b2013-10-31 16:43:55 -0700112 def testFileList(self, gen_mock):
113 """Verify that file_list restricts the symbols generated"""
114 with parallel_unittest.ParallelMock():
115 call1 = (os.path.join(self.board_dir, 'usr/sbin/elf'),
116 os.path.join(self.debug_dir, 'usr/sbin/elf.debug'))
117
118 # Filter with elf path.
119 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
120 self.board, sysroot=self.board_dir, breakpad_dir=self.breakpad_dir,
121 file_list=[os.path.join(self.board_dir, 'usr', 'sbin', 'elf')])
Mike Frysinger2d589a12019-08-25 14:15:12 -0400122 self.assertEqual(ret, 0)
123 self.assertEqual(gen_mock.call_count, 1)
124 self.assertEqual(gen_mock.call_args_list[0][0], call1)
Prathmesh Prabhu9995e9b2013-10-31 16:43:55 -0700125
126 # Filter with debug symbols file path.
127 gen_mock.reset_mock()
128 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
129 self.board, sysroot=self.board_dir, breakpad_dir=self.breakpad_dir,
130 file_list=[os.path.join(self.debug_dir, 'usr', 'sbin', 'elf.debug')])
Mike Frysinger2d589a12019-08-25 14:15:12 -0400131 self.assertEqual(ret, 0)
132 self.assertEqual(gen_mock.call_count, 1)
133 self.assertEqual(gen_mock.call_args_list[0][0], call1)
Prathmesh Prabhu9995e9b2013-10-31 16:43:55 -0700134
135
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400136 def testGenLimit(self, gen_mock):
137 """Verify generate_count arg works"""
138 with parallel_unittest.ParallelMock():
139 # Generate nothing!
140 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
141 self.board, sysroot=self.board_dir, breakpad_dir=self.breakpad_dir,
142 generate_count=0)
Mike Frysinger2d589a12019-08-25 14:15:12 -0400143 self.assertEqual(ret, 0)
144 self.assertEqual(gen_mock.call_count, 0)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400145
146 # Generate just one.
147 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
148 self.board, sysroot=self.board_dir, breakpad_dir=self.breakpad_dir,
149 generate_count=1)
Mike Frysinger2d589a12019-08-25 14:15:12 -0400150 self.assertEqual(ret, 0)
151 self.assertEqual(gen_mock.call_count, 1)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400152
153 # The largest ELF should be processed first.
154 call1 = (os.path.join(self.board_dir, 'iii/large-elf'),
155 os.path.join(self.debug_dir, 'iii/large-elf.debug'))
Mike Frysinger2d589a12019-08-25 14:15:12 -0400156 self.assertEqual(gen_mock.call_args_list[0][0], call1)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400157
158 def testGenErrors(self, gen_mock):
159 """Verify we handle errors from generation correctly"""
Mike Frysingerc15efa52013-12-12 01:13:56 -0500160 def _SetError(*_args, **kwargs):
161 kwargs['num_errors'].value += 1
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400162 return 1
163 gen_mock.side_effect = _SetError
164 with parallel_unittest.ParallelMock():
165 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
166 self.board, sysroot=self.board_dir)
Mike Frysinger2d589a12019-08-25 14:15:12 -0400167 self.assertEqual(ret, 3)
168 self.assertEqual(gen_mock.call_count, 3)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400169
Mike Frysinger9a628bb2013-10-24 15:51:37 -0400170 def testCleaningTrue(self, gen_mock):
171 """Verify behavior of clean_breakpad=True"""
172 with parallel_unittest.ParallelMock():
173 # Dir does not exist, and then does.
174 self.assertNotExists(self.breakpad_dir)
175 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
176 self.board, sysroot=self.board_dir, generate_count=1,
177 clean_breakpad=True)
Mike Frysinger2d589a12019-08-25 14:15:12 -0400178 self.assertEqual(ret, 0)
179 self.assertEqual(gen_mock.call_count, 1)
Mike Frysinger9a628bb2013-10-24 15:51:37 -0400180 self.assertExists(self.breakpad_dir)
181
182 # Dir exists before & after.
183 # File exists, but then doesn't.
184 dummy_file = os.path.join(self.breakpad_dir, 'fooooooooo')
185 osutils.Touch(dummy_file)
186 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
187 self.board, sysroot=self.board_dir, generate_count=1,
188 clean_breakpad=True)
Mike Frysinger2d589a12019-08-25 14:15:12 -0400189 self.assertEqual(ret, 0)
190 self.assertEqual(gen_mock.call_count, 2)
Mike Frysinger9a628bb2013-10-24 15:51:37 -0400191 self.assertNotExists(dummy_file)
192
193 def testCleaningFalse(self, gen_mock):
194 """Verify behavior of clean_breakpad=False"""
195 with parallel_unittest.ParallelMock():
196 # Dir does not exist, and then does.
197 self.assertNotExists(self.breakpad_dir)
198 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
199 self.board, sysroot=self.board_dir, generate_count=1,
200 clean_breakpad=False)
Mike Frysinger2d589a12019-08-25 14:15:12 -0400201 self.assertEqual(ret, 0)
202 self.assertEqual(gen_mock.call_count, 1)
Mike Frysinger9a628bb2013-10-24 15:51:37 -0400203 self.assertExists(self.breakpad_dir)
204
205 # Dir exists before & after.
206 # File exists before & after.
207 dummy_file = os.path.join(self.breakpad_dir, 'fooooooooo')
208 osutils.Touch(dummy_file)
209 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
210 self.board, sysroot=self.board_dir, generate_count=1,
211 clean_breakpad=False)
Mike Frysinger2d589a12019-08-25 14:15:12 -0400212 self.assertEqual(ret, 0)
213 self.assertEqual(gen_mock.call_count, 2)
Mike Frysinger9a628bb2013-10-24 15:51:37 -0400214 self.assertExists(dummy_file)
215
Shawn Nematbakhsh2c169cb2013-10-29 16:23:58 -0700216 def testExclusionList(self, gen_mock):
217 """Verify files in directories of the exclusion list are excluded"""
218 exclude_dirs = ['bin', 'usr', 'fake/dir/fake']
219 with parallel_unittest.ParallelMock():
220 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbols(
221 self.board, sysroot=self.board_dir, exclude_dirs=exclude_dirs)
Mike Frysinger2d589a12019-08-25 14:15:12 -0400222 self.assertEqual(ret, 0)
223 self.assertEqual(gen_mock.call_count, 1)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400224
Benjamin Gordon121a2aa2018-05-04 16:24:45 -0600225class GenerateSymbolTest(cros_test_lib.RunCommandTempDirTestCase):
Don Garrettf8bf7842014-03-20 17:03:42 -0700226 """Test GenerateBreakpadSymbol."""
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400227
228 def setUp(self):
229 self.elf_file = os.path.join(self.tempdir, 'elf')
230 osutils.Touch(self.elf_file)
231 self.debug_dir = os.path.join(self.tempdir, 'debug')
232 self.debug_file = os.path.join(self.debug_dir, 'elf.debug')
233 osutils.Touch(self.debug_file, makedirs=True)
234 # Not needed as the code itself should create it as needed.
235 self.breakpad_dir = os.path.join(self.debug_dir, 'breakpad')
236
Don Garrett1d1209d2017-02-28 13:42:57 -0800237 self.rc.SetDefaultCmdResult(output='MODULE OS CPU ID NAME')
238 self.assertCommandContains = self.rc.assertCommandContains
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400239 self.sym_file = os.path.join(self.breakpad_dir, 'NAME/ID/NAME.sym')
240
241 self.StartPatcher(FindDebugDirMock(self.debug_dir))
242
243 def assertCommandArgs(self, i, args):
244 """Helper for looking at the args of the |i|th call"""
Don Garrett1d1209d2017-02-28 13:42:57 -0800245 self.assertEqual(self.rc.call_args_list[i][0][0], args)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400246
247 def testNormal(self):
248 """Normal run -- given an ELF and a debug file"""
249 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
Don Garrette548cff2015-09-23 14:36:21 -0700250 self.elf_file, self.debug_file, self.breakpad_dir)
Don Garrettc9de3ac2015-10-01 15:40:10 -0700251 self.assertEqual(ret, self.sym_file)
Don Garrett1d1209d2017-02-28 13:42:57 -0800252 self.assertEqual(self.rc.call_count, 1)
Mike Frysinger2808deb2016-01-28 01:22:13 -0500253 self.assertCommandArgs(0, ['dump_syms', '-v', self.elf_file,
254 self.debug_dir])
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400255 self.assertExists(self.sym_file)
256
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400257 def testNormalNoCfi(self):
258 """Normal run w/out CFI"""
259 # Make sure the num_errors flag works too.
260 num_errors = ctypes.c_int()
261 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
Don Garrette548cff2015-09-23 14:36:21 -0700262 self.elf_file, breakpad_dir=self.breakpad_dir,
263 strip_cfi=True, num_errors=num_errors)
Don Garrettc9de3ac2015-10-01 15:40:10 -0700264 self.assertEqual(ret, self.sym_file)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400265 self.assertEqual(num_errors.value, 0)
Mike Frysinger2808deb2016-01-28 01:22:13 -0500266 self.assertCommandArgs(0, ['dump_syms', '-v', '-c', self.elf_file])
Don Garrett1d1209d2017-02-28 13:42:57 -0800267 self.assertEqual(self.rc.call_count, 1)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400268 self.assertExists(self.sym_file)
269
270 def testNormalElfOnly(self):
271 """Normal run -- given just an ELF"""
Don Garrette548cff2015-09-23 14:36:21 -0700272 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
273 self.elf_file, breakpad_dir=self.breakpad_dir)
Don Garrettc9de3ac2015-10-01 15:40:10 -0700274 self.assertEqual(ret, self.sym_file)
Mike Frysinger2808deb2016-01-28 01:22:13 -0500275 self.assertCommandArgs(0, ['dump_syms', '-v', self.elf_file])
Don Garrett1d1209d2017-02-28 13:42:57 -0800276 self.assertEqual(self.rc.call_count, 1)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400277 self.assertExists(self.sym_file)
278
279 def testNormalSudo(self):
280 """Normal run where ELF is readable only by root"""
281 with mock.patch.object(os, 'access') as mock_access:
282 mock_access.return_value = False
Don Garrette548cff2015-09-23 14:36:21 -0700283 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
284 self.elf_file, breakpad_dir=self.breakpad_dir)
Don Garrettc9de3ac2015-10-01 15:40:10 -0700285 self.assertEqual(ret, self.sym_file)
Mike Frysinger2808deb2016-01-28 01:22:13 -0500286 self.assertCommandArgs(0, ['sudo', '--', 'dump_syms', '-v', self.elf_file])
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400287
288 def testLargeDebugFail(self):
289 """Running w/large .debug failed, but retry worked"""
Don Garrett1d1209d2017-02-28 13:42:57 -0800290 self.rc.AddCmdResult(['dump_syms', '-v', self.elf_file, self.debug_dir],
291 returncode=1)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400292 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
Don Garrette548cff2015-09-23 14:36:21 -0700293 self.elf_file, self.debug_file, self.breakpad_dir)
Don Garrettc9de3ac2015-10-01 15:40:10 -0700294 self.assertEqual(ret, self.sym_file)
Don Garrett1d1209d2017-02-28 13:42:57 -0800295 self.assertEqual(self.rc.call_count, 2)
Mike Frysinger2808deb2016-01-28 01:22:13 -0500296 self.assertCommandArgs(0, ['dump_syms', '-v', self.elf_file,
297 self.debug_dir])
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400298 self.assertCommandArgs(
Mike Frysinger2808deb2016-01-28 01:22:13 -0500299 1, ['dump_syms', '-v', '-c', '-r', self.elf_file, self.debug_dir])
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400300 self.assertExists(self.sym_file)
301
302 def testDebugFail(self):
303 """Running w/.debug always failed, but works w/out"""
Don Garrett1d1209d2017-02-28 13:42:57 -0800304 self.rc.AddCmdResult(['dump_syms', '-v', self.elf_file, self.debug_dir],
305 returncode=1)
306 self.rc.AddCmdResult(['dump_syms', '-v', '-c', '-r', self.elf_file,
307 self.debug_dir],
308 returncode=1)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400309 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
Don Garrette548cff2015-09-23 14:36:21 -0700310 self.elf_file, self.debug_file, self.breakpad_dir)
Don Garrettc9de3ac2015-10-01 15:40:10 -0700311 self.assertEqual(ret, self.sym_file)
Don Garrett1d1209d2017-02-28 13:42:57 -0800312 self.assertEqual(self.rc.call_count, 3)
Mike Frysinger2808deb2016-01-28 01:22:13 -0500313 self.assertCommandArgs(0, ['dump_syms', '-v', self.elf_file,
314 self.debug_dir])
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400315 self.assertCommandArgs(
Mike Frysinger2808deb2016-01-28 01:22:13 -0500316 1, ['dump_syms', '-v', '-c', '-r', self.elf_file, self.debug_dir])
317 self.assertCommandArgs(2, ['dump_syms', '-v', self.elf_file])
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400318 self.assertExists(self.sym_file)
319
320 def testCompleteFail(self):
321 """Running dump_syms always fails"""
Don Garrett1d1209d2017-02-28 13:42:57 -0800322 self.rc.SetDefaultCmdResult(returncode=1)
Don Garrette548cff2015-09-23 14:36:21 -0700323 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
324 self.elf_file, breakpad_dir=self.breakpad_dir)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400325 self.assertEqual(ret, 1)
326 # Make sure the num_errors flag works too.
327 num_errors = ctypes.c_int()
328 ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol(
Don Garrette548cff2015-09-23 14:36:21 -0700329 self.elf_file, breakpad_dir=self.breakpad_dir, num_errors=num_errors)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400330 self.assertEqual(ret, 1)
331 self.assertEqual(num_errors.value, 1)
332
333
334class UtilsTestDir(cros_test_lib.TempDirTestCase):
Don Garrettf8bf7842014-03-20 17:03:42 -0700335 """Tests ReadSymsHeader."""
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400336
337 def testReadSymsHeaderGoodFile(self):
338 """Make sure ReadSymsHeader can parse sym files"""
339 sym_file = os.path.join(self.tempdir, 'sym')
340 osutils.WriteFile(sym_file, 'MODULE Linux x86 s0m31D chrooome')
341 result = cros_generate_breakpad_symbols.ReadSymsHeader(sym_file)
Mike Frysinger2d589a12019-08-25 14:15:12 -0400342 self.assertEqual(result.cpu, 'x86')
343 self.assertEqual(result.id, 's0m31D')
344 self.assertEqual(result.name, 'chrooome')
345 self.assertEqual(result.os, 'Linux')
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400346
347
348class UtilsTest(cros_test_lib.TestCase):
Don Garrettf8bf7842014-03-20 17:03:42 -0700349 """Tests ReadSymsHeader."""
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400350
351 def testReadSymsHeaderGoodBuffer(self):
352 """Make sure ReadSymsHeader can parse sym file handles"""
353 result = cros_generate_breakpad_symbols.ReadSymsHeader(
Mike Frysingerfd544572019-09-06 16:35:50 -0400354 StringIO('MODULE Linux arm MY-ID-HERE blkid'))
Mike Frysinger2d589a12019-08-25 14:15:12 -0400355 self.assertEqual(result.cpu, 'arm')
356 self.assertEqual(result.id, 'MY-ID-HERE')
357 self.assertEqual(result.name, 'blkid')
358 self.assertEqual(result.os, 'Linux')
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400359
360 def testReadSymsHeaderBadd(self):
361 """Make sure ReadSymsHeader throws on bad sym files"""
362 self.assertRaises(ValueError, cros_generate_breakpad_symbols.ReadSymsHeader,
Mike Frysingerfd544572019-09-06 16:35:50 -0400363 StringIO('asdf'))
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400364
365 def testBreakpadDir(self):
366 """Make sure board->breakpad path expansion works"""
367 expected = '/build/blah/usr/lib/debug/breakpad'
368 result = cros_generate_breakpad_symbols.FindBreakpadDir('blah')
Mike Frysinger2d589a12019-08-25 14:15:12 -0400369 self.assertEqual(expected, result)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400370
371 def testDebugDir(self):
372 """Make sure board->debug path expansion works"""
373 expected = '/build/blah/usr/lib/debug'
374 result = cros_generate_breakpad_symbols.FindDebugDir('blah')
Mike Frysinger2d589a12019-08-25 14:15:12 -0400375 self.assertEqual(expected, result)
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400376
377
Mike Frysingerea838d12014-12-08 11:55:32 -0500378def main(_argv):
Mike Frysinger27e21b72018-07-12 14:20:21 -0400379 # pylint: disable=protected-access
Mike Frysinger69cb41d2013-08-11 20:08:19 -0400380 # Set timeouts small so that if the unit test hangs, it won't hang for long.
381 parallel._BackgroundTask.STARTUP_TIMEOUT = 5
382 parallel._BackgroundTask.EXIT_TIMEOUT = 5
383
384 # Run the tests.
Mike Frysingerba167372015-01-21 10:37:03 -0500385 cros_test_lib.main(level='info', module=__name__)