diff --git a/crates/blockifier/src/test_utils/cairo_compile.rs b/crates/blockifier/src/test_utils/cairo_compile.rs index 727cd4ee68..f0345aa4a4 100644 --- a/crates/blockifier/src/test_utils/cairo_compile.rs +++ b/crates/blockifier/src/test_utils/cairo_compile.rs @@ -1,8 +1,11 @@ use std::process::Command; +use std::{env, fs}; use cached::proc_macro::cached; use serde::{Deserialize, Serialize}; +const CAIRO0_PIP_REQUIREMENTS_FILE: &str = "tests/requirements.txt"; + /// Objects for simple deserialization of Cargo.toml to fetch the Cairo1 compiler version. /// The compiler itself isn't actually a dependency, so we compile by using the version of the /// cairo-lang-casm crate. @@ -54,6 +57,7 @@ pub fn cairo1_compiler_version() -> String { /// Compiles a Cairo0 program using the deprecated compiler. pub fn cairo0_compile(path: String, extra_arg: Option, debug_info: bool) -> Vec { + verify_cairo0_compiler_deps(); let mut command = Command::new("starknet-compile-deprecated"); command.arg(&path); if let Some(extra_arg) = extra_arg { @@ -72,3 +76,34 @@ pub fn cairo0_compile(path: String, extra_arg: Option, debug_info: bool) pub fn cairo1_compile(_path: String) -> Vec { todo!(); } + +/// Verifies that the required dependencies are available before compiling; panics if unavailable. +fn verify_cairo0_compiler_deps() { + // Python compiler. Verify correct version. + let cairo_lang_version_output = + Command::new("sh").arg("-c").arg("pip freeze | grep cairo-lang").output().unwrap().stdout; + let cairo_lang_version_untrimmed = String::from_utf8(cairo_lang_version_output).unwrap(); + let cairo_lang_version = cairo_lang_version_untrimmed.trim(); + let requirements_contents = fs::read_to_string(CAIRO0_PIP_REQUIREMENTS_FILE).unwrap(); + let expected_cairo_lang_version = requirements_contents + .lines() + .nth(1) // Skip docstring. + .expect( + "Expecting requirements file to contain a docstring in the first line, and \ + then the required cairo-lang version in the second line." + ).trim(); + + assert_eq!( + cairo_lang_version, + expected_cairo_lang_version, + "cairo-lang version {expected_cairo_lang_version} not found ({}). Please run:\npip3.9 \ + install -r {}/{}\nthen rerun the test.", + if cairo_lang_version.is_empty() { + String::from("no installed cairo-lang found") + } else { + format!("installed version: {cairo_lang_version}") + }, + env::var("CARGO_MANIFEST_DIR").unwrap(), + CAIRO0_PIP_REQUIREMENTS_FILE + ); +}