Skip to content

Commit 4684cfb

Browse files
committed
chore: Replace Timeline::subscribe by Timeline::subscribe_batched.
This patch changes all calls to `Timeline::subscribe` to replace them by `Timeline::subscribe_batched`. Most of them are in tests. It's the first step of a plan to remove `Timeline::subscribe`. The rest of the patch updates all the tests to use `Timeline::subscribe_batched`.
1 parent 991c9ad commit 4684cfb

File tree

18 files changed

+839
-596
lines changed

18 files changed

+839
-596
lines changed

benchmarks/benches/room_bench.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ pub fn load_pinned_events_benchmark(c: &mut Criterion) {
198198
.await
199199
.expect("Could not create timeline");
200200

201-
let (items, _) = timeline.subscribe().await;
201+
let (items, _) = timeline.subscribe_batched().await;
202202
assert_eq!(items.len(), PINNED_EVENTS_COUNT + 1);
203203
timeline.clear().await;
204204
});

crates/matrix-sdk-ui/tests/integration/room_list_service.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2430,7 +2430,7 @@ async fn test_room_timeline() -> Result<(), Error> {
24302430
room.init_timeline_with_builder(room.default_room_timeline_builder().await.unwrap()).await?;
24312431
let timeline = room.timeline().unwrap();
24322432

2433-
let (previous_timeline_items, mut timeline_items_stream) = timeline.subscribe().await;
2433+
let (previous_timeline_items, mut timeline_items_stream) = timeline.subscribe_batched().await;
24342434

24352435
sync_then_assert_request_and_fake_response! {
24362436
[server, room_list, sync]
@@ -2493,7 +2493,7 @@ async fn test_room_empty_timeline() {
24932493
// The room wasn't synced, but it will be available
24942494
let room = room_list.room(&room_id).unwrap();
24952495
let timeline = room.default_room_timeline_builder().await.unwrap().build().await.unwrap();
2496-
let (prev_items, _) = timeline.subscribe().await;
2496+
let (prev_items, _) = timeline.subscribe_batched().await;
24972497

24982498
// However, since the room wasn't synced its timeline won't have any initial
24992499
// items

crates/matrix-sdk-ui/tests/integration/timeline/echo.rs

+43-24
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ use assert_matches2::assert_let;
1919
use eyeball_im::VectorDiff;
2020
use futures_util::StreamExt;
2121
use matrix_sdk::{
22-
assert_next_matches_with_timeout, config::SyncSettings, executor::spawn,
23-
ruma::MilliSecondsSinceUnixEpoch, test_utils::logged_in_client_with_server,
22+
config::SyncSettings, executor::spawn, ruma::MilliSecondsSinceUnixEpoch,
23+
test_utils::logged_in_client_with_server,
2424
};
2525
use matrix_sdk_test::{
2626
async_test, event_factory::EventFactory, mocks::mock_encryption_state, JoinedRoomBuilder,
@@ -33,7 +33,7 @@ use ruma::{
3333
room_id, uint, user_id,
3434
};
3535
use serde_json::json;
36-
use stream_assert::assert_next_matches;
36+
use stream_assert::{assert_next_matches, assert_pending};
3737
use tokio::task::yield_now;
3838
use wiremock::{
3939
matchers::{header, method, path_regex},
@@ -65,7 +65,7 @@ async fn test_echo() {
6565
.await
6666
.unwrap(),
6767
);
68-
let (_, mut timeline_stream) = timeline.subscribe().await;
68+
let (_, mut timeline_stream) = timeline.subscribe_batched().await;
6969

7070
let event_id = event_id!("$ev");
7171

@@ -83,7 +83,10 @@ async fn test_echo() {
8383
timeline.send(RoomMessageEventContent::text_plain("Hello, World!").into()).await
8484
});
8585

86-
assert_let!(Some(VectorDiff::PushBack { value: local_echo }) = timeline_stream.next().await);
86+
assert_let!(Some(timeline_updates) = timeline_stream.next().await);
87+
assert_eq!(timeline_updates.len(), 2);
88+
89+
assert_let!(VectorDiff::PushBack { value: local_echo } = &timeline_updates[0]);
8790
let item = local_echo.as_event().unwrap();
8891
assert_matches!(item.send_state(), Some(EventSendState::NotSentYet));
8992
assert_let!(TimelineItemContent::Message(msg) = item.content());
@@ -92,15 +95,16 @@ async fn test_echo() {
9295
assert!(item.event_id().is_none());
9396
let txn_id = item.transaction_id().unwrap();
9497

95-
assert_let!(Some(VectorDiff::PushFront { value: date_divider }) = timeline_stream.next().await);
98+
assert_let!(VectorDiff::PushFront { value: date_divider } = &timeline_updates[1]);
9699
assert!(date_divider.is_date_divider());
97100

98101
// Wait for the sending to finish and assert everything was successful
99102
send_hdl.await.unwrap().unwrap();
100103

101-
assert_let!(
102-
Some(VectorDiff::Set { index: 1, value: sent_confirmation }) = timeline_stream.next().await
103-
);
104+
assert_let!(Some(timeline_updates) = timeline_stream.next().await);
105+
assert_eq!(timeline_updates.len(), 1);
106+
107+
assert_let!(VectorDiff::Set { index: 1, value: sent_confirmation } = &timeline_updates[0]);
104108
let item = sent_confirmation.as_event().unwrap();
105109
assert_matches!(item.send_state(), Some(EventSendState::Sent { .. }));
106110
assert_eq!(item.event_id(), Some(event_id));
@@ -120,19 +124,24 @@ async fn test_echo() {
120124
let _response = client.sync_once(sync_settings.clone()).await.unwrap();
121125
server.reset().await;
122126

127+
assert_let!(Some(timeline_updates) = timeline_stream.next().await);
128+
assert_eq!(timeline_updates.len(), 4);
129+
123130
// Local echo is replaced with the remote echo.
124-
assert_next_matches!(timeline_stream, VectorDiff::Remove { index: 1 });
125-
let remote_echo =
126-
assert_next_matches!(timeline_stream, VectorDiff::PushFront { value } => value);
131+
assert_let!(VectorDiff::Remove { index: 1 } = &timeline_updates[0]);
132+
133+
assert_let!(VectorDiff::PushFront { value: remote_echo } = &timeline_updates[1]);
127134
let item = remote_echo.as_event().unwrap();
128135
assert!(item.is_own());
129136
assert_eq!(item.timestamp(), MilliSecondsSinceUnixEpoch(uint!(152038280)));
130137

131138
// The date divider is also replaced.
132-
let date_divider =
133-
assert_next_matches!(timeline_stream, VectorDiff::PushFront { value } => value);
139+
assert_let!(VectorDiff::PushFront { value: date_divider } = &timeline_updates[2]);
134140
assert!(date_divider.is_date_divider());
135-
assert_next_matches!(timeline_stream, VectorDiff::Remove { index: 2 });
141+
142+
assert_let!(VectorDiff::Remove { index: 2 } = &timeline_updates[3]);
143+
144+
assert_pending!(timeline_stream);
136145
}
137146

138147
#[async_test]
@@ -229,7 +238,7 @@ async fn test_dedup_by_event_id_late() {
229238

230239
let room = client.get_room(room_id).unwrap();
231240
let timeline = Arc::new(room.timeline().await.unwrap());
232-
let (_, mut timeline_stream) = timeline.subscribe().await;
241+
let (_, mut timeline_stream) = timeline.subscribe_batched().await;
233242

234243
let event_id = event_id!("$wWgymRfo7ri1uQx0NXO40vLJ");
235244

@@ -251,14 +260,16 @@ async fn test_dedup_by_event_id_late() {
251260

252261
timeline.send(RoomMessageEventContent::text_plain("Hello, World!").into()).await.unwrap();
253262

263+
assert_let!(Some(timeline_updates) = timeline_stream.next().await);
264+
assert_eq!(timeline_updates.len(), 2);
265+
254266
// Timeline: [local echo]
255-
let local_echo =
256-
assert_next_matches_with_timeout!(timeline_stream, VectorDiff::PushBack { value } => value);
267+
assert_let!(VectorDiff::PushBack { value: local_echo } = &timeline_updates[0]);
257268
let item = local_echo.as_event().unwrap();
258269
assert_matches!(item.send_state(), Some(EventSendState::NotSentYet));
259270

260271
// Timeline: [date-divider, local echo]
261-
let date_divider = assert_next_matches_with_timeout!( timeline_stream, VectorDiff::PushFront { value } => value);
272+
assert_let!(VectorDiff::PushFront { value: date_divider } = &timeline_updates[1]);
262273
assert!(date_divider.is_date_divider());
263274

264275
let f = EventFactory::new();
@@ -275,21 +286,29 @@ async fn test_dedup_by_event_id_late() {
275286
mock_sync(&server, sync_builder.build_json_sync_response(), None).await;
276287
let _response = client.sync_once(sync_settings.clone()).await.unwrap();
277288

289+
assert_let!(Some(timeline_updates) = timeline_stream.next().await);
290+
assert_eq!(timeline_updates.len(), 2);
291+
278292
// Timeline: [remote-echo, date-divider, local echo]
279-
let remote_echo =
280-
assert_next_matches!(timeline_stream, VectorDiff::PushFront { value } => value);
293+
assert_let!(VectorDiff::PushFront { value: remote_echo } = &timeline_updates[0]);
281294
let item = remote_echo.as_event().unwrap();
282295
assert_eq!(item.event_id(), Some(event_id));
283296

284297
// Timeline: [date-divider, remote-echo, date-divider, local echo]
285-
let date_divider = assert_next_matches_with_timeout!(timeline_stream, VectorDiff::PushFront { value } => value);
298+
assert_let!(VectorDiff::PushFront { value: date_divider } = &timeline_updates[1]);
286299
assert!(date_divider.is_date_divider());
287300

301+
assert_let!(Some(timeline_updates) = timeline_stream.next().await);
302+
assert_eq!(timeline_updates.len(), 2);
303+
288304
// Local echo and its date divider are removed.
289305
// Timeline: [date-divider, remote-echo, date-divider]
290-
assert_matches!(timeline_stream.next().await, Some(VectorDiff::Remove { index: 3 }));
306+
assert_let!(VectorDiff::Remove { index: 3 } = &timeline_updates[0]);
307+
291308
// Timeline: [date-divider, remote-echo]
292-
assert_matches!(timeline_stream.next().await, Some(VectorDiff::Remove { index: 2 }));
309+
assert_let!(VectorDiff::Remove { index: 2 } = &timeline_updates[1]);
310+
311+
assert_pending!(timeline_stream);
293312
}
294313

295314
#[async_test]

0 commit comments

Comments
 (0)