From fcdcc410d0f01b4116c7d25c3e0b94a438ccca9b Mon Sep 17 00:00:00 2001 From: Amogh Desai Date: Mon, 24 Nov 2025 13:16:11 +0530 Subject: [PATCH 1/2] Use filelock to fix race condition in version suffix test for xdist runs --- dev/breeze/tests/test_packages.py | 75 ++++++++++++++----------------- 1 file changed, 33 insertions(+), 42 deletions(-) diff --git a/dev/breeze/tests/test_packages.py b/dev/breeze/tests/test_packages.py index ea9fbfebc499b..bbe5cb623dd1a 100644 --- a/dev/breeze/tests/test_packages.py +++ b/dev/breeze/tests/test_packages.py @@ -401,23 +401,6 @@ def test_apply_version_suffix_to_provider_pyproject_toml(provider_id, version_su AIRFLOWCTL_INIT_PY = AIRFLOW_ROOT_PATH / "airflow-ctl" / "src" / "airflowctl" / "__init__.py" -@pytest.fixture -def restore_version_files(): - # save contents of all version files before test starts - version_files = [ - AIRFLOW_CORE_INIT_PY, - TASK_SDK_INIT_PY, - AIRFLOWCTL_INIT_PY, - ] - original_contents = {f: f.read_text() for f in version_files if f.exists()} - - yield - - # restore original contents after test - for fp, content in original_contents.items(): - fp.write_text(content) - - @pytest.mark.parametrize( ("distributions", "init_file_path", "version_suffix", "floored_version_suffix"), [ @@ -445,7 +428,6 @@ def restore_version_files(): ], ) def test_apply_version_suffix_to_non_provider_pyproject_tomls( - restore_version_files, distributions: tuple[str, ...], init_file_path: Path, version_suffix: str, @@ -454,28 +436,37 @@ def test_apply_version_suffix_to_non_provider_pyproject_tomls( """ Test the apply_version_suffix function with different version suffixes for pyproject.toml of non-provider. """ + from filelock import FileLock + + lock_file = AIRFLOW_ROOT_PATH / ".version_files.lock" + lock = FileLock(lock_file) try: - import tomllib - except ImportError: - import tomli as tomllib - distribution_paths = [AIRFLOW_ROOT_PATH / distribution for distribution in distributions] - original_pyproject_toml_paths = [path / "pyproject.toml" for path in distribution_paths] - original_contents = [path.read_text() for path in original_pyproject_toml_paths] - original_init_py = init_file_path.read_text() - with apply_version_suffix_to_non_provider_pyproject_tomls( - version_suffix, init_file_path, original_pyproject_toml_paths - ) as modified_pyproject_toml_paths: - modified_contents = [path.read_text() for path in modified_pyproject_toml_paths] - - original_tomls = [tomllib.loads(content) for content in original_contents] - modified_tomls = [tomllib.loads(content) for content in modified_contents] - modified_init_py = init_file_path.read_text() - - assert original_init_py != modified_init_py - assert version_suffix in modified_init_py - - for i, original_toml in enumerate(original_tomls): - modified_toml = modified_tomls[i] - _check_dependencies_modified_properly( - original_toml, modified_toml, version_suffix, floored_version_suffix - ) + with lock: + try: + import tomllib + except ImportError: + import tomli as tomllib + distribution_paths = [AIRFLOW_ROOT_PATH / distribution for distribution in distributions] + original_pyproject_toml_paths = [path / "pyproject.toml" for path in distribution_paths] + original_contents = [path.read_text() for path in original_pyproject_toml_paths] + original_init_py = init_file_path.read_text() + with apply_version_suffix_to_non_provider_pyproject_tomls( + version_suffix, init_file_path, original_pyproject_toml_paths + ) as modified_pyproject_toml_paths: + modified_contents = [path.read_text() for path in modified_pyproject_toml_paths] + + original_tomls = [tomllib.loads(content) for content in original_contents] + modified_tomls = [tomllib.loads(content) for content in modified_contents] + modified_init_py = init_file_path.read_text() + + assert original_init_py != modified_init_py + assert version_suffix in modified_init_py + + for i, original_toml in enumerate(original_tomls): + modified_toml = modified_tomls[i] + _check_dependencies_modified_properly( + original_toml, modified_toml, version_suffix, floored_version_suffix + ) + finally: + if lock_file.exists(): + lock_file.unlink() From 43aa295d037b412e62794efd872e64f069c7e20d Mon Sep 17 00:00:00 2001 From: Amogh Desai Date: Mon, 24 Nov 2025 14:35:01 +0530 Subject: [PATCH 2/2] Use filelock to fix race condition in version suffix test for xdist runs --- dev/breeze/tests/test_packages.py | 69 ++++++++++++++++--------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/dev/breeze/tests/test_packages.py b/dev/breeze/tests/test_packages.py index bbe5cb623dd1a..b6ca0ac4a0b89 100644 --- a/dev/breeze/tests/test_packages.py +++ b/dev/breeze/tests/test_packages.py @@ -401,6 +401,18 @@ def test_apply_version_suffix_to_provider_pyproject_toml(provider_id, version_su AIRFLOWCTL_INIT_PY = AIRFLOW_ROOT_PATH / "airflow-ctl" / "src" / "airflowctl" / "__init__.py" +@pytest.fixture +def lock_version_files(): + from filelock import FileLock + + lock_file = AIRFLOW_ROOT_PATH / ".version_files.lock" + with FileLock(lock_file): + yield + if lock_file.exists(): + lock_file.unlink() + + +@pytest.mark.usefixtures("lock_version_files") @pytest.mark.parametrize( ("distributions", "init_file_path", "version_suffix", "floored_version_suffix"), [ @@ -436,37 +448,28 @@ def test_apply_version_suffix_to_non_provider_pyproject_tomls( """ Test the apply_version_suffix function with different version suffixes for pyproject.toml of non-provider. """ - from filelock import FileLock - - lock_file = AIRFLOW_ROOT_PATH / ".version_files.lock" - lock = FileLock(lock_file) try: - with lock: - try: - import tomllib - except ImportError: - import tomli as tomllib - distribution_paths = [AIRFLOW_ROOT_PATH / distribution for distribution in distributions] - original_pyproject_toml_paths = [path / "pyproject.toml" for path in distribution_paths] - original_contents = [path.read_text() for path in original_pyproject_toml_paths] - original_init_py = init_file_path.read_text() - with apply_version_suffix_to_non_provider_pyproject_tomls( - version_suffix, init_file_path, original_pyproject_toml_paths - ) as modified_pyproject_toml_paths: - modified_contents = [path.read_text() for path in modified_pyproject_toml_paths] - - original_tomls = [tomllib.loads(content) for content in original_contents] - modified_tomls = [tomllib.loads(content) for content in modified_contents] - modified_init_py = init_file_path.read_text() - - assert original_init_py != modified_init_py - assert version_suffix in modified_init_py - - for i, original_toml in enumerate(original_tomls): - modified_toml = modified_tomls[i] - _check_dependencies_modified_properly( - original_toml, modified_toml, version_suffix, floored_version_suffix - ) - finally: - if lock_file.exists(): - lock_file.unlink() + import tomllib + except ImportError: + import tomli as tomllib + distribution_paths = [AIRFLOW_ROOT_PATH / distribution for distribution in distributions] + original_pyproject_toml_paths = [path / "pyproject.toml" for path in distribution_paths] + original_contents = [path.read_text() for path in original_pyproject_toml_paths] + original_init_py = init_file_path.read_text() + with apply_version_suffix_to_non_provider_pyproject_tomls( + version_suffix, init_file_path, original_pyproject_toml_paths + ) as modified_pyproject_toml_paths: + modified_contents = [path.read_text() for path in modified_pyproject_toml_paths] + + original_tomls = [tomllib.loads(content) for content in original_contents] + modified_tomls = [tomllib.loads(content) for content in modified_contents] + modified_init_py = init_file_path.read_text() + + assert original_init_py != modified_init_py + assert version_suffix in modified_init_py + + for i, original_toml in enumerate(original_tomls): + modified_toml = modified_tomls[i] + _check_dependencies_modified_properly( + original_toml, modified_toml, version_suffix, floored_version_suffix + )