mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-11 21:13:02 +00:00
Add failing integration test for resharing projects on reconnect
This commit is contained in:
parent
0ede89d82a
commit
67b265b3d5
1 changed files with 93 additions and 1 deletions
|
@ -15,7 +15,7 @@ use editor::{
|
||||||
self, ConfirmCodeAction, ConfirmCompletion, ConfirmRename, Editor, ExcerptRange, MultiBuffer,
|
self, ConfirmCodeAction, ConfirmCompletion, ConfirmRename, Editor, ExcerptRange, MultiBuffer,
|
||||||
Redo, Rename, ToOffset, ToggleCodeActions, Undo,
|
Redo, Rename, ToOffset, ToggleCodeActions, Undo,
|
||||||
};
|
};
|
||||||
use fs::{FakeFs, Fs as _, HomeDir, LineEnding};
|
use fs::{FakeFs, Fs as _, HomeDir, LineEnding, RemoveOptions};
|
||||||
use futures::{channel::oneshot, StreamExt as _};
|
use futures::{channel::oneshot, StreamExt as _};
|
||||||
use gpui::{
|
use gpui::{
|
||||||
executor::Deterministic, geometry::vector::vec2f, test::EmptyView, ModelHandle, Task,
|
executor::Deterministic, geometry::vector::vec2f, test::EmptyView, ModelHandle, Task,
|
||||||
|
@ -1306,6 +1306,98 @@ async fn test_host_disconnect(
|
||||||
project_a.read_with(cx_a, |project, _| assert!(!project.is_shared()));
|
project_a.read_with(cx_a, |project, _| assert!(!project.is_shared()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test(iterations = 10)]
|
||||||
|
async fn test_host_reconnect(
|
||||||
|
deterministic: Arc<Deterministic>,
|
||||||
|
cx_a: &mut TestAppContext,
|
||||||
|
cx_b: &mut TestAppContext,
|
||||||
|
) {
|
||||||
|
cx_b.update(editor::init);
|
||||||
|
deterministic.forbid_parking();
|
||||||
|
let mut server = TestServer::start(&deterministic).await;
|
||||||
|
let client_a = server.create_client(cx_a, "user_a").await;
|
||||||
|
let client_b = server.create_client(cx_b, "user_b").await;
|
||||||
|
server
|
||||||
|
.create_room(&mut [(&client_a, cx_a), (&client_b, cx_b)])
|
||||||
|
.await;
|
||||||
|
|
||||||
|
client_a
|
||||||
|
.fs
|
||||||
|
.insert_tree(
|
||||||
|
"/root",
|
||||||
|
json!({
|
||||||
|
"dir1": {
|
||||||
|
"a.txt": "a-contents",
|
||||||
|
"b.txt": "b-contents",
|
||||||
|
"subdir1": {
|
||||||
|
"c.txt": "c-contents",
|
||||||
|
"d.txt": "d-contents",
|
||||||
|
"e.txt": "e-contents",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dir2": {
|
||||||
|
"x.txt": "x-contents",
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
let active_call_a = cx_a.read(ActiveCall::global);
|
||||||
|
let (project_a, _) = client_a.build_local_project("/root/dir1", cx_a).await;
|
||||||
|
let worktree_a = project_a.read_with(cx_a, |project, cx| project.worktrees(cx).next().unwrap());
|
||||||
|
let project_id = active_call_a
|
||||||
|
.update(cx_a, |call, cx| call.share_project(project_a.clone(), cx))
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let project_b = client_b.build_remote_project(project_id, cx_b).await;
|
||||||
|
assert!(worktree_a.read_with(cx_a, |tree, _| tree.as_local().unwrap().is_shared()));
|
||||||
|
|
||||||
|
// Drop client A's connection.
|
||||||
|
server.forbid_connections();
|
||||||
|
server.disconnect_client(client_a.peer_id().unwrap());
|
||||||
|
deterministic.advance_clock(RECEIVE_TIMEOUT);
|
||||||
|
project_a.read_with(cx_a, |project, _| {
|
||||||
|
assert!(project.collaborators().is_empty())
|
||||||
|
});
|
||||||
|
project_a.read_with(cx_a, |project, _| assert!(!project.is_shared()));
|
||||||
|
project_b.read_with(cx_b, |project, _| assert!(project.is_read_only()));
|
||||||
|
worktree_a.read_with(cx_a, |tree, _| {
|
||||||
|
assert!(!tree.as_local().unwrap().is_shared())
|
||||||
|
});
|
||||||
|
|
||||||
|
// While disconnected, add and remove files from the client A's project.
|
||||||
|
client_a
|
||||||
|
.fs
|
||||||
|
.insert_tree(
|
||||||
|
"/root/dir1/subdir2",
|
||||||
|
json!({
|
||||||
|
"f.txt": "f-contents",
|
||||||
|
"g.txt": "g-contents",
|
||||||
|
"h.txt": "h-contents",
|
||||||
|
"i.txt": "i-contents",
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
client_a
|
||||||
|
.fs
|
||||||
|
.remove_dir(
|
||||||
|
"/root/dir1/subdir1".as_ref(),
|
||||||
|
RemoveOptions {
|
||||||
|
recursive: true,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Client A reconnects. Their project is re-shared, and client B re-joins it.
|
||||||
|
server.allow_connections();
|
||||||
|
deterministic.advance_clock(RECEIVE_TIMEOUT);
|
||||||
|
project_a.read_with(cx_a, |project, _| assert!(project.is_shared()));
|
||||||
|
project_b.read_with(cx_b, |project, _| assert!(!project.is_read_only()));
|
||||||
|
}
|
||||||
|
|
||||||
#[gpui::test(iterations = 10)]
|
#[gpui::test(iterations = 10)]
|
||||||
async fn test_active_call_events(
|
async fn test_active_call_events(
|
||||||
deterministic: Arc<Deterministic>,
|
deterministic: Arc<Deterministic>,
|
||||||
|
|
Loading…
Reference in a new issue