|
35 | 35 | PROTXVER_BASIC = 2 |
36 | 36 | PROTXVER_EXTADDR = 3 |
37 | 37 |
|
| 38 | +# Sample domains |
| 39 | +DOMAINS_CLR = [ |
| 40 | + "server-1.example.com", |
| 41 | + "server-2.example.com", |
| 42 | +] |
| 43 | +DOMAINS_TOR = [ |
| 44 | + "kpgvmscirrdqpekbqjsvw5teanhatztpp2gl6eee4zkowvwfxwenqaid.onion", |
| 45 | + "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion", |
| 46 | +] |
| 47 | +DOMAINS_I2P = [ |
| 48 | + "c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p", |
| 49 | + "udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p", |
| 50 | + "ukeu3k5oycgaauneqgtnvselmt4yemvoilkln7jpvamvfx7dnkdq.b32.i2p", |
| 51 | +] |
| 52 | + |
38 | 53 | class EvoNode: |
39 | 54 | mn: MasternodeInfo |
40 | 55 | node: TestNode |
@@ -191,6 +206,12 @@ def run_test(self): |
191 | 206 | self.test_empty_fields() |
192 | 207 | self.log.info("Test output masternode address fields for consistency (post-fork)") |
193 | 208 | self.test_shims() |
| 209 | + # Need to destroy masternodes as the next test will be re-creating them |
| 210 | + self.node_evo.destroy_mn(self) |
| 211 | + self.node_two.destroy_mn(self) |
| 212 | + self.reconnect_nodes() |
| 213 | + self.log.info("Test unique properties map duplication checks") |
| 214 | + self.test_uniqueness() |
194 | 215 |
|
195 | 216 | def test_validation_common(self): |
196 | 217 | # Arrays of addresses with invalid inputs get refused |
@@ -326,6 +347,15 @@ def test_validation_extended(self): |
326 | 347 | self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.mn.nodePort}", DEFAULT_PORT_PLATFORM_P2P, |
327 | 348 | [f"127.0.0.1:{DEFAULT_PORT_PLATFORM_HTTP}"])])[0]['allowed'] |
328 | 349 |
|
| 350 | + # coreP2PAddrs and platformP2PAddrs accept privacy network domains and platformHTTPSAddrs additionally supports internet domains |
| 351 | + # Note: I2P entries cannot be differentiated by port, they must always use port 0 |
| 352 | + assert self.node_evo.node.testmempoolaccept([ |
| 353 | + self.node_evo.register_mn(self, False, |
| 354 | + [f"127.0.0.1:{self.node_evo.mn.nodePort}", f"{DOMAINS_TOR[0]}:{self.node_evo.mn.nodePort}", f"{DOMAINS_I2P[0]}:0"], |
| 355 | + [f"127.0.0.1:{DEFAULT_PORT_PLATFORM_P2P}", f"{DOMAINS_TOR[0]}:{DEFAULT_PORT_PLATFORM_P2P}", f"{DOMAINS_I2P[1]}:0"], |
| 356 | + [f"127.0.0.1:{DEFAULT_PORT_PLATFORM_HTTP}", f"{DOMAINS_TOR[0]}:{DEFAULT_PORT_PLATFORM_HTTP}", f"{DOMAINS_I2P[2]}:0", |
| 357 | + f"{DOMAINS_CLR[0]}:{DEFAULT_PORT_PLATFORM_HTTP}"] )])[0]['allowed'] |
| 358 | + |
329 | 359 | # Port numbers may not be wrapped in arrays, either as integers or strings |
330 | 360 | self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.mn.nodePort}", [DEFAULT_PORT_PLATFORM_P2P], DEFAULT_PORT_PLATFORM_HTTP, |
331 | 361 | -8, "Invalid param for platformP2PAddrs[0], must be string") |
@@ -511,5 +541,40 @@ def test_shims(self): |
511 | 541 | self.node_evo.set_active_state(self, False) |
512 | 542 | self.reconnect_nodes() |
513 | 543 |
|
| 544 | + def test_uniqueness(self): |
| 545 | + # Empty registrations are not registered as conflicts |
| 546 | + self.node_evo.register_mn(self, True, "", "", "") |
| 547 | + self.node_two.register_mn(self, True, "", "", "") |
| 548 | + |
| 549 | + # Validate that the unique properties map correctly recognizes entries as duplicates |
| 550 | + self.node_evo.update_mn(self, True, |
| 551 | + [f"127.0.0.1:{self.node_evo.mn.nodePort}", f"{DOMAINS_TOR[0]}:{self.node_evo.mn.nodePort}"], |
| 552 | + [f"127.0.0.1:{DEFAULT_PORT_PLATFORM_P2P}", f"{DOMAINS_I2P[0]}:0"], |
| 553 | + [f"127.0.0.1:{DEFAULT_PORT_PLATFORM_HTTP}", f"{DOMAINS_CLR[0]}:{DEFAULT_PORT_PLATFORM_HTTP}"]) |
| 554 | + |
| 555 | + def update_node_two(self, duplicate_addr = None, duplicate_tor = None, duplicate_i2p = None, duplicate_domain = None): |
| 556 | + args = [ |
| 557 | + self, True, |
| 558 | + [duplicate_addr or f"127.0.0.2:{self.node_two.mn.nodePort}", duplicate_tor or f"{DOMAINS_TOR[1]}:{self.node_two.mn.nodePort}"], |
| 559 | + [f"127.0.0.2:{DEFAULT_PORT_PLATFORM_P2P}", duplicate_i2p or f"{DOMAINS_I2P[1]}:0"], |
| 560 | + [f"127.0.0.2:{DEFAULT_PORT_PLATFORM_HTTP}", duplicate_domain or f"{DOMAINS_CLR[1]}:{DEFAULT_PORT_PLATFORM_HTTP}"] |
| 561 | + ] |
| 562 | + if duplicate_addr or duplicate_tor or duplicate_i2p or duplicate_domain: |
| 563 | + args += [-1, "bad-protx-dup-netinfo-entry"] |
| 564 | + self.node_two.update_mn(*args) |
| 565 | + |
| 566 | + # Check for detection of duplicate IP:addr (CService) |
| 567 | + update_node_two(self, duplicate_addr=f"127.0.0.1:{self.node_evo.mn.nodePort}") |
| 568 | + |
| 569 | + # Check for detection of duplicate privacy addr (CService) |
| 570 | + update_node_two(self, duplicate_tor=f"{DOMAINS_TOR[0]}:{self.node_evo.mn.nodePort}") |
| 571 | + update_node_two(self, duplicate_i2p=f"{DOMAINS_I2P[0]}:0") |
| 572 | + |
| 573 | + # Check for detection of duplicate internet addr (DomainPort) |
| 574 | + update_node_two(self, duplicate_domain=f"{DOMAINS_CLR[0]}:{DEFAULT_PORT_PLATFORM_HTTP}") |
| 575 | + |
| 576 | + # All non-duplicate entries should still succeed |
| 577 | + update_node_two(self) |
| 578 | + |
514 | 579 | if __name__ == "__main__": |
515 | 580 | NetInfoTest().main() |
0 commit comments