Merge ~cjwatson/launchpad-buildd:avoid-python-logging-observer into launchpad-buildd:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 48a024b82751630ebf1fa324fe6fdcc23676ab7d
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad-buildd:avoid-python-logging-observer
Merge into: launchpad-buildd:master
Diff against target: 64 lines (+13/-12)
1 file modified
lpbuildd/tests/test_builder.py (+13/-12)
Reviewer Review Type Date Requested Status
Jürgen Gmach Approve
Review via email: mp+415820@code.launchpad.net

Commit message

Avoid buggy PythonLoggingObserver on focal

Description of the change

The packaged version of Twisted in focal has a broken `twisted.python.log.PythonLoggingObserver` (https://bugs.launchpad.net/bugs/1961455). While this should probably be fixed in Ubuntu, it only affects one test suite, so it's easy to avoid it by restructuring that suite using `FileLogObserver` from the more modern `twisted.logger` package.

(Unfortunately we can't yet use the simpler `twisted.logger.capturedLogs`, since the packaged version of Twisted in focal is a little too old for that; but this construction is a similar level of complexity to what we had before.)

To post a comment you must log in.
Revision history for this message
Jürgen Gmach (jugmac00) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lpbuildd/tests/test_builder.py b/lpbuildd/tests/test_builder.py
2index 2048bc6..177f644 100644
3--- a/lpbuildd/tests/test_builder.py
4+++ b/lpbuildd/tests/test_builder.py
5@@ -9,15 +9,16 @@ Most tests are done on subclasses instead.
6 import io
7 import re
8
9-from fixtures import (
10- FakeLogger,
11- TempDir,
12- )
13+from fixtures import TempDir
14 import six
15 from testtools import TestCase
16 from testtools.deferredruntest import AsynchronousDeferredRunTest
17 from twisted.internet import defer
18-from twisted.python import log
19+from twisted.logger import (
20+ FileLogObserver,
21+ formatEvent,
22+ globalLogPublisher,
23+ )
24
25 from lpbuildd.builder import (
26 Builder,
27@@ -32,13 +33,14 @@ class TestBuildManager(TestCase):
28
29 def setUp(self):
30 super(TestBuildManager, self).setUp()
31- observer = log.PythonLoggingObserver()
32- observer.start()
33- self.addCleanup(observer.stop)
34+ self.log_file = io.StringIO()
35+ observer = FileLogObserver(
36+ self.log_file, lambda event: formatEvent(event) + "\n")
37+ globalLogPublisher.addObserver(observer)
38+ self.addCleanup(globalLogPublisher.removeObserver, observer)
39
40 @defer.inlineCallbacks
41 def test_runSubProcess(self):
42- logger = self.useFixture(FakeLogger())
43 config = FakeConfig()
44 config.set("builder", "filecache", self.useFixture(TempDir()).path)
45 builder = Builder(config)
46@@ -56,11 +58,10 @@ class TestBuildManager(TestCase):
47 self.assertEqual(
48 "Build log: RUN: echo 'hello world'\n"
49 "Build log: hello world\n",
50- logger.output)
51+ self.log_file.getvalue())
52
53 @defer.inlineCallbacks
54 def test_runSubProcess_bytes(self):
55- logger = self.useFixture(FakeLogger())
56 config = FakeConfig()
57 config.set("builder", "filecache", self.useFixture(TempDir()).path)
58 builder = Builder(config)
59@@ -80,4 +81,4 @@ class TestBuildManager(TestCase):
60 ["Build log: RUN: echo '%s'" % logged_snowman,
61 "Build log: %s" % logged_snowman],
62 [re.sub(r".*? \[-\] (.*)", r"\1", line)
63- for line in logger.output.splitlines()])
64+ for line in self.log_file.getvalue().splitlines()])

Subscribers

People subscribed via source and target branches