diff mbox series

[RFC,3/3] prserv: start bitbake selftests

Message ID 20240416171945.3799445-4-michael.opdenacker@bootlin.com
State New
Headers show
Series Call for help for prserv selftests | expand

Commit Message

Michael Opdenacker April 16, 2024, 5:19 p.m. UTC
From: Michael Opdenacker <michael.opdenacker@bootlin.com>

Signed-off-by: Michael Opdenacker <michael.opdenacker@bootlin.com>
CC: Joshua Watt <JPEWhacker@gmail.com>
CC: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bin/bitbake-selftest   |  2 +
 lib/prserv/__init__.py | 24 ++++++++++++
 lib/prserv/tests.py    | 84 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 110 insertions(+)
 create mode 100644 bitbake/lib/prserv/tests.py
diff mbox series

Patch

diff --git a/bin/bitbake-selftest b/bin/bitbake-selftest
index f25f23b1ae..ce901232fe 100755
--- a/bin/bitbake-selftest
+++ b/bin/bitbake-selftest
@@ -15,6 +15,7 @@  import unittest
 try:
     import bb
     import hashserv
+    import prserv
     import layerindexlib
 except RuntimeError as exc:
     sys.exit(str(exc))
@@ -33,6 +34,7 @@  tests = ["bb.tests.codeparser",
          "bb.tests.utils",
          "bb.tests.compression",
          "hashserv.tests",
+         "prserv.tests",
          "layerindexlib.tests.layerindexobj",
          "layerindexlib.tests.restapi",
          "layerindexlib.tests.cooker"]
diff --git a/lib/prserv/__init__.py b/lib/prserv/__init__.py
index 2ee6a28c04..76041f9001 100644
--- a/lib/prserv/__init__.py
+++ b/lib/prserv/__init__.py
@@ -20,6 +20,30 @@  def init_logger(logfile, loglevel):
 class NotFoundError(Exception):
     pass
 
+def create_server(addr, dbpath, upstream=None, read_only=False):
+    from . import serv
+
+    s = serv.PRServer(dbpath, upstream=upstream, read_only=read_only)
+
+    (typ, a) = parse_address(addr)
+    s.start_tcp_server(*a)
+
+    return s
+
+def create_client(addr):
+    from . import client
+
+    c = client.PRClient()
+
+    try:
+        (typ, a) = parse_address(addr)
+        c.connect_tcp(*a)
+        print("CLIENT CONNECTED TO: %s" %(addr))
+        return c
+    except Exception as e:
+        c.close()
+        raise e
+
 async def create_async_client(addr):
     from . import client
 
diff --git a/lib/prserv/tests.py b/lib/prserv/tests.py
new file mode 100644
index 0000000000..1e3b63913b
--- /dev/null
+++ b/lib/prserv/tests.py
@@ -0,0 +1,84 @@ 
+#! /usr/bin/env python3
+#
+# Copyright (C) 2024 BitBake Contributors
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+from . import create_server, create_client
+import sys
+import tempfile
+import unittest
+import socket
+from pathlib import Path
+
+THIS_DIR = Path(__file__).parent
+BIN_DIR = THIS_DIR.parent.parent / "bin"
+
+def server_prefunc(server, idx):
+    logging.basicConfig(level=logging.DEBUG, filename='bbprserv-%d.log' % idx, filemode='w',
+                        format='%(levelname)s %(filename)s:%(lineno)d %(message)s')
+    server.logger.debug("Running server %d" % idx)
+    sys.stdout = open('bbprserv-stdout-%d.log' % idx, 'w')
+    sys.stderr = sys.stdout
+
+class PRTestSetup(object):
+
+    server_index = 0
+    client_index = 0
+
+    def start_server(self, dbpath=None, upstream=None, read_only=False, prefunc=server_prefunc):
+
+        self.server_index += 1
+
+        if dbpath is None:
+            dbpath = self.make_dbpath()
+
+        def cleanup_server(server):
+            if server.process.exitcode is not None:
+                return
+
+            server.process.terminate()
+            server.process.join()
+
+        server = create_server(socket.gethostbyname("localhost") + ":0",
+                               dbpath,
+                               upstream=upstream,
+                               read_only=read_only)
+
+        server.serve_as_process(prefunc=prefunc, args=(self.server_index))
+        self.addCleanup(cleanup_server, server)
+
+        return server
+
+    def make_dbpath(self):
+        return os.path.join(self.temp_dir.name, "prserv-test%d.sqlite3" % self.server_index)
+
+    def start_client(self, server_address):
+        def cleanup_client(client):
+            client.close()
+
+        client = create_client(server_address)
+        self.addCleanup(cleanup_client, client)
+
+        return client
+
+    def start_test_server(self):
+        self.server = self.start_server()
+        print("SERVER STARTED WITH ADDRESS: %s" % (self.server.address))
+        return self.server.address
+
+    def setUp(self):
+        self.temp_dir = tempfile.TemporaryDirectory(prefix='bb-prserv-test')
+        self.addCleanup(self.temp_dir.cleanup)
+
+        self.server_address = self.start_test_server()
+        self.client = self.start_client(self.server_address)
+
+class PRCommonTests(PRTestSetup, unittest.TestCase):
+
+    def test_create_pr(self):
+        result = self.client.test_pr("dummy-1.0-r0", "core2-64", "51bf8189dbe9ea81fa6dd89608bf19380c437a9cf12f6c6239887801ba4ab4a5")
+        return self.assertEqual(result, None)
+
+