def test_action_case_3(self): """nothing in 1st dump, sentinel and secondary in upload_file_minidump_flash2 dump""" pc = DotDict() pc.dump = DotDict() pijd = copy.deepcopy(cannonical_json_dump) pc.dump.json_dump = pijd f2jd = copy.deepcopy(cannonical_json_dump) pc.upload_file_minidump_flash2 = DotDict() pc.upload_file_minidump_flash2.json_dump = f2jd pc.upload_file_minidump_flash2.json_dump['crashing_thread']['frames'][2] \ ['function'] = 'NtUserSetWindowPos' pc.upload_file_minidump_flash2.json_dump['crashing_thread']['frames'][4] \ ['function'] = 'F455544145' fake_processor = create_basic_fake_processor() rc = DotDict() rule = SetWindowPos() action_result = rule.action(rc, pc, fake_processor) self.assertTrue(action_result) self.assertTrue('classifications' in pc) self.assertTrue('skunk_works' in pc.classifications) self.assertEqual( pc.classifications.skunk_works.classification, 'NtUserSetWindowPos | F455544145' )
def test_action_case_4(self): """nothing in 1st dump, sentinel but no secondary in upload_file_minidump_flash2 dump""" pc = DotDict() pc.dump = DotDict() pijd = copy.deepcopy(cannonical_json_dump) pc.dump.json_dump = pijd f2jd = copy.deepcopy(cannonical_json_dump) pc.upload_file_minidump_flash2 = DotDict() pc.upload_file_minidump_flash2.json_dump = f2jd pc.upload_file_minidump_flash2.json_dump['crashing_thread']['frames'][2] \ ['function'] = 'NtUserSetWindowPos' fake_processor = create_basic_fake_processor() rc = DotDict() rd = {} rule = SetWindowPos() action_result = rule.action(rc, rd, pc, fake_processor) ok_(action_result) ok_('classifications' in pc) ok_('skunk_works' in pc.classifications) eq_(pc.classifications.skunk_works.classification, 'NtUserSetWindowPos | other')
def test_action_case_4(self): """nothing in 1st dump, sentinel but no secondary in upload_file_minidump_flash2 dump""" pc = DotDict() pc.dump = DotDict() pijd = copy.deepcopy(cannonical_json_dump) pc.dump.json_dump = pijd f2jd = copy.deepcopy(cannonical_json_dump) pc.upload_file_minidump_flash2 = DotDict() pc.upload_file_minidump_flash2.json_dump = f2jd pc.upload_file_minidump_flash2.json_dump['crashing_thread']['frames'][2] \ ['function'] = 'NtUserSetWindowPos' fake_processor = create_basic_fake_processor() rc = DotDict() rule = SetWindowPos() action_result = rule.action(rc, pc, fake_processor) ok_(action_result) ok_('classifications' in pc) ok_('skunk_works' in pc.classifications) eq_( pc.classifications.skunk_works.classification, 'NtUserSetWindowPos | other' )
def test_action_wrong_order(self): jd = copy.deepcopy(cannonical_json_dump) jd['crashing_thread']['frames'][4]['function'] = ( "F_1152915508___________________________________" ) jd['crashing_thread']['frames'][3]['function'] = ( "mozilla::plugins::PluginInstanceChild::UpdateWindowAttributes" "(bool)" ) jd['crashing_thread']['frames'][5]['function'] = ( "mozilla::ipc::RPCChannel::Call(IPC::Message*, IPC::Message*)" ) pc = DotDict() pc.dump = DotDict() pc.dump.json_dump = jd fake_processor = create_basic_fake_processor() rc = DotDict() rd = {} rule = UpdateWindowAttributes() action_result = rule.action(rc, rd, pc, fake_processor) ok_(not action_result) ok_('classifications' not in pc)
def test_action_case_3(self): """nothing in 1st dump, sentinel and secondary in upload_file_minidump_flash2 dump""" pc = DotDict() pc.dump = DotDict() pijd = copy.deepcopy(cannonical_json_dump) pc.dump.json_dump = pijd f2jd = copy.deepcopy(cannonical_json_dump) pc.upload_file_minidump_flash2 = DotDict() pc.upload_file_minidump_flash2.json_dump = f2jd pc.upload_file_minidump_flash2.json_dump['threads'][0]['frames'][2] \ ['function'] = 'NtUserSetWindowPos' pc.upload_file_minidump_flash2.json_dump['threads'][0]['frames'][4] \ ['function'] = 'F455544145' fake_processor = create_basic_fake_processor() rc = DotDict() rule = SetWindowPos() action_result = rule.action(rc, pc, fake_processor) self.assertTrue(action_result) self.assertTrue('classifications' in pc) self.assertTrue('skunk_works' in pc.classifications) self.assertEqual( pc.classifications.skunk_works.classification, 'NtUserSetWindowPos | F455544145' )
def test_action_case_5(self): """nothing in either dump""" pc = DotDict() pc.dump = DotDict() pijd = copy.deepcopy(cannonical_json_dump) pc.dump.json_dump = pijd f2jd = copy.deepcopy(cannonical_json_dump) pc.upload_file_minidump_flash2 = DotDict() pc.upload_file_minidump_flash2.json_dump = f2jd fake_processor = create_basic_fake_processor() rc = DotDict() rule = SetWindowPos() action_result = rule.action(rc, pc, fake_processor) ok_(not action_result) ok_(not "classifications" in pc)
def test_action_case_5(self): """nothing in either dump""" pc = DotDict() pc.dump = DotDict() pijd = copy.deepcopy(cannonical_json_dump) pc.dump.json_dump = pijd f2jd = copy.deepcopy(cannonical_json_dump) pc.upload_file_minidump_flash2 = DotDict() pc.upload_file_minidump_flash2.json_dump = f2jd fake_processor = create_basic_fake_processor() rc = DotDict() rd = {} rule = SetWindowPos() action_result = rule.action(rc, rd, pc, fake_processor) ok_(not action_result) ok_(not 'classifications' in pc)
def test_action_wrong_order(self): jd = copy.deepcopy(cannonical_json_dump) jd['crashing_thread']['frames'][4]['function'] = \ "F_1152915508___________________________________" jd['crashing_thread']['frames'][3]['function'] = \ "mozilla::plugins::PluginInstanceChild::UpdateWindowAttributes" \ "(bool)" jd['crashing_thread']['frames'][5]['function'] = \ "mozilla::ipc::RPCChannel::Call(IPC::Message*, IPC::Message*)" pc = DotDict() pc.dump = DotDict() pc.dump.json_dump = jd fake_processor = create_basic_fake_processor() rc = DotDict() rd = {} rule = UpdateWindowAttributes() action_result = rule.action(rc, rd, pc, fake_processor) ok_(not action_result) ok_(not 'classifications' in pc)
def test_action_wrong_order(self): jd = copy.deepcopy(cannonical_json_dump) jd['threads'][0]['frames'][4]['function'] = \ "F_1152915508___________________________________" jd['threads'][0]['frames'][3]['function'] = \ "mozilla::plugins::PluginInstanceChild::UpdateWindowAttributes" \ "(bool)" jd['threads'][0]['frames'][5]['function'] = \ "mozilla::ipc::RPCChannel::Call(IPC::Message*, IPC::Message*)" pc = DotDict() pc.dump = DotDict() pc.dump.json_dump = jd fake_processor = create_basic_fake_processor() rc = DotDict() rule = UpdateWindowAttributes() action_result = rule.action(rc, pc, fake_processor) self.assertFalse(action_result) self.assertFalse('classifications' in pc)
def test_action_case_3(self): """nothing in 1st dump, sentinel and secondary in upload_file_minidump_flash2 dump""" pc = DotDict() pc.dump = DotDict() pijd = copy.deepcopy(cannonical_json_dump) pc.dump.json_dump = pijd f2jd = copy.deepcopy(cannonical_json_dump) pc.upload_file_minidump_flash2 = DotDict() pc.upload_file_minidump_flash2.json_dump = f2jd pc.upload_file_minidump_flash2.json_dump["crashing_thread"]["frames"][2]["function"] = "NtUserSetWindowPos" pc.upload_file_minidump_flash2.json_dump["crashing_thread"]["frames"][4]["function"] = "F455544145" fake_processor = create_basic_fake_processor() rc = DotDict() rule = SetWindowPos() action_result = rule.action(rc, pc, fake_processor) ok_(action_result) ok_("classifications" in pc) ok_("skunk_works" in pc.classifications) eq_(pc.classifications.skunk_works.classification, "NtUserSetWindowPos | F455544145")
def test_action_predicate_accept(self): """test all of the case where the predicate should return True""" filter_rule = DontConsiderTheseFilter() fake_processor = create_basic_fake_processor() # find non-plugin crashes test_raw_crash = DotDict() test_raw_crash.PluginHang = "0" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find non-Firefox crashes test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Internet Explorer" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with no Version info test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with faulty Version info test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "dwight" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with no BuildID info test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "17.1" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with faulty BuildID info test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "17.1" test_raw_crash.BuildID = "201307E2" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with faulty BuildID info (not integer) test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "17.1" test_raw_crash.BuildID = "201307E2" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with faulty BuildID info (bad month & day) test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "17.1" test_raw_crash.BuildID = "20131458" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with pre-17 version test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "15" test_raw_crash.BuildID = "20121015" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with 18 version but build date less than 2012-10-23 test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "18" test_raw_crash.BuildID = "20121015" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with build date less than 2012-10-17 # and version 17 or above test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "17" test_raw_crash.BuildID = "20121015" ok_(filter_rule.predicate(test_raw_crash, DotDict(), fake_processor)) # find crashes with no default dump test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "19" test_raw_crash.BuildID = "20121031" test_processed_crash = DotDict() ok_(filter_rule.predicate(test_raw_crash, test_processed_crash, fake_processor)) # find crashes with no architecture info test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "19" test_raw_crash.BuildID = "20121031" test_processed_crash = DotDict() test_processed_crash.dump = "fake dump" test_processed_crash.json_dump = DotDict() ok_(filter_rule.predicate(test_raw_crash, test_processed_crash, fake_processor)) # find crashes with amd64 architecture info test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "19" test_raw_crash.BuildID = "20121031" test_processed_crash = DotDict() test_processed_crash.dump = "fake dump" test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.cpu_arch = "amd64" ok_(filter_rule.predicate(test_raw_crash, test_processed_crash, fake_processor)) # find crashes with main dump processing errors test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "19" test_raw_crash.BuildID = "20121031" test_processed_crash = DotDict() test_processed_crash.dump = "fake dump" test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = "x86" test_processed_crash.success = False ok_(filter_rule.predicate(test_raw_crash, test_processed_crash, fake_processor)) # find crashes with extra dump processing errors test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "19" test_raw_crash.BuildID = "20121031" test_processed_crash = DotDict() test_processed_crash.dump = "fake dump" test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = "x86" test_processed_crash.success = True test_processed_crash.additional_minidumps = ["a", "b", "c"] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = False ok_(filter_rule.predicate(test_raw_crash, test_processed_crash, fake_processor)) # find crashes with missing critical attribute test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "19" test_raw_crash.BuildID = "20121031" test_processed_crash = DotDict() test_processed_crash.dump = "fake dump" test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = "x86" test_processed_crash.success = True test_processed_crash.additional_minidumps = ["a", "b", "c"] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = False ok_(filter_rule.predicate(test_raw_crash, test_processed_crash, fake_processor)) # find crashes with missing critical attribute test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "19" test_raw_crash.BuildID = "20121031" test_processed_crash = DotDict() test_processed_crash.dump = "fake dump" test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = "x86" test_processed_crash.success = True test_processed_crash.additional_minidumps = ["a", "b", "c"] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = False ok_(filter_rule.predicate(test_raw_crash, test_processed_crash, fake_processor)) # reject the perfect crash test_raw_crash = DotDict() test_raw_crash.PluginHang = "1" test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = "19" test_raw_crash.BuildID = "20121031" test_processed_crash = DotDict() test_processed_crash.dump = "fake dump" test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = "x86" test_processed_crash.success = True test_processed_crash.additional_minidumps = ["a", "b", "c"] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = True ok_(not filter_rule.predicate(test_raw_crash, test_processed_crash, fake_processor))
def test_action_predicate_accept(self): """test all of the case where the predicate should return True""" filter_rule = DontConsiderTheseFilter() fake_processor = create_basic_fake_processor() # find non-plugin crashes test_raw_crash = DotDict() test_raw_crash.PluginHang = '0' test_raw_dumps = {} ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find non-Firefox crashes test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Internet Explorer" ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with no Version info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with faulty Version info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = 'dwight' ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with no BuildID info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17.1' ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with faulty BuildID info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17.1' test_raw_crash.BuildID = '201307E2' ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with faulty BuildID info (not integer) test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17.1' test_raw_crash.BuildID = '201307E2' ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with faulty BuildID info (bad month & day) test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17.1' test_raw_crash.BuildID = '20131458' ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with pre-17 version test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '15' test_raw_crash.BuildID = '20121015' ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with 18 version but build date less than 2012-10-23 test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '18' test_raw_crash.BuildID = '20121015' ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with build date less than 2012-10-17 # and version 17 or above test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17' test_raw_crash.BuildID = '20121015' ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, DotDict(), fake_processor)) # find crashes with no default dump test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor)) # find crashes with no architecture info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor)) # find crashes with amd64 architecture info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.cpu_arch = 'amd64' ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor)) # find crashes with main dump processing errors test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = False ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor)) # find crashes with extra dump processing errors test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = False ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor)) # find crashes with missing critical attribute test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = False ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor)) # find crashes with missing critical attribute test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = False ok_( filter_rule.predicate(test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor)) # reject the perfect crash test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = True ok_(not filter_rule.predicate(test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor)) # test the do-nothing action test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = True ok_( filter_rule.action(test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor))
def _create_basic_processed_crash(self, uuid, raw_crash, submitted_timestamp, started_timestamp, processor_notes): """ This function is run only by a worker thread. Create the record for the current job in the 'reports' table input parameters: uuid: the unique id identifying the job - corresponds with the uuid column in the 'jobs' and the 'reports' tables jsonDocument: an object with a dictionary interface for fetching the components of the json document submitted_timestamp: when job came in (a key used in partitioning) processor_notes: list of strings of error messages """ #logger.debug("starting insertReportIntoDatabase") processed_crash = DotDict() processed_crash.success = False processed_crash.uuid = uuid processed_crash.startedDateTime = started_timestamp processed_crash.product = self._get_truncate_or_warn( raw_crash, 'ProductName', processor_notes, None, 30 ) processed_crash.version = self._get_truncate_or_warn( raw_crash, 'Version', processor_notes, None, 16 ) processed_crash.build = self._get_truncate_or_warn( raw_crash, 'BuildID', processor_notes, None, 16 ) processed_crash.url = self._get_truncate_or_none( raw_crash, 'URL', 255 ) processed_crash.user_comments = self._get_truncate_or_none( raw_crash, 'Comments', 500 ) processed_crash.app_notes = self._get_truncate_or_none( raw_crash, 'Notes', 1000 ) processed_crash.distributor = self._get_truncate_or_none( raw_crash, 'Distributor', 20 ) processed_crash.distributor_version = self._get_truncate_or_none( raw_crash, 'Distributor_version', 20 ) processed_crash.email = self._get_truncate_or_none( raw_crash, 'Email', 100 ) processed_crash.process_type = self._get_truncate_or_none( raw_crash, 'ProcessType', 10 ) processed_crash.release_channel = raw_crash.get( 'ReleaseChannel', 'unknown' ) # userId is now deprecated and replace with empty string processed_crash.user_id = "" # ++++++++++++++++++++ # date transformations processed_crash.date_processed = submitted_timestamp # defaultCrashTime: must have crashed before date processed submitted_timestamp_as_epoch = int( time.mktime(submitted_timestamp.timetuple()) ) timestampTime = int( raw_crash.get('timestamp', submitted_timestamp_as_epoch) ) # the old name for crash time crash_time = int( self._get_truncate_or_warn( raw_crash, 'CrashTime', processor_notes, timestampTime, 10 ) ) processed_crash.crash_time = crash_time if crash_time == submitted_timestamp_as_epoch: processor_notes.append( "WARNING: No 'client_crash_date' " "could be determined from the raw_crash" ) # StartupTime: must have started up some time before crash startupTime = int(raw_crash.get('StartupTime', crash_time)) # InstallTime: must have installed some time before startup installTime = int(raw_crash.get('InstallTime', startupTime)) processed_crash.client_crash_date = datetime.datetime.fromtimestamp( crash_time, UTC ) processed_crash.install_age = crash_time - installTime processed_crash.uptime = max(0, crash_time - startupTime) try: last_crash = int(raw_crash.SecondsSinceLastCrash) except: last_crash = None processed_crash.last_crash = last_crash # TODO: not sure how to reimplemnt this #if crash_id in self.priority_job_set: #processor_notes.append('Priority Job') #self.priority_job_set.remove(crash_id) # can't get report id because we don't have the database here #reportId = processed_crash["id"] processed_crash.dump = '' try: processed_crash.ReleaseChannel = \ raw_crash.ReleaseChannel except KeyError: processed_crash.ReleaseChannel = 'unknown' if self.config.collect_addon: #logger.debug("collecting Addons") # formerly 'insertAdddonsIntoDatabase' addons_as_a_list_of_tuples = self._process_list_of_addons( raw_crash, processor_notes ) processed_crash.addons = addons_as_a_list_of_tuples if self.config.collect_crash_process: #logger.debug("collecting Crash Process") # formerly insertCrashProcess processed_crash.update( self._add_process_type_to_processed_crash(raw_crash) ) processed_crash.addons_checked = None try: addons_checked_txt = raw_crash.EMCheckCompatibility.lower() processed_crash.addons_checked = False if addons_checked_txt == 'true': processed_crash.addons_checked = True except KeyError: pass # leaving it as None if not in the document if int(raw_crash.get('PluginHang', False)): processed_crash.hangid = 'fake-' + uuid else: processed_crash.hangid = raw_crash.get('HangID', None) if int(raw_crash.get('Hang', False)): processed_crash.hang_type = 1 elif int(raw_crash.get('PluginHang', False)): processed_crash.hang_type = -1 elif processed_crash.hangid: processed_crash.hang_type = -1 else: processed_crash.hang_type = 0 processed_crash.java_stack_trace = \ raw_crash.setdefault('JavaStackTrace', None) return processed_crash
def test_action_predicate_accept(self): """test all of the case where the predicate should return True""" filter_rule = DontConsiderTheseFilter() fake_processor = create_basic_fake_processor() # find non-plugin crashes test_raw_crash = DotDict() test_raw_crash.PluginHang = '0' test_raw_dumps = {} ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find non-Firefox crashes test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Internet Explorer" ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with no Version info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with faulty Version info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = 'dwight' ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with no BuildID info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17.1' ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with faulty BuildID info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17.1' test_raw_crash.BuildID = '201307E2' ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with faulty BuildID info (not integer) test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17.1' test_raw_crash.BuildID = '201307E2' ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with faulty BuildID info (bad month & day) test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17.1' test_raw_crash.BuildID = '20131458' ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with pre-17 version test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '15' test_raw_crash.BuildID = '20121015' ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with 18 version but build date less than 2012-10-23 test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '18' test_raw_crash.BuildID = '20121015' ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with build date less than 2012-10-17 # and version 17 or above test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '17' test_raw_crash.BuildID = '20121015' ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, DotDict(), fake_processor )) # find crashes with no default dump test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor )) # find crashes with no architecture info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor )) # find crashes with amd64 architecture info test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.cpu_arch = 'amd64' ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor )) # find crashes with main dump processing errors test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = False ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor )) # find crashes with extra dump processing errors test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = False ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor )) # find crashes with missing critical attribute test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = False ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor )) # find crashes with missing critical attribute test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = False ok_(filter_rule.predicate( test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor )) # reject the perfect crash test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = True ok_(not filter_rule.predicate( test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor )) # test the do-nothing action test_raw_crash = DotDict() test_raw_crash.PluginHang = '1' test_raw_crash.ProductName = "Firefox" test_raw_crash.Version = '19' test_raw_crash.BuildID = '20121031' test_processed_crash = DotDict() test_processed_crash.dump = 'fake dump' test_processed_crash.json_dump = DotDict() test_processed_crash.json_dump.system_info = DotDict() test_processed_crash.json_dump.system_info.cpu_arch = 'x86' test_processed_crash.success = True test_processed_crash.additional_minidumps = ['a', 'b', 'c'] test_processed_crash.a = DotDict() test_processed_crash.a.success = True test_processed_crash.b = DotDict() test_processed_crash.b.success = True test_processed_crash.c = DotDict() test_processed_crash.c.success = True ok_(filter_rule.action( test_raw_crash, test_raw_dumps, test_processed_crash, fake_processor ))
def _create_basic_processed_crash(self, uuid, raw_crash, submitted_timestamp, started_timestamp, processor_notes): """ This function is run only by a worker thread. Create the record for the current job in the 'reports' table input parameters: uuid: the unique id identifying the job - corresponds with the uuid column in the 'jobs' and the 'reports' tables jsonDocument: an object with a dictionary interface for fetching the components of the json document submitted_timestamp: when job came in (a key used in partitioning) processor_notes: list of strings of error messages """ #logger.debug("starting insertReportIntoDatabase") processed_crash = DotDict() processed_crash.success = False processed_crash.uuid = uuid processed_crash.startedDateTime = started_timestamp processed_crash.product = self._get_truncate_or_warn( raw_crash, 'ProductName', processor_notes, None, 30) processed_crash.version = self._get_truncate_or_warn( raw_crash, 'Version', processor_notes, None, 16) processed_crash.build = self._get_truncate_or_warn( raw_crash, 'BuildID', processor_notes, None, 16) processed_crash.url = self._get_truncate_or_none(raw_crash, 'URL', 255) processed_crash.user_comments = self._get_truncate_or_none( raw_crash, 'Comments', 500) processed_crash.app_notes = self._get_truncate_or_none( raw_crash, 'Notes', 1000) processed_crash.distributor = self._get_truncate_or_none( raw_crash, 'Distributor', 20) processed_crash.distributor_version = self._get_truncate_or_none( raw_crash, 'Distributor_version', 20) processed_crash.email = self._get_truncate_or_none( raw_crash, 'Email', 100) processed_crash.process_type = self._get_truncate_or_none( raw_crash, 'ProcessType', 10) processed_crash.release_channel = raw_crash.get( 'ReleaseChannel', 'unknown') # userId is now deprecated and replace with empty string processed_crash.user_id = "" # ++++++++++++++++++++ # date transformations processed_crash.date_processed = submitted_timestamp # defaultCrashTime: must have crashed before date processed submitted_timestamp_as_epoch = int( time.mktime(submitted_timestamp.timetuple())) timestampTime = int( raw_crash.get( 'timestamp', submitted_timestamp_as_epoch)) # the old name for crash time crash_time = int( self._get_truncate_or_warn(raw_crash, 'CrashTime', processor_notes, timestampTime, 10)) processed_crash.crash_time = crash_time if crash_time == submitted_timestamp_as_epoch: processor_notes.append("WARNING: No 'client_crash_date' " "could be determined from the raw_crash") # StartupTime: must have started up some time before crash startupTime = int(raw_crash.get('StartupTime', crash_time)) # InstallTime: must have installed some time before startup installTime = int(raw_crash.get('InstallTime', startupTime)) processed_crash.client_crash_date = datetime.datetime.fromtimestamp( crash_time, UTC) processed_crash.install_age = crash_time - installTime processed_crash.uptime = max(0, crash_time - startupTime) try: last_crash = int(raw_crash.SecondsSinceLastCrash) except: last_crash = None processed_crash.last_crash = last_crash # TODO: not sure how to reimplemnt this #if crash_id in self.priority_job_set: #processor_notes.append('Priority Job') #self.priority_job_set.remove(crash_id) # can't get report id because we don't have the database here #reportId = processed_crash["id"] processed_crash.dump = '' try: processed_crash.ReleaseChannel = \ raw_crash.ReleaseChannel except KeyError: processed_crash.ReleaseChannel = 'unknown' if self.config.collect_addon: #logger.debug("collecting Addons") # formerly 'insertAdddonsIntoDatabase' addons_as_a_list_of_tuples = self._process_list_of_addons( raw_crash, processor_notes) processed_crash.addons = addons_as_a_list_of_tuples if self.config.collect_crash_process: #logger.debug("collecting Crash Process") # formerly insertCrashProcess processed_crash.update( self._add_process_type_to_processed_crash(raw_crash)) processed_crash.addons_checked = None try: addons_checked_txt = raw_crash.EMCheckCompatibility.lower() processed_crash.addons_checked = False if addons_checked_txt == 'true': processed_crash.addons_checked = True except KeyError: pass # leaving it as None if not in the document processed_crash.hangid = raw_crash.get('HangID', None) if 'Hang' in raw_crash: processed_crash.hang_type = raw_crash.Hang elif processed_crash.hangid: processed_crash.hang_type = -1 else: processed_crash.hang_type = 0 processed_crash.java_stack_trace = \ raw_crash.setdefault('JavaStackTrace', None) return processed_crash