userver: /data/code/userver/testsuite/pytest_plugins/pytest_userver/plugins/dumps.py Source File
Loading...
Searching...
No Matches
dumps.py
1# pylint: disable=redefined-outer-name
2import pathlib
3import shutil
4
5import pytest
6
7USERVER_CONFIG_HOOKS = ['_userver_config_dumps']
8
9
10@pytest.fixture(scope='session')
11def userver_dumps_root(tmp_path_factory) -> pathlib.Path:
12 """
13 The directory which the service will use for cache dumps.
14 Dumps of individual components will be stored in
15 `{userver_dumps_root}/{component-name}/{datetime}-v{format-version}`
16
17 @see userver::dump::Dumper
18 @ingroup userver_testsuite_fixtures
19 """
20 path = tmp_path_factory.mktemp('userver-cache-dumps', numbered=False)
21 return path.resolve()
22
23
24@pytest.fixture
25def read_latest_dump(userver_dumps_root):
26 """
27 Read the latest dump produced by a specified dumper.
28
29 @see userver::dump::Dumper
30 @ingroup userver_testsuite_fixtures
31 """
32
33 def read(dumper_name: str) -> bytes | None:
34 specific_dir = userver_dumps_root.joinpath(dumper_name)
35 if not specific_dir.is_dir():
36 return None
37 latest_dump_filename = max(
38 (f for f in specific_dir.iterdir() if specific_dir.joinpath(f).is_file()),
39 default=None,
40 )
41 if not latest_dump_filename:
42 return None
43 with open(specific_dir.joinpath(latest_dump_filename), 'rb') as dump:
44 return dump.read()
45
46 return read
47
48
49@pytest.fixture
50def cleanup_userver_dumps(userver_dumps_root, request):
51 """
52 To avoid leaking dumps between tests, cache_dump_dir must be cleaned after
53 each test. To observe the dumps, add a final `time.sleep(1000000)` to your
54 test locally. The returned function may also be used to clean dumps
55 manually as appropriate.
56
57 @see userver::dump::Dumper
58 @ingroup userver_testsuite_fixtures
59 """
60
61 def cleanup() -> None:
62 shutil.rmtree(userver_dumps_root, ignore_errors=True)
63 userver_dumps_root.mkdir()
64
65 request.addfinalizer(cleanup)
66 return cleanup
67
68
69@pytest.fixture(scope='session')
70def _userver_config_dumps(pytestconfig, userver_dumps_root):
71 def patch_config(_config, config_vars) -> None:
72 config_vars['userver-dumps-root'] = str(userver_dumps_root)
73 if not pytestconfig.option.service_runner_mode:
74 config_vars['userver-dumps-periodic'] = False
75
76 return patch_config