From 1d580819e7cc4c5309369b367f1922f8b43177e3 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Tue, 1 Jul 2025 15:37:52 -0400 Subject: [PATCH] Enable parallel and stress testing --- .github/workflows/python-ci.yml | 11 ++++++++++- pytest.ini | 3 +++ src/requirements.txt | 1 + src/tests/conftest.py | 25 +++++++++++++++++++++++++ src/tests/test_concurrency_stress.py | 13 +++++++------ 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 80195a6..725a7f0 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -5,6 +5,8 @@ on: branches: [ "**" ] pull_request: branches: [ "**" ] + schedule: + - cron: '0 3 * * *' jobs: build: @@ -19,6 +21,8 @@ jobs: - os: windows-latest python-version: "3.10" runs-on: ${{ matrix.os }} + env: + HYPOTHESIS_SEED: 123456 steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 @@ -63,13 +67,18 @@ jobs: run: | python -m pip install --upgrade pip pip install -r src/requirements.txt + - name: Determine stress args + run: | + if [ "${{ github.event_name }}" = "schedule" ]; then + echo "STRESS_ARGS=--stress" >> $GITHUB_ENV + fi - name: Enable Nostr network tests on main branch if: github.ref == 'refs/heads/main' run: echo "NOSTR_E2E=1" >> $GITHUB_ENV - name: Run tests with coverage shell: bash run: | - pytest --cov=src --cov-report=xml --cov-report=term-missing \ + pytest ${STRESS_ARGS} --cov=src --cov-report=xml --cov-report=term-missing \ --cov-fail-under=20 src/tests - name: Upload coverage report uses: actions/upload-artifact@v4 diff --git a/pytest.ini b/pytest.ini index 19b13dc..e93a3ac 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,7 +1,10 @@ [pytest] +addopts = -n auto log_cli = true log_cli_level = WARNING log_level = WARNING testpaths = src/tests markers = network: tests that require network connectivity + stress: long running stress tests +hypothesis_profile = ci diff --git a/src/requirements.txt b/src/requirements.txt index 9d407a2..ef0e389 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -10,6 +10,7 @@ bcrypt bip85 pytest>=7.0 pytest-cov +pytest-xdist portalocker>=2.8 nostr-sdk>=0.42.1 websocket-client==1.7.0 diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 8e4b874..6daa678 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -5,3 +5,28 @@ import pytest @pytest.fixture(autouse=True) def mute_logging(): logging.getLogger().setLevel(logging.WARNING) + + +def pytest_addoption(parser: pytest.Parser) -> None: + parser.addoption( + "--stress", + action="store_true", + default=False, + help="run stress tests", + ) + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line("markers", "stress: long running stress tests") + + +def pytest_collection_modifyitems( + config: pytest.Config, items: list[pytest.Item] +) -> None: + if config.getoption("--stress"): + return + + skip_stress = pytest.mark.skip(reason="need --stress option to run") + for item in items: + if "stress" in item.keywords: + item.add_marker(skip_stress) diff --git a/src/tests/test_concurrency_stress.py b/src/tests/test_concurrency_stress.py index e96012b..5d07874 100644 --- a/src/tests/test_concurrency_stress.py +++ b/src/tests/test_concurrency_stress.py @@ -42,19 +42,20 @@ def _backup(dir_path: Path, loops: int, out: Queue) -> None: out.put(repr(e)) +@pytest.mark.parametrize("loops", [5, pytest.param(20, marks=pytest.mark.stress)]) @pytest.mark.parametrize("_", range(3)) -def test_concurrency_stress(tmp_path: Path, _): +def test_concurrency_stress(tmp_path: Path, loops: int, _): key = Fernet.generate_key() enc = EncryptionManager(key, tmp_path) Vault(enc, tmp_path).save_index({"counter": 0}) q: Queue = Queue() procs = [ - Process(target=_writer, args=(key, tmp_path, 20, q)), - Process(target=_writer, args=(key, tmp_path, 20, q)), - Process(target=_reader, args=(key, tmp_path, 20, q)), - Process(target=_reader, args=(key, tmp_path, 20, q)), - Process(target=_backup, args=(tmp_path, 20, q)), + Process(target=_writer, args=(key, tmp_path, loops, q)), + Process(target=_writer, args=(key, tmp_path, loops, q)), + Process(target=_reader, args=(key, tmp_path, loops, q)), + Process(target=_reader, args=(key, tmp_path, loops, q)), + Process(target=_backup, args=(tmp_path, loops, q)), ] for p in procs: