Ejemplo n.º 1
0
  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)
Ejemplo n.º 2
0
    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))
Ejemplo n.º 3
0
    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))