Skip to content

Commit d41f4a6

Browse files
committed
Merge bitcoin/bitcoin#30420: test: Fix intermittent failure in p2p_v2_misbehaving.py
c6d4336 test: Fix intermittent failure in p2p_v2_misbehaving.py (stratospher) Pull request description: Fixes #30419. Make sure that ellswift computation is complete in the `NetworkThread` in `test/functional/p2p_v2_misbehaving.py` before sending the ellswift in the `MainThread`. One way to reproduce this failure on master would be: ```diff diff --git a/test/functional/test_framework/v2_p2p.py b/test/functional/test_framework/v2_p2p.py index 87600c3..ea0615ef3b 100644 --- a/test/functional/test_framework/v2_p2p.py +++ b/test/functional/test_framework/v2_p2p.py @@ -111,6 +111,7 @@ class EncryptedP2PState: def generate_keypair_and_garbage(self, garbage_len=None): """Generates ellswift keypair and 4095 bytes garbage at max""" + import time; time.sleep(3) self.privkey_ours, self.ellswift_ours = ellswift_create() if garbage_len is None: garbage_len = random.randrange(MAX_GARBAGE_LEN + 1) ``` ACKs for top commit: maflcko: ACK c6d4336 mzumsande: Code Review ACK c6d4336 tdb3: cr and t ACK c6d4336 Tree-SHA512: dfc3a6afa09773b7e84d35aff0aa14e0b8a4475860e0b31ab5c1a8d54911c814f07138f624fea651fba90cc5c526c0d05c3fe33d2ce0ad833b2be3a3caa9f522
2 parents 8426e01 + c6d4336 commit d41f4a6

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

test/functional/p2p_v2_misbehaving.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
55

66
import random
7+
import time
78
from enum import Enum
89

910
from test_framework.messages import MAGIC_BYTES
@@ -136,16 +137,22 @@ def test_earlykeyresponse(self):
136137
self.log.info('Sending ellswift bytes in parts to ensure that response from responder is received only when')
137138
self.log.info('ellswift bytes have a mismatch from the 16 bytes(network magic followed by "version\\x00\\x00\\x00\\x00\\x00")')
138139
node0 = self.nodes[0]
140+
node0.setmocktime(int(time.time()))
139141
self.log.info('Sending first 4 bytes of ellswift which match network magic')
140142
self.log.info('If a response is received, assertion failure would happen in our custom data_received() function')
141143
peer1 = node0.add_p2p_connection(MisbehavingV2Peer(TestType.EARLY_KEY_RESPONSE), wait_for_verack=False, send_version=False, supports_v2_p2p=True, wait_for_v2_handshake=False)
142144
peer1.send_raw_message(MAGIC_BYTES['regtest'])
143145
self.log.info('Sending remaining ellswift and garbage which are different from V1_PREFIX. Since a response is')
144146
self.log.info('expected now, our custom data_received() function wouldn\'t result in assertion failure')
145147
peer1.v2_state.can_data_be_received = True
148+
self.wait_until(lambda: peer1.v2_state.ellswift_ours)
146149
peer1.send_raw_message(peer1.v2_state.ellswift_ours[4:] + peer1.v2_state.sent_garbage)
150+
node0.bumpmocktime(3)
151+
# Ensure that the bytes sent after 4 bytes network magic are actually received.
152+
self.wait_until(lambda: node0.getpeerinfo()[-1]["bytesrecv"] > 4)
147153
with node0.assert_debug_log(['V2 handshake timeout peer=0']):
148-
peer1.wait_for_disconnect(timeout=5)
154+
node0.bumpmocktime(1) # `InactivityCheck()` triggers now
155+
peer1.wait_for_disconnect(timeout=1)
149156
self.log.info('successful disconnection since modified ellswift was sent as response')
150157

151158
def test_v2disconnection(self):
@@ -154,7 +161,7 @@ def test_v2disconnection(self):
154161
expected_debug_message = [
155162
[], # EARLY_KEY_RESPONSE
156163
["V2 transport error: missing garbage terminator, peer=1"], # EXCESS_GARBAGE
157-
["V2 handshake timeout peer=2"], # WRONG_GARBAGE_TERMINATOR
164+
["V2 handshake timeout peer=3"], # WRONG_GARBAGE_TERMINATOR
158165
["V2 transport error: packet decryption failure"], # WRONG_GARBAGE
159166
["V2 transport error: packet decryption failure"], # SEND_NO_AAD
160167
[], # SEND_NON_EMPTY_VERSION_PACKET
@@ -167,8 +174,13 @@ def test_v2disconnection(self):
167174
self.log.info(f"No disconnection for {test_type.name}")
168175
else:
169176
with node0.assert_debug_log(expected_debug_message[test_type.value], timeout=5):
170-
peer = node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=False, send_version=False, supports_v2_p2p=True, expect_success=False)
171-
peer.wait_for_disconnect()
177+
node0.setmocktime(int(time.time()))
178+
peer1 = node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=False, send_version=False, supports_v2_p2p=True, expect_success=False)
179+
# Make a passing connection for more robust disconnection checking.
180+
peer2 = node0.add_p2p_connection(P2PInterface())
181+
assert peer2.is_connected
182+
node0.bumpmocktime(4) # `InactivityCheck()` triggers now
183+
peer1.wait_for_disconnect()
172184
self.log.info(f"Expected disconnection for {test_type.name}")
173185

174186

0 commit comments

Comments
 (0)