diff --git a/cli/src/install.rs b/cli/src/install.rs index c69e5d2d5c..e66106456a 100644 --- a/cli/src/install.rs +++ b/cli/src/install.rs @@ -182,6 +182,18 @@ fn platform_key() -> &'static str { } } +fn macos_version() -> Option<(u32, u32)> { + let output = Command::new("sw_vers") + .arg("-productVersion") + .output() + .ok()?; + let version_str = String::from_utf8_lossy(&output.stdout); + let mut parts = version_str.trim().split('.'); + let major: u32 = parts.next()?.parse().ok()?; + let minor: u32 = parts.next().and_then(|s| s.parse().ok()).unwrap_or(0); + Some((major, minor)) +} + async fn fetch_download_url() -> Result<(String, String), String> { let client = http_client()?; let resp = client @@ -208,6 +220,19 @@ async fn fetch_download_url() -> Result<(String, String), String> { let platform = platform_key(); + if platform == "mac-arm64" || platform == "mac-x64" { + if let Some((major, minor)) = macos_version() { + if major < 13 { + return Err(format!( + "Chrome for Testing builds require macOS 13 or later (you have macOS {}.{}). \ + Please upgrade macOS, or install Chrome manually from https://dl.google.com/chrome/mac/.", + major, + minor + )); + } + } + } + let url = channel .get("downloads") .and_then(|d| d.get("chrome")) @@ -1064,4 +1089,18 @@ mod tests { err ); } + + #[test] + #[cfg(target_os = "macos")] + fn macos_version_returns_some_on_macos() { + assert!(macos_version().is_some()); + let (major, _minor) = macos_version().unwrap(); + assert!(major >= 11, "expected macOS 11+, got {}", major); + } + + #[test] + #[cfg(not(target_os = "macos"))] + fn macos_version_returns_none_on_non_macos() { + assert!(macos_version().is_none()); + } }