Skip to content

Commit e101e81

Browse files
committed
Runtime checks for _std packages
commit-id:dc2f7a0d # Conflicts: # crates/forge/src/run_tests/workspace.rs
1 parent b051dc7 commit e101e81

File tree

3 files changed

+90
-11
lines changed

3 files changed

+90
-11
lines changed

crates/forge/src/lib.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ use foundry_ui::components::warning::WarningMessage;
1111
use run_tests::workspace::run_for_workspace;
1212
use scarb_api::{ScarbCommand, metadata::MetadataCommandExt};
1313
use scarb_ui::args::{FeaturesSpec, PackagesFilter};
14-
use semver::Version;
14+
use semver::{Version, VersionReq};
1515
use shared::auto_completions::{Completion, generate_completions};
1616
use std::cell::RefCell;
1717
use std::ffi::OsString;
1818
use std::process::Command;
19-
use std::sync::Arc;
19+
use std::sync::{Arc, LazyLock};
2020
use std::{fs, num::NonZeroU32, thread::available_parallelism};
2121
use tokio::runtime::Builder;
2222
use universal_sierra_compiler_api::UniversalSierraCompilerCommand;
@@ -41,8 +41,12 @@ const MINIMAL_RECOMMENDED_SCARB_VERSION: Version = Version::new(2, 9, 4);
4141
const MINIMAL_SCARB_VERSION_PREBUILT_PLUGIN: Version = Version::new(2, 10, 0);
4242
const MINIMAL_USC_VERSION: Version = Version::new(2, 0, 0);
4343
const MINIMAL_SCARB_VERSION_FOR_SIERRA_GAS: Version = Version::new(2, 10, 0);
44-
// TODO(#3344) Set this to 0.44.0 after it has been released
44+
// TODO Set this to version from v2 macros release
4545
const MINIMAL_SNFORGE_STD_VERSION: Version = Version::new(0, 44, 0);
46+
// TODO Set this to version from v2 macros release
47+
const MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION: Version = Version::new(0, 44, 0);
48+
pub static MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT: LazyLock<VersionReq> =
49+
LazyLock::new(|| VersionReq::parse(">=2.12.0-rc.1").expect("Failed to parse version req"));
4650

4751
#[derive(Parser, Debug)]
4852
#[command(

crates/forge/src/run_tests/workspace.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
use super::package::RunForPackageArgs;
22
use super::structs::{LatestBlocksNumbersMessage, TestsFailureSummaryMessage};
33
use crate::run_tests::structs::OverallSummaryMessage;
4-
use crate::warn::{error_if_snforge_std_not_compatible, warn_if_backtrace_without_panic_hint};
4+
use crate::warn::{
5+
error_if_snforge_std_compatibility_missing, error_if_snforge_std_compatibility_not_compatible,
6+
error_if_snforge_std_not_compatible, warn_if_backtrace_without_panic_hint,
7+
warn_if_snforge_std_compatibility_does_not_match_package_version,
8+
};
59
use crate::{
6-
ColorOption, ExitStatus, TestArgs, block_number_map::BlockNumberMap,
7-
run_tests::package::run_for_package, scarb::build_artifacts_with_scarb,
8-
shared_cache::FailedTestsCache, warn::warn_if_snforge_std_not_compatible,
10+
ColorOption, ExitStatus, MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT, TestArgs,
11+
block_number_map::BlockNumberMap, run_tests::package::run_for_package,
12+
scarb::build_artifacts_with_scarb, shared_cache::FailedTestsCache,
13+
warn::warn_if_snforge_std_does_not_match_package_version,
914
};
1015
use anyhow::{Context, Result};
1116
use forge_runner::{CACHE_DIR, test_target_summary::TestTargetSummary};
@@ -38,8 +43,16 @@ pub async fn run_for_workspace(args: TestArgs, ui: Arc<UI>) -> Result<ExitStatus
3843
can_coverage_be_generated(&scarb_metadata)?;
3944
}
4045

41-
error_if_snforge_std_not_compatible(&scarb_metadata)?;
42-
warn_if_snforge_std_not_compatible(&scarb_metadata, &ui)?;
46+
let scarb_version = ScarbCommand::version().run()?.scarb;
47+
if MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT.matches(&scarb_version) {
48+
error_if_snforge_std_not_compatible(&scarb_metadata)?;
49+
warn_if_snforge_std_does_not_match_package_version(&scarb_metadata, &ui)?;
50+
} else {
51+
error_if_snforge_std_compatibility_missing(&scarb_metadata)?;
52+
error_if_snforge_std_compatibility_not_compatible(&scarb_metadata)?;
53+
warn_if_snforge_std_compatibility_does_not_match_package_version(&scarb_metadata, &ui)?;
54+
}
55+
4356
warn_if_backtrace_without_panic_hint(&scarb_metadata, &ui);
4457

