1
1
from __future__ import annotations
2
2
3
- import asyncio
4
-
5
3
import pytest
6
4
from chia_rs .sized_ints import uint32
7
5
25
23
test_different_versions_results : list [int ] = []
26
24
27
25
26
+ def sleep () -> float :
27
+ return 0.0
28
+
29
+
30
+ @pytest .fixture
31
+ def mock_timer (monkeypatch ):
32
+ current_time = 1000.0
33
+
34
+ def mock_monotonic (* args , ** kwargs ) -> float :
35
+ nonlocal current_time
36
+ return current_time
37
+
38
+ def mock_sleep (* args , ** kwargs ) -> None :
39
+ nonlocal current_time
40
+ current_time += int (args [0 ])
41
+
42
+ import chia
43
+
44
+ monkeypatch .setattr (chia .server .rate_limits , "get_time" , mock_monotonic )
45
+ monkeypatch .setattr (chia ._tests .core .server .test_rate_limits , "sleep" , mock_sleep )
46
+
47
+
28
48
class TestRateLimits :
29
49
@pytest .mark .anyio
30
50
async def test_get_rate_limits_to_use (self ):
@@ -33,7 +53,7 @@ async def test_get_rate_limits_to_use(self):
33
53
assert get_rate_limits_to_use (rl_v1 , rl_v1 ) == get_rate_limits_to_use (rl_v1 , rl_v2 )
34
54
35
55
@pytest .mark .anyio
36
- async def test_too_many_messages (self ):
56
+ async def test_too_many_messages (self , mock_timer ):
37
57
# Too many messages
38
58
r = RateLimiter (incoming = True )
39
59
new_tx_message = make_msg (ProtocolMessageTypes .new_transaction , bytes ([1 ] * 40 ))
@@ -61,7 +81,7 @@ async def test_too_many_messages(self):
61
81
assert saw_disconnect
62
82
63
83
@pytest .mark .anyio
64
- async def test_large_message (self ):
84
+ async def test_large_message (self , mock_timer ):
65
85
# Large tx
66
86
small_tx_message = make_msg (ProtocolMessageTypes .respond_transaction , bytes ([1 ] * 500 * 1024 ))
67
87
large_tx_message = make_msg (ProtocolMessageTypes .new_transaction , bytes ([1 ] * 3 * 1024 * 1024 ))
@@ -81,7 +101,7 @@ async def test_large_message(self):
81
101
assert r .process_msg_and_check (large_blocks_message , rl_v2 , rl_v2 ) is not None
82
102
83
103
@pytest .mark .anyio
84
- async def test_too_much_data (self ):
104
+ async def test_too_much_data (self , mock_timer ):
85
105
# Too much data
86
106
r = RateLimiter (incoming = True )
87
107
tx_message = make_msg (ProtocolMessageTypes .respond_transaction , bytes ([1 ] * 500 * 1024 ))
@@ -108,7 +128,7 @@ async def test_too_much_data(self):
108
128
assert saw_disconnect
109
129
110
130
@pytest .mark .anyio
111
- async def test_non_tx_aggregate_limits (self ):
131
+ async def test_non_tx_aggregate_limits (self , mock_timer ):
112
132
# Frequency limits
113
133
r = RateLimiter (incoming = True )
114
134
message_1 = make_msg (ProtocolMessageTypes .coin_state_update , bytes ([1 ] * 32 ))
@@ -144,7 +164,7 @@ async def test_non_tx_aggregate_limits(self):
144
164
assert saw_disconnect
145
165
146
166
@pytest .mark .anyio
147
- async def test_periodic_reset (self ):
167
+ async def test_periodic_reset (self , mock_timer ):
148
168
r = RateLimiter (True , 5 )
149
169
tx_message = make_msg (ProtocolMessageTypes .respond_transaction , bytes ([1 ] * 500 * 1024 ))
150
170
for i in range (10 ):
@@ -157,7 +177,7 @@ async def test_periodic_reset(self):
157
177
saw_disconnect = True
158
178
assert saw_disconnect
159
179
assert r .process_msg_and_check (tx_message , rl_v2 , rl_v2 ) is not None
160
- await asyncio . sleep (6 )
180
+ sleep (6 )
161
181
assert r .process_msg_and_check (tx_message , rl_v2 , rl_v2 ) is None
162
182
163
183
# Counts reset also
@@ -172,11 +192,11 @@ async def test_periodic_reset(self):
172
192
if response is not None :
173
193
saw_disconnect = True
174
194
assert saw_disconnect
175
- await asyncio . sleep (6 )
195
+ sleep (6 )
176
196
assert r .process_msg_and_check (new_tx_message , rl_v2 , rl_v2 ) is None
177
197
178
198
@pytest .mark .anyio
179
- async def test_percentage_limits (self ):
199
+ async def test_percentage_limits (self , mock_timer ):
180
200
r = RateLimiter (True , 60 , 40 )
181
201
new_peak_message = make_msg (ProtocolMessageTypes .new_peak , bytes ([1 ] * 40 ))
182
202
for i in range (50 ):
@@ -235,7 +255,7 @@ async def test_percentage_limits(self):
235
255
assert saw_disconnect
236
256
237
257
@pytest .mark .anyio
238
- async def test_too_many_outgoing_messages (self ):
258
+ async def test_too_many_outgoing_messages (self , mock_timer ):
239
259
# Too many messages
240
260
r = RateLimiter (incoming = False )
241
261
new_peers_message = make_msg (ProtocolMessageTypes .respond_peers , bytes ([1 ]))
@@ -258,7 +278,7 @@ async def test_too_many_outgoing_messages(self):
258
278
assert r .process_msg_and_check (new_signatures_message , rl_v2 , rl_v2 ) is None
259
279
260
280
@pytest .mark .anyio
261
- async def test_too_many_incoming_messages (self ):
281
+ async def test_too_many_incoming_messages (self , mock_timer ):
262
282
# Too many messages
263
283
r = RateLimiter (incoming = True )
264
284
new_peers_message = make_msg (ProtocolMessageTypes .respond_peers , bytes ([1 ]))
@@ -353,7 +373,7 @@ async def test_different_versions(self, node_with_params, node_with_params_b, se
353
373
assert len (set (test_different_versions_results )) >= 2
354
374
355
375
@pytest .mark .anyio
356
- async def test_compose (self ):
376
+ async def test_compose (self , mock_timer ):
357
377
rl_1 = rl_numbers [1 ]
358
378
rl_2 = rl_numbers [2 ]
359
379
assert ProtocolMessageTypes .respond_children in rl_1 ["rate_limits_other" ]
0 commit comments