Check logcontexts before and after each test (#4190)

* Add better diagnostics to flakey keyring test

* fix interpolation fail

* Check logcontexts before and after each test

* update changelog

* update changelog
This commit is contained in:
Richard van der Hoff 2018-11-27 03:47:18 +01:00 committed by Amber Brown
parent 80527b568d
commit a44c0a096f
3 changed files with 22 additions and 8 deletions

1
changelog.d/4190.misc Normal file
View File

@ -0,0 +1 @@
Add some diagnostics to the tests to detect logcontext problems

View File

@ -63,6 +63,14 @@ class KeyringTestCase(unittest.TestCase):
keys = self.mock_perspective_server.get_verify_keys() keys = self.mock_perspective_server.get_verify_keys()
self.hs.config.perspectives = {self.mock_perspective_server.server_name: keys} self.hs.config.perspectives = {self.mock_perspective_server.server_name: keys}
def assert_sentinel_context(self):
if LoggingContext.current_context() != LoggingContext.sentinel:
self.fail(
"Expected sentinel context but got %s" % (
LoggingContext.current_context(),
)
)
def check_context(self, _, expected): def check_context(self, _, expected):
self.assertEquals( self.assertEquals(
getattr(LoggingContext.current_context(), "request", None), expected getattr(LoggingContext.current_context(), "request", None), expected
@ -70,8 +78,6 @@ class KeyringTestCase(unittest.TestCase):
@defer.inlineCallbacks @defer.inlineCallbacks
def test_wait_for_previous_lookups(self): def test_wait_for_previous_lookups(self):
sentinel_context = LoggingContext.current_context()
kr = keyring.Keyring(self.hs) kr = keyring.Keyring(self.hs)
lookup_1_deferred = defer.Deferred() lookup_1_deferred = defer.Deferred()
@ -99,8 +105,10 @@ class KeyringTestCase(unittest.TestCase):
["server1"], {"server1": lookup_2_deferred} ["server1"], {"server1": lookup_2_deferred}
) )
self.assertFalse(wait_2_deferred.called) self.assertFalse(wait_2_deferred.called)
# ... so we should have reset the LoggingContext. # ... so we should have reset the LoggingContext.
self.assertIs(LoggingContext.current_context(), sentinel_context) self.assert_sentinel_context()
wait_2_deferred.addBoth(self.check_context, "two") wait_2_deferred.addBoth(self.check_context, "two")
# let the first lookup complete (in the sentinel context) # let the first lookup complete (in the sentinel context)
@ -198,8 +206,6 @@ class KeyringTestCase(unittest.TestCase):
json1 = {} json1 = {}
signedjson.sign.sign_json(json1, "server9", key1) signedjson.sign.sign_json(json1, "server9", key1)
sentinel_context = LoggingContext.current_context()
with LoggingContext("one") as context_one: with LoggingContext("one") as context_one:
context_one.request = "one" context_one.request = "one"
@ -213,7 +219,7 @@ class KeyringTestCase(unittest.TestCase):
defer = kr.verify_json_for_server("server9", json1) defer = kr.verify_json_for_server("server9", json1)
self.assertFalse(defer.called) self.assertFalse(defer.called)
self.assertIs(LoggingContext.current_context(), sentinel_context) self.assert_sentinel_context()
yield defer yield defer
self.assertIs(LoggingContext.current_context(), context_one) self.assertIs(LoggingContext.current_context(), context_one)

View File

@ -102,8 +102,16 @@ class TestCase(unittest.TestCase):
# traceback when a unit test exits leaving things on the reactor. # traceback when a unit test exits leaving things on the reactor.
twisted.internet.base.DelayedCall.debug = True twisted.internet.base.DelayedCall.debug = True
old_level = logging.getLogger().level # if we're not starting in the sentinel logcontext, then to be honest
# all future bets are off.
if LoggingContext.current_context() is not LoggingContext.sentinel:
self.fail(
"Test starting with non-sentinel logging context %s" % (
LoggingContext.current_context(),
)
)
old_level = logging.getLogger().level
if old_level != level: if old_level != level:
@around(self) @around(self)
@ -118,7 +126,6 @@ class TestCase(unittest.TestCase):
@around(self) @around(self)
def tearDown(orig): def tearDown(orig):
ret = orig() ret = orig()
# force a GC to workaround problems with deferreds leaking logcontexts when # force a GC to workaround problems with deferreds leaking logcontexts when
# they are GCed (see the logcontext docs) # they are GCed (see the logcontext docs)
gc.collect() gc.collect()