diff options
author | jaseg <git@jaseg.de> | 2024-07-08 16:29:35 +0200 |
---|---|---|
committer | jaseg <git@jaseg.de> | 2024-07-08 16:29:35 +0200 |
commit | ec85d6c169620fd0968693b19b6109fb0184aa36 (patch) | |
tree | 5162868780af1a00f6881c6078c1abf41b0add23 /gerbonara/tests/conftest.py | |
parent | f447b12571049da91e726d2bb20e30eff07bac46 (diff) | |
download | gerbonara-ec85d6c169620fd0968693b19b6109fb0184aa36.tar.gz gerbonara-ec85d6c169620fd0968693b19b6109fb0184aa36.tar.bz2 gerbonara-ec85d6c169620fd0968693b19b6109fb0184aa36.zip |
tests: Speed up tests by a lot by bulk-caching kicad footprint renders
Diffstat (limited to 'gerbonara/tests/conftest.py')
-rw-r--r-- | gerbonara/tests/conftest.py | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/gerbonara/tests/conftest.py b/gerbonara/tests/conftest.py index ea16217..7d4e996 100644 --- a/gerbonara/tests/conftest.py +++ b/gerbonara/tests/conftest.py @@ -1,11 +1,14 @@ import os from pathlib import Path +import tqdm +import multiprocessing.pool +import subprocess from itertools import chain import pytest -from .image_support import ImageDifference, run_cargo_cmd +from .image_support import ImageDifference, run_cargo_cmd, bulk_populate_kicad_fp_export_cache def pytest_assertrepr_compare(op, left, right): if isinstance(left, ImageDifference) or isinstance(right, ImageDifference): @@ -24,41 +27,53 @@ def pytest_runtest_makereport(item, call): fail_dir = Path('gerbonara_test_failures') def pytest_sessionstart(session): - if not hasattr(session.config, 'workerinput'): # on worker + if 'PYTEST_XDIST_WORKER' in os.environ: # only run this on the controller return - # on coordinator for f in chain(fail_dir.glob('*.gbr'), fail_dir.glob('*.png')): f.unlink() try: - run_cargo_cmd('resvg', '--help') + run_cargo_cmd('resvg', '--help', stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) except FileNotFoundError: pytest.exit('resvg binary not found, aborting test.', 2) + +def pytest_configure(config): + if 'PYTEST_XDIST_WORKER' in os.environ: # only run this on the controller + return + + if (lib_dir := os.environ.get('KICAD_FOOTPRINTS')): + lib_dir = Path(lib_dir).expanduser() + if not lib_dir.is_dir(): + raise ValueError(f'Path "{lib_dir}" given by KICAD_FOOTPRINTS environment variable does not exist or is not a directory.') + + print('Checking and bulk re-building KiCad footprint library cache') + with multiprocessing.pool.ThreadPool() as pool: # use thread pool here since we're only monitoring podman processes + lib_dirs = list(lib_dir.glob('*.pretty')) + res = list(tqdm.tqdm(pool.imap(lambda path: bulk_populate_kicad_fp_export_cache(path), lib_dirs), total=len(lib_dirs))) + + def pytest_addoption(parser): parser.addoption('--kicad-symbol-library', nargs='*', help='Run symbol library tests on given symbol libraries. May be given multiple times.') parser.addoption('--kicad-footprint-files', nargs='*', help='Run footprint library tests on given footprint files. May be given multiple times.') + def pytest_generate_tests(metafunc): if 'kicad_library_file' in metafunc.fixturenames: if not (library_files := metafunc.config.getoption('symbol_library', None)): if (lib_dir := os.environ.get('KICAD_SYMBOLS')): lib_dir = Path(lib_dir).expanduser() - if not lib_dir.is_dir(): - raise ValueError(f'Path "{lib_dir}" given by KICAD_SYMBOLS environment variable does not exist or is not a directory.') library_files = list(lib_dir.glob('*.kicad_sym')) else: - raise ValueError('Either --kicad-symbol-library command line parameter or KICAD_SYMBOLS environment variable must be given.') + raise ValueError('Either --kicad-symbol-library command line parameter or KICAD_SYMBOLS environment variable must be given to run kicad symbol tests.') metafunc.parametrize('kicad_library_file', library_files, ids=list(map(str, library_files))) if 'kicad_mod_file' in metafunc.fixturenames: if not (mod_files := metafunc.config.getoption('footprint_files', None)): if (lib_dir := os.environ.get('KICAD_FOOTPRINTS')): lib_dir = Path(lib_dir).expanduser() - if not lib_dir.is_dir(): - raise ValueError(f'Path "{lib_dir}" given by KICAD_FOOTPRINTS environment variable does not exist or is not a directory.') mod_files = list(lib_dir.glob('*.pretty/*.kicad_mod')) else: - raise ValueError('Either --kicad-footprint-files command line parameter or KICAD_FOOTPRINTS environment variable must be given.') + raise ValueError('Either --kicad-footprint-files command line parameter or KICAD_FOOTPRINTS environment variable must be given to run kicad footprint tests.') metafunc.parametrize('kicad_mod_file', mod_files, ids=list(map(str, mod_files))) |