Skip to content

Commit 02741a8

Browse files
committed
test(foundry): explicitly define fuzzing and invariant test settings
1 parent 20fe316 commit 02741a8

File tree

6 files changed

+272
-215
lines changed

6 files changed

+272
-215
lines changed

.github/workflows/tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,4 @@ jobs:
4848
run: pnpm install
4949

5050
- name: Run tests
51-
run: FOUNDRY_PROFILE=ci forge test --gas-report
51+
run: forge test --gas-report

foundry.toml

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,13 @@ cache_path = 'foundry/cache'
2020
# Only run tests in contracts matching the specified glob pattern
2121
match_path = '**/test/**/*.t.sol'
2222

23-
# Speed up tests during development by low values for fuzzing and invariant
24-
fuzz = { runs = 256 }
25-
invariant = { runs = 256, depth = 16 }
23+
# https://book.getfoundry.sh/reference/config/testing#fuzz
24+
# fuzz = { runs = 256 }
25+
# https://book.getfoundry.sh/reference/config/testing#invariant
26+
# invariant = { runs = 256, depth = 15 }
2627

2728
# Fails the invariant fuzzing if a revert occurs
2829
# fail_on_revert = true
2930

3031
# Style of uint/int256 types
3132
fmt = { int_types = 'long' }
32-
33-
### Profiles ###
34-
35-
# Profile for continuous integration
36-
[profile.ci]
37-
fuzz = { runs = 256 }
38-
invariant = { runs = 256, depth = 16 }
39-
40-
# Profile for maximum testing, should be used for PR to master
41-
[profile.max]
42-
fuzz = { runs = 256 }
43-
invariant = { runs = 256, depth = 256 }

test/0.8.9/unstructuredStorage.t.sol

Lines changed: 75 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,115 +3,150 @@ pragma solidity 0.8.9;
33

44
import "forge-std/Test.sol";
55

6-
import { UnstructuredStorage } from "contracts/0.8.9/lib/UnstructuredStorage.sol";
6+
import {UnstructuredStorage} from "contracts/0.8.9/lib/UnstructuredStorage.sol";
77

