summaryrefslogtreecommitdiff
path: root/gerbonara/tests/conftest.py
diff options
context:
space:
mode:
authorjaseg <git@jaseg.de>2024-07-08 16:29:35 +0200
committerjaseg <git@jaseg.de>2024-07-08 16:29:35 +0200
commitec85d6c169620fd0968693b19b6109fb0184aa36 (patch)
tree5162868780af1a00f6881c6078c1abf41b0add23 /gerbonara/tests/conftest.py
parentf447b12571049da91e726d2bb20e30eff07bac46 (diff)
downloadgerbonara-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.py35
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)))