foundry icon indicating copy to clipboard operation
foundry copied to clipboard

test_invariant_shrink fails for ubuntu but works on mac

Open CyMule opened this issue 2 years ago • 1 comments

Component

Forge

Have you ensured that all of these are up to date?

  • [X] Foundry
  • [X] Foundryup

What version of Foundry are you on?

forge 0.2.0 (ecddbdb 2023-02-17T00:11:42.4198088Z)

What command(s) is the bug in?

No response

Operating System

Linux

Describe the bug

Test Failure

cargo test test_invariant_shrink fails on Linux dev 5.15.0-60-generic #66~20.04.1-Ubuntu SMP Wed Jan 25 09:41:30 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux but works on Darwin dev.local 22.1.0 Darwin Kernel Version 22.1.0: Sun Oct 9 20:14:54 PDT 2022; root:xnu-8792.41.9~2/RELEASE_X86_64 x86_64

running 1 test
test invariant::test_invariant_shrink ... FAILED

failures:

---- invariant::test_invariant_shrink stdout ----
thread 'invariant::test_invariant_shrink' panicked at 'assertion failed: `(left == right)`
  left: `3`,
 right: `2`', forge/tests/it/invariant.rs:164:47

Workaround

If I change the fuzz seed from 102 to 100 then the test passes on my system.

#[test]
fn test_invariant_shrink() {
    let mut runner = runner();

    let mut opts = TEST_OPTS;
    opts.fuzz.seed = Some(U256::from(100u32));
    runner.test_options = opts;

The original commit for #2745 had the seed set to 100, it was changed to 102 in the next commit for #2724 and there is still a comment from the first commit explaining:

// `fuzz_seed` at 100 makes this sequence shrinkable from 4 to 2.

Solution?

Changing the seed to 100 did work on both ubuntu and mac for me, but I'm not sure if this is the case for everyone.

Maybe the test runner could be run multiple times over a range of seeds? This doesn't seem ideal...

Maybe a comment is added that this case might fail depending on your system? Or an additional message in the failure case?

    match counter {
        CounterExample::Single(_) => panic!("CounterExample should be a sequence."),
        // `fuzz_seed` at 100 makes this sequence shrinkable from 4 to 2.
        CounterExample::Sequence(sequence) => {
            assert_eq!(sequence.len(), 2, "This may fail depending on your system and fuzz seed.")

    };

Does anyone have a more optimal solution? I'm happy to help implement the changes.

Additional Context

As stated before, this test is originally added in #2745.

To my understanding, the test fuzzes InvariantInnerContract.t.sol.

The goal of the test is to find a "minimum representation" of the sequence to find an "invariant failure" for the contract. By starting with

opts.fuzz.seed = Some(U256::from(102u32))

on my system, the test runner is only able to find a sequence of 3 steps to break the invariant even though there is a shorter sequence of length 2, which is what the test expects.

CyMule avatar Feb 17 '23 16:02 CyMule

@CyMule this should be fixed with https://github.com/foundry-rs/foundry/pull/7756 pls recheck @mattsse I think we can close it / reopen if hit again?

grandizzy avatar Apr 26 '24 06:04 grandizzy

please reopen if you hit it again

grandizzy avatar May 28 '24 05:05 grandizzy