(self)
| 52 | self.nodes[0].setmocktime(self.mock_time) |
| 53 | |
| 54 | def run_test(self): |
| 55 | self.mock_time = int(time.time()) |
| 56 | self.mock_forward(0) |
| 57 | |
| 58 | self.log.info('Check that ping is sent after connection is established') |
| 59 | no_pong_node = self.nodes[0].add_p2p_connection(NodeNoPong()) |
| 60 | self.mock_forward(3) |
| 61 | assert no_pong_node.last_message.pop('ping').nonce != 0 |
| 62 | self.check_peer_info(pingtime=None, minping=None, pingwait=3) |
| 63 | |
| 64 | self.log.info('Reply without nonce cancels ping') |
| 65 | with self.nodes[0].assert_debug_log(['pong peer=0: Short payload']): |
| 66 | no_pong_node.send_and_ping(msg_pong_corrupt()) |
| 67 | self.check_peer_info(pingtime=None, minping=None, pingwait=None) |
| 68 | |
| 69 | self.log.info('Reply without ping') |
| 70 | with self.nodes[0].assert_debug_log([ |
| 71 | 'pong peer=0: Unsolicited pong without ping, 0 expected, 0 received, 8 bytes', |
| 72 | ]): |
| 73 | no_pong_node.send_and_ping(msg_pong()) |
| 74 | self.check_peer_info(pingtime=None, minping=None, pingwait=None) |
| 75 | |
| 76 | self.log.info('Reply with wrong nonce does not cancel ping') |
| 77 | assert 'ping' not in no_pong_node.last_message |
| 78 | with self.nodes[0].assert_debug_log(['pong peer=0: Nonce mismatch']): |
| 79 | # mock time PING_INTERVAL ahead to trigger node into sending a ping |
| 80 | self.mock_forward(PING_INTERVAL + 1) |
| 81 | no_pong_node.wait_until(lambda: 'ping' in no_pong_node.last_message) |
| 82 | self.mock_forward(9) |
| 83 | # Send the wrong pong |
| 84 | no_pong_node.send_and_ping(msg_pong(no_pong_node.last_message.pop('ping').nonce - 1)) |
| 85 | self.check_peer_info(pingtime=None, minping=None, pingwait=9) |
| 86 | |
| 87 | self.log.info('Reply with zero nonce does cancel ping') |
| 88 | with self.nodes[0].assert_debug_log(['pong peer=0: Nonce zero']): |
| 89 | no_pong_node.send_and_ping(msg_pong(0)) |
| 90 | self.check_peer_info(pingtime=None, minping=None, pingwait=None) |
| 91 | |
| 92 | self.log.info('Check that ping is properly reported on RPC') |
| 93 | assert 'ping' not in no_pong_node.last_message |
| 94 | # mock time PING_INTERVAL ahead to trigger node into sending a ping |
| 95 | self.mock_forward(PING_INTERVAL + 1) |
| 96 | no_pong_node.wait_until(lambda: 'ping' in no_pong_node.last_message) |
| 97 | ping_delay = 29 |
| 98 | self.mock_forward(ping_delay) |
| 99 | no_pong_node.wait_until(lambda: 'ping' in no_pong_node.last_message) |
| 100 | no_pong_node.send_and_ping(msg_pong(no_pong_node.last_message.pop('ping').nonce)) |
| 101 | self.check_peer_info(pingtime=ping_delay, minping=ping_delay, pingwait=None) |
| 102 | |
| 103 | self.log.info('Check that minping is decreased after a fast roundtrip') |
| 104 | # mock time PING_INTERVAL ahead to trigger node into sending a ping |
| 105 | self.mock_forward(PING_INTERVAL + 1) |
| 106 | no_pong_node.wait_until(lambda: 'ping' in no_pong_node.last_message) |
| 107 | ping_delay = 9 |
| 108 | self.mock_forward(ping_delay) |
| 109 | no_pong_node.wait_until(lambda: 'ping' in no_pong_node.last_message) |
| 110 | no_pong_node.send_and_ping(msg_pong(no_pong_node.last_message.pop('ping').nonce)) |
| 111 | self.check_peer_info(pingtime=ping_delay, minping=ping_delay, pingwait=None) |
nothing calls this directly
no test coverage detected