diff --git a/fail2ban/tests/clientreadertestcase.py b/fail2ban/tests/clientreadertestcase.py index 9e5f0dfe..184595ab 100644 --- a/fail2ban/tests/clientreadertestcase.py +++ b/fail2ban/tests/clientreadertestcase.py @@ -266,7 +266,7 @@ class JailReaderTest(LogCaptureTestCase): self.assertEqual(('mail--ho_is', {}), extractOptions("mail--ho_is")) self.assertEqual(('mail--ho_is', {}), extractOptions("mail--ho_is['s']")) - #self.printLog() + #print(self.getLog()) #self.assertLogged("Invalid argument ['s'] in ''s''") self.assertEqual(('mail', {'a': ','}), extractOptions("mail[a=',']")) @@ -528,7 +528,7 @@ class JailsReaderTestCache(LogCaptureTestCase): # how many times jail.local was read: cnt = self._getLoggedReadCount('jail.local') # if cnt > 1: - # self.printLog() + # print(self.getLog()) self.assertTrue(cnt == 1, "Unexpected count by reading of jail files, cnt = %s" % cnt) # read whole configuration like a file2ban-client, again ... @@ -648,7 +648,7 @@ class JailsReaderTest(LogCaptureTestCase): ## We should not "read" some bogus jail #old_comm_commands = comm_commands[:] # make a copy #self.assertRaises(ValueError, jails.getOptions, "BOGUS") - #self.printLog() + #print(self.getLog()) #self.assertLogged("No section: 'BOGUS'") ## and there should be no side-effects #self.assertEqual(jails.convert(), old_comm_commands) diff --git a/fail2ban/tests/fail2banclienttestcase.py b/fail2ban/tests/fail2banclienttestcase.py index 318a1c50..ed3d9868 100644 --- a/fail2ban/tests/fail2banclienttestcase.py +++ b/fail2ban/tests/fail2banclienttestcase.py @@ -210,6 +210,12 @@ def _start_params(tmp, use_stock=False, use_stock_cfg=None, "--timeout", str(fail2bancmdline.MAX_WAITTIME), ) +def _inherited_log(startparams): + try: + return startparams[startparams.index('--logtarget')+1] == 'INHERITED' + except ValueError: + return False + def _get_pid_from_file(pidfile): pid = None try: @@ -325,6 +331,13 @@ def with_foreground_server_thread(startextra={}): self.pruneLog() # several commands to server in body of decorated function: return f(self, tmp, startparams, *args, **kwargs) + except Exception as e: # pragma: no cover + print('=== Catch an exception: %s' % e) + log = self.getLog() + if log: + print('=== Error of server, log: ===\n%s===' % log) + self.pruneLog() + raise finally: if th: # wait for server end (if not yet already exited): @@ -369,7 +382,8 @@ class Fail2banClientServerBase(LogCaptureTestCase): else: raise FailExitException() - def _wait_for_srv(self, tmp, ready=True, startparams=None, phase={}): + def _wait_for_srv(self, tmp, ready=True, startparams=None, phase=None): + if not phase: phase = {} try: sock = pjoin(tmp, "f2b.sock") # wait for server (socket): @@ -384,14 +398,17 @@ class Fail2banClientServerBase(LogCaptureTestCase): ret = Utils.wait_for(lambda: "Server ready" in self.getLog(), MAX_WAITTIME) if not ret: # pragma: no cover - test-failure case only raise Exception( - 'Unexpected: Server ready was not found.\nStart failed: %r' - % (startparams,) + 'Unexpected: Server ready was not found, phase %r.\nStart failed: %r' + % (phase, startparams,) ) except: # pragma: no cover + if _inherited_log(startparams): + print('=== Error by wait fot server, log: ===\n%s===' % self.getLog()) + self.pruneLog() log = pjoin(tmp, "f2b.log") if isfile(log): _out_file(log) - else: + elif not _inherited_log(startparams): logSys.debug("No log file %s to examine details of error", log) raise @@ -410,6 +427,7 @@ class Fail2banClientServerBase(LogCaptureTestCase): self.execCmd(SUCCESS, ("-f",) + startparams, "start") finally: # end : + phase['start'] = False phase['end'] = True logSys.debug("end of test worker") @@ -1192,7 +1210,7 @@ class Fail2banServerTest(Fail2banClientServerBase): 'failregex = ^ failure "[^"]+" - ', 'maxretry = 1', # ban by first failure 'enabled = true', - ) + ) }) def testServerActions_NginxBlockMap(self, tmp, startparams): cfg = pjoin(tmp, "config") @@ -1251,3 +1269,14 @@ class Fail2banServerTest(Fail2banClientServerBase): _out_file(mpfn) mp = _read_file(mpfn) self.assertEqual(mp, '') + + # test multiple start/stop of the server (threaded in foreground) -- + if False: # pragma: no cover + @with_foreground_server_thread() + def _testServerStartStop(self, tmp, startparams): + # stop server and wait for end: + self.stopAndWaitForServerEnd(SUCCESS) + + def testServerStartStop(self): + for i in xrange(2000): + self._testServerStartStop() diff --git a/fail2ban/tests/utils.py b/fail2ban/tests/utils.py index f681db76..3eeb8eb4 100644 --- a/fail2ban/tests/utils.py +++ b/fail2ban/tests/utils.py @@ -807,8 +807,5 @@ class LogCaptureTestCase(unittest.TestCase): def getLog(self): return self._log.getvalue() - def printLog(self): - print(self._log.getvalue()) - pid_exists = Utils.pid_exists