← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~tushar5526/launchpad-buildd:enable-support-for-riscv-support-via-noble into launchpad-buildd:master

 

Tushar Gupta has proposed merging ~tushar5526/launchpad-buildd:enable-support-for-riscv-support-via-noble into launchpad-buildd:master.

Commit message:
feat: added support for noble

- python-txfixtures and associated tests are removed. 
- migration from imp to importlib after deprecation in 3.12(noble)
- migration from deferredruntests module to twistedsupport in testtools

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~tushar5526/launchpad-buildd/+git/launchpad-buildd/+merge/469735
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~tushar5526/launchpad-buildd:enable-support-for-riscv-support-via-noble into launchpad-buildd:master.
diff --git a/debian/control b/debian/control
index e4b5dc3..0cfa9aa 100644
--- a/debian/control
+++ b/debian/control
@@ -26,7 +26,6 @@ Build-Depends: apt-utils,
                python3-systemfixtures,
                python3-testtools,
                python3-twisted (>= 16.4.0),
-               python3-txfixtures,
                python3-yaml,
 # We don't use the bits of pylxd that require this at run-time, but at
 # build-time pybuild fails if it's not available.
diff --git a/lpbuildd/tests/harness.py b/lpbuildd/tests/harness.py
index 2c7761a..28ccf80 100644
--- a/lpbuildd/tests/harness.py
+++ b/lpbuildd/tests/harness.py
@@ -14,10 +14,6 @@ import os
 import shutil
 import tempfile
 import unittest
-from textwrap import dedent
-
-from fixtures import EnvironmentVariable, TempDir
-from txfixtures.tachandler import TacTestFixture
 
 from lpbuildd.builder import Builder
 
@@ -60,108 +56,3 @@ class BuilddTestCase(unittest.TestCase):
         f = open(self.builder.cachePath("buildlog"), "w")
         f.write("x" * size)
         f.close()
-
-
-class BuilddTestSetup(TacTestFixture):
-    r"""Setup Builder for use by functional tests
-
-    >>> fixture = BuilddTestSetup()
-    >>> fixture.setUp()
-
-    Make sure the server is running
-
-    >>> try:
-    ...     from xmlrpc.client import ServerProxy
-    ... except ImportError:
-    ...     from xmlrpclib import ServerProxy
-    >>> s = ServerProxy('http://localhost:8321/rpc/')
-    >>> s.echo('Hello World')
-    ['Hello World']
-    >>> fixture.tearDown()
-
-    Again for luck !
-
-    >>> fixture.setUp()
-    >>> s = ServerProxy('http://localhost:8321/rpc/')
-
-    >>> s.echo('Hello World')
-    ['Hello World']
-
-    >>> info = s.info()
-    >>> len(info)
-    3
-    >>> print(info[:2])
-    ['1.0', 'i386']
-
-    >>> for buildtype in sorted(info[2]):
-    ...     print(buildtype)
-    binarypackage
-    debian
-    sourcepackagerecipe
-    translation-templates
-
-    >>> s.status()["builder_status"]
-    'BuilderStatus.IDLE'
-
-    >>> fixture.tearDown()
-    """
-
-    _root = None
-
-    def setUp(self, **kwargs):
-        # TacTestFixture defaults to /usr/bin/twistd, but on Ubuntu the
-        # Python 3 version of this is /usr/bin/twistd3, so that makes for a
-        # better default.
-        if kwargs.get("twistd_script") is None:
-            kwargs["twistd_script"] = "/usr/bin/twistd3"
-        super().setUp(**kwargs)
-
-    def setUpRoot(self):
-        filecache = os.path.join(self.root, "filecache")
-        os.mkdir(filecache)
-        self.useFixture(EnvironmentVariable("HOME", self.root))
-        test_conffile = os.path.join(self.root, "buildd.conf")
-        with open(test_conffile, "w") as f:
-            f.write(
-                dedent(
-                    f"""\
-                [builder]
-                architecturetag = i386
-                filecache = {filecache}
-                bindhost = localhost
-                bindport = {self.daemon_port}
-                sharepath = {self.root}
-                """
-                )
-            )
-        self.useFixture(EnvironmentVariable("BUILDD_CONFIG", test_conffile))
-        # XXX cprov 2005-05-30:
-        # When we are about running it seriously we need :
-        # * install sbuild package
-        # * to copy the scripts for sbuild
-
-    @property
-    def root(self):
-        if self._root is None:
-            self._root = self.useFixture(TempDir()).path
-        return self._root
-
-    @property
-    def tacfile(self):
-        return os.path.abspath(
-            os.path.join(
-                os.path.dirname(__file__), os.path.pardir, "buildd.tac"
-            )
-        )
-
-    @property
-    def pidfile(self):
-        return os.path.join(self.root, "buildd.pid")
-
-    @property
-    def logfile(self):
-        return "/var/tmp/buildd.log"
-
-    @property
-    def daemon_port(self):
-        return 8321
diff --git a/lpbuildd/tests/test_binarypackage.py b/lpbuildd/tests/test_binarypackage.py
index 8c41f8b..77029d3 100644
--- a/lpbuildd/tests/test_binarypackage.py
+++ b/lpbuildd/tests/test_binarypackage.py
@@ -12,7 +12,6 @@ from textwrap import dedent
 from debian.deb822 import PkgRelation
 from fixtures import MonkeyPatch
 from testtools import TestCase
