def test_report_silence(self): # Log an error, ensure it's returned, silence it, ensure it's silenced. self.mock_as_admin() exceptions = [ErrorRecord()] self.mock( logscraper, '_extract_exceptions_from_logs', lambda *_: exceptions[:]) resp = self.app.get('/restricted/ereporter2/report') # Grep the form. This is crude parsing with assumption of the form layout. # mechanize could be used if more complex parsing is needed. forms = re.findall(r'(\<form .+?\<\/form\>)', resp.body, re.DOTALL) self.assertEqual(1, len(forms)) form = forms[0] silence_url = re.search(r'action\=\"(.+?)\"', form).group(1) self.assertEqual('/restricted/ereporter2/silence', silence_url) expected_inputs = { 'exception_type': 'DeadlineExceededError', 'signature': 'DeadlineExceededError@check_entry_infos', 'mute_type': 'exception_type', 'silenced': None, 'silenced_until': 'T', 'threshold': '10', } actual_inputs = {} for i in re.findall(r'(\<input .+?\<\/input\>)', form, re.DOTALL): input_type = re.search(r'type\=\"(.+?)\"', i).group(1) name_match = re.search(r'name\=\"(.+?)\"', i) if input_type == 'submit': self.assertEqual(None, name_match) continue self.assertTrue(name_match, i) name = name_match.group(1) # That's cheezy, as silenced used 'checked', not value. value_match = re.search(r'value\=\"(.+)\"', i) if name == 'xsrf_token': expected_inputs[name] = value_match.group(1) actual_inputs[name] = value_match.group(1) if value_match else None self.assertEqual(expected_inputs, actual_inputs) def gen_request(request_id): for i in exceptions: if i.request_id == request_id: return logservice.RequestLog() self.fail() self.mock(logscraper, '_log_request_id', gen_request) self.app.get('/restricted/ereporter2/request/123', status=200) params = {k: (v or '') for k, v in actual_inputs.iteritems()} # Silence it. params['silenced'] = '1' resp = self.app.post(silence_url, params=params) silenced = models.ErrorReportingMonitoring().query().fetch() self.assertEqual(1, len(silenced)) # Ensures silencing worked. resp = self.app.get('/restricted/ereporter2/report') self.assertIn('Found 0 occurrences of 0 errors across', resp.body) self.assertIn('Ignored 1 occurrences of 1 errors across', resp.body)
def test_silence_unicode(self): record = ErrorRecordStub(u'fàiléd', u'DéadlineExceèdedError') category = logscraper._ErrorCategory(record.signature) category.append_error(record) self.assertEqual( False, logscraper._should_ignore_error_category(None, category)) m = models.ErrorReportingMonitoring( key=models.ErrorReportingMonitoring.error_to_key( u'DéadlineExceèdedError@function_name'), error=u'DéadlineExceèdedError@function_name', silenced=True) self.assertEqual(True, logscraper._should_ignore_error_category(m, category))
def test_silence_until(self): record = ErrorRecordStub(u'failed', u'DeadlineExceededError') category = logscraper._ErrorCategory(record.signature) category.append_error(record) self.assertEqual( False, logscraper._should_ignore_error_category(None, category)) m = models.ErrorReportingMonitoring( key=models.ErrorReportingMonitoring.error_to_key( u'DeadlineExceededError@function_name'), error=u'DeadlineExceededError@function_name', silenced_until=self._now + datetime.timedelta(seconds=5)) self.assertEqual(True, logscraper._should_ignore_error_category(m, category)) self.mock_now(self._now, 10) self.assertEqual(False, logscraper._should_ignore_error_category(m, category))