Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Get features from all targets #2570

Draft
wants to merge 28 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
2113d29
Run `features` tests with scarb 2.8.3 on CI
cptartur Oct 7, 2024
2ddc2b7
Get features from all targets
cptartur Oct 8, 2024
9c70b19
Update tests
cptartur Oct 9, 2024
8b201d7
Move `test_targets_by_name` to scarb-api
cptartur Oct 9, 2024
c9ddf28
Update package loading logic
cptartur Oct 9, 2024
08a5935
Fix dependencies in workspace test
cptartur Oct 9, 2024
f62fd3d
Fix dependencies in workspace test
cptartur Oct 11, 2024
06c5ee6
Extend tests
cptartur Oct 11, 2024
a7af046
Fix test
cptartur Oct 14, 2024
bb7ad81
Inline `build_target_path`
cptartur Oct 16, 2024
cb8fd4d
Remove TODO
cptartur Oct 16, 2024
1af16b7
Remove duplicated validation
cptartur Oct 16, 2024
5652e24
Use const for integration `test_type`
cptartur Oct 16, 2024
bc8049d
Add doc comment
cptartur Oct 16, 2024
c28c543
Update comment
cptartur Oct 16, 2024
9b54c0a
Print warnings on missing artifacts, simply logic for building path i…
cptartur Oct 16, 2024
1da9367
Remove unwrap
cptartur Oct 16, 2024
14d302c
Remove metadata.json
cptartur Oct 16, 2024
88a1645
Restructure code
cptartur Oct 16, 2024
2479091
Use unique names for test packages
cptartur Oct 16, 2024
5d1b195
Compile contracts in parallel
cptartur Oct 16, 2024
3a9bf30
Update crates/scarb-api/src/lib.rs
cptartur Oct 16, 2024
52765b9
Run some tests only on scarb 2.8.3
cptartur Oct 16, 2024
308507b
Merge remote-tracking branch 'origin/2568-get-features-from-all-targe…
cptartur Oct 16, 2024
e69d664
Merge branch 'master' into 2568-get-features-from-all-targets
cptartur Oct 16, 2024
4582720
`scarb fmt`
cptartur Oct 16, 2024
a6c4f6e
Remove inline struct
cptartur Oct 17, 2024
816154d
Use `as_deref` instead of `to_string`
cptartur Oct 17, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ jobs:
- uses: software-mansion/setup-universal-sierra-compiler@v1
- run: |
cargo test --package forge --features scarb_2_8_3 e2e::contract_artifacts
cargo test --package forge --features scarb_2_8_3 e2e::features
cargo test --package scarb-api --features scarb_2_8_3 get_starknet_artifacts_path

test-forge-runner:
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions crates/cheatnet/tests/common/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ use conversions::string::TryFromHexStr;
use conversions::IntoConv;
use runtime::starknet::context::build_context;
use scarb_api::metadata::MetadataCommandExt;
use scarb_api::{get_contracts_artifacts_and_source_sierra_paths, ScarbCommand};
use scarb_api::{
get_contracts_artifacts_and_source_sierra_paths, target_dir_for_workspace, ScarbCommand,
};
use starknet::core::utils::get_selector_from_name;
use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector};
use starknet_api::deprecated_contract_class::EntryPointType;
Expand Down Expand Up @@ -72,12 +74,12 @@ pub fn get_contracts() -> ContractsData {
.manifest_path("tests/contracts/Scarb.toml")
.run()
.unwrap();
let target_dir = target_dir_for_workspace(&scarb_metadata).join("dev");

let package = scarb_metadata.packages.first().unwrap();

let contracts =
get_contracts_artifacts_and_source_sierra_paths(&scarb_metadata, &package.id, None, false)
.unwrap();
get_contracts_artifacts_and_source_sierra_paths(&target_dir, package, false).unwrap();
ContractsData::try_from(contracts).unwrap()
}

