Skip to content

Commit 6ceb6e5

Browse files
committed
test: Test that we don't end up in a deadlock when fetching the version
1 parent 957f72a commit 6ceb6e5

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

crates/matrix-sdk/tests/integration/refresh_token.rs

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use serde_json::json;
3030
use tokio::sync::{broadcast::error::TryRecvError, mpsc};
3131
use wiremock::{
3232
Mock, ResponseTemplate,
33-
matchers::{body_partial_json, header, method, path},
33+
matchers::{body_partial_json, header, method, path, path_regex},
3434
};
3535

3636
fn session() -> MatrixSession {
@@ -764,3 +764,74 @@ async fn test_oauth_handle_refresh_tokens() {
764764
"There should be no more session changes"
765765
);
766766
}
767+
768+
#[async_test]
769+
async fn test_oauth_handle_refresh_tokens_without_versions() {
770+
use matrix_sdk::test_utils::{
771+
client::{
772+
mock_prev_session_tokens_with_refresh, mock_session_tokens_with_refresh,
773+
oauth::mock_session,
774+
},
775+
mocks::MatrixMockServer,
776+
};
777+
778+
let server = MatrixMockServer::new().await;
779+
let oauth_server = server.oauth();
780+
781+
// If we provide an access token, we encounter a failure, likely because the
782+
// token has expired.
783+
Mock::given(method("GET"))
784+
.and(path_regex(r"^/_matrix/client/versions"))
785+
.and(header("authorization", "Bearer prev-access-token"))
786+
.respond_with(ResponseTemplate::new(401))
787+
.mount(server.server())
788+
.await;
789+
790+
// If we do not provide an access token, all is fine as the endpoint does not
791+
// require one.
792+
Mock::given(method("GET"))
793+
.and(path_regex(r"^/_matrix/client/versions"))
794+
.respond_with(ResponseTemplate::new(200).set_body_json(json!({
795+
"versions": [
796+
"r0.0.1",
797+
"v1.1"
798+
]
799+
})))
800+
.expect(1..)
801+
.mount(server.server())
802+
.await;
803+
804+
oauth_server.mock_server_metadata().ok().expect(1..).named("server_metadata").mount().await;
805+
806+
let client = server
807+
.client_builder()
808+
.unlogged()
809+
.on_builder(|builder| builder.handle_refresh_tokens())
810+
.build()
811+
.await;
812+
813+
let oauth = client.oauth();
814+
oauth
815+
.restore_session(
816+
mock_session(mock_prev_session_tokens_with_refresh()),
817+
RoomLoadSettings::default(),
818+
)
819+
.await
820+
.unwrap();
821+
822+
// Ensure that we don't have any server info.
823+
client.reset_server_info().await.unwrap();
824+
825+
assert_eq!(client.session_tokens(), Some(mock_prev_session_tokens_with_refresh()));
826+
827+
// Refresh token successfully.
828+
oauth_server.mock_token().ok().mock_once().named("refresh_token").mount().await;
829+
oauth.refresh_access_token().await.unwrap();
830+
831+
// The tokens were updated.
832+
assert_eq!(
833+
client.session_tokens(),
834+
Some(mock_session_tokens_with_refresh()),
835+
"The session tokens should have been updated with the new values"
836+
);
837+
}

0 commit comments

Comments
 (0)