Skip to content

Commit b645c11

Browse files
committed
refactor(test): avoid proliferation of builder submethods in the MockClientBuilder
Instead of having one static method duplicating an underlying `ClientBuilder` method, we can pass the builder directly to a closure, that will replace it. Call sites are a bit more verbose, but that would avoid having to add duplicate `MockClientBuilder` methods for each `ClientBuilder` method.
1 parent 8091094 commit b645c11

File tree

9 files changed

+201
-117
lines changed

9 files changed

+201
-117
lines changed

benchmarks/benches/event_cache.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,14 @@ fn handle_room_updates(c: &mut Criterion) {
8686
// Setup code.
8787
let client = server
8888
.client_builder()
89-
.store_config(
90-
StoreConfig::new(
91-
"cross-process-store-locks-holder-name".to_owned(),
89+
.on_builder(|builder| {
90+
builder.store_config(
91+
StoreConfig::new(
92+
"cross-process-store-locks-holder-name".to_owned(),
93+
)
94+
.event_cache_store(store.clone()),
9295
)
93-
.event_cache_store(store.clone()),
94-
)
96+
})
9597
.build()
9698
.await;
9799

crates/matrix-sdk/src/authentication/oauth/cross_process.rs

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,11 @@ mod tests {
269269
// Create a client that will use sqlite databases.
270270

271271
let tmp_dir = tempfile::tempdir()?;
272-
let client = MockClientBuilder::new(None).sqlite_store(&tmp_dir).unlogged().build().await;
272+
let client = MockClientBuilder::new(None)
273+
.on_builder(|builder| builder.sqlite_store(&tmp_dir, None))
274+
.unlogged()
275+
.build()
276+
.await;
273277

274278
let tokens = mock_session_tokens_with_refresh();
275279

@@ -315,8 +319,12 @@ mod tests {
315319
server.mock_who_am_i().ok().expect(1).named("whoami").mount().await;
316320

317321
let tmp_dir = tempfile::tempdir()?;
318-
let client =
319-
server.client_builder().sqlite_store(&tmp_dir).registered_with_oauth().build().await;
322+
let client = server
323+
.client_builder()
324+
.on_builder(|builder| builder.sqlite_store(&tmp_dir, None))
325+
.registered_with_oauth()
326+
.build()
327+
.await;
320328
let oauth = client.oauth();
321329

322330
// Enable cross-process lock.
@@ -365,7 +373,12 @@ mod tests {
365373
oauth_server.mock_token().ok().expect(1).named("token").mount().await;
366374

367375
let tmp_dir = tempfile::tempdir()?;
368-
let client = server.client_builder().sqlite_store(&tmp_dir).unlogged().build().await;
376+
let client = server
377+
.client_builder()
378+
.on_builder(|builder| builder.sqlite_store(&tmp_dir, None))
379+
.unlogged()
380+
.build()
381+
.await;
369382
let oauth = client.oauth();
370383

371384
let next_tokens = mock_session_tokens_with_refresh();
@@ -414,7 +427,12 @@ mod tests {
414427

415428
// Create the first client.
416429
let tmp_dir = tempfile::tempdir()?;
417-
let client = server.client_builder().sqlite_store(&tmp_dir).unlogged().build().await;
430+
let client = server
431+
.client_builder()
432+
.on_builder(|builder| builder.sqlite_store(&tmp_dir, None))
433+
.unlogged()
434+
.build()
435+
.await;
418436

419437
let oauth = client.oauth();
420438
oauth.enable_cross_process_refresh_lock("client1".to_owned()).await?;
@@ -425,15 +443,24 @@ mod tests {
425443

426444
// Create a second client, without restoring it, to test that a token update
427445
// before restoration doesn't cause new issues.
428-
let unrestored_client =
429-
server.client_builder().sqlite_store(&tmp_dir).unlogged().build().await;
446+
let unrestored_client = server
447+
.client_builder()
448+
.on_builder(|builder| builder.sqlite_store(&tmp_dir, None))
449+
.unlogged()
450+
.build()
451+
.await;
430452
let unrestored_oauth = unrestored_client.oauth();
431453
unrestored_oauth.enable_cross_process_refresh_lock("unrestored_client".to_owned()).await?;
432454

433455
{
434456
// Create a third client that will run a refresh while the others two are doing
435457
// nothing.
436-
let client3 = server.client_builder().sqlite_store(&tmp_dir).unlogged().build().await;
458+
let client3 = server
459+
.client_builder()
460+
.on_builder(|builder| builder.sqlite_store(&tmp_dir, None))
461+
.unlogged()
462+
.build()
463+
.await;
437464

438465
let oauth3 = client3.oauth();
439466
oauth3.enable_cross_process_refresh_lock("client3".to_owned()).await?;
@@ -541,7 +568,12 @@ mod tests {
541568
oauth_server.mock_revocation().ok().expect(1).named("revocation").mount().await;
542569

543570
let tmp_dir = tempfile::tempdir()?;
544-
let client = server.client_builder().sqlite_store(&tmp_dir).unlogged().build().await;
571+
let client = server
572+
.client_builder()
573+
.on_builder(|builder| builder.sqlite_store(&tmp_dir, None))
574+
.unlogged()
575+
.build()
576+
.await;
545577
let oauth = client.oauth().insecure_rewrite_https_to_http();
546578

547579
// Enable cross-process lock.

crates/matrix-sdk/src/client/mod.rs

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3069,7 +3069,7 @@ pub(crate) mod tests {
30693069
let server = MatrixMockServer::new().await;
30703070
let client = server
30713071
.client_builder()
3072-
.request_config(RequestConfig::new().retry_limit(3))
3072+
.on_builder(|builder| builder.request_config(RequestConfig::new().retry_limit(3)))
30733073
.build()
30743074
.await;
30753075

@@ -3087,7 +3087,9 @@ pub(crate) mod tests {
30873087
let server = MatrixMockServer::new().await;
30883088
let client = server
30893089
.client_builder()
3090-
.request_config(RequestConfig::new().max_retry_time(retry_timeout))
3090+
.on_builder(|builder| {
3091+
builder.request_config(RequestConfig::new().max_retry_time(retry_timeout))
3092+
})
30913093
.build()
30923094
.await;
30933095

@@ -3101,8 +3103,11 @@ pub(crate) mod tests {
31013103
#[async_test]
31023104
async fn test_short_retry_initial_http_requests() {
31033105
let server = MatrixMockServer::new().await;
3104-
let client =
3105-
server.client_builder().request_config(RequestConfig::short_retry()).build().await;
3106+
let client = server
3107+
.client_builder()
3108+
.on_builder(|builder| builder.request_config(RequestConfig::short_retry()))
3109+
.build()
3110+
.await;
31063111

31073112
server.mock_login().error500().expect(3..).mount().await;
31083113

@@ -3318,10 +3323,12 @@ pub(crate) mod tests {
33183323
let client = server
33193324
.client_builder()
33203325
.no_server_versions()
3321-
.store_config(
3322-
StoreConfig::new("cross-process-store-locks-holder-name".to_owned())
3323-
.state_store(memory_store.clone()),
3324-
)
3326+
.on_builder(|builder| {
3327+
builder.store_config(
3328+
StoreConfig::new("cross-process-store-locks-holder-name".to_owned())
3329+
.state_store(memory_store.clone()),
3330+
)
3331+
})
33253332
.build()
33263333
.await;
33273334

@@ -3372,10 +3379,12 @@ pub(crate) mod tests {
33723379
let client = server
33733380
.client_builder()
33743381
.no_server_versions()
3375-
.store_config(
3376-
StoreConfig::new("cross-process-store-locks-holder-name".to_owned())
3377-
.state_store(memory_store.clone()),
3378-
)
3382+
.on_builder(|builder| {
3383+
builder.store_config(
3384+
StoreConfig::new("cross-process-store-locks-holder-name".to_owned())
3385+
.state_store(memory_store.clone()),
3386+
)
3387+
})
33793388
.build()
33803389
.await;
33813390

@@ -3390,10 +3399,12 @@ pub(crate) mod tests {
33903399
let client = server
33913400
.client_builder()
33923401
.no_server_versions()
3393-
.store_config(
3394-
StoreConfig::new("cross-process-store-locks-holder-name".to_owned())
3395-
.state_store(memory_store.clone()),
3396-
)
3402+
.on_builder(|builder| {
3403+
builder.store_config(
3404+
StoreConfig::new("cross-process-store-locks-holder-name".to_owned())
3405+
.state_store(memory_store.clone()),
3406+
)
3407+
})
33973408
.build()
33983409
.await;
33993410

@@ -3424,8 +3435,10 @@ pub(crate) mod tests {
34243435
#[async_test]
34253436
async fn test_no_network_doesnt_cause_infinite_retries() {
34263437
// We want infinite retries for transient errors.
3427-
let client =
3428-
MockClientBuilder::new(None).request_config(RequestConfig::new()).build().await;
3438+
let client = MockClientBuilder::new(None)
3439+
.on_builder(|builder| builder.request_config(RequestConfig::new()))
3440+
.build()
3441+
.await;
34293442

34303443
// We don't define a mock server on purpose here, so that the error is really a
34313444
// network error.

crates/matrix-sdk/src/event_cache/room/mod.rs

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2221,9 +2221,12 @@ mod timed_tests {
22212221
let event_cache_store = Arc::new(MemoryStore::new());
22222222

22232223
let client = MockClientBuilder::new(None)
2224-
.store_config(
2225-
StoreConfig::new("hodlor".to_owned()).event_cache_store(event_cache_store.clone()),
2226-
)
2224+
.on_builder(|builder| {
2225+
builder.store_config(
2226+
StoreConfig::new("hodlor".to_owned())
2227+
.event_cache_store(event_cache_store.clone()),
2228+
)
2229+
})
22272230
.build()
22282231
.await;
22292232

@@ -2295,9 +2298,12 @@ mod timed_tests {
22952298
let event_cache_store = Arc::new(MemoryStore::new());
22962299

22972300
let client = MockClientBuilder::new(None)
2298-
.store_config(
2299-
StoreConfig::new("hodlor".to_owned()).event_cache_store(event_cache_store.clone()),
2300-
)
2301+
.on_builder(|builder| {
2302+
builder.store_config(
2303+
StoreConfig::new("hodlor".to_owned())
2304+
.event_cache_store(event_cache_store.clone()),
2305+
)
2306+
})
23012307
.build()
23022308
.await;
23032309

@@ -2434,9 +2440,12 @@ mod timed_tests {
24342440
.unwrap();
24352441

24362442
let client = MockClientBuilder::new(None)
2437-
.store_config(
2438-
StoreConfig::new("hodlor".to_owned()).event_cache_store(event_cache_store.clone()),
2439-
)
2443+
.on_builder(|builder| {
2444+
builder.store_config(
2445+
StoreConfig::new("hodlor".to_owned())
2446+
.event_cache_store(event_cache_store.clone()),
2447+
)
2448+
})
24402449
.build()
24412450
.await;
24422451

@@ -2585,9 +2594,12 @@ mod timed_tests {
25852594
.unwrap();
25862595

25872596
let client = MockClientBuilder::new(None)
2588-
.store_config(
2589-
StoreConfig::new("hodlor".to_owned()).event_cache_store(event_cache_store.clone()),
2590-
)
2597+
.on_builder(|builder| {
2598+
builder.store_config(
2599+
StoreConfig::new("hodlor".to_owned())
2600+
.event_cache_store(event_cache_store.clone()),
2601+
)
2602+
})
25912603
.build()
25922604
.await;
25932605

@@ -2706,9 +2718,12 @@ mod timed_tests {
27062718
.unwrap();
27072719

27082720
let client = MockClientBuilder::new(None)
2709-
.store_config(
2710-
StoreConfig::new("holder".to_owned()).event_cache_store(event_cache_store.clone()),
2711-
)
2721+
.on_builder(|builder| {
2722+
builder.store_config(
2723+
StoreConfig::new("holder".to_owned())
2724+
.event_cache_store(event_cache_store.clone()),
2725+
)
2726+
})
27122727
.build()
27132728
.await;
27142729

crates/matrix-sdk/src/test_utils/client.rs

Lines changed: 22 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@
1414

1515
//! Augmented [`ClientBuilder`] that can set up an already logged-in user.
1616
17-
use matrix_sdk_base::{
18-
store::{RoomLoadSettings, StoreConfig},
19-
SessionMeta,
20-
};
17+
use matrix_sdk_base::{store::RoomLoadSettings, SessionMeta};
2118
use ruma::{api::MatrixVersion, owned_device_id, owned_user_id, OwnedDeviceId, OwnedUserId};
2219

2320
use crate::{
@@ -39,7 +36,7 @@ impl MockClientBuilder {
3936
/// default).
4037
///
4138
/// If no homeserver is provided, `http://localhost` is used as a homeserver.
42-
pub(crate) fn new(homeserver: Option<&str>) -> Self {
39+
pub fn new(homeserver: Option<&str>) -> Self {
4340
let homeserver = homeserver.unwrap_or("http://localhost");
4441

4542
let default_builder = Client::builder()
@@ -63,23 +60,6 @@ impl MockClientBuilder {
6360
self
6461
}
6562

66-
/// Enable the share history on invite feature for the Client.
67-
#[cfg(feature = "e2e-encryption")]
68-
pub fn enable_share_history_on_invite(mut self) -> Self {
69-
self.builder = self.builder.with_enable_share_history_on_invite(true);
70-
self
71-
}
72-
73-
/// Use the given encryption settings with the test client.
74-
#[cfg(feature = "e2e-encryption")]
75-
pub fn with_encryption_settings(
76-
mut self,
77-
settings: crate::encryption::EncryptionSettings,
78-
) -> Self {
79-
self.builder = self.builder.with_encryption_settings(settings);
80-
self
81-
}
82-
8363
/// Set the cached server versions in the client.
8464
pub fn server_versions(mut self, versions: Vec<MatrixVersion>) -> Self {
8565
self.server_versions = ServerVersions::Custom(versions);
@@ -121,30 +101,25 @@ impl MockClientBuilder {
121101
self
122102
}
123103

124-
/// Override the default [`RequestConfig`] for the underlying
125-
/// [`ClientBuilder`].
126-
pub fn request_config(mut self, request_config: RequestConfig) -> Self {
127-
self.builder = self.builder.request_config(request_config);
128-
self
129-
}
130-
131-
/// Provides another [`StoreConfig`] for the underlying [`ClientBuilder`].
132-
pub fn store_config(mut self, store_config: StoreConfig) -> Self {
133-
self.builder = self.builder.store_config(store_config);
134-
self
135-
}
136-
137-
/// Use an SQLite store at the given path for the underlying
138-
/// [`ClientBuilder`].
139-
#[cfg(feature = "sqlite")]
140-
pub fn sqlite_store(mut self, path: impl AsRef<std::path::Path>) -> Self {
141-
self.builder = self.builder.sqlite_store(path, None);
142-
self
143-
}
144-
145-
/// Handle refreshing access tokens automatically.
146-
pub fn handle_refresh_tokens(mut self) -> Self {
147-
self.builder = self.builder.handle_refresh_tokens();
104+
/// Apply changes to the underlying [`ClientBuilder`].
105+
///
106+
/// ```
107+
/// # tokio_test::block_on(async {
108+
/// use matrix_sdk::test_utils::client::MockClientBuilder;
109+
///
110+
/// MockClientBuilder::new(None)
111+
/// .on_builder(|builder| {
112+
/// // Here it's possible to modify the underlying `ClientBuilder`.
113+
/// builder
114+
/// .handle_refresh_tokens()
115+
/// .cross_process_store_locks_holder_name("hodor".to_owned())
116+
/// })
117+
/// .build()
118+
/// .await;
119+
/// # anyhow::Ok(()) });
120+
/// ```
121+
pub fn on_builder<F: FnOnce(ClientBuilder) -> ClientBuilder>(mut self, f: F) -> Self {
122+
self.builder = f(self.builder);
148123
self
149124
}
150125

@@ -157,6 +132,7 @@ impl MockClientBuilder {
157132
}
158133

159134
let client = builder.build().await.expect("building client failed");
135+
160136
self.auth_state.maybe_restore_client(&client).await;
161137

162138
client

0 commit comments

Comments
 (0)