20
20
from synapse .api .constants import EventTypes
21
21
from synapse .api .errors import AuthError , Codes , LimitExceededError , SynapseError
22
22
from synapse .api .room_versions import RoomVersions
23
- from synapse .events import EventBase
23
+ from synapse .events import EventBase , make_event_from_dict
24
24
from synapse .federation .federation_base import event_from_pdu_json
25
25
from synapse .logging .context import LoggingContext , run_in_background
26
26
from synapse .rest import admin
27
27
from synapse .rest .client import login , room
28
28
from synapse .server import HomeServer
29
- from synapse .types import create_requester
30
29
from synapse .util import Clock
31
30
from synapse .util .stringutils import random_string
32
31
33
32
from tests import unittest
33
+ from tests .test_utils import event_injection
34
34
35
35
logger = logging .getLogger (__name__ )
36
36
@@ -39,7 +39,7 @@ def generate_fake_event_id() -> str:
39
39
return "$fake_" + random_string (43 )
40
40
41
41
42
- class FederationTestCase (unittest .HomeserverTestCase ):
42
+ class FederationTestCase (unittest .FederatingHomeserverTestCase ):
43
43
servlets = [
44
44
admin .register_servlets ,
45
45
login .register_servlets ,
@@ -219,41 +219,77 @@ def test_backfill_with_many_backward_extremities(self) -> None:
219
219
# create the room
220
220
user_id = self .register_user ("kermit" , "test" )
221
221
tok = self .login ("kermit" , "test" )
222
- requester = create_requester (user_id )
223
222
224
223
room_id = self .helper .create_room_as (room_creator = user_id , tok = tok )
224
+ room_version = self .get_success (self .store .get_room_version (room_id ))
225
+
226
+ # we need a user on the remote server to be a member, so that we can send
227
+ # extremity-causing events.
228
+ self .get_success (
229
+ event_injection .inject_member_event (
230
+ self .hs , room_id , f"@user:{ self .OTHER_SERVER_NAME } " , "join"
231
+ )
232
+ )
225
233
226
- ev1 = self .helper .send (room_id , "first message" , tok = tok )
234
+ send_result = self .helper .send (room_id , "first message" , tok = tok )
235
+ ev1 = self .get_success (
236
+ self .store .get_event (send_result ["event_id" ], allow_none = False )
237
+ )
238
+ current_state = self .get_success (
239
+ self .store .get_events_as_list (
240
+ (self .get_success (self .store .get_current_state_ids (room_id ))).values ()
241
+ )
242
+ )
227
243
228
244
# Create "many" backward extremities. The magic number we're trying to
229
245
# create more than is 5 which corresponds to the number of backward
230
246
# extremities we slice off in `_maybe_backfill_inner`
247
+ federation_event_handler = self .hs .get_federation_event_handler ()
231
248
for _ in range (0 , 8 ):
232
- event_handler = self .hs .get_event_creation_handler ()
233
- event , context = self .get_success (
234
- event_handler .create_event (
235
- requester ,
249
+ event = make_event_from_dict (
250
+ self .add_hashes_and_signatures (
236
251
{
252
+ "origin_server_ts" : 1 ,
237
253
"type" : "m.room.message" ,
238
254
"content" : {
239
255
"msgtype" : "m.text" ,
240
256
"body" : "message connected to fake event" ,
241
257
},
242
258
"room_id" : room_id ,
243
- "sender" : user_id ,
259
+ "sender" : f"@user:{ self .OTHER_SERVER_NAME } " ,
260
+ "prev_events" : [
261
+ ev1 .event_id ,
262
+ # We're creating an backward extremity each time thanks
263
+ # to this fake event
264
+ generate_fake_event_id (),
265
+ ],
266
+ # lazy: *everything* is an auth event
267
+ "auth_events" : [ev .event_id for ev in current_state ],
268
+ "depth" : ev1 .depth + 1 ,
244
269
},
245
- prev_event_ids = [
246
- ev1 ["event_id" ],
247
- # We're creating an backward extremity each time thanks
248
- # to this fake event
249
- generate_fake_event_id (),
250
- ],
251
- )
270
+ room_version ,
271
+ ),
272
+ room_version ,
252
273
)
274
+
275
+ # we poke this directly into _process_received_pdu, to avoid the
276
+ # federation handler wanting to backfill the fake event.
253
277
self .get_success (
254
- event_handler .handle_new_client_event (requester , event , context )
278
+ federation_event_handler ._process_received_pdu (
279
+ self .OTHER_SERVER_NAME , event , state = current_state
280
+ )
255
281
)
256
282
283
+ # we should now have 8 backwards extremities.
284
+ backwards_extremities = self .get_success (
285
+ self .store .db_pool .simple_select_list (
286
+ "event_backward_extremities" ,
287
+ keyvalues = {"room_id" : room_id },
288
+ retcols = ["event_id" ],
289
+ )
290
+ )
291
+ self .assertEqual (len (backwards_extremities ), 8 )
292
+
257
293
current_depth = 1
258
294
limit = 100
259
295
with LoggingContext ("receive_pdu" ):
0 commit comments