88
contract ExposedUnstructuredStorageTest is Test {
9-
ExposedUnstructuredStorage public unstructedStorage;
9+
ExposedUnstructuredStorage public unstructuredStorage;
1010

1111
function setUp() public {
12-
unstructedStorage = new ExposedUnstructuredStorage();
12+
unstructuredStorage = new ExposedUnstructuredStorage();
1313
}
1414

1515
function test_getStorageBool_Uninitialized() public {
16-
bytes32 position = keccak256("FOO");
17-
assertEq(unstructedStorage.getStorageBool(position), false);
16+
bytes32 position = keccak256("FOO");
17+
assertEq(unstructuredStorage.getStorageBool(position), false);
1818
}
1919

20+
/**
21+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-fuzz-configs
22+
* forge-config: default.fuzz.runs = 2048
23+
* forge-config: default.fuzz.max-test-rejects = 0
24+
*/
2025
function testFuzz_getStorageBool_Uninitialized(bytes32 position) public {
21-
assertEq(unstructedStorage.getStorageBool(position), false);
26+
assertEq(unstructuredStorage.getStorageBool(position), false);
2227
}
2328

2429
function test_getStorageAddress_Uninitialized() public {
2530
bytes32 position = keccak256("FOO");
26-
assertEq(unstructedStorage.getStorageAddress(position), address(0));
31+
assertEq(unstructuredStorage.getStorageAddress(position), address(0));
2732
}
2833

29-
function testFuzz_getStorageAddress_Uninitialized(bytes32 position ) public {
30-
assertEq(unstructedStorage.getStorageAddress(position), address(0));
34+
/**
35+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-fuzz-configs
36+
* forge-config: default.fuzz.runs = 2048
37+
* forge-config: default.fuzz.max-test-rejects = 0
38+
*/
39+
function testFuzz_getStorageAddress_Uninitialized(bytes32 position) public {
40+
assertEq(unstructuredStorage.getStorageAddress(position), address(0));
3141
}
3242

3343
function test_getStorageBytes32_Uninitialized() public {
3444
bytes32 position = keccak256("FOO");
3545
bytes32 data;
36-
assertEq(unstructedStorage.getStorageBytes32(position), data);
46+
assertEq(unstructuredStorage.getStorageBytes32(position), data);
3747
}
3848

49+
/**
50+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-fuzz-configs
51+
* forge-config: default.fuzz.runs = 2048
52+
* forge-config: default.fuzz.max-test-rejects = 0
53+
*/
3954
function testFuzz_getStorageBytes32_Uninitialized(bytes32 position) public {
4055
bytes32 data;
41-
assertEq(unstructedStorage.getStorageBytes32(position), data);
56+
assertEq(unstructuredStorage.getStorageBytes32(position), data);
4257
}
4358

4459
function test_getStorageUint256_Uninitialized() public {
4560
bytes32 position = keccak256("FOO");
4661
uint256 data;
47-
assertEq(unstructedStorage.getStorageUint256(position), data);
62+
assertEq(unstructuredStorage.getStorageUint256(position), data);
4863
}
4964

65+
/**
66+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-fuzz-configs
67+
* forge-config: default.fuzz.runs = 2048
68+
* forge-config: default.fuzz.max-test-rejects = 0
69+
*/
5070
function testFuzz_getStorageUint256_Uninitialized(bytes32 position) public {
5171
uint256 data;
52-
assertEq(unstructedStorage.getStorageUint256(position), data);
72+
assertEq(unstructuredStorage.getStorageUint256(position), data);
5373
}
5474

5575
function test_setStorageBool() public {
5676
bytes32 position = keccak256("FOO");
57-
assertEq(unstructedStorage.getStorageBool(position), false);
77+
assertEq(unstructuredStorage.getStorageBool(position), false);
5878

59-
unstructedStorage.setStorageBool(position, true);
60-
assertEq(unstructedStorage.getStorageBool(position), true);
79+
unstructuredStorage.setStorageBool(position, true);
80+
assertEq(unstructuredStorage.getStorageBool(position), true);
6181

62-
unstructedStorage.setStorageBool(position, false);
63-
assertEq(unstructedStorage.getStorageBool(position), false);
82+
unstructuredStorage.setStorageBool(position, false);
83+
assertEq(unstructuredStorage.getStorageBool(position), false);
6484
}
6585

6686
function test_setStorageAddress() public {
6787
bytes32 position = keccak256("FOO");
6888
address data = vm.addr(1);
6989

70-
assertEq(unstructedStorage.getStorageAddress(position), address(0));
71-
unstructedStorage.setStorageAddress(position, data);
72-
assertEq(unstructedStorage.getStorageAddress(position), data);
90+
assertEq(unstructuredStorage.getStorageAddress(position), address(0));
91+
unstructuredStorage.setStorageAddress(position, data);
92+
assertEq(unstructuredStorage.getStorageAddress(position), data);
7393
}
7494

95+
/**
96+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-fuzz-configs
97+
* forge-config: default.fuzz.runs = 2048
98+
* forge-config: default.fuzz.max-test-rejects = 0
99+
*/
75100
function testFuzz_setStorageAddress(address data, bytes32 position) public {
76-
assertEq(unstructedStorage.getStorageAddress(position), address(0));
77-
unstructedStorage.setStorageAddress(position, data);
78-
assertEq(unstructedStorage.getStorageAddress(position), data);
101+
assertEq(unstructuredStorage.getStorageAddress(position), address(0));
102+
unstructuredStorage.setStorageAddress(position, data);
103+
assertEq(unstructuredStorage.getStorageAddress(position), data);
79104
}
80105

81106
function test_setStorageBytes32() public {
82107
bytes32 position = keccak256("FOO");
83108
bytes32 data = keccak256("BAR");
84-
bytes32 unintializedData;
109+
bytes32 unInitializedData;
85110

86-
assertEq(unstructedStorage.getStorageBytes32(position), unintializedData);
87-
unstructedStorage.setStorageBytes32(position, data);
88-
assertEq(unstructedStorage.getStorageBytes32(position), data);
111+
assertEq(unstructuredStorage.getStorageBytes32(position), unInitializedData);
112+
unstructuredStorage.setStorageBytes32(position, data);
113+
assertEq(unstructuredStorage.getStorageBytes32(position), data);
89114
}
90115

116+
/**
117+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-fuzz-configs
118+
* forge-config: default.fuzz.runs = 2048
119+
* forge-config: default.fuzz.max-test-rejects = 0
120+
*/
91121
function testFuzz_setStorageBytes32(bytes32 data, bytes32 position) public {
92-
bytes32 unintializedData;
122+
bytes32 unInitializedData;
93123

94-
assertEq(unstructedStorage.getStorageBytes32(position), unintializedData);
95-
unstructedStorage.setStorageBytes32(position, data);
96-
assertEq(unstructedStorage.getStorageBytes32(position), data);
124+
assertEq(unstructuredStorage.getStorageBytes32(position), unInitializedData);
125+
unstructuredStorage.setStorageBytes32(position, data);
126+
assertEq(unstructuredStorage.getStorageBytes32(position), data);
97127
}
98128

99129
function test_setStorageUint256() public {
100130
bytes32 position = keccak256("FOO");
101131
uint256 data = 1;
102-
uint256 unintializedData;
132+
uint256 unInitializedData;
103133

104-
assertEq(unstructedStorage.getStorageUint256(position), unintializedData);
105-
unstructedStorage.setStorageUint256(position, data);
106-
assertEq(unstructedStorage.getStorageUint256(position), data);
134+
assertEq(unstructuredStorage.getStorageUint256(position), unInitializedData);
135+
unstructuredStorage.setStorageUint256(position, data);
136+
assertEq(unstructuredStorage.getStorageUint256(position), data);
107137
}
108138

139+
/**
140+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-fuzz-configs
141+
* forge-config: default.fuzz.runs = 2048
142+
* forge-config: default.fuzz.max-test-rejects = 0
143+
*/
109144
function testFuzz_setStorageUint256(uint256 data, bytes32 position) public {
110-
uint256 unintializedData;
145+
uint256 unInitializedData;
111146

112-
assertEq(unstructedStorage.getStorageUint256(position), unintializedData);
113-
unstructedStorage.setStorageUint256(position, data);
114-
assertEq(unstructedStorage.getStorageUint256(position), data);
147+
assertEq(unstructuredStorage.getStorageUint256(position), unInitializedData);
148+
unstructuredStorage.setStorageUint256(position, data);
149+
assertEq(unstructuredStorage.getStorageUint256(position), data);
115150
}
116151
}
117152

test/0.8.9/withdrawalQueue.t.sol

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,31 +24,52 @@ contract WQInvariants is Test {
2424
selectors[1] = WQHandler.finalize.selector;
2525
selectors[2] = WQHandler.claim.selector;
2626

27-
targetSelector(FuzzSelector({
28-
addr: address(handler),
29-
selectors: selectors
30-
}));
27+
targetSelector(FuzzSelector({addr: address(handler), selectors: selectors}));
3128

3229
targetContract(address(handler));
3330
}
3431

35-
function invariant_queueStETH() public {
32+
/**
33+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-invariant-configs
34+
* forge-config: default.invariant.runs = 256
35+
* forge-config: default.invariant.depth = 256
36+
* forge-config: default.invariant.fail-on-revert = true
37+
*/
38+
function invariant_queueStETH() public view {
3639
uint256 lastRequestId = wq.getLastRequestId();
3740
uint256 naiveUnfinalizedStETH = handler.sumOfStETHInQueue(wq.getLastFinalizedRequestId() + 1, lastRequestId);
3841

3942
assertEq(naiveUnfinalizedStETH, wq.unfinalizedStETH(), "cumulative stETH in queue is equal to sum of requests");
4043
}
4144

42-
function invariant_queueLength() public {
45+
/**
46+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-invariant-configs
47+
* forge-config: default.invariant.runs = 256
48+
* forge-config: default.invariant.depth = 256
49+
* forge-config: default.invariant.fail-on-revert = true
50+
*/
51+
function invariant_queueLength() public view {
4352
assertEq(wq.getLastRequestId(), handler.ghost_totalRequestNum(), "queue grows on request");
4453
}
4554

46-
function invariant_unfinalizedQueue() public {
55+
/**
56+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-invariant-configs
57+
* forge-config: default.invariant.runs = 256
58+
* forge-config: default.invariant.depth = 256
59+
* forge-config: default.invariant.fail-on-revert = true
60+
*/
61+
function invariant_unfinalizedQueue() public view {
4762
assertEq(wq.getLastRequestId() - wq.getLastFinalizedRequestId(), wq.unfinalizedRequestNumber());
4863
assertLe(wq.unfinalizedRequestNumber(), handler.ghost_totalRequestNum());
4964
}
5065

51-
function invariant_lockedEthIsLessThanInQueue() public {
66+
/**
67+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-invariant-configs
68+
* forge-config: default.invariant.runs = 256
69+
* forge-config: default.invariant.depth = 256
70+
* forge-config: default.invariant.fail-on-revert = true
71+
*/
72+
function invariant_lockedEthIsLessThanInQueue() public view {
5273
uint256 maxEthInTheQueue = handler.sumOfStETHInQueue(1, wq.getLastFinalizedRequestId());
5374
assertLe(
5475
wq.getLockedEtherAmount(),
@@ -57,23 +78,41 @@ contract WQInvariants is Test {
5778
);
5879
}
5980

60-
function invariant_lockedEthDecreasesOnClaim() public {
81+
/**
82+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-invariant-configs
83+
* forge-config: default.invariant.runs = 256
84+
* forge-config: default.invariant.depth = 256
85+
* forge-config: default.invariant.fail-on-revert = true
86+
*/
87+
function invariant_lockedEthDecreasesOnClaim() public view {
6188
assertEq(
6289
wq.getLockedEtherAmount(),
6390
handler.ghost_totalLockedEth() - handler.ghost_totalClaimedEth(),
6491
"locked eth decreases on claim"
6592
);
6693
}
6794

68-
function invariant_totalLockedEthNaiveCheck() public {
95+
/**
96+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-invariant-configs
97+
* forge-config: default.invariant.runs = 256
98+
* forge-config: default.invariant.depth = 256
99+
* forge-config: default.invariant.fail-on-revert = true
100+
*/
101+
function invariant_totalLockedEthNaiveCheck() public view {
69102
assertLe(
70103
handler.ghost_totalLockedEth() - handler.naiveSumOfFinalizedRequestsEth(),
71104
wq.getLastFinalizedRequestId(),
72105
"total locked eth should be equal to sum of all finalized request in the queue"
73106
);
74107
}
75108

76-
function invariant_requestCantBeClaimedAndNotFinalizedInTheSameTime() public {
109+
/**
110+
* https://book.getfoundry.sh/reference/config/inline-test-config#in-line-invariant-configs
111+
* forge-config: default.invariant.runs = 256
112+
* forge-config: default.invariant.depth = 256
113+
* forge-config: default.invariant.fail-on-revert = true
114+
*/
115+
function invariant_requestCantBeClaimedAndNotFinalizedInTheSameTime() public view {
77116
uint256 lastId = wq.getLastRequestId();
78117
for (uint256 i = 1; i <= lastId; ++i) {
79118
WQBase.WithdrawalRequestStatus memory status = wq.status(i);

0 commit comments

Comments
 (0)