diff --git a/docs/changelog.txt b/docs/changelog.txt index a5aa3003..e6dc6024 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -4,6 +4,13 @@ Changelog .. currentmodule:: firebird.qa.plugin +Version 0.17.2 +============== + +* Trace session support in plugin now uses service query with timeout (provided by + firebird-driver 1.8.0) and terminates the trace thread gracefuly even if terminating + trace session fails. + Version 0.17.1 ============== diff --git a/docs/conf.py b/docs/conf.py index 02b173e2..4a9da2ec 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -19,14 +19,14 @@ import sphinx_bootstrap_theme # -- Project information ----------------------------------------------------- project = 'Firebird QA' -copyright = '2022, Pavel Cisar' +copyright = '2021, Pavel Cisar' author = 'Pavel Císař' # The short X.Y version -version = '0.17.1' +version = '0.17.2' # The full version, including alpha/beta/rc tags -release = '0.17.1' +release = '0.17.2' # -- General configuration --------------------------------------------------- diff --git a/firebird/qa/plugin.py b/firebird/qa/plugin.py index d2b43c21..b07d8710 100644 --- a/firebird/qa/plugin.py +++ b/firebird/qa/plugin.py @@ -54,11 +54,11 @@ from configparser import ConfigParser, ExtendedInterpolation from packaging.specifiers import SpecifierSet from packaging.version import parse import time -from threading import Thread, Barrier +from threading import Thread, Barrier, Event from firebird.driver import connect, connect_server, create_database, driver_config, \ NetProtocol, Server, CHARSET_MAP, Connection, Cursor, \ DESCRIPTION_NAME, DESCRIPTION_DISPLAY_SIZE, DatabaseConfig, DBKeyScope, DbInfoCode, \ - DbWriteMode, get_api, Error + DbWriteMode, get_api, Error, TIMEOUT from firebird.driver.core import _connect_helper Substitutions = List[Tuple[str, str]] @@ -1077,7 +1077,7 @@ def user_factory(db_fixture_name: str, *, name: str, password: str='', plugin: O def trace_thread(act: Action, b: Barrier, cfg: List[str], output: List[str], keep_log: bool, encoding: str, encoding_errors: str, user: str, password: str, - role: str): + role: str, stop: Event): """Function used by `TraceSession` for execution in separate thread to run trace session. Arguments: @@ -1088,14 +1088,22 @@ def trace_thread(act: Action, b: Barrier, cfg: List[str], output: List[str], kee keep_log: When `True`, the trace session output is discarded. encoding: Encoding for trace session output. encoding_errors: Error handler for trace session output encoding. + user: user name + password: User password + role: User role + stop: Event used to stop the trace thread """ with act.connect_server(encoding=encoding, encoding_errors=encoding_errors, user=user, password=password) as srv: output.append(srv.trace.start(config='\n'.join(cfg))) b.wait() - for line in srv: - if keep_log: - output.append(line) + while not stop.is_set(): + line = srv.readline_timed(1) + if line is not TIMEOUT: + if not line: + stop.set() + elif keep_log: + output.append(line) class TraceSession: """Object to manage Firebird trace session. @@ -1145,6 +1153,7 @@ class TraceSession: self.encoding: Optional[str] = encoding #: Encoding errors handling for trace session output. self.encoding_errors: Optional[str] = encoding_errors + self.stop_event: Event = Event() def __enter__(self) -> TraceSession: b = Barrier(2) self.trace_thread = Thread(target=trace_thread, args=[self.act, b, self.config, @@ -1152,7 +1161,7 @@ class TraceSession: self.encoding, self.encoding_errors, self.user, self.password, - self.role]) + self.role, self.stop_event]) self.trace_thread.start() b.wait() return self @@ -1161,6 +1170,7 @@ class TraceSession: session = self.output.pop(0) with self.act.connect_server() as srv: srv.trace.stop(session_id=session) + self.stop_event.set() self.trace_thread.join(5.0) if self.trace_thread.is_alive(): pytest.fail('Trace thread still alive') diff --git a/setup.cfg b/setup.cfg index 81c20546..d96f27a1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,7 +5,7 @@ all-files=True [metadata] name = firebird-qa -version = 0.17.1 +version = 0.17.2 description = pytest plugin for Firebird QA long_description = file: README.rst long_description_content_type = text/x-rst; charset=UTF-8 @@ -37,8 +37,8 @@ classifiers = zip_safe = True python_requires = >=3.8, <4 install_requires = - firebird-base>=1.3.0 - firebird-driver>=1.5.1 + firebird-base>=1.5.0 + firebird-driver>=1.8.0 pytest>=7.0.0 psutil>=5.9.1 packages = find_namespace: