def test_everything_we_hoped_for_2(self, mocked_subprocess_module): config = self.get_basic_config() raw_crash = copy.copy(canonical_standard_raw_crash) raw_dumps = {config.dump_field: 'a_fake_dump.dump'} processed_crash = CDotDict() processed_crash.product = 'Firefox' processed_crash.os_name = 'Windows 386' processed_crash.cpu_name = 'x86' processed_crash.signature = 'EnterIon' processed_crash['json_dump.crashing_thread.frames'] = [ DotDict({ 'not_module': 'not-a-module', }), DotDict({ 'module': 'a-module', }) ] processor_meta = self.get_basic_processor_meta() mocked_subprocess_handle = ( mocked_subprocess_module.Popen.return_value) mocked_subprocess_handle.stdout.read.return_value = ('EXTRA-SPECIAL') mocked_subprocess_handle.wait.return_value = 0 rule = JitCrashCategorizeRule(config) # the call to be tested rule.act(raw_crash, raw_dumps, processed_crash, processor_meta) eq_(processor_meta.processor_notes, []) eq_(processed_crash.classifications.jit.category, 'EXTRA-SPECIAL') eq_(processed_crash.classifications.jit.category_return_code, 0)
def test_subprocess_fail(self, mocked_subprocess_module): config = self.get_basic_config() raw_crash = copy.copy(canonical_standard_raw_crash) raw_dumps = {config.dump_field: 'a_fake_dump.dump'} processed_crash = CDotDict() processed_crash.product = 'Firefox' processed_crash.os_name = 'Windows 386' processed_crash.cpu_name = 'x86' processed_crash.signature = 'EnterBaseline' processed_crash['json_dump.crashing_thread.frames'] = [ DotDict({'not_module': 'not-a-module'}), DotDict({'module': 'a-module'}) ] processor_meta = self.get_basic_processor_meta() mocked_subprocess_handle = ( mocked_subprocess_module.Popen.return_value) mocked_subprocess_handle.stdout.read.return_value = (None) mocked_subprocess_handle.wait.return_value = -1 rule = JitCrashCategorizeRule(config) # the call to be tested rule.act(raw_crash, raw_dumps, processed_crash, processor_meta) assert processor_meta.processor_notes == [] assert processed_crash.classifications.jit.category is None assert processed_crash.classifications.jit.category_return_code == -1
def test_success_all_types_of_signatures(self, mocked_subprocess_module): config = self.get_basic_config() raw_crash = copy.copy(canonical_standard_raw_crash) raw_dumps = {config.dump_field: 'a_fake_dump.dump'} base_processed_crash = CDotDict() base_processed_crash.product = 'Firefox' base_processed_crash.os_name = 'Windows 386' base_processed_crash.cpu_name = 'x86' base_processed_crash['json_dump.crashing_thread.frames'] = [ DotDict({'not_module': 'not-a-module'}), DotDict({'module': 'a-module'}) ] processor_meta = self.get_basic_processor_meta() mocked_subprocess_handle = ( mocked_subprocess_module.Popen.return_value ) mocked_subprocess_handle.stdout.read.return_value = ( 'EXTRA-SPECIAL' ) mocked_subprocess_handle.wait.return_value = 0 rule = JitCrashCategorizeRule(config) signatures = [ 'EnterBaseline', 'moz::something | EnterBaseline', 'EnterIon', 'js::jit::FastInvoke', 'Foo::Bar__js::jit::IonCannon', 'Small | js::irregexp::ExecuteCode<T>', ] for signature in signatures: processed_crash = CDotDict(base_processed_crash) processed_crash.signature = signature # the call to be tested rule.act(raw_crash, raw_dumps, processed_crash, processor_meta) eq_(processor_meta.processor_notes, []) eq_(processed_crash.classifications.jit.category, 'EXTRA-SPECIAL') eq_(processed_crash.classifications.jit.category_return_code, 0)
def get_basic_config(self): config = CDotDict() config.logger = Mock() config.dump_field = 'upload_file_minidump' config.command_line = ( JitCrashCategorizeRule.required_config.command_line.default) config.result_key = 'classifications.jit.category' config.return_code_key = 'classifications.jit.category_return_code' config.command_pathname = \ '/data/socorro/stackwalk/bin/jit-crash-categorize' config.temporary_file_system_storage_path = '/tmp' return config
def get_basic_config(self): config = CDotDict() config.logger = Mock() config.dump_field = 'upload_file_minidump' config.command_line = ( BreakpadStackwalkerRule2015.required_config.command_line.default) config.kill_timeout = 5 config.command_pathname = '/bin/stackwalker' config.symbols_urls = 'https://localhost' config.symbol_cache_path = '/mnt/socorro/symbols' config.symbol_tmp_path = '/mnt/socorro/symbols' config.temporary_file_system_storage_path = '/tmp' return config
def test_dot_save(self): d = {} ExternalProcessRule.dot_save(d, 'x', 1) assert d['x'] == 1 ExternalProcessRule.dot_save(d, 'z.y', 10) assert d['z']['y'] == 10 d['a'] = {} d['a']['b'] = {} ExternalProcessRule.dot_save(d, 'a.b.c', 100) assert d['a']['b']['c'] == 100 dd = CDotDict() ExternalProcessRule.dot_save(dd, 'a.b.c.d.e.f', 1000) assert dd.a.b.c.d.e.f == 1000
def test_dot_save(self): d = {} ExternalProcessRule.dot_save(d, 'x', 1) ok_(d['x'], 1) ExternalProcessRule.dot_save(d, 'z.y', 10) ok_(d['z']['y'], 10) d['a'] = {} d['a']['b'] = {} ExternalProcessRule.dot_save(d, 'a.b.c', 100) ok_(d['a']['b']['c'], 100) dd = CDotDict() ExternalProcessRule.dot_save(dd, 'a.b.c.d.e.f', 1000) ok_(dd.a.b.c.d.e.f, 1000)
def get_basic_config(self): config = CDotDict() config.logger = Mock() config.dump_field = 'upload_file_minidump' config.command_line = ('timeout -s KILL 30 {command_pathname} ' '{dump_file_pathname} ' '{processor_symbols_pathname_list} 2>/dev/null') config.command_pathname = 'bogus_command' config.processor_symbols_pathname_list = ( '/mnt/socorro/symbols/symbols_ffx,' '/mnt/socorro/symbols/symbols_sea,' '/mnt/socorro/symbols/symbols_tbrd,' '/mnt/socorro/symbols/symbols_sbrd,' '/mnt/socorro/symbols/symbols_os') config.symbol_cache_path = '/mnt/socorro/symbols' config.result_key = 'bogus_command_result' config.return_code_key = 'bogus_command_return_code' return config
def get_basic_config(self): config = CDotDict() config.logger = Mock() config.chatty = True config.dump_field = 'upload_file_minidump' config.stackwalk_command_line = ( 'timeout -s KILL 30 $minidump_stackwalk_pathname ' '--raw-json $rawfilePathname $dumpfilePathname ' '$processor_symbols_pathname_list 2>/dev/null') config.minidump_stackwalk_pathname = '/bin/stackwalker' config.processor_symbols_pathname_list = ( '/mnt/socorro/symbols/symbols_ffx,' '/mnt/socorro/symbols/symbols_sea,' '/mnt/socorro/symbols/symbols_tbrd,' '/mnt/socorro/symbols/symbols_sbrd,' '/mnt/socorro/symbols/symbols_os') config.symbol_cache_path = '/mnt/socorro/symbols' return config
def get_basic_config(self): config = CDotDict() config.logger = Mock() return config
def get_basic_config(self): config = CDotDict() config.logger = Mock() config.chatty = True return config