def test_ignored_flag(self): on_error.log(foo='bar') self.assertEqual(1, models.Error.query().count()) expected = { 'args': [], 'category': None, 'created_ts': self._now, 'cwd': None, 'duration': None, 'endpoint': None, 'env': None, 'exception_type': None, 'hostname': None, 'identity': None, 'message': None, 'method': None, 'os': None, 'params': None, 'python_version': None, 'request_id': None, 'source': u'unknown', 'source_ip': None, 'stack': None, 'user': None, 'version': None, } self.assertEqual(expected, models.Error.query().get().to_dict())
def test_log(self): kwargs = dict((k, k) for k in on_error.VALID_ERROR_KEYS) kwargs['args'] = ['args'] kwargs['category'] = 'exception' kwargs['duration'] = 2.3 kwargs['env'] = {'foo': 'bar'} kwargs['params'] = {'foo': 'bar'} kwargs['source'] = 'bot' kwargs['source_ip'] = '0.0.0.0' on_error.log(**kwargs) self.assertEqual(1, models.Error.query().count()) expected = { 'args': [u'args'], 'category': u'exception', 'created_ts': self._now, 'cwd': u'cwd', 'duration': 2.3, 'endpoint': u'endpoint', 'env': {u'foo': u'bar'}, 'exception_type': u'exception_type', 'hostname': u'hostname', 'identity': None, 'message': u'message', 'method': u'method', 'os': u'os', 'params': {u'foo': u'bar'}, 'python_version': u'python_version', 'request_id': u'request_id', 'source': u'bot', 'source_ip': u'0.0.0.0', 'stack': u'stack', 'user': u'user', 'version': u'version', } self.assertEqual(expected, models.Error.query().get().to_dict())
def test_ignored_flag(self): on_error.log(foo='bar') self.assertEqual(1, models.Error.query().count()) expected = { 'args': [], 'category': None, 'created_ts': self._now, 'cwd': None, 'duration': None, 'endpoint': None, 'env': None, 'exception_type': None, 'hostname': None, 'identity': None, 'message': None, 'method': None, 'os': None, 'params': None, 'python_version': None, 'request_id': None, 'source': u'unknown', 'source_ip': None, 'stack': None, 'user': None, 'version': None, } self.assertEqual(expected, models.Error.query().get().to_dict())
def test_log(self): kwargs = dict((k, k) for k in on_error.VALID_ERROR_KEYS) kwargs['args'] = ['args'] kwargs['category'] = 'exception' kwargs['duration'] = 2.3 kwargs['env'] = {'foo': 'bar'} kwargs['params'] = {'foo': 'bar'} kwargs['source'] = 'bot' kwargs['source_ip'] = '0.0.0.0' on_error.log(**kwargs) self.assertEqual(1, models.Error.query().count()) expected = { 'args': [u'args'], 'category': u'exception', 'created_ts': self._now, 'cwd': u'cwd', 'duration': 2.3, 'endpoint': u'endpoint', 'env': {u'foo': u'bar'}, 'exception_type': u'exception_type', 'hostname': u'hostname', 'identity': None, 'message': u'message', 'method': u'method', 'os': u'os', 'params': {u'foo': u'bar'}, 'python_version': u'python_version', 'request_id': u'request_id', 'source': u'bot', 'source_ip': u'0.0.0.0', 'stack': u'stack', 'user': u'user', 'version': u'version', } self.assertEqual(expected, models.Error.query().get().to_dict())
def test_log_server(self): # version is automatiaclly added. on_error.log(source='server') self.assertEqual(1, models.Error.query().count()) expected = dict((k, None) for k in on_error.VALID_ERROR_KEYS) expected['args'] = [] expected['created_ts'] = self._now expected['identity'] = None expected['python_version'] = unicode(platform.python_version()) expected['source'] = u'server' expected['source_ip'] = None expected['version'] = u'v1a' self.assertEqual(expected, models.Error.query().get().to_dict())
def test_log_server(self): # version is automatiaclly added. on_error.log(source='server') self.assertEqual(1, models.Error.query().count()) expected = dict((k, None) for k in on_error.VALID_ERROR_KEYS) expected['args'] = [] expected['created_ts'] = self._now expected['identity'] = None expected['python_version'] = unicode(platform.python_version()) expected['source'] = u'server' expected['source_ip'] = None expected['version'] = u'v1a' self.assertEqual(expected, models.Error.query().get().to_dict())
def test_log(self): # It must work even if auth is not initialized. self.mock(logging, 'error', lambda *_, **_kwargs: None) error_id = on_error.log(source='bot', category='task_failure', message='Dang') self.assertEqual(1, models.Error.query().count()) self.assertEqual(error_id, models.Error.query().get().key.integer_id()) expected = { 'args': [], 'category': u'task_failure', 'created_ts': self._now, 'cwd': None, 'duration': None, 'endpoint': None, 'env': None, 'exception_type': None, 'hostname': None, 'identity': None, 'message': u'Dang', 'method': None, 'os': None, 'params': None, 'python_version': None, 'request_id': None, 'source': u'bot', 'source_ip': None, 'stack': None, 'user': None, 'version': None, } self.assertEqual(expected, models.Error.query().get().to_dict())
def test_log(self): # It must work even if auth is not initialized. self.mock(logging, 'error', lambda *_, **_kwargs: None) error_id = on_error.log( source='bot', category='task_failure', message='Dang') self.assertEqual(1, models.Error.query().count()) self.assertEqual(error_id, models.Error.query().get().key.integer_id()) expected = { 'args': [], 'category': u'task_failure', 'created_ts': self._now, 'cwd': None, 'duration': None, 'endpoint': None, 'env': None, 'exception_type': None, 'hostname': None, 'identity': None, 'message': u'Dang', 'method': None, 'os': None, 'params': None, 'python_version': None, 'request_id': None, 'source': u'bot', 'source_ip': None, 'stack': None, 'user': None, 'version': None, } self.assertEqual(expected, models.Error.query().get().to_dict())
def test_exception(self): on_error.log(env='str') self.assertEqual(1, models.Error.query().count()) relpath_on_error = formatter._relative_path(ON_ERROR_PATH) expected = { 'args': [], 'category': u'exception', 'created_ts': self._now, 'cwd': None, 'duration': None, 'endpoint': None, 'env': None, 'exception_type': u'<type \'exceptions.TypeError\'>', 'hostname': None, 'identity': None, 'message': u'log({\'env\': \'str\'}) caused: JSON property must be a ' u'<type \'dict\'>', 'method': None, 'os': None, 'params': None, 'python_version': None, 'request_id': None, 'source': u'server', 'source_ip': None, 'stack': u'Traceback (most recent call last):\n' u' File "%s", line 0, in log\n' u' error = models.Error(identity=identity, **kwargs)\n' u' File "appengine/ext/ndb/model.py", line 0, in __init__\n' % relpath_on_error.replace('.pyc', '.py'), 'user': None, 'version': None, } actual = models.Error.query().get().to_dict() # Zap out line numbers to 0, it's annoying otherwise to update the unit test # just for line move. Only keep the first 4 lines because json_dict # verification is a tad deep insode ndb/model.py. actual['stack'] = ''.join( re.sub(r' \d+', ' 0', actual['stack']).splitlines(True)[:4]) # Also make no distinction between *.pyc and *.py files. actual['stack'] = actual['stack'].replace('.pyc', '.py') self.assertEqual(expected, actual)
def test_exception(self): on_error.log(env='str') self.assertEqual(1, models.Error.query().count()) relpath_on_error = formatter._relative_path(ON_ERROR_PATH) expected = { 'args': [], 'category': u'exception', 'created_ts': self._now, 'cwd': None, 'duration': None, 'endpoint': None, 'env': None, 'exception_type': u'<type \'exceptions.TypeError\'>', 'hostname': None, 'identity': None, 'message': u'log({\'env\': \'str\'}) caused: JSON property must be a ' u'<type \'dict\'>', 'method': None, 'os': None, 'params': None, 'python_version': None, 'request_id': None, 'source': u'server', 'source_ip': None, 'stack': u'Traceback (most recent call last):\n' u' File "%s", line 0, in log\n' u' error = models.Error(identity=identity, **kwargs)\n' u' File "appengine/ext/ndb/model.py", line 0, in __init__\n' % relpath_on_error.replace('.pyc', '.py'), 'user': None, 'version': None, } actual = models.Error.query().get().to_dict() # Zap out line numbers to 0, it's annoying otherwise to update the unit test # just for line move. Only keep the first 4 lines because json_dict # verification is a tad deep insode ndb/model.py. actual['stack'] = ''.join( re.sub(r' \d+', ' 0', actual['stack']).splitlines(True)[:4]) # Also make no distinction between *.pyc and *.py files. actual['stack'] = actual['stack'].replace('.pyc', '.py') self.assertEqual(expected, actual)
def test_cron_old_errors(self): self.mock(logging, 'error', lambda *_a, **_k: None) kwargs = dict((k, k) for k in on_error.VALID_ERROR_KEYS) kwargs['category'] = 'exception' kwargs['duration'] = 2.3 kwargs['source'] = 'bot' kwargs['source_ip'] = '0.0.0.0' on_error.log(**kwargs) # First call shouldn't delete the error since its not stale yet. headers = {'X-AppEngine-Cron': 'true'} response = self.app.get( '/internal/cron/ereporter2/cleanup', headers=headers) self.assertEqual('0', response.body) self.assertEqual(1, models.Error.query().count()) # Set the current time to the future, but not too much. now = self._now + on_error.ERROR_TIME_TO_LIVE self.mock_now(now, -60) headers = {'X-AppEngine-Cron': 'true'} response = self.app.get( '/internal/cron/ereporter2/cleanup', headers=headers) self.assertEqual('0', response.body) self.assertEqual(1, models.Error.query().count()) # Set the current time to the future. now = self._now + on_error.ERROR_TIME_TO_LIVE self.mock_now(now, 60) # Second call should remove the now stale error. headers = {'X-AppEngine-Cron': 'true'} response = self.app.get( '/internal/cron/ereporter2/cleanup', headers=headers) self.assertEqual('1', response.body) self.assertEqual(0, models.Error.query().count())
def test_cron_old_errors(self): self.mock(logging, 'error', lambda *_a, **_k: None) kwargs = dict((k, k) for k in on_error.VALID_ERROR_KEYS) kwargs['category'] = 'exception' kwargs['duration'] = 2.3 kwargs['source'] = 'bot' kwargs['source_ip'] = '0.0.0.0' on_error.log(**kwargs) # First call shouldn't delete the error since its not stale yet. headers = {'X-AppEngine-Cron': 'true'} response = self.app.get( '/internal/cron/ereporter2/cleanup', headers=headers) self.assertEqual('0', response.body) self.assertEqual(1, models.Error.query().count()) # Set the current time to the future, but not too much. now = self._now + on_error.ERROR_TIME_TO_LIVE self.mock_now(now, -60) headers = {'X-AppEngine-Cron': 'true'} response = self.app.get( '/internal/cron/ereporter2/cleanup', headers=headers) self.assertEqual('0', response.body) self.assertEqual(1, models.Error.query().count()) # Set the current time to the future. now = self._now + on_error.ERROR_TIME_TO_LIVE self.mock_now(now, 60) # Second call should remove the now stale error. headers = {'X-AppEngine-Cron': 'true'} response = self.app.get( '/internal/cron/ereporter2/cleanup', headers=headers) self.assertEqual('1', response.body) self.assertEqual(0, models.Error.query().count())