def testCompleteFail(self): """Running dump_syms always fails""" self.rc_mock.SetDefaultCmdResult(returncode=1) ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( self.elf_file) self.assertEqual(ret, 1) # Make sure the num_errors flag works too. num_errors = ctypes.c_int() ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( self.elf_file, num_errors=num_errors) self.assertEqual(ret, 1) self.assertEqual(num_errors.value, 1)
def _UnpackGenerateBreakpad(elf_file, *args, **kwargs): """Unpack Android relocation symbols, and GenerateBreakpadSymbol This method accepts exactly the same arguments as cros_generate_breakpad_symbols.GenerateBreakpadSymbol, except that it requires elf_file, and fills in dump_sym_cmd. Args: elf_file: Name of the file to generate breakpad symbols for. args: See cros_generate_breakpad_symbols.GenerateBreakpadSymbol. kwargs: See cros_generate_breakpad_symbols.GenerateBreakpadSymbol. """ # We try to unpack, and just see if it works. Real failures caused by # something other than a binary that's already unpacked will be logged and # ignored. We'll notice them when dump_syms fails later (which it will on # packed binaries.). unpack_cmd = [RELOCATION_PACKER_BIN, '-u', elf_file] unpack_result = cros_build_lib.run(unpack_cmd, stdout=True, check=False, encoding='utf8') # If we unpacked, extract the offset, and remember it. offset = FindExpansionOffset(unpack_result) if offset: logging.info('Unpacked relocation symbols for %s with offset %d.', elf_file, offset) # Now generate breakpad symbols from the binary. breakpad_file = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( elf_file, *args, **kwargs) if offset: _AdjustSymbolOffset(breakpad_file, offset)
def testNormalElfOnly(self): """Normal run -- given just an ELF""" ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( self.elf_file, breakpad_dir=self.breakpad_dir) self.assertEqual(ret, self.sym_file) self.assertCommandArgs(0, ['dump_syms', '-v', self.elf_file]) self.assertEqual(self.rc.call_count, 1) self.assertExists(self.sym_file)
def testNormalBoard(self): """Normal run w/board info but not breakpad dir""" ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( self.elf_file, board='foo') self.assertEqual(ret, 0) self.assertCommandArgs(0, ['dump_syms', self.elf_file]) self.assertEqual(self.rc_mock.call_count, 1) self.assertExists(self.sym_file)
def testNormal(self): """Normal run -- given an ELF and a debug file""" ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( self.elf_file, self.debug_file, breakpad_dir=self.breakpad_dir) self.assertEqual(ret, 0) self.assertEqual(self.rc_mock.call_count, 1) self.assertCommandArgs(0, ['dump_syms', self.elf_file, self.debug_dir]) self.assertExists(self.sym_file)
def testNormalSudo(self): """Normal run where ELF is readable only by root""" with mock.patch.object(os, 'access') as mock_access: mock_access.return_value = False ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( self.elf_file, breakpad_dir=self.breakpad_dir) self.assertEqual(ret, self.sym_file) self.assertCommandArgs(0, ['sudo', '--', 'dump_syms', '-v', self.elf_file])
def testNormalNoCfi(self): """Normal run w/out CFI""" # Make sure the num_errors flag works too. num_errors = ctypes.c_int() ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( self.elf_file, strip_cfi=True, num_errors=num_errors) self.assertEqual(ret, 0) self.assertEqual(num_errors.value, 0) self.assertCommandArgs(0, ['dump_syms', '-c', self.elf_file]) self.assertEqual(self.rc_mock.call_count, 1) self.assertExists(self.sym_file)
def testLargeDebugFail(self): """Running w/large .debug failed, but retry worked""" self.rc_mock.AddCmdResult(['dump_syms', self.elf_file, self.debug_dir], returncode=1) ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( self.elf_file, self.debug_file) self.assertEqual(ret, 0) self.assertEqual(self.rc_mock.call_count, 2) self.assertCommandArgs(0, ['dump_syms', self.elf_file, self.debug_dir]) self.assertCommandArgs( 1, ['dump_syms', '-c', '-r', self.elf_file, self.debug_dir]) self.assertExists(self.sym_file)
def testDebugFail(self): """Running w/.debug always failed, but works w/out""" self.rc_mock.AddCmdResult(['dump_syms', self.elf_file, self.debug_dir], returncode=1) self.rc_mock.AddCmdResult( ['dump_syms', '-c', '-r', self.elf_file, self.debug_dir], returncode=1) ret = cros_generate_breakpad_symbols.GenerateBreakpadSymbol( self.elf_file, self.debug_file) self.assertEqual(ret, 0) self.assertEqual(self.rc_mock.call_count, 3) self.assertCommandArgs(0, ['dump_syms', self.elf_file, self.debug_dir]) self.assertCommandArgs( 1, ['dump_syms', '-c', '-r', self.elf_file, self.debug_dir]) self.assertCommandArgs(2, ['dump_syms', self.elf_file]) self.assertExists(self.sym_file)