Skip to content

Commit 2fa54e5

Browse files
MatMaulHywan
authored andcommitted
Activate share_pos on the room-list sliding sync instance
1 parent 04275d7 commit 2fa54e5

File tree

3 files changed

+108
-2
lines changed

3 files changed

+108
-2
lines changed

crates/matrix-sdk-ui/src/room_list_service/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@ impl RoomListService {
135135
}))
136136
.with_typing_extension(assign!(http::request::Typing::default(), {
137137
enabled: Some(true),
138-
}));
138+
}))
139+
// We don't deal with encryption device messages here so this is safe
140+
.share_pos();
139141

140142
let sliding_sync = builder
141143
.add_cached_list(

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

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ use std::{
66
use assert_matches::assert_matches;
77
use eyeball_im::VectorDiff;
88
use futures_util::{pin_mut, FutureExt, StreamExt};
9-
use matrix_sdk::{test_utils::logged_in_client_with_server, Client};
9+
use matrix_sdk::{
10+
config::RequestConfig,
11+
test_utils::{logged_in_client_with_server, set_client_session, test_client_builder},
12+
Client,
13+
};
1014
use matrix_sdk_base::sync::UnreadNotificationsCount;
1115
use matrix_sdk_test::{async_test, mocks::mock_encryption_state};
1216
use matrix_sdk_ui::{
@@ -23,6 +27,7 @@ use ruma::{
2327
};
2428
use serde_json::json;
2529
use stream_assert::{assert_next_matches, assert_pending};
30+
use tempfile::TempDir;
2631
use tokio::{spawn, sync::mpsc::channel, task::yield_now};
2732
use wiremock::{
2833
matchers::{header, method, path},
@@ -38,12 +43,30 @@ async fn new_room_list_service() -> Result<(Client, MockServer, RoomListService)
3843
Ok((client, server, room_list))
3944
}
4045

46+
async fn new_persistent_room_list_service(
47+
store_path: &std::path::Path,
48+
) -> Result<(MockServer, RoomListService), Error> {
49+
let server = MockServer::start().await;
50+
let client = test_client_builder(Some(server.uri().to_string()))
51+
.request_config(RequestConfig::new().disable_retry())
52+
.sqlite_store(store_path, None)
53+
.build()
54+
.await
55+
.unwrap();
56+
set_client_session(&client).await;
57+
58+
let room_list = RoomListService::new(client.clone()).await?;
59+
60+
Ok((server, room_list))
61+
}
62+
4163
// Same macro as in the main, with additional checking that the state
4264
// before/after the sync loop match those we expect.
4365
macro_rules! sync_then_assert_request_and_fake_response {
4466
(
4567
[$server:ident, $room_list:ident, $stream:ident]
4668
$( states = $pre_state:pat => $post_state:pat, )?
69+
$( assert pos $pos:expr, )?
4770
assert request $assert_request:tt { $( $request_json:tt )* },
4871
respond with = $( ( code $code:expr ) )? { $( $response_json:tt )* }
4972
$( , after delay = $response_delay:expr )?
@@ -53,6 +76,7 @@ macro_rules! sync_then_assert_request_and_fake_response {
5376
[$server, $room_list, $stream]
5477
sync matches Some(Ok(_)),
5578
$( states = $pre_state => $post_state, )?
79+
$( assert pos $pos, )?
5680
assert request $assert_request { $( $request_json )* },
5781
respond with = $( ( code $code ) )? { $( $response_json )* },
5882
$( after delay = $response_delay, )?
@@ -63,6 +87,7 @@ macro_rules! sync_then_assert_request_and_fake_response {
6387
[$server:ident, $room_list:ident, $stream:ident]
6488
sync matches $sync_result:pat,
6589
$( states = $pre_state:pat => $post_state:pat, )?
90+
$( assert pos $pos:expr, )?
6691
assert request $assert_request:tt { $( $request_json:tt )* },
6792
respond with = $( ( code $code:expr ) )? { $( $response_json:tt )* }
6893
$( , after delay = $response_delay:expr )?
@@ -80,6 +105,7 @@ macro_rules! sync_then_assert_request_and_fake_response {
80105
let next = super::sliding_sync_then_assert_request_and_fake_response! {
81106
[$server, $stream]
82107
sync matches $sync_result,
108+
$( assert pos $pos, )?
83109
assert request $assert_request { $( $request_json )* },
84110
respond with = $( ( code $code ) )? { $( $response_json )* },
85111
$( after delay = $response_delay, )?
@@ -481,6 +507,7 @@ async fn test_sync_resumes_from_previous_state() -> Result<(), Error> {
481507
sync_then_assert_request_and_fake_response! {
482508
[server, room_list, sync]
483509
states = Init => SettingUp,
510+
assert pos None::<String>,
484511
assert request >= {
485512
"lists": {
486513
ALL_ROOMS: {
@@ -509,6 +536,7 @@ async fn test_sync_resumes_from_previous_state() -> Result<(), Error> {
509536
sync_then_assert_request_and_fake_response! {
510537
[server, room_list, sync]
511538
states = SettingUp => Running,
539+
assert pos Some("0"),
512540
assert request >= {
513541
"lists": {
514542
ALL_ROOMS: {
@@ -537,6 +565,7 @@ async fn test_sync_resumes_from_previous_state() -> Result<(), Error> {
537565
sync_then_assert_request_and_fake_response! {
538566
[server, room_list, sync]
539567
states = Running => Running,
568+
assert pos Some("1"),
540569
assert request >= {
541570
"lists": {
542571
ALL_ROOMS: {
@@ -560,6 +589,70 @@ async fn test_sync_resumes_from_previous_state() -> Result<(), Error> {
560589
Ok(())
561590
}
562591

592+
#[async_test]
593+
async fn test_sync_resumes_from_previous_state_after_restart() -> Result<(), Error> {
594+
let tmp_dir = TempDir::new().unwrap();
595+
let store_path = tmp_dir.path();
596+
597+
{
598+
let (server, room_list) = new_persistent_room_list_service(store_path).await?;
599+
let sync = room_list.sync();
600+
pin_mut!(sync);
601+
602+
sync_then_assert_request_and_fake_response! {
603+
[server, room_list, sync]
604+
states = Init => SettingUp,
605+
assert pos None::<String>,
606+
assert request >= {
607+
"lists": {
608+
ALL_ROOMS: {
609+
"ranges": [[0, 19]],
610+
},
611+
},
612+
},
613+
respond with = {
614+
"pos": "0",
615+
"lists": {
616+
ALL_ROOMS: {
617+
"count": 10,
618+
},
619+
},
620+
"rooms": {},
621+
},
622+
};
623+
}
624+
625+
{
626+
let (server, room_list) = new_persistent_room_list_service(store_path).await?;
627+
let sync = room_list.sync();
628+
pin_mut!(sync);
629+
630+
sync_then_assert_request_and_fake_response! {
631+
[server, room_list, sync]
632+
states = Init => SettingUp,
633+
assert pos Some("0"),
634+
assert request >= {
635+
"lists": {
636+
ALL_ROOMS: {
637+
"ranges": [[0, 19]],
638+
},
639+
},
640+
},
641+
respond with = {
642+
"pos": "1",
643+
"lists": {
644+
ALL_ROOMS: {
645+
"count": 10,
646+
},
647+
},
648+
"rooms": {},
649+
},
650+
};
651+
}
652+
653+
Ok(())
654+
}
655+
563656
#[async_test]
564657
async fn test_sync_resumes_from_error() -> Result<(), Error> {
565658
let (_, server, room_list) = new_room_list_service().await?;

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ impl Match for SlidingSyncMatcher {
5858
macro_rules! sliding_sync_then_assert_request_and_fake_response {
5959
(
6060
[$server:ident, $stream:ident]
61+
$( assert pos $pos:expr, )?
6162
assert request $sign:tt { $( $request_json:tt )* },
6263
respond with = $( ( code $code:expr ) )? { $( $response_json:tt )* }
6364
$( , after delay = $response_delay:expr )?
@@ -66,6 +67,7 @@ macro_rules! sliding_sync_then_assert_request_and_fake_response {
6667
sliding_sync_then_assert_request_and_fake_response! {
6768
[$server, $stream]
6869
sync matches Some(Ok(_)),
70+
$( assert pos $pos, )?
6971
assert request $sign { $( $request_json )* },
7072
respond with = $( ( code $code ) )? { $( $response_json )* },
7173
$( after delay = $response_delay, )?
@@ -75,6 +77,7 @@ macro_rules! sliding_sync_then_assert_request_and_fake_response {
7577
(
7678
[$server:ident, $stream:ident]
7779
sync matches $sync_result:pat,
80+
$( assert pos $pos:expr, )?
7881
assert request $sign:tt { $( $request_json:tt )* },
7982
respond with = $( ( code $code:expr ) )? { $( $response_json:tt )* }
8083
$( , after delay = $response_delay:expr )?
@@ -117,6 +120,14 @@ macro_rules! sliding_sync_then_assert_request_and_fake_response {
117120
root.remove("txn_id");
118121
}
119122

123+
// Validate `pos` from the query parameter if specified.
124+
$(
125+
match $pos {
126+
Some(pos) => assert!(wiremock::matchers::query_param("pos", pos).matches(request)),
127+
None => assert!(wiremock::matchers::query_param_is_missing("pos").matches(request)),
128+
}
129+
)?
130+
120131
if let Err(error) = assert_json_diff::assert_json_matches_no_panic(
121132
&json_value,
122133
&json!({ $( $request_json )* }),

0 commit comments

Comments
 (0)