Skip to content

Commit 90eb9ae

Browse files
authored
Workflow Registry: Add remaining tests for workflow registry manager (smartcontractkit#15359)
* add remaining tests for workflow registry manager * update geth wrappers * address comments
1 parent 73788c6 commit 90eb9ae

File tree

50 files changed

+765
-241
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+765
-241
lines changed

.github/workflows/solidity-foundry.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ jobs:
4040
{ "name": "shared", "setup": { "run-coverage": true, "extra-coverage-params": "--no-match-path='*CallWithExactGas*' --ir-minimum", "min-coverage": 32.6, "run-gas-snapshot": true, "run-forge-fmt": false }},
4141
{ "name": "transmission", "setup": { "run-coverage": true, "min-coverage": 61.5, "run-gas-snapshot": true, "run-forge-fmt": false }},
4242
{ "name": "vrf", "setup": { "run-coverage": false, "min-coverage": 98.5, "run-gas-snapshot": false, "run-forge-fmt": false }},
43-
{ "name": "workflow", "setup": { "run-coverage": true, "extra-coverage-params": "--ir-minimum", "min-coverage": 65.0, "run-gas-snapshot": false, "run-forge-fmt": true }}
43+
{ "name": "workflow", "setup": { "run-coverage": true, "extra-coverage-params": "--ir-minimum", "min-coverage": 96.0, "run-gas-snapshot": true, "run-forge-fmt": true }}
4444
]
4545
EOF
4646
+57-46
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,64 @@
1-
WorkflowRegistryManager_activateVersion:test_WhenTheVersionNumberIsNotActive() (gas: 419)
2-
WorkflowRegistryManageraddVersion:test_WhenAutoActivateIsFalse() (gas: 164)
3-
WorkflowRegistryManageraddVersion:test_WhenAutoActivateIsTrue() (gas: 120)
4-
WorkflowRegistryManagergetActiveVersion:test_WhenAnActiveVersionExists() (gas: 120)
5-
WorkflowRegistryManagergetActiveVersion:test_WhenNoActiveVersionIsAvailable() (gas: 139)
6-
WorkflowRegistryManagergetAllVersions:test_WhenLimitExceedsMaximumPaginationLimit() (gas: 161)
7-
WorkflowRegistryManagergetAllVersions:test_WhenRequestingWithInvalidStartIndex() (gas: 142)
8-
WorkflowRegistryManagergetAllVersions:test_WhenRequestingWithValidStartIndexAndLimitWithinBounds() (gas: 120)
9-
WorkflowRegistryManagergetLatestVersion:test_WhenNoVersionsHaveBeenRegistered() (gas: 120)
10-
WorkflowRegistryManagergetLatestVersion:test_WhenVersionsHaveBeenRegistered() (gas: 139)
11-
WorkflowRegistryManagergetVersion:test_WhenVersionNumberIsNotRegistered() (gas: 120)
12-
WorkflowRegistryManagergetVersion:test_WhenVersionNumberIsRegistered() (gas: 139)
13-
WorkflowRegistryManagergetVersionNumber:test_WhenAVersionIsRegisteredForTheContractAddressAndChainIDCombination() (gas: 161)
14-
WorkflowRegistryManagergetVersionNumber:test_WhenNoVersionIsRegisteredForTheContractAddressAndChainIDCombination() (gas: 120)
15-
WorkflowRegistryManagergetVersionNumber:test_WhenTheContractAddressIsInvalid() (gas: 142)
16-
WorkflowRegistry_activateWorkflow:test_WhenTheCallerIsAnAuthorizedAddress() (gas: 491327)
17-
WorkflowRegistry_deleteWorkflow:test_WhenTheCallerIsAnAuthorizedAddress_AndTheDonIDIsAllowed() (gas: 400597)
18-
WorkflowRegistry_deleteWorkflow:test_WhenTheCallerIsAnAuthorizedAddress_AndTheDonIDIsNotAllowed() (gas: 418579)
1+
WorkflowRegistryManager_activateVersion:test_WhenTheVersionNumberIsNotActive_AndWhenThereAreNoActiveVersions() (gas: 528769)
2+
WorkflowRegistryManager_addVersion:test_WhenAutoActivateIsFalse() (gas: 265551)
3+
WorkflowRegistryManager_addVersion:test_WhenAutoActivateIsTrue() (gas: 270596)
4+
WorkflowRegistryManager_getActiveVersion:test_WhenAnActiveVersionExists() (gas: 287760)
5+
WorkflowRegistryManager_getActiveVersion:test_WhenNoActiveVersionIsAvailable() (gas: 13258)
6+
WorkflowRegistryManager_getActiveVersionNumber:test_WhenAnActiveVersionExists() (gas: 283885)
7+
WorkflowRegistryManager_getActiveVersionNumber:test_WhenNoActiveVersionIsAvailable() (gas: 10698)
8+
WorkflowRegistryManager_getAllVersions:test_WhenLimitExceedsMaximumPaginationLimit() (gas: 54503)
9+
WorkflowRegistryManager_getAllVersions:test_WhenRequestingWithInvalidStartIndex() (gas: 11338)
10+
WorkflowRegistryManager_getAllVersions:test_WhenRequestingWithValidStartIndexAndLimitWithinBounds() (gas: 40398)
11+
WorkflowRegistryManager_getLatestVersion:test_WhenNoVersionsHaveBeenRegistered() (gas: 12984)
12+
WorkflowRegistryManager_getLatestVersion:test_WhenVersionsHaveBeenRegistered() (gas: 287791)
13+
WorkflowRegistryManager_getLatestVersionNumber:test_WhenNoVersionsHaveBeenRegistered() (gas: 10637)
14+
WorkflowRegistryManager_getLatestVersionNumber:test_WhenVersionsHaveBeenRegistered() (gas: 284134)
15+
WorkflowRegistryManager_getVersion:test_WhenVersionNumberIsNotRegistered() (gas: 13785)
16+
WorkflowRegistryManager_getVersion:test_WhenVersionNumberIsRegistered() (gas: 288169)
17+
WorkflowRegistryManager_getVersionNumberByContractAddressAndChainID:test_WhenAVersionIsRegisteredForTheContractAddressAndChainIDCombination() (gas: 285022)
18+
WorkflowRegistryManager_getVersionNumberByContractAddressAndChainID:test_WhenNoVersionIsRegisteredForTheContractAddressAndChainIDCombination() (gas: 286634)
19+
WorkflowRegistryManager_getVersionNumberByContractAddressAndChainID:test_WhenTheContractAddressIsInvalid() (gas: 284604)
20+
WorkflowRegistry_activateWorkflow:test_WhenTheCallerIsAnAuthorizedAddress() (gas: 495029)
21+
WorkflowRegistry_deleteWorkflow:test_WhenTheCallerIsAnAuthorizedAddress_AndTheDonIDIsAllowed() (gas: 403945)
22+
WorkflowRegistry_deleteWorkflow:test_WhenTheCallerIsAnAuthorizedAddress_AndTheDonIDIsNotAllowed() (gas: 421748)
23+
WorkflowRegistry_getAllAllowedDONs:test_WhenTheRegistryIsLocked() (gas: 47473)
1924
WorkflowRegistry_getAllAllowedDONs:test_WhenTheSetOfAllowedDONsIsEmpty() (gas: 25780)
2025
WorkflowRegistry_getAllAllowedDONs:test_WhenThereAreMultipleAllowedDONs() (gas: 75437)
21-
WorkflowRegistry_getAllAllowedDONs:test_WhenThereIsASingleAllowedDON() (gas: 16566)
22-
WorkflowRegistry_getWorkflowMetadata:test_WhenTheWorkflowDoesNotExist() (gas: 17521)
23-
WorkflowRegistry_getWorkflowMetadata:test_WhenTheWorkflowExistsWithTheOwnerAndName() (gas: 490176)
24-
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenLimitExceedsTotalWorkflows() (gas: 127660)
25-
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenLimitIsEqualToTotalWorkflows() (gas: 128013)
26-
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenLimitIsLessThanTotalWorkflows() (gas: 90119)
27-
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenStartIs0() (gas: 127572)
28-
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenStartIsGreaterThan0() (gas: 90076)
29-
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenStartIsGreaterThanOrEqualToTotalWorkflows() (gas: 13454)
26+
WorkflowRegistry_getAllAllowedDONs:test_WhenThereIsASingleAllowedDON() (gas: 16590)
27+
WorkflowRegistry_getAllAuthorizedAddresses:test_WhenTheRegistryIsLocked() (gas: 47740)
28+
WorkflowRegistry_getAllAuthorizedAddresses:test_WhenTheSetOfAuthorizedAddressesIsEmpty() (gas: 26152)
29+
WorkflowRegistry_getAllAuthorizedAddresses:test_WhenThereAreMultipleAuthorizedAddresses() (gas: 78270)
30+
WorkflowRegistry_getAllAuthorizedAddresses:test_WhenThereIsASingleAuthorizedAddress() (gas: 16832)
31+
WorkflowRegistry_getWorkflowMetadata:test_WhenTheRegistryIsLocked() (gas: 519145)
32+
WorkflowRegistry_getWorkflowMetadata:test_WhenTheWorkflowDoesNotExist() (gas: 17543)
33+
WorkflowRegistry_getWorkflowMetadata:test_WhenTheWorkflowExistsWithTheOwnerAndName() (gas: 490001)
34+
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenLimitExceedsTotalWorkflows() (gas: 128146)
35+
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenLimitIsEqualToTotalWorkflows() (gas: 128035)
36+
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenLimitIsLessThanTotalWorkflows() (gas: 90141)
37+
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenStartIs0() (gas: 128075)
38+
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenStartIsGreaterThan0() (gas: 90098)
39+
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenStartIsGreaterThanOrEqualToTotalWorkflows() (gas: 13476)
3040
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenTheDONHasNoWorkflows() (gas: 13410)
31-
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenLimitExceedsTotalWorkflows() (gas: 128221)
32-
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenLimitIsEqualToTotalWorkflows() (gas: 128320)
33-
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenLimitIsLessThanTotalWorkflows() (gas: 90404)
34-
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenStartIs0_AndLimitIs0() (gas: 128118)
35-
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenStartIsGreaterThan0() (gas: 90361)
41+
WorkflowRegistry_getWorkflowMetadataListByDON:test_WhenTheRegistryIsLocked() (gas: 158899)
42+
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenLimitExceedsTotalWorkflows() (gas: 135174)
43+
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenLimitIsEqualToTotalWorkflows() (gas: 135073)
44+
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenLimitIsLessThanTotalWorkflows() (gas: 95635)
45+
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenStartIs0() (gas: 135113)
46+
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenStartIsGreaterThan0() (gas: 95592)
3647
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenStartIsGreaterThanOrEqualToTotalWorkflows() (gas: 13764)
37-
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenTheOwnerHasNoWorkflows() (gas: 13984)
38-
WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsAllowed_AndTheCallerIsAnAuthorizedAddress() (gas: 491299)
39-
WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsAllowed_AndTheCallerIsAnUnauthorizedAddress() (gas: 499097)
40-
WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsNotAllowed_AndTheCallerIsAnAuthorizedAddress() (gas: 498850)
41-
WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsNotAllowed_AndTheCallerIsAnUnauthorizedAddress() (gas: 503264)
42-
WorkflowRegistry_registerWorkflow:test_WhenTheWorkflowInputsAreAllValid() (gas: 549829)
48+
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenTheOwnerHasNoWorkflows() (gas: 14006)
49+
WorkflowRegistry_getWorkflowMetadataListByOwner:test_WhenTheRegistryIsLocked() (gas: 165968)
50+
WorkflowRegistry_lockRegistry:test_WhenTheCallerIsTheContractOwner() (gas: 38758)
51+
WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsAllowed_AndTheCallerIsAnAuthorizedAddress() (gas: 494993)
52+
WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsAllowed_AndTheCallerIsAnUnauthorizedAddress() (gas: 502796)
53+
WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsNotAllowed_AndTheCallerIsAnAuthorizedAddress() (gas: 502555)
54+
WorkflowRegistry_pauseWorkflow:test_WhenTheDonIDIsNotAllowed_AndTheCallerIsAnUnauthorizedAddress() (gas: 506966)
55+
WorkflowRegistry_registerWorkflow:test_WhenTheWorkflowInputsAreAllValid() (gas: 549769)
4356
WorkflowRegistry_requestForceUpdateSecrets:test_WhenTheCallerIsAnAuthorizedAddress_AndTheWorkflowIsInAnAllowedDON() (gas: 891242)
4457
WorkflowRegistry_requestForceUpdateSecrets:test_WhenTheCallerIsAnAuthorizedAddress_AndTheWorkflowIsNotInAnAllowedDON() (gas: 488397)
4558
WorkflowRegistry_requestForceUpdateSecrets:test_WhenTheCallerIsNotAnAuthorizedAddress() (gas: 486751)
46-
WorkflowRegistry_updateAllowedDONs:test_WhenTheBoolInputIsFalse() (gas: 29811)
47-
WorkflowRegistry_updateAllowedDONs:test_WhenTheBoolInputIsTrue() (gas: 170386)
48-
WorkflowRegistry_updateAuthorizedAddresses:test_WhenTheBoolInputIsFalse() (gas: 30350)
49-
WorkflowRegistry_updateAuthorizedAddresses:test_WhenTheBoolInputIsTrue() (gas: 175605)
50-
WorkflowRegistry_updateWorkflow:test_WhenTheWorkflowInputsAreAllValid() (gas: 501589)
51-
WorkflowRegistrygetAllAuthorizedAddresses:test_WhenTheSetOfAuthorizedAddressesIsEmpty() (gas: 26152)
52-
WorkflowRegistrygetAllAuthorizedAddresses:test_WhenThereAreMultipleAuthorizedAddresses() (gas: 78270)
53-
WorkflowRegistrygetAllAuthorizedAddresses:test_WhenThereIsASingleAuthorizedAddress() (gas: 16814)
59+
WorkflowRegistry_unlockRegistry:test_WhenTheCallerIsTheContractOwner() (gas: 30325)
60+
WorkflowRegistry_updateAllowedDONs:test_WhenTheBoolInputIsFalse() (gas: 29739)
61+
WorkflowRegistry_updateAllowedDONs:test_WhenTheBoolInputIsTrue() (gas: 170296)
62+
WorkflowRegistry_updateAuthorizedAddresses:test_WhenTheBoolInputIsFalse() (gas: 30278)
63+
WorkflowRegistry_updateAuthorizedAddresses:test_WhenTheBoolInputIsTrue() (gas: 175515)
64+
WorkflowRegistry_updateWorkflow:test_WhenTheWorkflowInputsAreAllValid() (gas: 479601)

