@@ -329,3 +329,110 @@ def test_do_not_prune_gap_if_not_dummy(self):
329329
330330 # Check the new extremity is just the new remote event.
331331 self .assert_extremities ([local_message_event_id , remote_event_2 .event_id ])
332+
333+
334+ class InvalideUsersInRoomCacheTestCase (HomeserverTestCase ):
335+ servlets = [
336+ admin .register_servlets ,
337+ room .register_servlets ,
338+ login .register_servlets ,
339+ ]
340+
341+ def prepare (self , reactor , clock , homeserver ):
342+ self .state = self .hs .get_state_handler ()
343+ self .persistence = self .hs .get_storage ().persistence
344+ self .store = self .hs .get_datastore ()
345+
346+ def test_remote_user_rooms_cache_invalidated (self ):
347+ """Test that if the server leaves a room the `get_rooms_for_user` cache
348+ is invalidated for remote users.
349+ """
350+
351+ # Set up a room with a local and remote user in it.
352+ user_id = self .register_user ("user" , "pass" )
353+ token = self .login ("user" , "pass" )
354+
355+ room_id = self .helper .create_room_as (
356+ "user" , room_version = RoomVersions .V6 .identifier , tok = token
357+ )
358+
359+ body = self .helper .send (room_id , body = "Test" , tok = token )
360+ local_message_event_id = body ["event_id" ]
361+
362+ # Fudge a join event for a remote user.
363+ remote_user = "@user:other"
364+ remote_event_1 = event_from_pdu_json (
365+ {
366+ "type" : EventTypes .Member ,
367+ "state_key" : remote_user ,
368+ "content" : {"membership" : Membership .JOIN },
369+ "room_id" : room_id ,
370+ "sender" : remote_user ,
371+ "depth" : 5 ,
372+ "prev_events" : [local_message_event_id ],
373+ "auth_events" : [],
374+ "origin_server_ts" : self .clock .time_msec (),
375+ },
376+ RoomVersions .V6 ,
377+ )
378+
379+ context = self .get_success (self .state .compute_event_context (remote_event_1 ))
380+ self .get_success (self .persistence .persist_event (remote_event_1 , context ))
381+
382+ # Call `get_rooms_for_user` to add the remote user to the cache
383+ rooms = self .get_success (self .store .get_rooms_for_user (remote_user ))
384+ self .assertEqual (set (rooms ), {room_id })
385+
386+ # Now we have the local server leave the room, and check that calling
387+ # `get_user_in_room` for the remote user no longer includes the room.
388+ self .helper .leave (room_id , user_id , tok = token )
389+
390+ rooms = self .get_success (self .store .get_rooms_for_user (remote_user ))
391+ self .assertEqual (set (rooms ), set ())
392+
393+ def test_room_remote_user_cache_invalidated (self ):
394+ """Test that if the server leaves a room the `get_users_in_room` cache
395+ is invalidated for remote users.
396+ """
397+
398+ # Set up a room with a local and remote user in it.
399+ user_id = self .register_user ("user" , "pass" )
400+ token = self .login ("user" , "pass" )
401+
402+ room_id = self .helper .create_room_as (
403+ "user" , room_version = RoomVersions .V6 .identifier , tok = token
404+ )
405+
406+ body = self .helper .send (room_id , body = "Test" , tok = token )
407+ local_message_event_id = body ["event_id" ]
408+
409+ # Fudge a join event for a remote user.
410+ remote_user = "@user:other"
411+ remote_event_1 = event_from_pdu_json (
412+ {
413+ "type" : EventTypes .Member ,
414+ "state_key" : remote_user ,
415+ "content" : {"membership" : Membership .JOIN },
416+ "room_id" : room_id ,
417+ "sender" : remote_user ,
418+ "depth" : 5 ,
419+ "prev_events" : [local_message_event_id ],
420+ "auth_events" : [],
421+ "origin_server_ts" : self .clock .time_msec (),
422+ },
423+ RoomVersions .V6 ,
424+ )
425+
426+ context = self .get_success (self .state .compute_event_context (remote_event_1 ))
427+ self .get_success (self .persistence .persist_event (remote_event_1 , context ))
428+
429+ # Call `get_users_in_room` to add the remote user to the cache
430+ users = self .get_success (self .store .get_users_in_room (room_id ))
431+ self .assertEqual (set (users ), {user_id , remote_user })
432+
433+ # Now we have the local server leave the room, and check that calling
434+ # `get_user_in_room` for the remote user no longer includes the room.
435+ self .helper .leave (room_id , user_id , tok = token )
436+
437+ users = self .get_success (self .store .get_users_in_room (room_id ))
438+ self .assertEqual (users , [])
0 commit comments