Skip to content

Commit

Permalink
Add fuzzer tests with multiple attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
ddoktorski committed Jan 30, 2025
1 parent 3a18d4c commit ca0e40c
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 5 deletions.
13 changes: 13 additions & 0 deletions crates/forge/tests/data/fuzzing/tests/generate_arg.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
use snforge_std::fuzzable::generate_arg;

#[test]
fn use_generate_arg_outside_fuzzer() {
let random: usize = generate_arg(100, 999);
assert(99 < random && random < 1000, 'value outside correct range');
}


#[test]
fn generate_arg_incorrect_range() {
generate_arg(101, 100);
}
35 changes: 35 additions & 0 deletions crates/forge/tests/data/fuzzing/tests/multiple_attributes.cairo
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
use fuzzing::adder;
use fuzzing::fib;

#[available_gas(100)]
#[fuzzer(runs: 50, seed: 123)]
#[test]
fn with_available_gas(a: usize) {
fib(0, 1, 1000);
assert(a >= 0, 'unsigned must be >= 0');
}


#[fuzzer]
#[test]
#[should_panic(expected: 'panic message')]
fn with_should_panic(a: u64) {
let b: i128 = a.into();
assert(b < 0, 'panic message');
}

#[available_gas(5)]
#[should_panic(expected: 'panic message')]
#[test]
#[fuzzer(runs: 300)]
fn with_both(a: felt252, b: u128) {
let sum = adder(a, b.into());
assert(sum + 1 == 0, 'panic message');
}

#[test]
#[fuzzer(seed: 5)]
#[ignore]
fn ignored(a: felt252) {
assert(1 == 1, '');
}
63 changes: 58 additions & 5 deletions crates/forge/tests/e2e/fuzzing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ fn fuzzing() {
[PASS] fuzzing::tests::uint128_arg (runs: 256, [..]
[PASS] fuzzing::tests::uint256_arg (runs: 256, [..]
Running 0 test(s) from tests/
Tests: 12 passed, 1 failed, 0 skipped, 0 ignored, 5 filtered out
Tests: 12 passed, 1 failed, 0 skipped, 0 ignored, 11 filtered out
Fuzzer seed: [..]
Failures:
Expand Down Expand Up @@ -80,7 +80,7 @@ fn fuzzing_set_runs() {
[PASS] fuzzing::tests::uint128_arg (runs: 10, [..]
[PASS] fuzzing::tests::uint256_arg (runs: 10, [..]
Running 0 test(s) from tests/
Tests: 12 passed, 1 failed, 0 skipped, 0 ignored, 5 filtered out
Tests: 12 passed, 1 failed, 0 skipped, 0 ignored, 11 filtered out
Fuzzer seed: [..]
Failures:
Expand Down Expand Up @@ -125,7 +125,7 @@ fn fuzzing_set_seed() {
[PASS] fuzzing::tests::uint128_arg (runs: 256, [..]
[PASS] fuzzing::tests::uint256_arg (runs: 256, [..]
Running 0 test(s) from tests/
Tests: 12 passed, 1 failed, 0 skipped, 0 ignored, 5 filtered out
Tests: 12 passed, 1 failed, 0 skipped, 0 ignored, 11 filtered out
Fuzzer seed: 1234
Failures:
Expand Down Expand Up @@ -195,7 +195,7 @@ fn fuzzing_exit_first() {
Failure data:
0x32202b2062203d3d2032202b2062 ('2 + b == 2 + b')
Tests: 0 passed, 1 failed, 1 skipped, 0 ignored, 16 filtered out
Tests: 0 passed, 1 failed, 1 skipped, 0 ignored, 22 filtered out
Fuzzer seed: [..]
Failures:
Expand Down Expand Up @@ -230,7 +230,60 @@ fn fuzzing_exit_first_single_fail() {
Failures:
fuzzing_integrationtest::exit_first_single_fail::exit_first_fails_test
Tests: 0 passed, 1 failed, 1 skipped, 0 ignored, 16 filtered out
Tests: 0 passed, 1 failed, 1 skipped, 0 ignored, 22 filtered out
"},
);
}

#[test]
fn fuzzing_multiple_attributes() {
let temp = setup_package("fuzzing");

let output = test_runner(&temp)
.arg("multiple_attributes")
.assert()
.success();

assert_stdout_contains(
output,
indoc! {r"
[..]Compiling[..]
[..]Finished[..]
Collected 4 test(s) from fuzzing package
Running 4 test(s) from tests/
[IGNORE] fuzzing_integrationtest::multiple_attributes::ignored
[PASS] fuzzing_integrationtest::multiple_attributes::with_should_panic (runs: 256, [..])
[PASS] fuzzing_integrationtest::multiple_attributes::with_available_gas (runs: 50, [..])
[PASS] fuzzing_integrationtest::multiple_attributes::with_both (runs: 300, [..])
Tests: 3 passed, 0 failed, 0 skipped, 1 ignored, 20 filtered out
"},
);
}

#[test]
fn generate_arg_cheatcode() {
let temp = setup_package("fuzzing");

let output = test_runner(&temp).arg("generate_arg").assert().code(1);

assert_stdout_contains(
output,
indoc! {r#"
[..]Compiling[..]
[..]Finished[..]
Collected 2 test(s) from fuzzing package
Running 2 test(s) from tests/
[FAIL] fuzzing_integrationtest::generate_arg::generate_arg_incorrect_range
Failure data:
"`generate_arg` cheatcode: `min_value` must be <= `max_value`, provided values after deserialization: 101 and 100"
[PASS] fuzzing_integrationtest::generate_arg::use_generate_arg_outside_fuzzer (gas: ~1)
Tests: 1 passed, 1 failed, 0 skipped, 0 ignored, 22 filtered out
"#},
);
}

0 comments on commit ca0e40c

Please sign in to comment.