def testExtractMetadata(self): def side_effect(*args): params = self._CreateRunQueryResultsFromValues( version_number='Chrome/36.9.7934.4', os_name='Android', architecture='x86_64', bitness='64', version_code='857854', modules=[{ 'name': '/libmonochrome.so', 'build_id': '3284389AB83CD' }, { 'name': '/missing', 'build_id': 'AB3288CDE3283' }, { 'name': '/chrome.so', 'build_id': 'abcdef' }]) return params[args] extractor = metadata_extractor.MetadataExtractor( self.trace_processor_path, self.trace_file) trace_processor.RunQuery = mock.MagicMock(side_effect=side_effect) extractor.Initialize() self.assertEqual(extractor.version_number, '36.9.7934.4') self.assertEqual(extractor.os_name, OSName.ANDROID) self.assertEqual(extractor.architecture, 'x86_64') self.assertEqual(extractor.bitness, '64') self.assertEqual(extractor.version_code, '857854') self.assertEqual(extractor.modules, { '/libmonochrome.so': '3284389AB83CD', '/chrome.so': 'ABCDEF' })
def testSubtreeNoFilesExtracted(self): # Setup subtree symbol files. No files to be extracted. symbol_files, side_effect_map = self._setupSubtreeFiles() # Empty set of module IDs to extract. Nothing should be extracted. metadata = metadata_extractor.MetadataExtractor( 'trace_processor_shell', 'trace_file.proto') metadata.InitializeForTesting(modules={}) # Setup |_RunDumpSyms| mock for module ID optimization. breakpad_file_extractor._RunDumpSyms = mock.MagicMock( side_effect=self._mockDumpSyms(side_effect_map)) exception_msg = ( 'No breakpad symbols could be extracted from files in the subtree: ' + self.test_breakpad_dir) with self.assertRaises(Exception) as e: breakpad_file_extractor.ExtractBreakpadOnSubtree( self.test_breakpad_dir, metadata, self.test_dump_syms_binary) self.assertIn(exception_msg, str(e.exception)) # Should be calls to extract module ID, but none to extract breakpad. expected_module_calls = self._getExpectedModuleExtractionCalls( symbol_files) breakpad_file_extractor._RunDumpSyms.assert_has_calls( expected_module_calls, any_order=True)
def testExtractOnSubtree(self): # Setup subtree symbol files. symbol_files, side_effect_map = self._setupSubtreeFiles() subdir_symbols = symbol_files[0] unstripped_symbols = symbol_files[1] # Setup metadata. metadata = metadata_extractor.MetadataExtractor( 'trace_processor_shell', 'trace_file.proto') metadata.InitializeForTesting(modules={ '/subdir.so': '34984AB4EF948D', '/unstripped.so': '34984AB4EF948C' }) extracted_files = [subdir_symbols, unstripped_symbols] # Setup |_RunDumpSyms| mock for module ID optimization. breakpad_file_extractor._RunDumpSyms = mock.MagicMock( side_effect=self._mockDumpSyms(side_effect_map)) breakpad_file_extractor.ExtractBreakpadOnSubtree( self.test_breakpad_dir, metadata, self.test_dump_syms_binary) # Ensure correct |_RunDumpSyms| calls. expected_module_calls = self._getExpectedModuleExtractionCalls( symbol_files) breakpad_files = self._getAndEnsureExpectedSubtreeBreakpadFiles( extracted_files) expected_extract_calls = self._getExpectedBreakpadExtractionCalls( extracted_files, breakpad_files) breakpad_file_extractor._RunDumpSyms.assert_has_calls( expected_module_calls + expected_extract_calls, any_order=True)
def testGetModuleIds(self): extractor = metadata_extractor.MetadataExtractor( self.trace_processor_path, self.trace_file) extractor.InitializeForTesting(modules={ 'name': '13423EDFAB2', 'name2': '321468945', 'name3': '4093492737482' }) self.assertEqual(extractor.GetModuleIds(), {'13423EDFAB2', '321468945', '4093492737482'})
def testParseOSNameFuschia(self): def side_effect(*args): params = self._CreateRunQueryResultsFromValues(os_name='Fuschia') return params[args] extractor = metadata_extractor.MetadataExtractor( self.trace_processor_path, self.trace_file) trace_processor.RunQuery = mock.MagicMock(side_effect=side_effect) extractor.Initialize() self.assertEqual(extractor.os_name, OSName.FUSCHIA)
def testExtractMetadataVersionNumberParsed(self): def side_effect(*args): params = self._CreateRunQueryResultsFromValues( version_number='36.9.7934.4') return params[args] extractor = metadata_extractor.MetadataExtractor( self.trace_processor_path, self.trace_file) trace_processor.RunQuery = mock.MagicMock(side_effect=side_effect) extractor.Initialize() self.assertEqual(extractor.version_number, '36.9.7934.4')
def _createMetadataExtractor(self, version_number=None, os_name=None, architecture=None, bitness=None, version_code=None, modules=None): metadata = metadata_extractor.MetadataExtractor(self.trace_processor_path, self.trace_file) metadata.InitializeForTesting(version_number, os_name, architecture, bitness, version_code, modules) return metadata
def testParseOSNameNotRecognized(self): def side_effect(*args): params = self._CreateRunQueryResultsFromValues(os_name='blah') return params[args] extractor = metadata_extractor.MetadataExtractor( self.trace_processor_path, self.trace_file) trace_processor.RunQuery = mock.MagicMock(side_effect=side_effect) exception_msg = 'OS name "blah" not recognized: ' + self.trace_file with self.assertRaises(Exception) as context: extractor.Initialize() self.assertEqual(exception_msg, str(context.exception))
def testParseMac64(self): def side_effect(*args): params = self._CreateRunQueryResultsFromValues( os_name='Mac OS X', version_number='Chrome/28.9.9364.32-64') return params[args] extractor = metadata_extractor.MetadataExtractor( self.trace_processor_path, self.trace_file) trace_processor.RunQuery = mock.MagicMock(side_effect=side_effect) extractor.Initialize() self.assertEqual(extractor.version_number, '28.9.9364.32') self.assertEqual(extractor.os_name, OSName.MAC)
def testExtractMetadataEmptyList(self): def side_effect(*args): params = self._CreateRunQueryResults() return params[args] extractor = metadata_extractor.MetadataExtractor( self.trace_processor_path, self.trace_file) trace_processor.RunQuery = mock.MagicMock(side_effect=side_effect) extractor.Initialize() self.assertEqual(extractor.version_number, None) self.assertEqual(extractor.os_name, None) self.assertEqual(extractor.architecture, None) self.assertEqual(extractor.bitness, None) self.assertEqual(extractor.version_code, None) self.assertEqual(extractor.modules, None)
def testExtractMetadataValuesNull(self): def side_effect(*args): params = self._CreateRunQueryResultsFromValues( modules=[{ 'name': None, 'build_id': None }, { 'name': None, 'build_id': None }]) return params[args] extractor = metadata_extractor.MetadataExtractor( self.trace_processor_path, self.trace_file) trace_processor.RunQuery = mock.MagicMock(side_effect=side_effect) extractor.Initialize() self.assertEqual(extractor.version_number, None) self.assertEqual(extractor.os_name, None) self.assertEqual(extractor.architecture, None) self.assertEqual(extractor.bitness, None) self.assertEqual(extractor.version_code, None) self.assertEqual(extractor.modules, None)
def testGetModuleIdsNone(self): extractor = metadata_extractor.MetadataExtractor( self.trace_processor_path, self.trace_file) extractor.InitializeForTesting(modules=None) self.assertEqual(extractor.GetModuleIds(), None)