@@ -6,7 +6,11 @@ use std::{
6
6
use assert_matches:: assert_matches;
7
7
use eyeball_im:: VectorDiff ;
8
8
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
+ } ;
10
14
use matrix_sdk_base:: sync:: UnreadNotificationsCount ;
11
15
use matrix_sdk_test:: { async_test, mocks:: mock_encryption_state} ;
12
16
use matrix_sdk_ui:: {
@@ -23,6 +27,7 @@ use ruma::{
23
27
} ;
24
28
use serde_json:: json;
25
29
use stream_assert:: { assert_next_matches, assert_pending} ;
30
+ use tempfile:: TempDir ;
26
31
use tokio:: { spawn, sync:: mpsc:: channel, task:: yield_now} ;
27
32
use wiremock:: {
28
33
matchers:: { header, method, path} ,
@@ -38,12 +43,30 @@ async fn new_room_list_service() -> Result<(Client, MockServer, RoomListService)
38
43
Ok ( ( client, server, room_list) )
39
44
}
40
45
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
+
41
63
// Same macro as in the main, with additional checking that the state
42
64
// before/after the sync loop match those we expect.
43
65
macro_rules! sync_then_assert_request_and_fake_response {
44
66
(
45
67
[ $server: ident, $room_list: ident, $stream: ident]
46
68
$( states = $pre_state: pat => $post_state: pat, ) ?
69
+ $( assert pos $pos: expr, ) ?
47
70
assert request $assert_request: tt { $( $request_json: tt ) * } ,
48
71
respond with = $( ( code $code: expr ) ) ? { $( $response_json: tt ) * }
49
72
$( , after delay = $response_delay: expr ) ?
@@ -53,6 +76,7 @@ macro_rules! sync_then_assert_request_and_fake_response {
53
76
[ $server, $room_list, $stream]
54
77
sync matches Some ( Ok ( _) ) ,
55
78
$( states = $pre_state => $post_state, ) ?
79
+ $( assert pos $pos, ) ?
56
80
assert request $assert_request { $( $request_json ) * } ,
57
81
respond with = $( ( code $code ) ) ? { $( $response_json ) * } ,
58
82
$( after delay = $response_delay, ) ?
@@ -63,6 +87,7 @@ macro_rules! sync_then_assert_request_and_fake_response {
63
87
[ $server: ident, $room_list: ident, $stream: ident]
64
88
sync matches $sync_result: pat,
65
89
$( states = $pre_state: pat => $post_state: pat, ) ?
90
+ $( assert pos $pos: expr, ) ?
66
91
assert request $assert_request: tt { $( $request_json: tt ) * } ,
67
92
respond with = $( ( code $code: expr ) ) ? { $( $response_json: tt ) * }
68
93
$( , after delay = $response_delay: expr ) ?
@@ -80,6 +105,7 @@ macro_rules! sync_then_assert_request_and_fake_response {
80
105
let next = super :: sliding_sync_then_assert_request_and_fake_response! {
81
106
[ $server, $stream]
82
107
sync matches $sync_result,
108
+ $( assert pos $pos, ) ?
83
109
assert request $assert_request { $( $request_json ) * } ,
84
110
respond with = $( ( code $code ) ) ? { $( $response_json ) * } ,
85
111
$( after delay = $response_delay, ) ?
@@ -481,6 +507,7 @@ async fn test_sync_resumes_from_previous_state() -> Result<(), Error> {
481
507
sync_then_assert_request_and_fake_response ! {
482
508
[ server, room_list, sync]
483
509
states = Init => SettingUp ,
510
+ assert pos None :: <String >,
484
511
assert request >= {
485
512
"lists" : {
486
513
ALL_ROOMS : {
@@ -509,6 +536,7 @@ async fn test_sync_resumes_from_previous_state() -> Result<(), Error> {
509
536
sync_then_assert_request_and_fake_response ! {
510
537
[ server, room_list, sync]
511
538
states = SettingUp => Running ,
539
+ assert pos Some ( "0" ) ,
512
540
assert request >= {
513
541
"lists" : {
514
542
ALL_ROOMS : {
@@ -537,6 +565,7 @@ async fn test_sync_resumes_from_previous_state() -> Result<(), Error> {
537
565
sync_then_assert_request_and_fake_response ! {
538
566
[ server, room_list, sync]
539
567
states = Running => Running ,
568
+ assert pos Some ( "1" ) ,
540
569
assert request >= {
541
570
"lists" : {
542
571
ALL_ROOMS : {
@@ -560,6 +589,70 @@ async fn test_sync_resumes_from_previous_state() -> Result<(), Error> {
560
589
Ok ( ( ) )
561
590
}
562
591
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
+
563
656
#[ async_test]
564
657
async fn test_sync_resumes_from_error ( ) -> Result < ( ) , Error > {
565
658
let ( _, server, room_list) = new_room_list_service ( ) . await ?;
0 commit comments