1616
1717from synapse .handlers .typing import RoomMember
1818from synapse .replication .tcp .streams import TypingStream
19+ from synapse .util .caches .stream_change_cache import StreamChangeCache
1920
2021from tests .replication ._base import BaseStreamTestCase
2122
2223USER_ID = "@feeling:blue"
24+ USER_ID_2 = "@da-ba-dee:blue"
25+
26+ ROOM_ID = "!bar:blue"
27+ ROOM_ID_2 = "!foo:blue"
2328
2429
2530class TypingStreamTestCase (BaseStreamTestCase ):
@@ -29,11 +34,9 @@ def _build_replication_data_handler(self):
2934 def test_typing (self ):
3035 typing = self .hs .get_typing_handler ()
3136
32- room_id = "!bar:blue"
33-
3437 self .reconnect ()
3538
36- typing ._push_update (member = RoomMember (room_id , USER_ID ), typing = True )
39+ typing ._push_update (member = RoomMember (ROOM_ID , USER_ID ), typing = True )
3740
3841 self .reactor .advance (0 )
3942
@@ -46,15 +49,15 @@ def test_typing(self):
4649 self .assertEqual (stream_name , "typing" )
4750 self .assertEqual (1 , len (rdata_rows ))
4851 row = rdata_rows [0 ] # type: TypingStream.TypingStreamRow
49- self .assertEqual (room_id , row .room_id )
52+ self .assertEqual (ROOM_ID , row .room_id )
5053 self .assertEqual ([USER_ID ], row .user_ids )
5154
5255 # Now let's disconnect and insert some data.
5356 self .disconnect ()
5457
5558 self .test_handler .on_rdata .reset_mock ()
5659
57- typing ._push_update (member = RoomMember (room_id , USER_ID ), typing = False )
60+ typing ._push_update (member = RoomMember (ROOM_ID , USER_ID ), typing = False )
5861
5962 self .test_handler .on_rdata .assert_not_called ()
6063
@@ -73,5 +76,78 @@ def test_typing(self):
7376 self .assertEqual (stream_name , "typing" )
7477 self .assertEqual (1 , len (rdata_rows ))
7578 row = rdata_rows [0 ]
76- self .assertEqual (room_id , row .room_id )
79+ self .assertEqual (ROOM_ID , row .room_id )
80+ self .assertEqual ([], row .user_ids )
81+
82+ def test_reset (self ):
83+ """
84+ Test what happens when a typing stream resets.
85+
86+ This is emulated by jumping the stream ahead, then reconnecting (which
87+ sends the proper position and RDATA).
88+ """
89+ typing = self .hs .get_typing_handler ()
90+
91+ self .reconnect ()
92+
93+ typing ._push_update (member = RoomMember (ROOM_ID , USER_ID ), typing = True )
94+
95+ self .reactor .advance (0 )
96+
97+ # We should now see an attempt to connect to the master
98+ request = self .handle_http_replication_attempt ()
99+ self .assert_request_is_get_repl_stream_updates (request , "typing" )
100+
101+ self .test_handler .on_rdata .assert_called_once ()
102+ stream_name , _ , token , rdata_rows = self .test_handler .on_rdata .call_args [0 ]
103+ self .assertEqual (stream_name , "typing" )
104+ self .assertEqual (1 , len (rdata_rows ))
105+ row = rdata_rows [0 ] # type: TypingStream.TypingStreamRow
106+ self .assertEqual (ROOM_ID , row .room_id )
107+ self .assertEqual ([USER_ID ], row .user_ids )
108+
109+ # Push the stream forward a bunch so it can be reset.
110+ for i in range (100 ):
111+ typing ._push_update (
112+ member = RoomMember (ROOM_ID , "@test%s:blue" % i ), typing = True
113+ )
114+ self .reactor .advance (0 )
115+
116+ # Disconnect.
117+ self .disconnect ()
118+
119+ # Reset the typing handler
120+ self .hs .get_replication_streams ()["typing" ].last_token = 0
121+ self .hs .get_tcp_replication ()._streams ["typing" ].last_token = 0
122+ typing ._latest_room_serial = 0
123+ typing ._typing_stream_change_cache = StreamChangeCache (
124+ "TypingStreamChangeCache" , typing ._latest_room_serial
125+ )
126+ typing ._reset ()
127+
128+ # Reconnect.
129+ self .reconnect ()
130+ self .pump (0.1 )
131+
132+ # We should now see an attempt to connect to the master
133+ request = self .handle_http_replication_attempt ()
134+ self .assert_request_is_get_repl_stream_updates (request , "typing" )
135+
136+ # Reset the test code.
137+ self .test_handler .on_rdata .reset_mock ()
138+ self .test_handler .on_rdata .assert_not_called ()
139+
140+ # Push additional data.
141+ typing ._push_update (member = RoomMember (ROOM_ID_2 , USER_ID_2 ), typing = False )
142+ self .reactor .advance (0 )
143+
144+ self .test_handler .on_rdata .assert_called_once ()
145+ stream_name , _ , token , rdata_rows = self .test_handler .on_rdata .call_args [0 ]
146+ self .assertEqual (stream_name , "typing" )
147+ self .assertEqual (1 , len (rdata_rows ))
148+ row = rdata_rows [0 ]
149+ self .assertEqual (ROOM_ID_2 , row .room_id )
77150 self .assertEqual ([], row .user_ids )
151+
152+ # The token should have been reset.
153+ self .assertEqual (token , 1 )
0 commit comments