]> www.average.org Git - loctrkd.git/blobdiff - test/common.py
Update changelog for 2.00 release
[loctrkd.git] / test / common.py
index 58954a2b217acbd0fa5a930476cee1882dea8ff1..17446a55f807311aab059fb6beabbbd9bb0fb80e 100644 (file)
@@ -4,23 +4,27 @@ from configparser import ConfigParser, SectionProxy
 from contextlib import closing, ExitStack
 from http.server import HTTPServer, SimpleHTTPRequestHandler
 from importlib import import_module
-from logging import DEBUG, StreamHandler
+from logging import DEBUG, StreamHandler, WARNING
 from multiprocessing import Process
 from os import kill, unlink
 from signal import SIGINT
 from socket import (
+    AF_INET,
     AF_INET6,
+    getaddrinfo,
     MSG_DONTWAIT,
     SOCK_DGRAM,
+    SOCK_STREAM,
     SOL_SOCKET,
     SO_REUSEADDR,
     socket,
     SocketType,
 )
 from sys import exit, stderr
+from random import Random
 from tempfile import mkstemp
 from time import sleep
-from typing import Optional
+from typing import Any, Optional
 from unittest import TestCase
 
 from loctrkd.common import init_protocols
@@ -42,7 +46,7 @@ class TestWithServers(TestCase):
         _, self.tmpfilebase = mkstemp()
         self.conf = ConfigParser()
         self.conf["common"] = {
-            "protocols": "zx303proto",
+            "protocols": "zx303proto,beesure",
         }
         self.conf["collector"] = {
             "port": str(freeports[0]),
@@ -51,6 +55,7 @@ class TestWithServers(TestCase):
         }
         self.conf["storage"] = {
             "dbfn": self.tmpfilebase + ".storage.sqlite",
+            "events": "yes",
         }
         self.conf["opencellid"] = {
             "dbfn": self.tmpfilebase + ".opencellid.sqlite",
@@ -74,6 +79,8 @@ class TestWithServers(TestCase):
             if verbose:
                 cls.log.addHandler(StreamHandler(stderr))
                 cls.log.setLevel(DEBUG)
+            else:
+                cls.log.setLevel(WARNING)
             p = Process(target=cls.runserver, args=(self.conf,), kwargs=kwargs)
             p.start()
             self.children.append((srvname, p))
@@ -91,17 +98,17 @@ class TestWithServers(TestCase):
             p.start()
             self.children.append(("httpd", p))
         sleep(1)
+        for srvname, p in self.children:
+            self.assertTrue(
+                p.is_alive(),
+                f"{srvname} did not start, exit code {p.exitcode}",
+            )
 
     def tearDown(self) -> None:
         for srvname, p in self.children:
             if p.pid is not None:
                 kill(p.pid, SIGINT)
             p.join()
-            self.assertEqual(
-                p.exitcode,
-                0,
-                f"{srvname} terminated with return code {p.exitcode}",
-            )
         for sfx in (
             "",
             ".pub",
@@ -114,6 +121,34 @@ class TestWithServers(TestCase):
                 unlink(self.tmpfilebase + sfx)
             except OSError:
                 pass
+        for srvname, p in self.children:
+            self.assertEqual(
+                p.exitcode,
+                0,
+                f"{srvname} terminated with exit code {p.exitcode}",
+            )
+
+
+class Fuzz(TestWithServers):
+    def setUp(self, *args: str, **kwargs: Any) -> None:
+        super().setUp("collector")
+        self.rnd = Random()
+        for fam, typ, pro, cnm, skadr in getaddrinfo(
+            "127.0.0.1",
+            self.conf.getint("collector", "port"),
+            family=AF_INET,
+            type=SOCK_STREAM,
+        ):
+            break  # Just take the first element
+        self.sock = socket(AF_INET, SOCK_STREAM)
+        self.sock.connect(skadr)
+
+    def tearDown(self) -> None:
+        sleep(1)  # give collector some time
+        send_and_drain(self.sock, None)
+        self.sock.close()
+        sleep(1)  # Let the server close their side
+        super().tearDown()
 
 
 def send_and_drain(sock: SocketType, buf: Optional[bytes]) -> None: