Skip to content

Commit

Permalink
new tests
Browse files Browse the repository at this point in the history
  • Loading branch information
MBerguer committed Jan 27, 2025
1 parent 3db5b6a commit 2b7b321
Show file tree
Hide file tree
Showing 3 changed files with 194 additions and 59 deletions.
6 changes: 5 additions & 1 deletion crates/zksync/compilers/src/compilers/zksolc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ pub const ZKSOLC: &str = "zksolc";
/// ZKsync solc release used for all ZKsync solc versions
pub const ZKSYNC_SOLC_RELEASE: Version = Version::new(1, 0, 1);
/// Default zksolc version
pub const ZKSOLC_VERSION: Version = Version::new(1, 5, 10);
pub const ZKSOLC_VERSION: Version = Version::new(1, 5, 9);

#[cfg(test)]
macro_rules! take_solc_installer_lock {
Expand Down Expand Up @@ -151,7 +151,11 @@ impl Compiler for ZkSolcCompiler {
) -> Result<CompilerOutput<Self::CompilationError, Self::CompilerContract>> {
let zksolc = self.zksolc(input)?;

println!("paso por aca 1");

let mut zk_output = zksolc.compile(&input.input)?;
println!("zk_output {:?}", zk_output);

let mut metadata = BTreeMap::new();
if let Some(solc_version) = zk_output.version.take() {
metadata.insert("solcVersion".to_string(), solc_version.into());
Expand Down
2 changes: 2 additions & 0 deletions crates/zksync/compilers/src/compilers/zksolc/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,8 @@ impl CompilerSettings for ZkSolcSettings {
..
} = self;

println!("ybue: zksolc_version: {:?}", self.zksolc_version);

*via_ir == other.settings.via_ir &&
*remappings == other.settings.remappings &&
*evm_version == other.settings.evm_version &&
Expand Down
245 changes: 187 additions & 58 deletions crates/zksync/compilers/tests/zksync_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use std::{
str::FromStr,
};

use foundry_compilers::ProjectCompileOutput;
use foundry_compilers_artifacts_solc::Remapping;
use foundry_test_utils::foundry_compilers::{
buildinfo::BuildInfo, cache::CompilerCache, project_util::*, resolver::parse::SolData,
Expand Down Expand Up @@ -58,6 +59,7 @@ fn test_zksync_can_compile_contract_with_suppressed_errors(compiler: ZkSolcCompi
// .with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
// .try_init()
// .ok();

let mut project = TempProject::<ZkSolcCompiler, ZkArtifactOutput>::dapptools().unwrap();
project.project_mut().compiler = compiler;

Expand All @@ -78,16 +80,59 @@ fn test_zksync_can_compile_contract_with_suppressed_errors(compiler: ZkSolcCompi
.unwrap();

let compiled = project.compile().unwrap();

assert!(compiled.has_compiler_errors());

project.project_mut().settings.settings.suppressed_errors =
HashSet::from([ErrorType::SendTransfer]);

let compiled = project.compile().unwrap();

let cache = CompilerCache::<ZkSolcSettings>::read(project.cache_path()).unwrap();
print!("CAAACHEE {:?}", cache);

compiled.assert_success();
assert!(compiled.find_first("Erroneous").is_some());
}

fn test_zksync_can_compile_with_version(
project: &mut TempProject<ZkSolcCompiler, ZkArtifactOutput>,
compiler: ZkSolcCompiler,
) -> ProjectCompileOutput<ZkSolcCompiler, ZkArtifactOutput> {
// let _ = tracing_subscriber::fmt()
// .with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
// .try_init()
// .ok();

project.project_mut().compiler = compiler;

project
.add_source(
"A",
r#"
pragma solidity ^0.8.10;
import "./B.sol";
contract A { }
"#,
)
.unwrap();

project
.add_source(
"B",
r"
pragma solidity ^0.8.10;
contract B { }
",
)
.unwrap();

project.project_mut().settings.settings.suppressed_errors =
HashSet::from([ErrorType::SendTransfer]);

project.compile().unwrap()
}

#[test]
fn zksync_can_compile_contract_with_suppressed_errors() {
test_zksync_can_compile_contract_with_suppressed_errors(ZkSolcCompiler::default());
Expand Down Expand Up @@ -657,68 +702,152 @@ fn zksync_can_compile_yul_sample() {
assert!(!yul_bytecode.is_empty(), "SimpleStore bytecode is empty");
}

forgetest_init!(test_zk_cache_ok, |prj, cmd| {
let zk_toml = r#"[profile.default]
src = 'src'
out = 'out'
libs = ['lib']
solc = '0.8.26'
[profile.default.zksync]
zksolc = '1.5.6'
"#;

fs::write(prj.root().join("foundry.toml"), zk_toml).unwrap();

cmd.args(["build", "--zksync"]);
let stdout_1 = cmd.assert_success().get_output().stdout_lossy();
let pattern_1 = Regex::new(r"Compiler run successful").unwrap();

let stdout_2 = cmd.assert_success().get_output().stdout_lossy();
let pattern_2 = Regex::new(r"No files changed, compilation skipped").unwrap();

assert!(pattern_1.is_match(&stdout_1));
assert!(pattern_2.is_match(&stdout_2));
});

// tests cache is invalidated when zksolc version changes
forgetest_init!(test_zk_cache_invalid_on_version_changed, |prj, cmd| {
let template_toml = r#"[profile.default]
src = 'src'
out = 'out'
libs = ['lib']
solc = '0.8.26'
[profile.default.zksync]
"#;

let toml_156 = format!(
r#"{template_toml}
zksolc = '1.5.6'
"#
);
// forgetest_init!(test_zk_cache_ok, |prj, cmd| {
// let zk_toml = r#"[profile.default]
// src = 'src'
// out = 'out'
// libs = ['lib']
// solc = '0.8.26'

let toml_157 = format!(
r#"{template_toml}
zksolc = '1.5.7'
"#
);
// [profile.default.zksync]
// zksolc = '1.5.6'
// "#;

// fs::write(prj.root().join("foundry.toml"), zk_toml).unwrap();

// cmd.args(["build", "--zksync"]);
// let stdout_1 = cmd.assert_success().get_output().stdout_lossy();
// let pattern_1 = Regex::new(r"Compiler run successful").unwrap();

// let stdout_2 = cmd.assert_success().get_output().stdout_lossy();
// let pattern_2 = Regex::new(r"No files changed, compilation skipped").unwrap();

// assert!(pattern_1.is_match(&stdout_1));
// assert!(pattern_2.is_match(&stdout_2));
// });

// // tests cache is invalidated when zksolc version changes
// forgetest_init!(test_zk_cache_invalid_on_version_changed, |prj, cmd| {
// let template_toml = r#"[profile.default]
// src = 'src'
// out = 'out'
// libs = ['lib']
// solc = '0.8.26'

// [profile.default.zksync]
// "#;

// let toml_156 = format!(
// r#"{template_toml}
// zksolc = '1.5.6'
// "#
// );

// let toml_157 = format!(
// r#"{template_toml}
// zksolc = '1.5.7'
// "#
// );

// fs::write(prj.root().join("foundry.toml"), toml_156).unwrap();

// cmd.args(["build", "--zksync"]);
// let stdout_1 = cmd.assert_success().get_output().stdout_lossy();
// let pattern_1 = Regex::new(r"Compiler run successful").unwrap();

// fs::remove_file(prj.root().join("foundry.toml")).unwrap();
// fs::write(prj.root().join("foundry.toml"), toml_157).unwrap();

// let stdout_2 = cmd.assert_success().get_output().stdout_lossy();
// let pattern_2 = Regex::new(r"Compiler run successful!").unwrap(); // if we see this, means
// the cache was invalidated

// print!("stdout_1: {}", stdout_1);
// print!("stdout_2: {}", stdout_2);

fs::write(prj.root().join("foundry.toml"), toml_156).unwrap();
// assert!(pattern_1.is_match(&stdout_1));
// assert!(pattern_2.is_match(&stdout_2));
// });

cmd.args(["build", "--zksync"]);
let stdout_1 = cmd.assert_success().get_output().stdout_lossy();
let pattern_1 = Regex::new(r"Compiler run successful").unwrap();
// Test that checks that you have to recompile the project if the zksolc version changes (the
// cache is invalidated)

fs::remove_file(prj.root().join("foundry.toml")).unwrap();
fs::write(prj.root().join("foundry.toml"), toml_157).unwrap();
#[test]
fn zksync_detects_change_on_cache_if_zksolc_version_changes() {
let mut project = TempProject::<ZkSolcCompiler, ZkArtifactOutput>::dapptools().unwrap();

project.project_mut().build_info = true;
project
.add_source(
"A",
r#"
pragma solidity ^0.8.10;
import "./B.sol";
contract A { }
"#,
)
.unwrap();

project
.add_source(
"B",
r"
pragma solidity ^0.8.10;
contract B { }
",
)
.unwrap();

let config_1_5_6 = ZkSolcCompiler {
zksolc: ZkSolc::get_path_for_version(&semver::Version::new(1, 5, 6)).unwrap(),
solc: Default::default(),
};
project.project_mut().compiler = config_1_5_6;

let compiled_1 = project.compile().unwrap();
compiled_1.assert_success();

let cache = CompilerCache::<ZkSolcSettings>::read(project.cache_path()).unwrap();

let config_1_5_7 = ZkSolcCompiler {
zksolc: ZkSolc::get_path_for_version(&semver::Version::new(1, 5, 7)).unwrap(),
solc: Default::default(),
};
project.project_mut().compiler = config_1_5_7;

let stdout_2 = cmd.assert_success().get_output().stdout_lossy();
let pattern_2 = Regex::new(r"Compiler run successful!").unwrap(); // if we see this, means the cache was invalidated
let compiled_2 = project.compile().unwrap();

print!("stdout_1: {}", stdout_1);
print!("stdout_2: {}", stdout_2);
assert!(compiled_2.is_unchanged());

assert!(pattern_1.is_match(&stdout_1));
assert!(pattern_2.is_match(&stdout_2));
});
let latest_cache = CompilerCache::<ZkSolcSettings>::read(project.cache_path()).unwrap();

assert_ne!(cache, latest_cache);
}

#[test]
fn test_nuevo_vamoaver() {
let mut project = TempProject::<ZkSolcCompiler, ZkArtifactOutput>::dapptools().unwrap();

let compiler_1_5_6 = ZkSolcCompiler {
zksolc: ZkSolc::get_path_for_version(&semver::Version::new(1, 5, 6)).unwrap(),
solc: Default::default(),
};
let compiled_1 = test_zksync_can_compile_with_version(&mut project, compiler_1_5_6);

assert!(!compiled_1.is_unchanged());

let cache = CompilerCache::<ZkSolcSettings>::read(project.cache_path()).unwrap();

let compiler_1_5_7 = ZkSolcCompiler {
zksolc: ZkSolc::get_path_for_version(&semver::Version::new(1, 5, 7)).unwrap(),
solc: Default::default(),
};

let compiled_2 = test_zksync_can_compile_with_version(&mut project, compiler_1_5_7);

assert!(compiled_2.is_unchanged());

let latest_cache = CompilerCache::<ZkSolcSettings>::read(project.cache_path()).unwrap();

assert_ne!(cache, latest_cache);
}

0 comments on commit 2b7b321

Please sign in to comment.