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
@@ -128,6 +129,10 @@ def set_test_params(self):
128
129
self .num_nodes = 1
129
130
self .extra_args = [["-v2transport=1" , "-peertimeout=3" ]]
130
131
132
+ def mock_forward (self , delta ):
133
+ self .mock_time += delta
134
+ self .nodes [0 ].setmocktime (self .mock_time )
135
+
131
136
def run_test (self ):
132
137
self .test_earlykeyresponse ()
133
138
self .test_v2disconnection ()
@@ -136,25 +141,34 @@ def test_earlykeyresponse(self):
136
141
self .log .info ('Sending ellswift bytes in parts to ensure that response from responder is received only when' )
137
142
self .log .info ('ellswift bytes have a mismatch from the 16 bytes(network magic followed by "version\\ x00\\ x00\\ x00\\ x00\\ x00")' )
138
143
node0 = self .nodes [0 ]
144
+ self .mock_time = int (time .time ())
145
+ self .mock_forward (0 )
139
146
self .log .info ('Sending first 4 bytes of ellswift which match network magic' )
140
147
self .log .info ('If a response is received, assertion failure would happen in our custom data_received() function' )
141
148
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
149
peer1 .send_raw_message (MAGIC_BYTES ['regtest' ])
143
150
self .log .info ('Sending remaining ellswift and garbage which are different from V1_PREFIX. Since a response is' )
144
151
self .log .info ('expected now, our custom data_received() function wouldn\' t result in assertion failure' )
145
152
peer1 .v2_state .can_data_be_received = True
153
+ self .wait_until (lambda : peer1 .v2_state .ellswift_ours )
146
154
peer1 .send_raw_message (peer1 .v2_state .ellswift_ours [4 :] + peer1 .v2_state .sent_garbage )
155
+ self .mock_forward (3 )
156
+ # `InactivityCheck()` displays a different net log message compared to the one specified below if `sendSet` isn't populated.
157
+ # Make a passing connection so that there's time to populate `sendSet` for consistent logging.
158
+ peer2 = node0 .add_p2p_connection (P2PInterface ())
159
+ assert peer2 .is_connected
147
160
with node0 .assert_debug_log (['V2 handshake timeout peer=0' ]):
148
- peer1 .wait_for_disconnect (timeout = 5 )
161
+ self .mock_forward (1 ) # `InactivityCheck()` triggers now
162
+ peer1 .wait_for_disconnect (timeout = 1 )
149
163
self .log .info ('successful disconnection since modified ellswift was sent as response' )
150
164
151
165
def test_v2disconnection (self ):
152
166
# test v2 disconnection scenarios
153
167
node0 = self .nodes [0 ]
154
168
expected_debug_message = [
155
169
[], # EARLY_KEY_RESPONSE
156
- ["V2 transport error: missing garbage terminator, peer=1 " ], # EXCESS_GARBAGE
157
- ["V2 handshake timeout peer=2 " ], # WRONG_GARBAGE_TERMINATOR
170
+ ["V2 transport error: missing garbage terminator, peer=2 " ], # EXCESS_GARBAGE
171
+ ["V2 handshake timeout peer=4 " ], # WRONG_GARBAGE_TERMINATOR
158
172
["V2 transport error: packet decryption failure" ], # WRONG_GARBAGE
159
173
["V2 transport error: packet decryption failure" ], # SEND_NO_AAD
160
174
[], # SEND_NON_EMPTY_VERSION_PACKET
@@ -167,8 +181,16 @@ def test_v2disconnection(self):
167
181
self .log .info (f"No disconnection for { test_type .name } " )
168
182
else :
169
183
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 ()
184
+ self .mock_time = int (time .time ())
185
+ self .mock_forward (0 )
186
+ peer1 = node0 .add_p2p_connection (MisbehavingV2Peer (test_type ), wait_for_verack = False , send_version = False , supports_v2_p2p = True , expect_success = False )
187
+ # `InactivityCheck()` displays a different net log message compared to the one specified below if `sendSet` isn't populated.
188
+ # Make a passing connection so that there's time to populate `sendSet` for consistent logging
189
+ # and for more robust disconnection checking.
190
+ peer2 = node0 .add_p2p_connection (P2PInterface ())
191
+ assert peer2 .is_connected
192
+ self .mock_forward (4 ) # `InactivityCheck()` triggers now
193
+ peer1 .wait_for_disconnect ()
172
194
self .log .info (f"Expected disconnection for { test_type .name } " )
173
195
174
196
0 commit comments