]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.10] Add more syslog tests (GH-97953). (GH-98101)
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 9 Oct 2022 11:21:10 +0000 (14:21 +0300)
committerGitHub <noreply@github.com>
Sun, 9 Oct 2022 11:21:10 +0000 (14:21 +0300)
(cherry picked from commit cae7d1d7a713f8267daf5e4f2fff5cb1dad02c7c)

Lib/test/audit-tests.py
Lib/test/test_audit.py
Lib/test/test_syslog.py
Modules/syslogmodule.c

index ccec9fedc4460d74feb7a503990776b39fbb633c..b781b9940465c717894b4fc8e7279627cc1f2f87 100644 (file)
@@ -408,6 +408,27 @@ def test_sqlite3():
             raise RuntimeError("Expected sqlite3.load_extension to fail")
 
 
+def test_syslog():
+    import syslog
+
+    def hook(event, args):
+        if event.startswith("syslog."):
+            print(event, *args)
+
+    sys.addaudithook(hook)
+    syslog.openlog('python')
+    syslog.syslog('test')
+    syslog.setlogmask(syslog.LOG_DEBUG)
+    syslog.closelog()
+    # implicit open
+    syslog.syslog('test2')
+    # open with default ident
+    syslog.openlog(logoption=syslog.LOG_NDELAY, facility=syslog.LOG_LOCAL0)
+    sys.argv = None
+    syslog.openlog()
+    syslog.closelog()
+
+
 if __name__ == "__main__":
     from test.support import suppress_msvcrt_asserts
 
index 04c9d6b85539aa563b787b39a5d213038cc4690d..cea452ddce51ba649f0ad55af9db7ec3ef4f79f3 100644 (file)
@@ -16,6 +16,8 @@ AUDIT_TESTS_PY = support.findfile("audit-tests.py")
 
 
 class AuditTest(unittest.TestCase):
+    maxDiff = None
+
     def do_test(self, *args):
         with subprocess.Popen(
             [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
@@ -170,5 +172,29 @@ class AuditTest(unittest.TestCase):
         self.assertEqual(actual, expected)
 
 
+    def test_syslog(self):
+        syslog = import_helper.import_module("syslog")
+
+        returncode, events, stderr = self.run_python("test_syslog")
+        if returncode:
+            self.fail(stderr)
+
+        if support.verbose:
+            print('Events:', *events, sep='\n  ')
+
+        self.assertSequenceEqual(
+            events,
+            [('syslog.openlog', ' ', f'python 0 {syslog.LOG_USER}'),
+            ('syslog.syslog', ' ', f'{syslog.LOG_INFO} test'),
+            ('syslog.setlogmask', ' ', f'{syslog.LOG_DEBUG}'),
+            ('syslog.closelog', '', ''),
+            ('syslog.syslog', ' ', f'{syslog.LOG_INFO} test2'),
+            ('syslog.openlog', ' ', f'audit-tests.py 0 {syslog.LOG_USER}'),
+            ('syslog.openlog', ' ', f'audit-tests.py {syslog.LOG_NDELAY} {syslog.LOG_LOCAL0}'),
+            ('syslog.openlog', ' ', f'None 0 {syslog.LOG_USER}'),
+            ('syslog.closelog', '', '')]
+        )
+
+
 if __name__ == "__main__":
     unittest.main()
index fe09bd39f8b7fd95a401cbe0b5d3d8e0e2125db5..b3ba2aba1da302c3f470bad30f43034f35aaa306 100644 (file)
@@ -1,5 +1,9 @@
-from test.support import import_helper
+from test.support import import_helper, threading_helper
 syslog = import_helper.import_module("syslog") #skip if not supported
+from test import support
+import sys
+import threading
+import time
 import unittest
 
 # XXX(nnorwitz): This test sucks.  I don't know of a platform independent way
@@ -8,6 +12,9 @@ import unittest
 
 class Test(unittest.TestCase):
 
+    def tearDown(self):
+        syslog.closelog()
+
     def test_openlog(self):
         syslog.openlog('python')
         # Issue #6697.
@@ -18,22 +25,58 @@ class Test(unittest.TestCase):
         syslog.syslog('test message from python test_syslog')
         syslog.syslog(syslog.LOG_ERR, 'test error from python test_syslog')
 
+    def test_syslog_implicit_open(self):
+        syslog.closelog() # Make sure log is closed
+        syslog.syslog('test message from python test_syslog')
+        syslog.syslog(syslog.LOG_ERR, 'test error from python test_syslog')
+
     def test_closelog(self):
         syslog.openlog('python')
         syslog.closelog()
+        syslog.closelog()  # idempotent operation
 
     def test_setlogmask(self):
-        syslog.setlogmask(syslog.LOG_DEBUG)
+        mask = syslog.LOG_UPTO(syslog.LOG_WARNING)
+        oldmask = syslog.setlogmask(mask)
+        self.assertEqual(syslog.setlogmask(0), mask)
+        self.assertEqual(syslog.setlogmask(oldmask), mask)
 
     def test_log_mask(self):
-        syslog.LOG_MASK(syslog.LOG_INFO)
-
-    def test_log_upto(self):
-        syslog.LOG_UPTO(syslog.LOG_INFO)
+        mask = syslog.LOG_UPTO(syslog.LOG_WARNING)
+        self.assertTrue(mask & syslog.LOG_MASK(syslog.LOG_WARNING))
+        self.assertTrue(mask & syslog.LOG_MASK(syslog.LOG_ERR))
+        self.assertFalse(mask & syslog.LOG_MASK(syslog.LOG_INFO))
 
     def test_openlog_noargs(self):
         syslog.openlog()
         syslog.syslog('test message from python test_syslog')
 
+    def test_syslog_threaded(self):
+        start = threading.Event()
+        stop = False
+        def opener():
+            start.wait(10)
+            i = 1
+            while not stop:
+                syslog.openlog(f'python-test-{i}')  # new string object
+                i += 1
+        def logger():
+            start.wait(10)
+            while not stop:
+                syslog.syslog('test message from python test_syslog')
+
+        orig_si = sys.getswitchinterval()
+        support.setswitchinterval(1e-9)
+        try:
+            threads = [threading.Thread(target=opener)]
+            threads += [threading.Thread(target=logger) for k in range(10)]
+            with threading_helper.start_threads(threads):
+                start.set()
+                time.sleep(0.1)
+                stop = True
+        finally:
+            sys.setswitchinterval(orig_si)
+
+
 if __name__ == "__main__":
     unittest.main()
index 729986a5549ef094e147c3da51290c1313dcf042..bfa2ca2b653befea91abe91b8b928ac63061b163 100644 (file)
@@ -235,7 +235,7 @@ syslog_setlogmask(PyObject *self, PyObject *args)
 
     if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
         return NULL;
-    if (PySys_Audit("syslog.setlogmask", "(O)", args ? args : Py_None) < 0) {
+    if (PySys_Audit("syslog.setlogmask", "l", maskpri) < 0) {
         return NULL;
     }
     omaskpri = setlogmask(maskpri);