4
4
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
5
6
6
import random
7
+ import time
7
8
from enum import Enum
8
9
9
10
from test_framework .messages import MAGIC_BYTES
@@ -136,16 +137,22 @@ def test_earlykeyresponse(self):
136
137
self .log .info ('Sending ellswift bytes in parts to ensure that response from responder is received only when' )
137
138
self .log .info ('ellswift bytes have a mismatch from the 16 bytes(network magic followed by "version\\ x00\\ x00\\ x00\\ x00\\ x00")' )
138
139
node0 = self .nodes [0 ]
140
+ node0 .setmocktime (int (time .time ()))
139
141
self .log .info ('Sending first 4 bytes of ellswift which match network magic' )
140
142
self .log .info ('If a response is received, assertion failure would happen in our custom data_received() function' )
141
143
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 )
142
144
peer1 .send_raw_message (MAGIC_BYTES ['regtest' ])
143
145
self .log .info ('Sending remaining ellswift and garbage which are different from V1_PREFIX. Since a response is' )
144
146
self .log .info ('expected now, our custom data_received() function wouldn\' t result in assertion failure' )
145
147
peer1 .v2_state .can_data_be_received = True
148
+ self .wait_until (lambda : peer1 .v2_state .ellswift_ours )
146
149
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 )
147
153
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 )
149
156
self .log .info ('successful disconnection since modified ellswift was sent as response' )
150
157
151
158
def test_v2disconnection (self ):
@@ -154,7 +161,7 @@ def test_v2disconnection(self):
154
161
expected_debug_message = [
155
162
[], # EARLY_KEY_RESPONSE
156
163
["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
158
165
["V2 transport error: packet decryption failure" ], # WRONG_GARBAGE
159
166
["V2 transport error: packet decryption failure" ], # SEND_NO_AAD
160
167
[], # SEND_NON_EMPTY_VERSION_PACKET
@@ -167,8 +174,13 @@ def test_v2disconnection(self):
167
174
self .log .info (f"No disconnection for { test_type .name } " )
168
175
else :
169
176
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 ()
172
184
self .log .info (f"Expected disconnection for { test_type .name } " )
173
185
174
186
0 commit comments