diff --git a/codeflash/languages/java/support.py b/codeflash/languages/java/support.py index 7115d2225..55af834f6 100644 --- a/codeflash/languages/java/support.py +++ b/codeflash/languages/java/support.py @@ -546,6 +546,21 @@ def ensure_runtime_environment(self, project_root: Path) -> bool: if self._language_version is None: self._detect_java_version() + if self._language_version is not None: + try: + major = int(self._language_version) + if major < 11: + logger.error( + "Java %s detected, but codeflash requires JDK 11 or later. " + "The codeflash-runtime JAR and --add-opens flags are incompatible with JDK %s. " + "Please install JDK 11+ and ensure it is on your PATH.", + self._language_version, + self._language_version, + ) + return False + except ValueError: + pass + self._test_framework = config.test_framework return True diff --git a/tests/test_languages/test_java/test_support.py b/tests/test_languages/test_java/test_support.py index b5cba5ab4..de48d68d9 100644 --- a/tests/test_languages/test_java/test_support.py +++ b/tests/test_languages/test_java/test_support.py @@ -134,3 +134,44 @@ def test_discover_functions_from_fixture(self, support, java_fixture_path: Path) source = calculator_file.read_text(encoding="utf-8") functions = support.discover_functions(source, calculator_file) assert len(functions) > 0 + + +class TestJdkVersionCheck: + def test_jdk8_rejected(self, tmp_path: Path) -> None: + from unittest.mock import MagicMock, patch + + support = get_java_support() + + mock_config = MagicMock() + mock_config.java_version = "8" + mock_config.test_framework = "junit5" + + with patch("codeflash.languages.java.support.detect_java_project", return_value=mock_config): + result = support.ensure_runtime_environment(tmp_path) + assert result is False + + def test_jdk11_accepted(self, tmp_path: Path) -> None: + from unittest.mock import MagicMock, patch + + support = get_java_support() + + mock_config = MagicMock() + mock_config.java_version = "11" + mock_config.test_framework = "junit5" + + with patch("codeflash.languages.java.support.detect_java_project", return_value=mock_config): + result = support.ensure_runtime_environment(tmp_path) + assert result is True + + def test_jdk21_accepted(self, tmp_path: Path) -> None: + from unittest.mock import MagicMock, patch + + support = get_java_support() + + mock_config = MagicMock() + mock_config.java_version = "21" + mock_config.test_framework = "junit5" + + with patch("codeflash.languages.java.support.detect_java_project", return_value=mock_config): + result = support.ensure_runtime_environment(tmp_path) + assert result is True