-from testtools.deferredruntest import AsynchronousDeferredRunTest
 from testtools.matchers import (
     Contains,
     ContainsDict,
@@ -21,6 +20,7 @@ from testtools.matchers import (
     MatchesListwise,
     Not,
 )
+from testtools.twistedsupport import AsynchronousDeferredRunTest
 from twisted.internet import defer
 from twisted.internet.task import Clock
 
diff --git a/lpbuildd/tests/test_buildd.py b/lpbuildd/tests/test_buildd.py
index 569a901..7855cec 100644
--- a/lpbuildd/tests/test_buildd.py
+++ b/lpbuildd/tests/test_buildd.py
@@ -16,19 +16,10 @@ __all__ = ["LaunchpadBuilddTests"]
 import difflib
 import os
 import shutil
-import sys
 import tempfile
-import unittest
 from urllib.request import HTTPBasicAuthHandler
-from xmlrpc.client import ServerProxy
 
-import twisted
-
-from lpbuildd.tests.harness import (
-    BuilddTestCase,
-    BuilddTestSetup,
-    MockBuildManager,
-)
+from lpbuildd.tests.harness import BuilddTestCase, MockBuildManager
 
 
 def read_file(path):
@@ -223,33 +214,3 @@ class LaunchpadBuilddTests(BuilddTestCase):
             self.builder.addWaitingFile(path)
         self.builder.clean()
         self.assertEqual([], os.listdir(self.builder._cachepath))
-
-
-class XMLRPCBuilderTests(unittest.TestCase):
-    def setUp(self):
-        super().setUp()
-        self.builder = BuilddTestSetup()
-        self.builder.setUp()
-        self.server = ServerProxy("http://localhost:8321/rpc/";)
-
-    def tearDown(self):
-        self.builder.tearDown()
-        super().tearDown()
-
-    @unittest.skipIf(
-        sys.version >= "3"
-        and (twisted.version.major, twisted.version.minor) < (16, 4),
-        "twistd fails to daemonise on Python 3 before Twisted 16.4.0",
-    )
-    def test_build_unknown_builder(self):
-        # If a bogus builder name is passed into build, it returns an
-        # appropriate error message and not just 'None'.
-        buildername = "nonexistentbuilder"
-        status, info = self.server.build("foo", buildername, "sha1", {}, {})
-
-        self.assertEqual("BuilderStatus.UNKNOWNBUILDER", status)
-        self.assertIsNotNone(info, "UNKNOWNBUILDER returns 'None' info.")
-        self.assertTrue(
-            info.startswith("%s not in [" % buildername),
-            'UNKNOWNBUILDER info is "%s"' % info,
-        )
diff --git a/lpbuildd/tests/test_builder.py b/lpbuildd/tests/test_builder.py
index 607e7ce..161923f 100644
--- a/lpbuildd/tests/test_builder.py
+++ b/lpbuildd/tests/test_builder.py
@@ -11,7 +11,7 @@ import re
 
 from fixtures import TempDir
 from testtools import TestCase
-from testtools.deferredruntest import AsynchronousDeferredRunTest
+from testtools.twistedsupport import AsynchronousDeferredRunTest
 from twisted.internet import defer
 from twisted.logger import FileLogObserver, formatEvent, globalLogPublisher
 
diff --git a/lpbuildd/tests/test_buildrecipe.py b/lpbuildd/tests/test_buildrecipe.py
index c56958e..e5bc21c 100644
--- a/lpbuildd/tests/test_buildrecipe.py
+++ b/lpbuildd/tests/test_buildrecipe.py
@@ -1,7 +1,8 @@
 # Copyright 2014-2019 Canonical Ltd.  This software is licensed under the
 # GNU Affero General Public License version 3 (see the file LICENSE).
 
-import imp
+import importlib.machinery
+import importlib.util
 import io
 import os
 import shutil
@@ -17,6 +18,22 @@ from testtools import TestCase
 from testtools.matchers import Equals, MatchesListwise, StartsWith
 
 
+# imp was removed in python3.12(used by noble)
+# docs suggests the below migration snippet for imp.load_source
+# https://docs.python.org/dev/whatsnew/3.12.html#imp
+def load_source(modname, filename):
+    loader = importlib.machinery.SourceFileLoader(modname, filename)
+    spec = importlib.util.spec_from_file_location(
+        modname, filename, loader=loader
+    )
+    module = importlib.util.module_from_spec(spec)
+    # The module is always executed and not cached in sys.modules.
+    # Uncomment the following line to cache the module.
+    # sys.modules[module.__name__] = module
+    loader.exec_module(module)
+    return module
+
+
 @contextmanager
 def disable_bytecode():
     original = sys.dont_write_bytecode
@@ -27,9 +44,7 @@ def disable_bytecode():
 
 # By-hand import to avoid having to put .py suffixes on builder binaries.
 with disable_bytecode():
-    RecipeBuilder = imp.load_source(
-        "buildrecipe", "bin/buildrecipe"
-    ).RecipeBuilder
+    RecipeBuilder = load_source("buildrecipe", "bin/buildrecipe").RecipeBuilder
 
 
 class RanCommand(MatchesListwise):
diff --git a/lpbuildd/tests/test_charm.py b/lpbuildd/tests/test_charm.py
index 18736dd..c1e0e14 100644
--- a/lpbuildd/tests/test_charm.py
+++ b/lpbuildd/tests/test_charm.py
@@ -7,7 +7,7 @@ import os
 import responses
 from fixtures import EnvironmentVariable, TempDir
 from testtools import TestCase
-from testtools.deferredruntest import AsynchronousDeferredRunTest
+from testtools.twistedsupport import AsynchronousDeferredRunTest
 from twisted.internet import defer
 
 from lpbuildd.charm import CharmBuildManager, CharmBuildState
diff --git a/lpbuildd/tests/test_ci.py b/lpbuildd/tests/test_ci.py
index b9cfd19..6aa00af 100644
--- a/lpbuildd/tests/test_ci.py
+++ b/lpbuildd/tests/test_ci.py
@@ -6,7 +6,7 @@ import shutil
 
 from fixtures import EnvironmentVariable, TempDir
 from testtools import TestCase
-from testtools.deferredruntest import AsynchronousDeferredRunTest
+from testtools.twistedsupport import AsynchronousDeferredRunTest
 from twisted.internet import defer
 
 from lpbuildd.builder import get_build_path
diff --git a/lpbuildd/tests/test_livefs.py b/lpbuildd/tests/test_livefs.py
index 25eea06..6640f90 100644
--- a/lpbuildd/tests/test_livefs.py
+++ b/lpbuildd/tests/test_livefs.py
@@ -5,7 +5,7 @@ import os
 
 from fixtures import EnvironmentVariable, TempDir
 from testtools import TestCase
-from testtools.deferredruntest import AsynchronousDeferredRunTest
+from testtools.twistedsupport import AsynchronousDeferredRunTest
 from twisted.internet import defer
 
 from lpbuildd.livefs import (
diff --git a/lpbuildd/tests/test_oci.py b/lpbuildd/tests/test_oci.py
index d236b34..fe4ee23 100644
--- a/lpbuildd/tests/test_oci.py
+++ b/lpbuildd/tests/test_oci.py
@@ -7,8 +7,8 @@ from collections import OrderedDict
 
 from fixtures import EnvironmentVariable, MockPatch, TempDir
 from testtools import TestCase
-from testtools.deferredruntest import AsynchronousDeferredRunTest
 from testtools.matchers import Contains
+from testtools.twistedsupport import AsynchronousDeferredRunTest
 from twisted.internet import defer
 
 from lpbuildd.oci import OCIBuildManager, OCIBuildState
diff --git a/lpbuildd/tests/test_snap.py b/lpbuildd/tests/test_snap.py
index b6cb638..bf2adfa 100644
--- a/lpbuildd/tests/test_snap.py
+++ b/lpbuildd/tests/test_snap.py
@@ -8,7 +8,7 @@ import responses
 from fixtures import EnvironmentVariable, TempDir
 from testtools import TestCase
 from testtools.content import text_content
-from testtools.deferredruntest import AsynchronousDeferredRunTest
+from testtools.twistedsupport import AsynchronousDeferredRunTest
 from twisted.internet import defer, reactor, utils
 from twisted.web import http, proxy, resource, server, static
 
diff --git a/lpbuildd/tests/test_sourcepackagerecipe.py b/lpbuildd/tests/test_sourcepackagerecipe.py
index 4ff7004..07490a3 100644
--- a/lpbuildd/tests/test_sourcepackagerecipe.py
+++ b/lpbuildd/tests/test_sourcepackagerecipe.py
@@ -8,7 +8,7 @@ from textwrap import dedent
 
 from systemfixtures import FakeProcesses
 from testtools import TestCase
-from testtools.deferredruntest import AsynchronousDeferredRunTest
+from testtools.twistedsupport import AsynchronousDeferredRunTest
 from twisted.internet import defer
 
 from lpbuildd.sourcepackagerecipe import (
diff --git a/lpbuildd/tests/test_translationtemplatesbuildmanager.py b/lpbuildd/tests/test_translationtemplatesbuildmanager.py
index 3729345..6dfa695 100644
--- a/lpbuildd/tests/test_translationtemplatesbuildmanager.py
+++ b/lpbuildd/tests/test_translationtemplatesbuildmanager.py
@@ -5,7 +5,7 @@ import os
 
 from fixtures import EnvironmentVariable, TempDir
 from testtools import TestCase
-from testtools.deferredruntest import AsynchronousDeferredRunTest
+from testtools.twistedsupport import AsynchronousDeferredRunTest
 from twisted.internet import defer
 
 from lpbuildd.target.generate_translation_templates import (
diff --git a/setup.py b/setup.py
index e478581..53549d4 100755
--- a/setup.py
+++ b/setup.py
@@ -84,6 +84,5 @@ setup(
         "responses",
         "systemfixtures",
         "testtools",
-        "txfixtures",
     ],
 )
diff --git a/system-dependencies.txt b/system-dependencies.txt
index df43d2b..da837e6 100644
--- a/system-dependencies.txt
+++ b/system-dependencies.txt
@@ -16,6 +16,5 @@ python3-setuptools
 python3-systemfixtures
 python3-testtools
 python3-twisted
-python3-txfixtures
 python3-yaml
 python3-zope.interface

Follow ups