|
5 | 5 | """Test network information fields across RPCs.""" |
6 | 6 |
|
7 | 7 | from test_framework.util import ( |
8 | | - assert_equal |
| 8 | + assert_equal, |
| 9 | + assert_raises_rpc_error |
9 | 10 | ) |
10 | 11 | from test_framework.script import ( |
11 | 12 | hash160 |
@@ -95,19 +96,31 @@ def is_mn_visible(self, _protx_hash = None) -> bool: |
95 | 96 | mn_visible = True |
96 | 97 | return mn_visible |
97 | 98 |
|
98 | | - def register_mn(self, test: BitcoinTestFramework, submit: bool, addrs_core_p2p, addrs_platform_p2p = None, addrs_platform_http = None) -> str: |
| 99 | + def register_mn(self, test: BitcoinTestFramework, submit: bool, addrs_core_p2p, addrs_platform_p2p = None, addrs_platform_http = None, code = None, msg = None) -> str: |
| 100 | + assert((code and msg) or (not code and not msg)) |
99 | 101 | protx_output: str = "" |
100 | 102 | if self.is_evo: |
101 | 103 | assert(addrs_platform_http and addrs_platform_p2p) |
102 | 104 | self.platform_nodeid = hash160(b'%d' % randint(1, 65535)).hex() |
103 | | - protx_output = self.node.protx( |
104 | | - "register_evo", self.collateral_txid, self.collateral_vout, addrs_core_p2p, self.address_owner, self.operator_pk, |
105 | | - self.address_voting, 0, self.address_reward, self.platform_nodeid, addrs_platform_p2p, addrs_platform_http, |
106 | | - self.address_funds, submit) |
| 105 | + if code and msg: |
| 106 | + assert_raises_rpc_error( |
| 107 | + code, msg, self.node.protx, "register_evo", self.collateral_txid, self.collateral_vout, addrs_core_p2p, self.address_owner, self.operator_pk, |
| 108 | + self.address_voting, 0, self.address_reward, self.platform_nodeid, addrs_platform_p2p, addrs_platform_http, self.address_funds, submit) |
| 109 | + return "" |
| 110 | + else: |
| 111 | + protx_output = self.node.protx( |
| 112 | + "register_evo", self.collateral_txid, self.collateral_vout, addrs_core_p2p, self.address_owner, self.operator_pk, |
| 113 | + self.address_voting, 0, self.address_reward, self.platform_nodeid, addrs_platform_p2p, addrs_platform_http, self.address_funds, submit) |
107 | 114 | else: |
108 | | - protx_output = self.node.protx( |
109 | | - "register", self.collateral_txid, self.collateral_vout, addrs_core_p2p, self.address_owner, self.operator_pk, |
110 | | - self.address_voting, 0, self.address_reward, self.address_funds, submit) |
| 115 | + if code and msg: |
| 116 | + assert_raises_rpc_error( |
| 117 | + code, msg, self.node.protx, "register", self.collateral_txid, self.collateral_vout, addrs_core_p2p, self.address_owner, self.operator_pk, |
| 118 | + self.address_voting, 0, self.address_reward, self.address_funds, submit) |
| 119 | + return "" |
| 120 | + else: |
| 121 | + protx_output = self.node.protx( |
| 122 | + "register", self.collateral_txid, self.collateral_vout, addrs_core_p2p, self.address_owner, self.operator_pk, |
| 123 | + self.address_voting, 0, self.address_reward, self.address_funds, submit) |
111 | 124 | if not submit: |
112 | 125 | return "" |
113 | 126 | self.provider_txid = protx_output |
@@ -194,6 +207,38 @@ def run_test(self): |
194 | 207 |
|
195 | 208 | self.node_evo.generate_collateral(self) |
196 | 209 |
|
| 210 | + self.test_validation() |
| 211 | + self.test_deprecation() |
| 212 | + |
| 213 | + def test_validation(self): |
| 214 | + self.log.info("Test input validation for masternode address fields") |
| 215 | + # Arrays of addresses are recognized by coreP2PAddrs |
| 216 | + self.node_evo.register_mn(self, False, [f"127.0.0.1:{self.node_evo.port_p2p}", f"127.0.0.2:9998"], "22200", "22201", |
| 217 | + -8, f"Error setting coreP2PAddrs[1] to '127.0.0.2:9998' (too many entries)") |
| 218 | + |
| 219 | + # platformP2PPort and platformHTTPPort doesn't accept non-numeric inputs |
| 220 | + self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.port_p2p}", "127.0.0.1:22200", "22201", |
| 221 | + -8, "platformP2PPort must be a 32bit integer (not '127.0.0.1:22200')") |
| 222 | + self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.port_p2p}", ["127.0.0.1:22200"], "22201", |
| 223 | + -8, "Invalid param for platformP2PPort, must be number") |
| 224 | + self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.port_p2p}", "22200", "127.0.0.1:22201", |
| 225 | + -8, "platformHTTPPort must be a 32bit integer (not '127.0.0.1:22201')") |
| 226 | + self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.port_p2p}", "22200", ["127.0.0.1:22201"], |
| 227 | + -8, "Invalid param for platformHTTPPort, must be number") |
| 228 | + |
| 229 | + # platformP2PPort and platformHTTPPort must be within acceptable range (i.e. a valid port number) |
| 230 | + self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.port_p2p}", "0", "22201", |
| 231 | + -8, "platformP2PPort must be a valid port [1-65535]") |
| 232 | + self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.port_p2p}", "65536", "22201", |
| 233 | + -8, "platformP2PPort must be a valid port [1-65535]") |
| 234 | + self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.port_p2p}", "22200", "0", |
| 235 | + -8, "platformHTTPPort must be a valid port [1-65535]") |
| 236 | + self.node_evo.register_mn(self, False, f"127.0.0.1:{self.node_evo.port_p2p}", "22200", "65536", |
| 237 | + -8, "platformHTTPPort must be a valid port [1-65535]") |
| 238 | + |
| 239 | + def test_deprecation(self): |
| 240 | + self.log.info("Test output masternode address fields for consistency") |
| 241 | + |
197 | 242 | # netInfo is represented with JSON in CProRegTx, CProUpServTx, CDeterministicMNState and CSimplifiedMNListEntry, |
198 | 243 | # so we need to test calls that rely on these underlying implementations. Start by collecting RPC responses. |
199 | 244 | self.log.info("Collect JSON RPC responses from node") |
|
0 commit comments