Fix dev server projects reconnect (#13484)

Conrad Irwin created

Release Notes:

- Improved handling of client reconnects for dev-servers (alpha group
only)

Change summary

crates/collab/src/rpc.rs                    |  7 +++----
crates/collab/src/rpc/connection_pool.rs    |  1 +
crates/collab/src/tests/dev_server_tests.rs | 23 +++++++++++++++++++++++
3 files changed, 27 insertions(+), 4 deletions(-)

Detailed changes

crates/collab/src/rpc.rs 🔗

@@ -2583,14 +2583,13 @@ async fn rejoin_dev_server_projects(
         )
         .await?
     };
-    notify_rejoined_projects(&mut rejoined_projects, &session)?;
-
     response.send(proto::RejoinRemoteProjectsResponse {
         rejoined_projects: rejoined_projects
-            .into_iter()
+            .iter()
             .map(|project| project.to_proto())
             .collect(),
-    })
+    })?;
+    notify_rejoined_projects(&mut rejoined_projects, &session)
 }
 
 async fn reconnect_dev_server(

crates/collab/src/rpc/connection_pool.rs 🔗

@@ -73,6 +73,7 @@ impl ConnectionPool {
     pub fn reset(&mut self) {
         self.connections.clear();
         self.connected_users.clear();
+        self.connected_dev_servers.clear();
         self.channels.clear();
     }
 

crates/collab/src/tests/dev_server_tests.rs 🔗

@@ -504,6 +504,29 @@ async fn test_dev_server_reconnect(
         .unwrap();
 }
 
+#[gpui::test]
+async fn test_dev_server_restart(cx1: &mut gpui::TestAppContext, cx2: &mut gpui::TestAppContext) {
+    let (server, client1) = TestServer::start1(cx1).await;
+
+    let (_dev_server, remote_workspace) =
+        create_dev_server_project(&server, client1.app_state.clone(), cx1, cx2).await;
+    let cx = VisualTestContext::from_window(remote_workspace.into(), cx1).as_mut();
+
+    server.reset().await;
+    cx.run_until_parked();
+
+    cx.simulate_keystrokes("cmd-p 1 enter");
+    remote_workspace
+        .update(cx, |ws, cx| {
+            ws.active_item_as::<Editor>(cx)
+                .unwrap()
+                .update(cx, |ed, cx| {
+                    assert_eq!(ed.text(cx).to_string(), "remote\nremote\nremote");
+                })
+        })
+        .unwrap();
+}
+
 #[gpui::test]
 async fn test_create_dev_server_project_path_validation(
     cx1: &mut gpui::TestAppContext,