Expand Down
5 changes: 2 additions & 3 deletions crates/forge/src/run_tests/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,8 @@ impl RunForPackageArgs {
let raw_test_targets = load_test_artifacts(snforge_target_dir_path, &package)?;

let contracts = get_contracts_artifacts_and_source_sierra_paths(
scarb_metadata,
&package.id,
None,
snforge_target_dir_path,
&package,
!should_compile_starknet_contract_target(
&scarb_metadata.app_version_info.version,
args.no_optimization,
Expand Down
26 changes: 2 additions & 24 deletions crates/forge/src/scarb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,10 @@ use camino::Utf8Path;
use configuration::PackageConfig;
use forge_runner::package_tests::raw::TestTargetRaw;
use forge_runner::package_tests::TestTargetLocation;
use scarb_api::ScarbCommand;
use scarb_metadata::{PackageMetadata, TargetMetadata};
use scarb_api::{test_targets_by_name, ScarbCommand};
use scarb_metadata::PackageMetadata;
use scarb_ui::args::{FeaturesSpec, PackagesFilter};
use semver::Version;
use std::collections::HashMap;
use std::fs::read_to_string;
use std::io::ErrorKind;

Expand Down Expand Up @@ -76,27 +75,6 @@ fn build_test_artifacts_with_scarb(filter: PackagesFilter, features: FeaturesSpe
Ok(())
}

/// collecting by name allow us to dedup targets
/// we do it because they use same sierra and we display them without distinction anyway
fn test_targets_by_name(package: &PackageMetadata) -> HashMap<String, &TargetMetadata> {
fn test_target_name(target: &TargetMetadata) -> String {
// this is logic copied from scarb: https://github.com/software-mansion/scarb/blob/90ab01cb6deee48210affc2ec1dc94d540ab4aea/extensions/scarb-cairo-test/src/main.rs#L115
target
.params
.get("group-id") // by unit tests grouping
.and_then(|v| v.as_str())
.map(ToString::to_string)
.unwrap_or(target.name.clone()) // else by integration test name
}

package
.targets
.iter()
.filter(|target| target.kind == "test")
.map(|target| (test_target_name(target), target))
.collect()
}

pub fn load_test_artifacts(
target_dir: &Utf8Path,
package: &PackageMetadata,
Expand Down
20 changes: 8 additions & 12 deletions crates/forge/test_utils/src/runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ use forge_runner::{
};
use indoc::formatdoc;
use scarb_api::{
get_contracts_artifacts_and_source_sierra_paths, metadata::MetadataCommandExt, ScarbCommand,
StarknetContractArtifacts,
get_contracts_artifacts_and_source_sierra_paths, metadata::MetadataCommandExt,
target_dir_for_workspace, ScarbCommand, StarknetContractArtifacts,
};
use shared::command::CommandExt;
use std::{
Expand Down Expand Up @@ -96,17 +96,13 @@ impl Contract {
.iter()
.find(|package| package.name == "contract")
.unwrap();
let target_dir = target_dir_for_workspace(&scarb_metadata).join("dev");

let contract = get_contracts_artifacts_and_source_sierra_paths(
&scarb_metadata,
&package.id,
None,
false,
)
.unwrap()
.remove(&self.name)
.ok_or(anyhow!("there is no contract with name {}", self.name))?
.0;
let contract = get_contracts_artifacts_and_source_sierra_paths(&target_dir, package, false)
.unwrap()
.remove(&self.name)
.ok_or(anyhow!("there is no contract with name {}", self.name))?
.0;

Ok((contract.sierra, contract.casm))
}
Expand Down
3 changes: 3 additions & 0 deletions crates/forge/tests/data/hello_workspaces/Scarb.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,8 @@ starknet.workspace = true
fibonacci = { path = "crates/fibonacci" }
addition = { path = "crates/addition" }

[dev-dependencies]
snforge_std.workspace = true

[[target.starknet-contract]]
sierra = true
25 changes: 25 additions & 0 deletions crates/forge/tests/data/targets/custom_target/Scarb.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
[package]
name = "custom_target"
version = "0.1.0"

[dependencies]
starknet = "2.7.0"

[dev-dependencies]
snforge_std = { path = "../../../../../../snforge_std" }

[[target.starknet-contract]]

[[test]]
name = "custom_target_integrationtest"
kind = "test"
source-path = "./tests/tests.cairo"
test-type = "integration"

[[test]]
name = "custom_target_unittest"
kind = "test"
test-type = "unit"

[tool.snforge]
exit_first = false
55 changes: 55 additions & 0 deletions crates/forge/tests/data/targets/custom_target/src/lib.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#[starknet::interface]
trait IHelloStarknet<TContractState> {
fn increase_balance(ref self: TContractState, amount: felt252);
fn get_balance(self: @TContractState) -> felt252;
fn do_a_panic(self: @TContractState);
fn do_a_panic_with(self: @TContractState, panic_data: Array<felt252>);
}

#[starknet::contract]
mod HelloStarknet {
use array::ArrayTrait;

#[storage]
struct Storage {
balance: felt252,
}

#[abi(embed_v0)]
impl IHelloStarknetImpl of super::IHelloStarknet<ContractState> {
// Increases the balance by the given amount.
fn increase_balance(ref self: ContractState, amount: felt252) {
self.balance.write(self.balance.read() + amount);
}

// Returns the current balance.
fn get_balance(self: @ContractState) -> felt252 {
self.balance.read()
}

// Panics
fn do_a_panic(self: @ContractState) {
let mut arr = ArrayTrait::new();
arr.append('PANIC');
arr.append('DAYTAH');
panic(arr);
}

// Panics with given array data
fn do_a_panic_with(self: @ContractState, panic_data: Array<felt252>) {
panic(panic_data);
}
}
}

#[cfg(test)]
mod tests {
use snforge_std::{declare, ContractClassTrait};
use snforge_std::cheatcodes::contract_class::DeclareResultTrait;

#[test]
fn declare_contract_from_lib() {
let _ = declare("HelloStarknet").unwrap().contract_class();
assert(2 == 2, 'Should declare');
}
}
28 changes: 28 additions & 0 deletions crates/forge/tests/data/targets/custom_target/tests/tests.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use array::ArrayTrait;
use result::ResultTrait;
use option::OptionTrait;
use traits::TryInto;
use starknet::ContractAddress;
use starknet::Felt252TryIntoContractAddress;

use snforge_std::{declare, ContractClassTrait};
use snforge_std::cheatcodes::contract_class::DeclareResultTrait;

use custom_target::IHelloStarknetDispatcher;
use custom_target::IHelloStarknetDispatcherTrait;

#[test]
fn declare_and_call_contract_from_lib() {
let contract = declare("HelloStarknet").unwrap().contract_class();
let constructor_calldata = @ArrayTrait::new();
let (contract_address, _) = contract.deploy(constructor_calldata).unwrap();
let dispatcher = IHelloStarknetDispatcher { contract_address };

let balance = dispatcher.get_balance();
assert(balance == 0, 'balance == 0');

dispatcher.increase_balance(100);

let balance = dispatcher.get_balance();
assert(balance == 100, 'balance == 100');
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
[package]
name = "custom_target_custom_names"
version = "0.1.0"

[dependencies]
starknet = "2.7.0"

[dev-dependencies]
snforge_std = { path = "../../../../../../snforge_std" }


[[test]]
name = "custom_first"
kind = "my_kind"
source-path = "./tests/tests.cairo"
test-type = "integration"
build-external-contracts = ["custom_target_custom_names::*"]

[[test]]
name = "custom_second"
kind = "my_other_kind"
test-type = "unit"

[tool.snforge]
exit_first = false
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#[starknet::interface]
trait IHelloStarknet<TContractState> {
fn increase_balance(ref self: TContractState, amount: felt252);
fn get_balance(self: @TContractState) -> felt252;
fn do_a_panic(self: @TContractState);
fn do_a_panic_with(self: @TContractState, panic_data: Array<felt252>);
}

#[starknet::contract]
mod HelloStarknet {
use array::ArrayTrait;

#[storage]
struct Storage {
balance: felt252,
}

#[abi(embed_v0)]
impl IHelloStarknetImpl of super::IHelloStarknet<ContractState> {
// Increases the balance by the given amount.
fn increase_balance(ref self: ContractState, amount: felt252) {
self.balance.write(self.balance.read() + amount);
}

// Returns the current balance.
fn get_balance(self: @ContractState) -> felt252 {
self.balance.read()
}

// Panics
fn do_a_panic(self: @ContractState) {
let mut arr = ArrayTrait::new();
arr.append('PANIC');
arr.append('DAYTAH');
panic(arr);
}

// Panics with given array data
fn do_a_panic_with(self: @ContractState, panic_data: Array<felt252>) {
panic(panic_data);
}
}
}

#[cfg(test)]
mod tests {
use snforge_std::{declare, ContractClassTrait};
use snforge_std::cheatcodes::contract_class::DeclareResultTrait;

#[test]
fn declare_contract_from_lib() {
let _ = declare("HelloStarknet").unwrap().contract_class();
assert(2 == 2, 'Should declare');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use array::ArrayTrait;
use result::ResultTrait;
use option::OptionTrait;
use traits::TryInto;
use starknet::ContractAddress;
use starknet::Felt252TryIntoContractAddress;

use snforge_std::{declare, ContractClassTrait};
use snforge_std::cheatcodes::contract_class::DeclareResultTrait;

use custom_target_custom_names::IHelloStarknetDispatcher;
use custom_target_custom_names::IHelloStarknetDispatcherTrait;

#[test]
fn declare_and_call_contract_from_lib() {
let contract = declare("HelloStarknet").unwrap().contract_class();
let constructor_calldata = @ArrayTrait::new();
let (contract_address, _) = contract.deploy(constructor_calldata).unwrap();
let dispatcher = IHelloStarknetDispatcher { contract_address };

let balance = dispatcher.get_balance();
assert(balance == 0, 'balance == 0');

dispatcher.increase_balance(100);

let balance = dispatcher.get_balance();
assert(balance == 100, 'balance == 100');
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[package]
name = "custom_target_only_integration"
version = "0.1.0"

[dependencies]
starknet = "2.7.0"

[dev-dependencies]
snforge_std = { path = "../../../../../../snforge_std" }

[[target.starknet-contract]]

[[test]]
name = "custom_first"
kind = "test"
source-path = "./tests/tests.cairo"
test-type = "integration"
build-external-contracts = ["custom_target_only_integration::*"]

[tool.snforge]
exit_first = false
Loading
Loading