contracts/src/v0.8/workflow/dev/WorkflowRegistry.sol

+20-27
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
8383
bytes32 indexed workflowID, address indexed workflowOwner, uint32 indexed donID, string workflowName
8484
);
8585
event WorkflowForceUpdateSecretsRequestedV1(address indexed owner, bytes32 secretsURLHash, string workflowName);
86-
event RegistryLockedV1(address indexed lockedBy);
87-
event RegistryUnlockedV1(address indexed unlockedBy);
86+
event RegistryLockedV1(address lockedBy);
87+
event RegistryUnlockedV1(address unlockedBy);
8888

8989
error AddressNotAuthorized(address caller);
9090
error CallerIsNotWorkflowOwner(address caller);
@@ -306,7 +306,7 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
306306
if (!sameSecretsURL) {
307307
// Remove the old secrets hash if secretsURL is not empty
308308
if (bytes(workflow.secretsURL).length > 0) {
309-
// Using keccak256 instead of _computeOwnerAndStringFieldHashKey as currentSecretsURL is memory
309+
// Using keccak256 instead of computeHashKey as currentSecretsURL is memory
310310
bytes32 oldSecretsHash = keccak256(abi.encodePacked(msg.sender, workflow.secretsURL));
311311
s_secretsHashToWorkflows[oldSecretsHash].remove(workflowKey);
312312
}
@@ -378,34 +378,31 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
378378
function deleteWorkflow(
379379
bytes32 workflowKey
380380
) external registryNotLocked {
381-
address sender = msg.sender;
382-
383381
// Retrieve workflow metadata from storage
384-
WorkflowMetadata storage workflow = _getWorkflowFromStorage(sender, workflowKey);
385-
uint32 donID = workflow.donID;
382+
WorkflowMetadata storage workflow = _getWorkflowFromStorage(msg.sender, workflowKey);
386383

387384
// Only checking access for the caller instead of using _validatePermissions so that even if the DON was removed from the
388385
// allowed list, the workflow can still be deleted.
389-
if (!s_authorizedAddresses.contains(sender)) {
390-
revert AddressNotAuthorized(sender);
386+
if (!s_authorizedAddresses.contains(msg.sender)) {
387+
revert AddressNotAuthorized(msg.sender);
391388
}
392389

393390
// Remove the workflow from the owner and DON mappings
394-
s_ownerWorkflowKeys[sender].remove(workflowKey);
395-
s_donWorkflowKeys[donID].remove(workflowKey);
391+
s_ownerWorkflowKeys[msg.sender].remove(workflowKey);
392+
s_donWorkflowKeys[workflow.donID].remove(workflowKey);
396393

397394
// Remove the workflow from the secrets hash set if secretsURL is not empty
398395
if (bytes(workflow.secretsURL).length > 0) {
399-
// Using keccak256 instead of _computeOwnerAndStringFieldHashKey as secretsURL is storage ref
400-
bytes32 secretsHash = keccak256(abi.encodePacked(sender, workflow.secretsURL));
396+
// Using keccak256 instead of computeHashKey as secretsURL is storage ref
397+
bytes32 secretsHash = keccak256(abi.encodePacked(msg.sender, workflow.secretsURL));
401398
s_secretsHashToWorkflows[secretsHash].remove(workflowKey);
402399
}
403400

401+
// Emit an event indicating the workflow has been deleted. We need to do this before deleting the workflow from storage.
402+
emit WorkflowDeletedV1(workflow.workflowID, msg.sender, workflow.donID, workflow.workflowName);
403+
404404
// Delete the workflow metadata from storage
405405
delete s_workflows[workflowKey];
406-
407-
// Emit an event indicating the workflow has been deleted
408-
emit WorkflowDeletedV1(workflow.workflowID, sender, donID, workflow.workflowName);
409406
}
410407

411408
/// @notice Requests a force update for workflows that share the same secrets URL.
@@ -430,10 +427,8 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
430427
function requestForceUpdateSecrets(
431428
string calldata secretsURL
432429
) external registryNotLocked {
433-
address sender = msg.sender;
434-
435430
// Use secretsURL and sender hash key to get the mapping key
436-
bytes32 secretsHash = computeHashKey(sender, secretsURL);
431+
bytes32 secretsHash = computeHashKey(msg.sender, secretsURL);
437432

438433
// Retrieve all workflow keys associated with the given secrets hash
439434
EnumerableSet.Bytes32Set storage workflowKeys = s_secretsHashToWorkflows[secretsHash];
@@ -449,8 +444,8 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
449444
bytes32 workflowKey = workflowKeys.at(i);
450445
WorkflowMetadata storage workflow = s_workflows[workflowKey];
451446

452-
if (s_allowedDONs.contains(workflow.donID) && s_authorizedAddresses.contains(sender)) {
453-
emit WorkflowForceUpdateSecretsRequestedV1(sender, secretsHash, workflow.workflowName);
447+
if (s_allowedDONs.contains(workflow.donID) && s_authorizedAddresses.contains(msg.sender)) {
448+
emit WorkflowForceUpdateSecretsRequestedV1(msg.sender, secretsHash, workflow.workflowName);
454449
}
455450
}
456451
}
@@ -472,10 +467,8 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
472467
/// @param workflowKey The unique identifier for the workflow.
473468
/// @param newStatus The new status to set for the workflow (either `Paused` or `Active`).
474469
function _updateWorkflowStatus(bytes32 workflowKey, WorkflowStatus newStatus) internal {
475-
address sender = msg.sender;
476-
477470
// Retrieve workflow metadata once
478-
WorkflowMetadata storage workflow = _getWorkflowFromStorage(sender, workflowKey);
471+
WorkflowMetadata storage workflow = _getWorkflowFromStorage(msg.sender, workflowKey);
479472
uint32 donID = workflow.donID;
480473

481474
// Avoid unnecessary storage writes if already in the desired status
@@ -485,17 +478,17 @@ contract WorkflowRegistry is Ownable2StepMsgSender, ITypeAndVersion {
485478

486479
// Check if the DON ID is allowed when activating a workflow
487480
if (newStatus == WorkflowStatus.ACTIVE) {
488-
_validatePermissions(donID, sender);
481+
_validatePermissions(donID, msg.sender);
489482
}
490483

491484
// Update the workflow status
492485
workflow.status = newStatus;
493486

494487
// Emit the appropriate event based on newStatus
495488
if (newStatus == WorkflowStatus.PAUSED) {
496-
emit WorkflowPausedV1(workflow.workflowID, sender, donID, workflow.workflowName);
489+
emit WorkflowPausedV1(workflow.workflowID, msg.sender, donID, workflow.workflowName);
497490
} else if (newStatus == WorkflowStatus.ACTIVE) {
498-
emit WorkflowActivatedV1(workflow.workflowID, sender, donID, workflow.workflowName);
491+
emit WorkflowActivatedV1(workflow.workflowID, msg.sender, donID, workflow.workflowName);
499492
}
500493
}
501494

0 commit comments

Comments
 (0)