@@ -27,26 +27,130 @@ contract DomainRoutingIsmTest is Test {
2727 return new TestIsm (abi.encode (requiredMetadata));
2828 }
2929
30+ function deployTestIsms (
31+ uint256 count
32+ ) internal returns (IInterchainSecurityModule[] memory isms ) {
33+ isms = new IInterchainSecurityModule [](count);
34+ for (uint32 i = 0 ; i < count; ++ i) {
35+ isms[i] = IInterchainSecurityModule (deployTestIsm (bytes32 (0 )));
36+ }
37+ }
38+
39+ function uniqueDomains (
40+ uint32 domain ,
41+ uint256 count
42+ ) internal pure returns (uint32 [] memory ) {
43+ uint32 [] memory domains = new uint32 [](count);
44+ for (uint32 i = 0 ; i < count; ++ i) {
45+ unchecked {
46+ domains[i] = domain + i;
47+ }
48+ }
49+ return domains;
50+ }
51+
52+ function buildDomainModules (
53+ uint32 [] memory domains ,
54+ IInterchainSecurityModule[] memory modules
55+ ) internal pure returns (DomainRoutingIsm.DomainModule[] memory ) {
56+ DomainRoutingIsm.DomainModule[]
57+ memory domainModules = new DomainRoutingIsm.DomainModule [](
58+ domains.length
59+ );
60+ for (uint256 i = 0 ; i < domains.length ; ++ i) {
61+ domainModules[i] = DomainRoutingIsm.DomainModule ({
62+ domain: domains[i],
63+ module: modules[i]
64+ });
65+ }
66+ return domainModules;
67+ }
68+
3069 function getMetadata (uint32 domain ) internal view returns (bytes memory ) {
3170 return TestIsm (address (ism.module (domain))).requiredMetadata ();
3271 }
3372
3473 function testSet (uint32 domain ) public {
74+ vm.expectRevert ("ISM must be a contract " );
75+ ism.set (domain, IInterchainSecurityModule (address (0x0 )));
76+
3577 TestIsm _ism = deployTestIsm (bytes32 (0 ));
78+ vm.expectEmit (true , false , false , true );
79+ emit DomainRoutingIsm.ModuleSet (domain, address (_ism));
3680 ism.set (domain, _ism);
3781 assertEq (address (ism.module (domain)), address (_ism));
3882 }
3983
84+ function testSetBatch (uint32 domain , uint8 count ) public {
85+ vm.assume (count > 0 );
86+ uint32 [] memory domains = uniqueDomains (domain, count);
87+ IInterchainSecurityModule[] memory modules = deployTestIsms (count);
88+ DomainRoutingIsm.DomainModule[]
89+ memory domainModules = buildDomainModules (domains, modules);
90+
91+ ism.setBatch (domainModules);
92+ for (uint256 i = 0 ; i < count; ++ i) {
93+ assertEq (address (ism.module (domains[i])), address (modules[i]));
94+ }
95+ }
96+
97+ function testAdd (uint32 domain ) public virtual {
98+ vm.expectRevert ("ISM must be a contract " );
99+ ism.add (domain, IInterchainSecurityModule (address (0x0 )));
100+
101+ TestIsm _ism = deployTestIsm (bytes32 (0 ));
102+ vm.expectEmit (true , false , false , true );
103+ emit DomainRoutingIsm.ModuleSet (domain, address (_ism));
104+ ism.add (domain, _ism);
105+ assertEq (address (ism.module (domain)), address (_ism));
106+
107+ vm.expectRevert ("Domain already exists " );
108+ ism.add (domain, _ism);
109+ }
110+
111+ function testAddBatch (uint32 domain , uint8 count ) public virtual {
112+ vm.assume (count > 0 );
113+ uint32 [] memory domains = uniqueDomains (domain, count);
114+ IInterchainSecurityModule[] memory modules = deployTestIsms (count);
115+ DomainRoutingIsm.DomainModule[]
116+ memory domainModules = buildDomainModules (domains, modules);
117+
118+ ism.addBatch (domainModules);
119+ for (uint256 i = 0 ; i < count; ++ i) {
120+ assertEq (address (ism.module (domains[i])), address (modules[i]));
121+ }
122+ vm.expectRevert ("Domain already exists " );
123+ ism.addBatch (domainModules);
124+ }
125+
40126 function testRemove (uint32 domain ) public virtual {
41127 vm.expectRevert ();
42128 ism.remove (domain);
43129
44130 TestIsm _ism = deployTestIsm (bytes32 (0 ));
45131 ism.set (domain, _ism);
132+ vm.expectEmit (true , false , false , false );
133+ emit DomainRoutingIsm.ModuleRemoved (domain);
46134 ism.remove (domain);
47135 }
48136
49- function testSetManyViaFactory (uint8 count , uint32 domain ) public {
137+ function testRemoveBatch (uint32 domain , uint8 count ) public virtual {
138+ vm.assume (count > 0 );
139+ uint32 [] memory domains = uniqueDomains (domain, count);
140+ IInterchainSecurityModule[] memory modules = deployTestIsms (count);
141+ DomainRoutingIsm.DomainModule[]
142+ memory domainModules = buildDomainModules (domains, modules);
143+
144+ ism.addBatch (domainModules);
145+ ism.removeBatch (domains);
146+ for (uint256 i = 0 ; i < count; ++ i) {
147+ vm.expectRevert ();
148+ ism.module (domains[i]);
149+ }
150+ }
151+
152+ function testSetManyViaFactory (uint8 count , uint32 domain ) public virtual {
153+ vm.assume (count > 0 );
50154 vm.assume (domain > count);
51155 DomainRoutingIsmFactory factory = new DomainRoutingIsmFactory ();
52156 uint32 [] memory _domains = new uint32 [](count);
@@ -60,6 +164,9 @@ contract DomainRoutingIsmTest is Test {
60164 for (uint256 i = 0 ; i < count; ++ i) {
61165 assertEq (address (ism.module (_domains[i])), address (_isms[i]));
62166 }
167+ uint32 [] memory shortDomains = new uint32 [](count - 1 );
168+ vm.expectRevert ("length mismatch " );
169+ factory.deploy (address (this ), shortDomains, _isms);
63170 }
64171
65172 function testSetNonOwner (
@@ -71,6 +178,53 @@ contract DomainRoutingIsmTest is Test {
71178 ism.set (domain, _ism);
72179 }
73180
181+ function testSetBatchNonOwner (uint32 domain ) public {
182+ DomainRoutingIsm.DomainModule[]
183+ memory domainModules = new DomainRoutingIsm.DomainModule [](1 );
184+ domainModules[0 ] = DomainRoutingIsm.DomainModule ({
185+ domain: domain,
186+ module: IInterchainSecurityModule (address (0 ))
187+ });
188+ vm.prank (NON_OWNER);
189+ vm.expectRevert ("Ownable: caller is not the owner " );
190+ ism.setBatch (domainModules);
191+ }
192+
193+ function testAddNonOwner (
194+ uint32 domain ,
195+ IInterchainSecurityModule _ism
196+ ) public {
197+ vm.prank (NON_OWNER);
198+ vm.expectRevert ("Ownable: caller is not the owner " );
199+ ism.add (domain, _ism);
200+ }
201+
202+ function testAddBatchNonOwner (uint32 domain ) public {
203+ DomainRoutingIsm.DomainModule[]
204+ memory domainModules = new DomainRoutingIsm.DomainModule [](1 );
205+ domainModules[0 ] = DomainRoutingIsm.DomainModule ({
206+ domain: domain,
207+ module: IInterchainSecurityModule (address (0 ))
208+ });
209+ vm.prank (NON_OWNER);
210+ vm.expectRevert ("Ownable: caller is not the owner " );
211+ ism.addBatch (domainModules);
212+ }
213+
214+ function testRemoveNonOwner (uint32 domain ) public {
215+ vm.prank (NON_OWNER);
216+ vm.expectRevert ("Ownable: caller is not the owner " );
217+ ism.remove (domain);
218+ }
219+
220+ function testRemoveBatchNonOwner (uint32 domain ) public {
221+ uint32 [] memory domains = new uint32 [](1 );
222+ domains[0 ] = domain;
223+ vm.prank (NON_OWNER);
224+ vm.expectRevert ("Ownable: caller is not the owner " );
225+ ism.removeBatch (domains);
226+ }
227+
74228 function testVerify (uint32 domain , bytes32 seed ) public {
75229 ism.set (domain, deployTestIsm (seed));
76230
@@ -123,6 +277,20 @@ contract DefaultFallbackRoutingIsmTest is DomainRoutingIsmTest {
123277 new DefaultFallbackRoutingIsm (address (0 ));
124278 }
125279
280+ function testRemoveBatch (uint32 domain , uint8 count ) public override {
281+ vm.assume (count > 0 );
282+ uint32 [] memory domains = uniqueDomains (domain, count);
283+ IInterchainSecurityModule[] memory modules = deployTestIsms (count);
284+ DomainRoutingIsm.DomainModule[]
285+ memory domainModules = buildDomainModules (domains, modules);
286+
287+ ism.addBatch (domainModules);
288+ ism.removeBatch (domains);
289+ for (uint256 i = 0 ; i < count; ++ i) {
290+ assertEq (address (ism.module (domains[i])), address (defaultIsm));
291+ }
292+ }
293+
126294 function testVerifyNoIsm (uint32 domain , bytes32 seed ) public override {
127295 vm.assume (domain > 0 );
128296 ism.set (domain, deployTestIsm (seed));
0 commit comments