// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.15;
import {DSTestPlus} from "./utils/DSTestPlus.sol";
import {MockAuthority} from "./utils/mocks/MockAuthority.sol";
import {Authority} from "../auth/Auth.sol";
import {MultiRolesAuthority} from "../auth/authorities/MultiRolesAuthority.sol";
contract MultiRolesAuthorityTest is DSTestPlus {
MultiRolesAuthority multiRolesAuthority;
function setUp() public {
multiRolesAuthority = new MultiRolesAuthority(address(this), Authority(address(0)));
}
function testSetRoles() public {
assertFalse(multiRolesAuthority.doesUserHaveRole(address(0xBEEF), 0));
multiRolesAuthority.setUserRole(address(0xBEEF), 0, true);
assertTrue(multiRolesAuthority.doesUserHaveRole(address(0xBEEF), 0));
multiRolesAuthority.setUserRole(address(0xBEEF), 0, false);
assertFalse(multiRolesAuthority.doesUserHaveRole(address(0xBEEF), 0));
}
function testSetRoleCapabilities() public {
assertFalse(multiRolesAuthority.doesRoleHaveCapability(0, 0xBEEFCAFE));
multiRolesAuthority.setRoleCapability(0, 0xBEEFCAFE, true);
assertTrue(multiRolesAuthority.doesRoleHaveCapability(0, 0xBEEFCAFE));
multiRolesAuthority.setRoleCapability(0, 0xBEEFCAFE, false);
assertFalse(multiRolesAuthority.doesRoleHaveCapability(0, 0xBEEFCAFE));
}
function testSetPublicCapabilities() public {
assertFalse(multiRolesAuthority.isCapabilityPublic(0xBEEFCAFE));
multiRolesAuthority.setPublicCapability(0xBEEFCAFE, true);
assertTrue(multiRolesAuthority.isCapabilityPublic(0xBEEFCAFE));
multiRolesAuthority.setPublicCapability(0xBEEFCAFE, false);
assertFalse(multiRolesAuthority.isCapabilityPublic(0xBEEFCAFE));
}
function testSetTargetCustomAuthority() public {
assertEq(address(multiRolesAuthority.getTargetCustomAuthority(address(0xBEEF))), address(0));
multiRolesAuthority.setTargetCustomAuthority(address(0xBEEF), Authority(address(0xCAFE)));
assertEq(address(multiRolesAuthority.getTargetCustomAuthority(address(0xBEEF))), address(0xCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xBEEF), Authority(address(0)));
assertEq(address(multiRolesAuthority.getTargetCustomAuthority(address(0xBEEF))), address(0));
}
function testCanCallWithAuthorizedRole() public {
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setUserRole(address(0xBEEF), 0, true);
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setRoleCapability(0, 0xBEEFCAFE, true);
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setRoleCapability(0, 0xBEEFCAFE, false);
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setRoleCapability(0, 0xBEEFCAFE, true);
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setUserRole(address(0xBEEF), 0, false);
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
}
function testCanCallPublicCapability() public {
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setPublicCapability(0xBEEFCAFE, true);
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setPublicCapability(0xBEEFCAFE, false);
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
}
function testCanCallWithCustomAuthority() public {
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), new MockAuthority(false));
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), new MockAuthority(true));
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), new MockAuthority(false));
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), Authority(address(0)));
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), new MockAuthority(true));
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
}
function testCanCallWithCustomAuthorityOverridesPublicCapability() public {
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setPublicCapability(0xBEEFCAFE, true);
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), new MockAuthority(false));
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), new MockAuthority(true));
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setPublicCapability(0xBEEFCAFE, false);
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), Authority(address(0)));
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setPublicCapability(0xBEEFCAFE, true);
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
}
function testCanCallWithCustomAuthorityOverridesUserWithRole() public {
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setUserRole(address(0xBEEF), 0, true);
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setRoleCapability(0, 0xBEEFCAFE, true);
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), new MockAuthority(false));
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), new MockAuthority(true));
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setUserRole(address(0xBEEF), 0, false);
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setTargetCustomAuthority(address(0xCAFE), Authority(address(0)));
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setUserRole(address(0xBEEF), 0, true);
assertTrue(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setRoleCapability(0, 0xBEEFCAFE, false);
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
multiRolesAuthority.setUserRole(address(0xBEEF), 0, false);
assertFalse(multiRolesAuthority.canCall(address(0xBEEF), address(0xCAFE), 0xBEEFCAFE));
}
function testSetRoles(address user, uint8 role) public {
assertFalse(multiRolesAuthority.doesUserHaveRole(user, role));
multiRolesAuthority.setUserRole(user, role, true);
assertTrue(multiRolesAuthority.doesUserHaveRole(user, role));
multiRolesAuthority.setUserRole(user, role, false);
assertFalse(multiRolesAuthority.doesUserHaveRole(user, role));
}
function testSetRoleCapabilities(uint8 role, bytes4 functionSig) public {
assertFalse(multiRolesAuthority.doesRoleHaveCapability(role, functionSig));
multiRolesAuthority.setRoleCapability(role, functionSig, true);
assertTrue(multiRolesAuthority.doesRoleHaveCapability(role, functionSig));
multiRolesAuthority.setRoleCapability(role, functionSig, false);
assertFalse(multiRolesAuthority.doesRoleHaveCapability(role, functionSig));
}
function testSetPublicCapabilities(bytes4 functionSig) public {
assertFalse(multiRolesAuthority.isCapabilityPublic(functionSig));
multiRolesAuthority.setPublicCapability(functionSig, true);
assertTrue(multiRolesAuthority.isCapabilityPublic(functionSig));
multiRolesAuthority.setPublicCapability(functionSig, false);
assertFalse(multiRolesAuthority.isCapabilityPublic(functionSig));
}
function testSetTargetCustomAuthority(address user, Authority customAuthority) public {
assertEq(address(multiRolesAuthority.getTargetCustomAuthority(user)), address(0));
multiRolesAuthority.setTargetCustomAuthority(user, customAuthority);
assertEq(address(multiRolesAuthority.getTargetCustomAuthority(user)), address(customAuthority));
multiRolesAuthority.setTargetCustomAuthority(user, Authority(address(0)));
assertEq(address(multiRolesAuthority.getTargetCustomAuthority(user)), address(0));
}
function testCanCallWithAuthorizedRole(
address user,
uint8 role,
address target,
bytes4 functionSig
) public {
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setUserRole(user, role, true);
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setRoleCapability(role, functionSig, true);
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setRoleCapability(role, functionSig, false);
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setRoleCapability(role, functionSig, true);
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setUserRole(user, role, false);
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
}
function testCanCallPublicCapability(
address user,
address target,
bytes4 functionSig
) public {
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setPublicCapability(functionSig, true);
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setPublicCapability(functionSig, false);
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
}
function testCanCallWithCustomAuthority(
address user,
address target,
bytes4 functionSig
) public {
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, new MockAuthority(false));
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, new MockAuthority(true));
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, new MockAuthority(false));
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, Authority(address(0)));
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, new MockAuthority(true));
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
}
function testCanCallWithCustomAuthorityOverridesPublicCapability(
address user,
address target,
bytes4 functionSig
) public {
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setPublicCapability(functionSig, true);
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, new MockAuthority(false));
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, new MockAuthority(true));
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setPublicCapability(functionSig, false);
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, Authority(address(0)));
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setPublicCapability(functionSig, true);
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
}
function testCanCallWithCustomAuthorityOverridesUserWithRole(
address user,
uint8 role,
address target,
bytes4 functionSig
) public {
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setUserRole(user, role, true);
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setRoleCapability(role, functionSig, true);
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, new MockAuthority(false));
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, new MockAuthority(true));
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setUserRole(user, role, false);
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setTargetCustomAuthority(target, Authority(address(0)));
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setUserRole(user, role, true);
assertTrue(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setRoleCapability(role, functionSig, false);
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
multiRolesAuthority.setUserRole(user, role, false);
assertFalse(multiRolesAuthority.canCall(user, target, functionSig));
}
}