aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authormerge-script <fanquake@gmail.com>2024-07-16 08:58:42 +0100
committermerge-script <fanquake@gmail.com>2024-07-16 08:58:42 +0100
commitd41f4a69e7beecec8de7c0cdeb1b97bf8d7cf04e (patch)
treeed4e16586a1368769e15d9faf631dfb3a97ae593 /test
parent8426e018bf22b5e7e1ffa4b42e06813c470b1cc6 (diff)
parentc6d43367a1ec47c004991143f031417c4e4b8095 (diff)
Merge bitcoin/bitcoin#30420: test: Fix intermittent failure in p2p_v2_misbehaving.py
c6d43367a1ec47c004991143f031417c4e4b8095 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 87600c36de..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 c6d43367a1ec47c004991143f031417c4e4b8095 mzumsande: Code Review ACK c6d43367a1ec47c004991143f031417c4e4b8095 tdb3: cr and t ACK c6d43367a1ec47c004991143f031417c4e4b8095 Tree-SHA512: dfc3a6afa09773b7e84d35aff0aa14e0b8a4475860e0b31ab5c1a8d54911c814f07138f624fea651fba90cc5c526c0d05c3fe33d2ce0ad833b2be3a3caa9f522
Diffstat (limited to 'test')
-rwxr-xr-xtest/functional/p2p_v2_misbehaving.py20
1 files changed, 16 insertions, 4 deletions
diff --git a/test/functional/p2p_v2_misbehaving.py b/test/functional/p2p_v2_misbehaving.py
index e45a63b3b0..9017ee9455 100755
--- a/test/functional/p2p_v2_misbehaving.py
+++ b/test/functional/p2p_v2_misbehaving.py
@@ -4,6 +4,7 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
import random
+import time
from enum import Enum
from test_framework.messages import MAGIC_BYTES
@@ -136,6 +137,7 @@ class EncryptedP2PMisbehaving(BitcoinTestFramework):
self.log.info('Sending ellswift bytes in parts to ensure that response from responder is received only when')
self.log.info('ellswift bytes have a mismatch from the 16 bytes(network magic followed by "version\\x00\\x00\\x00\\x00\\x00")')
node0 = self.nodes[0]
+ node0.setmocktime(int(time.time()))
self.log.info('Sending first 4 bytes of ellswift which match network magic')
self.log.info('If a response is received, assertion failure would happen in our custom data_received() function')
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)
@@ -143,9 +145,14 @@ class EncryptedP2PMisbehaving(BitcoinTestFramework):
self.log.info('Sending remaining ellswift and garbage which are different from V1_PREFIX. Since a response is')
self.log.info('expected now, our custom data_received() function wouldn\'t result in assertion failure')
peer1.v2_state.can_data_be_received = True
+ self.wait_until(lambda: peer1.v2_state.ellswift_ours)
peer1.send_raw_message(peer1.v2_state.ellswift_ours[4:] + peer1.v2_state.sent_garbage)
+ node0.bumpmocktime(3)
+ # Ensure that the bytes sent after 4 bytes network magic are actually received.
+ self.wait_until(lambda: node0.getpeerinfo()[-1]["bytesrecv"] > 4)
with node0.assert_debug_log(['V2 handshake timeout peer=0']):
- peer1.wait_for_disconnect(timeout=5)
+ node0.bumpmocktime(1) # `InactivityCheck()` triggers now
+ peer1.wait_for_disconnect(timeout=1)
self.log.info('successful disconnection since modified ellswift was sent as response')
def test_v2disconnection(self):
@@ -154,7 +161,7 @@ class EncryptedP2PMisbehaving(BitcoinTestFramework):
expected_debug_message = [
[], # EARLY_KEY_RESPONSE
["V2 transport error: missing garbage terminator, peer=1"], # EXCESS_GARBAGE
- ["V2 handshake timeout peer=2"], # WRONG_GARBAGE_TERMINATOR
+ ["V2 handshake timeout peer=3"], # WRONG_GARBAGE_TERMINATOR
["V2 transport error: packet decryption failure"], # WRONG_GARBAGE
["V2 transport error: packet decryption failure"], # SEND_NO_AAD
[], # SEND_NON_EMPTY_VERSION_PACKET
@@ -167,8 +174,13 @@ class EncryptedP2PMisbehaving(BitcoinTestFramework):
self.log.info(f"No disconnection for {test_type.name}")
else:
with node0.assert_debug_log(expected_debug_message[test_type.value], timeout=5):
- peer = node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=False, send_version=False, supports_v2_p2p=True, expect_success=False)
- peer.wait_for_disconnect()
+ node0.setmocktime(int(time.time()))
+ peer1 = node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=False, send_version=False, supports_v2_p2p=True, expect_success=False)
+ # Make a passing connection for more robust disconnection checking.
+ peer2 = node0.add_p2p_connection(P2PInterface())
+ assert peer2.is_connected
+ node0.bumpmocktime(4) # `InactivityCheck()` triggers now
+ peer1.wait_for_disconnect()
self.log.info(f"Expected disconnection for {test_type.name}")