2014-09-12 21:24:53 +04:00
|
|
|
# -*- coding: utf-8 -*-
|
2016-01-07 07:26:29 +03:00
|
|
|
# Copyright 2014-2016 OpenMarket Ltd
|
2014-09-12 21:24:53 +04:00
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
# limitations under the License.
|
2018-01-09 15:05:25 +03:00
|
|
|
import twisted
|
2014-09-12 21:24:53 +04:00
|
|
|
from twisted.trial import unittest
|
|
|
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
# logging doesn't have a "don't log anything at all EVARRRR setting,
|
|
|
|
# but since the highest value is 50, 1000000 should do ;)
|
|
|
|
NEVER = 1000000
|
|
|
|
|
2016-07-25 14:12:47 +03:00
|
|
|
handler = logging.StreamHandler()
|
|
|
|
handler.setFormatter(logging.Formatter(
|
|
|
|
"%(levelname)s:%(name)s:%(message)s [%(pathname)s:%(lineno)d]"
|
|
|
|
))
|
|
|
|
logging.getLogger().addHandler(handler)
|
2014-09-12 21:24:53 +04:00
|
|
|
logging.getLogger().setLevel(NEVER)
|
2016-07-25 14:12:47 +03:00
|
|
|
logging.getLogger("synapse.storage.SQL").setLevel(NEVER)
|
|
|
|
logging.getLogger("synapse.storage.txn").setLevel(NEVER)
|
2014-09-12 21:24:53 +04:00
|
|
|
|
|
|
|
|
2014-09-12 22:07:29 +04:00
|
|
|
def around(target):
|
|
|
|
"""A CLOS-style 'around' modifier, which wraps the original method of the
|
|
|
|
given instance with another piece of code.
|
|
|
|
|
|
|
|
@around(self)
|
|
|
|
def method_name(orig, *args, **kwargs):
|
|
|
|
return orig(*args, **kwargs)
|
|
|
|
"""
|
|
|
|
def _around(code):
|
|
|
|
name = code.__name__
|
|
|
|
orig = getattr(target, name)
|
2016-02-19 18:34:38 +03:00
|
|
|
|
2014-09-12 22:07:29 +04:00
|
|
|
def new(*args, **kwargs):
|
|
|
|
return code(orig, *args, **kwargs)
|
2016-02-19 18:34:38 +03:00
|
|
|
|
2014-09-12 22:07:29 +04:00
|
|
|
setattr(target, name, new)
|
2016-02-19 18:34:38 +03:00
|
|
|
|
2014-09-12 22:07:29 +04:00
|
|
|
return _around
|
|
|
|
|
|
|
|
|
2014-09-12 21:24:53 +04:00
|
|
|
class TestCase(unittest.TestCase):
|
2014-09-12 21:45:48 +04:00
|
|
|
"""A subclass of twisted.trial's TestCase which looks for 'loglevel'
|
|
|
|
attributes on both itself and its individual test methods, to override the
|
|
|
|
root logger's logging level while that test (case|method) runs."""
|
|
|
|
|
2014-09-12 21:43:49 +04:00
|
|
|
def __init__(self, methodName, *args, **kwargs):
|
|
|
|
super(TestCase, self).__init__(methodName, *args, **kwargs)
|
2014-09-12 21:29:07 +04:00
|
|
|
|
2014-09-12 21:43:49 +04:00
|
|
|
method = getattr(self, methodName)
|
|
|
|
|
2016-02-19 18:34:38 +03:00
|
|
|
level = getattr(method, "loglevel", getattr(self, "loglevel", NEVER))
|
2014-09-12 21:29:07 +04:00
|
|
|
|
2014-09-12 22:07:29 +04:00
|
|
|
@around(self)
|
|
|
|
def setUp(orig):
|
2018-01-09 15:05:25 +03:00
|
|
|
# enable debugging of delayed calls - this means that we get a
|
|
|
|
# traceback when a unit test exits leaving things on the reactor.
|
|
|
|
twisted.internet.base.DelayedCall.debug = True
|
|
|
|
|
2014-09-12 21:29:07 +04:00
|
|
|
old_level = logging.getLogger().level
|
|
|
|
|
|
|
|
if old_level != level:
|
2014-09-12 22:07:29 +04:00
|
|
|
@around(self)
|
|
|
|
def tearDown(orig):
|
|
|
|
ret = orig()
|
2014-09-12 21:29:07 +04:00
|
|
|
logging.getLogger().setLevel(old_level)
|
|
|
|
return ret
|
|
|
|
|
|
|
|
logging.getLogger().setLevel(level)
|
2014-09-12 22:07:29 +04:00
|
|
|
return orig()
|
2014-09-12 21:38:11 +04:00
|
|
|
|
2014-09-17 18:56:40 +04:00
|
|
|
def assertObjectHasAttributes(self, attrs, obj):
|
|
|
|
"""Asserts that the given object has each of the attributes given, and
|
|
|
|
that the value of each matches according to assertEquals."""
|
|
|
|
for (key, value) in attrs.items():
|
|
|
|
if not hasattr(obj, key):
|
|
|
|
raise AssertionError("Expected obj to have a '.%s'" % key)
|
|
|
|
try:
|
|
|
|
self.assertEquals(attrs[key], getattr(obj, key))
|
|
|
|
except AssertionError as e:
|
|
|
|
raise (type(e))(e.message + " for '.%s'" % key)
|
|
|
|
|
2014-09-12 21:38:11 +04:00
|
|
|
|
|
|
|
def DEBUG(target):
|
2014-09-12 21:45:48 +04:00
|
|
|
"""A decorator to set the .loglevel attribute to logging.DEBUG.
|
|
|
|
Can apply to either a TestCase or an individual test method."""
|
2014-09-12 21:38:11 +04:00
|
|
|
target.loglevel = logging.DEBUG
|
|
|
|
return target
|