4558
let artifacts_dir_path =

crates/forge/src/warn.rs

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::MINIMAL_SNFORGE_STD_VERSION;
1+
use crate::{MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION, MINIMAL_SNFORGE_STD_VERSION};
22
use anyhow::{Result, anyhow};
33
use forge_runner::backtrace::is_backtrace_enabled;
44
use forge_runner::package_tests::with_config_resolved::TestTargetWithResolvedConfig;
@@ -85,6 +85,65 @@ fn snforge_std_recommended_version() -> VersionReq {
8585
}
8686
}
8787

88+
fn snforge_std_compatibility_recommended_version() -> VersionReq {
89+
snforge_std_recommended_version()
90+
}
91+
92+
pub fn error_if_snforge_std_compatibility_missing(scarb_metadata: &Metadata) -> Result<()> {
93+
if !scarb_metadata
94+
.packages
95+
.iter()
96+
.any(|p| p.name == "snforge_std_compatibility")
97+
{
98+
return Err(anyhow!(
99+
"On Scarb versions < 2.12.0, the `snforge_std` package must be replaced with `snforge_std_compatibility`. Please update it in Scarb.toml"
100+
));
101+
}
102+
Ok(())
103+
}
104+
105+
pub fn error_if_snforge_std_compatibility_not_compatible(scarb_metadata: &Metadata) -> Result<()> {
106+
let snforge_std_compatibility_version_requirement_comparator = Comparator {
107+
op: Op::GreaterEq,
108+
major: MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION.major,
109+
minor: Some(MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION.minor),
110+
patch: Some(MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION.patch),
111+
pre: MINIMAL_SNFORGE_STD_COMPATIBILITY_VERSION.pre,
112+
};
113+
let snforge_std_compatibility_version_requirement = VersionReq {
114+
comparators: vec![snforge_std_compatibility_version_requirement_comparator],
115+
};
116+
117+
if !package_matches_version_requirement(
118+
scarb_metadata,
119+
"snforge_std_compatibility",
120+
&snforge_std_compatibility_version_requirement,
121+
)? {
122+
return Err(anyhow!(
123+
"Package `snforge_std_compatibility` version does not meet the minimum required version {snforge_std_compatibility_version_requirement}. Please upgrade `snforge_std_compatibility` in Scarb.toml"
124+
));
125+
}
126+
Ok(())
127+
}
128+
129+
pub fn warn_if_snforge_std_compatibility_does_not_match_package_version(
130+
scarb_metadata: &Metadata,
131+
ui: &UI,
132+
) -> Result<()> {
133+
let snforge_std_compatibility_version_requirement =
134+
snforge_std_compatibility_recommended_version();
135+
if !package_matches_version_requirement(
136+
scarb_metadata,
137+
"snforge_std_compatibility",
138+
&snforge_std_compatibility_version_requirement,
139+
)? {
140+
ui.println(&WarningMessage::new(&format!(
141+
"Package `snforge_std_compatibility` version does not meet the recommended version requirement {snforge_std_compatibility_version_requirement}, it might result in unexpected behaviour"
142+
)));
143+
}
144+
Ok(())
145+
}
146+
88147
pub fn error_if_snforge_std_not_compatible(scarb_metadata: &Metadata) -> Result<()> {
89148
let snforge_std_version_requirement_comparator = Comparator {
90149
op: Op::GreaterEq,
@@ -109,7 +168,10 @@ pub fn error_if_snforge_std_not_compatible(scarb_metadata: &Metadata) -> Result<
109168
Ok(())
110169
}
111170

112-
pub fn warn_if_snforge_std_not_compatible(scarb_metadata: &Metadata, ui: &UI) -> Result<()> {
171+
pub fn warn_if_snforge_std_does_not_match_package_version(
172+
scarb_metadata: &Metadata,
173+
ui: &UI,
174+
) -> Result<()> {
113175
let snforge_std_version_requirement = snforge_std_recommended_version();
114176
if !package_matches_version_requirement(
115177
scarb_metadata,

0 commit comments

Comments
 (0)