diff --git a/crates/dbx-core/src/agent_service.rs b/crates/dbx-core/src/agent_service.rs index 67fa2f467..8ae606d86 100644 --- a/crates/dbx-core/src/agent_service.rs +++ b/crates/dbx-core/src/agent_service.rs @@ -46,6 +46,7 @@ impl AgentProgressEvent { pub fn build_agent_list(am: &AgentManager, registry: Option<&AgentRegistry>) -> Vec { let local_state = am.load_state(); + let use_managed_jre = local_state.java_runtime.mode == JavaRuntimeMode::Managed; agent_catalog::driver_store_entries() .map(|(key, label)| { let installed = am.is_driver_installed(key); @@ -56,8 +57,9 @@ pub fn build_agent_list(am: &AgentManager, registry: Option<&AgentRegistry>) -> .or_else(|| local.map(|l| l.jre.clone())) .unwrap_or_else(|| DEFAULT_JRE_KEY.to_string()); let remote_jre_version = registry.and_then(|r| r.resolve_jre(&jre_key)).map(|j| &j.version); - let local_jre_version = local_state.jre_versions.get(&jre_key); + let local_jre_version = installed_jre_version(&local_state, &jre_key); let jre_update_available = installed + && use_managed_jre && (!am.is_jre_installed(&jre_key) || remote_jre_version.is_some_and(|version| local_jre_version != Some(version))); AgentDriverInfo { @@ -78,6 +80,13 @@ pub fn build_agent_list(am: &AgentManager, registry: Option<&AgentRegistry>) -> .collect() } +fn installed_jre_version<'a>(state: &'a crate::agent_manager::AgentState, jre_key: &str) -> Option<&'a String> { + state + .jre_versions + .get(jre_key) + .or_else(|| (jre_key == DEFAULT_JRE_KEY).then_some(state.jre_version.as_ref()).flatten()) +} + pub fn jre_needs_install(am: &AgentManager, registry: &AgentRegistry, jre_key: &str) -> bool { let state = am.load_state(); if state.java_runtime.mode != JavaRuntimeMode::Managed { diff --git a/crates/dbx-core/tests/agent_service.rs b/crates/dbx-core/tests/agent_service.rs index 15d77fe08..79db283d5 100644 --- a/crates/dbx-core/tests/agent_service.rs +++ b/crates/dbx-core/tests/agent_service.rs @@ -1,5 +1,6 @@ use dbx_core::agent_manager::{ - AgentManager, AgentRegistry, ArtifactInfo, DriverInfo, InstalledDriver, JreInfo, DEFAULT_JRE_KEY, + AgentManager, AgentRegistry, ArtifactInfo, DriverInfo, InstalledDriver, JavaRuntimeConfig, JavaRuntimeMode, + JreInfo, DEFAULT_JRE_KEY, }; use dbx_core::agent_service::{ build_agent_list, github_url_to_r2_path, import_agent_jar, import_agents_from_zip, is_app_version_compatible, @@ -113,6 +114,71 @@ fn agent_list_marks_update_when_installed_managed_jre_version_differs() { assert!(h2.update_available); } +#[test] +fn agent_list_does_not_mark_jre_update_for_system_java_runtime() { + let manager = test_manager("system-java-no-jre-update"); + let jar_path = manager.driver_jar_path("dameng"); + std::fs::create_dir_all(jar_path.parent().unwrap()).unwrap(); + std::fs::write(&jar_path, b"jar").unwrap(); + manager + .save_state(&dbx_core::agent_manager::AgentState { + java_runtime: JavaRuntimeConfig { mode: JavaRuntimeMode::System, custom_java_path: None }, + installed_drivers: [( + "dameng".to_string(), + InstalledDriver { + version: "0.2.0".to_string(), + installed_at: "2026-05-18T00:00:00Z".to_string(), + jre: DEFAULT_JRE_KEY.to_string(), + }, + )] + .into_iter() + .collect(), + ..Default::default() + }) + .unwrap(); + let registry = registry_with_jre_driver("dameng", "0.2.0", DEFAULT_JRE_KEY, "21.0.11"); + + let agents = build_agent_list(&manager, Some(®istry)); + let dameng = agents.iter().find(|agent| agent.db_type == "dameng").unwrap(); + + assert!(dameng.installed); + assert!(!dameng.jre_installed); + assert!(!dameng.update_available); +} + +#[test] +fn agent_list_uses_legacy_default_jre_version_when_checking_updates() { + let manager = test_manager("legacy-jre-version"); + let jar_path = manager.driver_jar_path("dameng"); + let java_path = manager.jre_java_path(DEFAULT_JRE_KEY); + std::fs::create_dir_all(jar_path.parent().unwrap()).unwrap(); + std::fs::create_dir_all(java_path.parent().unwrap()).unwrap(); + std::fs::write(&jar_path, b"jar").unwrap(); + std::fs::write(&java_path, b"java").unwrap(); + manager + .save_state(&dbx_core::agent_manager::AgentState { + jre_version: Some("21.0.11".to_string()), + installed_drivers: [( + "dameng".to_string(), + InstalledDriver { + version: "0.2.0".to_string(), + installed_at: "2026-05-18T00:00:00Z".to_string(), + jre: DEFAULT_JRE_KEY.to_string(), + }, + )] + .into_iter() + .collect(), + ..Default::default() + }) + .unwrap(); + let registry = registry_with_jre_driver("dameng", "0.2.0", DEFAULT_JRE_KEY, "21.0.11"); + + let agents = build_agent_list(&manager, Some(®istry)); + let dameng = agents.iter().find(|agent| agent.db_type == "dameng").unwrap(); + + assert!(!dameng.update_available); +} + #[test] fn jre_needs_install_when_managed_runtime_version_differs() { let manager = test_manager("jre-needs-install");