From b0336cd27e9d69774e956a02dad0f7097b646290 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 21 Dec 2022 11:56:15 +0100 Subject: [PATCH] Add failing test for buffer synchronization after disconnecting --- crates/collab/src/integration_tests.rs | 30 ++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/crates/collab/src/integration_tests.rs b/crates/collab/src/integration_tests.rs index f17ad95086..2014b5172b 100644 --- a/crates/collab/src/integration_tests.rs +++ b/crates/collab/src/integration_tests.rs @@ -1415,6 +1415,15 @@ async fn test_project_reconnect( assert!(project.worktree_for_id(worktree2_id, cx).is_some()) }); + let buffer_a1 = project_a1 + .update(cx_a, |p, cx| p.open_buffer((worktree1_id, "a.txt"), cx)) + .await + .unwrap(); + let buffer_b1 = project_b1 + .update(cx_b, |p, cx| p.open_buffer((worktree1_id, "a.txt"), cx)) + .await + .unwrap(); + // Drop client A's connection. server.forbid_connections(); server.disconnect_client(client_a.peer_id().unwrap()); @@ -1431,7 +1440,7 @@ async fn test_project_reconnect( assert!(tree.as_local().unwrap().is_shared()) }); - // While disconnected, add and remove files from client A's project. + // While client A is disconnected, add and remove files from client A's project. client_a .fs .insert_tree( @@ -1456,7 +1465,7 @@ async fn test_project_reconnect( .await .unwrap(); - // While disconnected, add and remove worktrees from client A's project. + // While client A is disconnected, add and remove worktrees from client A's project. project_a1 .update(cx_a, |project, cx| { project.remove_worktree(worktree2_id, cx) @@ -1477,12 +1486,12 @@ async fn test_project_reconnect( }); deterministic.run_until_parked(); - // While disconnected, close project 2 + // While client A is disconnected, close project 2 cx_a.update(|_| drop(project_a2)); - // While disconnected, mutate a buffer on both the host and the guest. - buffer_a1.update(cx_a, |buf, cx| buf.edit([(0..0, "X")], None, cx)); - buffer_b1.update(cx_b, |buf, cx| buf.edit([(1..1, "Y")], None, cx)); + // While client A is disconnected, mutate a buffer on both the host and the guest. + buffer_a1.update(cx_a, |buf, cx| buf.edit([(0..0, "W")], None, cx)); + buffer_b1.update(cx_b, |buf, cx| buf.edit([(1..1, "Z")], None, cx)); deterministic.run_until_parked(); // Client A reconnects. Their project is re-shared, and client B re-joins it. @@ -1565,6 +1574,8 @@ async fn test_project_reconnect( }); project_b2.read_with(cx_b, |project, _| assert!(project.is_read_only())); project_b3.read_with(cx_b, |project, _| assert!(!project.is_read_only())); + buffer_a1.read_with(cx_a, |buffer, _| assert_eq!(buffer.text(), "WaZ")); + buffer_b1.read_with(cx_b, |buffer, _| assert_eq!(buffer.text(), "WaZ")); // Drop client B's connection. server.forbid_connections(); @@ -1603,6 +1614,11 @@ async fn test_project_reconnect( .await; deterministic.run_until_parked(); + // While client B is disconnected, mutate a buffer on both the host and the guest. + buffer_a1.update(cx_a, |buf, cx| buf.edit([(1..1, "X")], None, cx)); + buffer_b1.update(cx_b, |buf, cx| buf.edit([(2..2, "Y")], None, cx)); + deterministic.run_until_parked(); + // While disconnected, close project 3 cx_a.update(|_| drop(project_a3)); @@ -1652,6 +1668,8 @@ async fn test_project_reconnect( ); }); project_b3.read_with(cx_b, |project, _| assert!(project.is_read_only())); + buffer_a1.read_with(cx_a, |buffer, _| assert_eq!(buffer.text(), "WXaYZ")); + buffer_b1.read_with(cx_b, |buffer, _| assert_eq!(buffer.text(), "WXaYZ")); } #[gpui::test(iterations = 10)]