crates/collab/src/tests.rs 🔗
@@ -8,7 +8,6 @@ mod channel_buffer_tests;
mod channel_guest_tests;
mod channel_message_tests;
mod channel_tests;
-mod dev_server_tests;
mod editor_tests;
mod following_tests;
mod integration_tests;
Kirill Bulatov created
These tests were removed in Preview, but that commit was not yet cherry-picked here.
crates/collab/src/tests.rs | 1
crates/collab/src/tests/dev_server_tests.rs | 643 -----------------------
crates/collab/src/tests/test_server.rs | 130 ----
3 files changed, 774 deletions(-)
@@ -8,7 +8,6 @@ mod channel_buffer_tests;
mod channel_guest_tests;
mod channel_message_tests;
mod channel_tests;
-mod dev_server_tests;
mod editor_tests;
mod following_tests;
mod integration_tests;
@@ -1,643 +0,0 @@
-use std::{path::Path, sync::Arc};
-
-use call::ActiveCall;
-use editor::Editor;
-use fs::Fs;
-use gpui::{TestAppContext, VisualTestContext, WindowHandle};
-use rpc::{proto::DevServerStatus, ErrorCode, ErrorExt};
-use serde_json::json;
-use workspace::{AppState, Workspace};
-
-use crate::tests::{following_tests::join_channel, TestServer};
-
-use super::TestClient;
-
-#[gpui::test]
-async fn test_dev_server(cx: &mut gpui::TestAppContext, cx2: &mut gpui::TestAppContext) {
- let (server, client) = TestServer::start1(cx).await;
-
- let store = cx.update(|cx| dev_server_projects::Store::global(cx).clone());
-
- let resp = store
- .update(cx, |store, cx| {
- store.create_dev_server("server-1".to_string(), None, cx)
- })
- .await
- .unwrap();
-
- store.update(cx, |store, _| {
- assert_eq!(store.dev_servers().len(), 1);
- assert_eq!(store.dev_servers()[0].name, "server-1");
- assert_eq!(store.dev_servers()[0].status, DevServerStatus::Offline);
- });
-
- let dev_server = server.create_dev_server(resp.access_token, cx2).await;
- cx.executor().run_until_parked();
- store.update(cx, |store, _| {
- assert_eq!(store.dev_servers()[0].status, DevServerStatus::Online);
- });
-
- dev_server
- .fs()
- .insert_tree(
- "/remote",
- json!({
- "1.txt": "remote\nremote\nremote",
- "2.js": "function two() { return 2; }",
- "3.rs": "mod test",
- }),
- )
- .await;
-
- store
- .update(cx, |store, cx| {
- store.create_dev_server_project(
- client::DevServerId(resp.dev_server_id),
- "/remote".to_string(),
- cx,
- )
- })
- .await
- .unwrap();
-
- cx.executor().run_until_parked();
-
- let remote_workspace = store
- .update(cx, |store, cx| {
- let projects = store.dev_server_projects();
- assert_eq!(projects.len(), 1);
- assert_eq!(projects[0].paths, vec!["/remote"]);
- workspace::join_dev_server_project(
- projects[0].id,
- projects[0].project_id.unwrap(),
- client.app_state.clone(),
- None,
- cx,
- )
- })
- .await
- .unwrap();
-
- cx.executor().run_until_parked();
-
- let cx = VisualTestContext::from_window(remote_workspace.into(), cx).as_mut();
- cx.simulate_keystrokes("cmd-p 1 enter");
-
- let editor = remote_workspace
- .update(cx, |ws, cx| {
- ws.active_item_as::<Editor>(cx).unwrap().clone()
- })
- .unwrap();
- editor.update(cx, |ed, cx| {
- assert_eq!(ed.text(cx).to_string(), "remote\nremote\nremote");
- });
- cx.simulate_input("wow!");
- cx.simulate_keystrokes("cmd-s");
-
- let content = dev_server
- .fs()
- .load(Path::new("/remote/1.txt"))
- .await
- .unwrap();
- assert_eq!(content, "wow!remote\nremote\nremote\n");
-}
-
-#[gpui::test]
-async fn test_dev_server_env_files(
- cx1: &mut gpui::TestAppContext,
- cx2: &mut gpui::TestAppContext,
- cx3: &mut gpui::TestAppContext,
-) {
- let (server, client1, client2, channel_id) = TestServer::start2(cx1, cx2).await;
-
- let (_dev_server, remote_workspace) =
- create_dev_server_project(&server, client1.app_state.clone(), cx1, cx3).await;
-
- cx1.executor().run_until_parked();
-
- let cx1 = VisualTestContext::from_window(remote_workspace.into(), cx1).as_mut();
- cx1.simulate_keystrokes("cmd-p . e enter");
-
- let editor = remote_workspace
- .update(cx1, |ws, cx| {
- ws.active_item_as::<Editor>(cx).unwrap().clone()
- })
- .unwrap();
- editor.update(cx1, |ed, cx| {
- assert_eq!(ed.text(cx).to_string(), "SECRET");
- });
-
- cx1.update(|cx| {
- workspace::join_channel(
- channel_id,
- client1.app_state.clone(),
- Some(remote_workspace),
- cx,
- )
- })
- .await
- .unwrap();
- cx1.executor().run_until_parked();
-
- remote_workspace
- .update(cx1, |ws, cx| {
- assert!(ws.project().read(cx).is_shared());
- })
- .unwrap();
-
- join_channel(channel_id, &client2, cx2).await.unwrap();
- cx2.executor().run_until_parked();
-
- let (workspace2, cx2) = client2.active_workspace(cx2);
- let editor = workspace2.update(cx2, |ws, cx| {
- ws.active_item_as::<Editor>(cx).unwrap().clone()
- });
- // TODO: it'd be nice to hide .env files from other people
- editor.update(cx2, |ed, cx| {
- assert_eq!(ed.text(cx).to_string(), "SECRET");
- });
-}
-
-async fn create_dev_server_project(
- server: &TestServer,
- client_app_state: Arc<AppState>,
- cx: &mut TestAppContext,
- cx_devserver: &mut TestAppContext,
-) -> (TestClient, WindowHandle<Workspace>) {
- let store = cx.update(|cx| dev_server_projects::Store::global(cx).clone());
-
- let resp = store
- .update(cx, |store, cx| {
- store.create_dev_server("server-1".to_string(), None, cx)
- })
- .await
- .unwrap();
- let dev_server = server
- .create_dev_server(resp.access_token, cx_devserver)
- .await;
-
- cx.executor().run_until_parked();
-
- dev_server
- .fs()
- .insert_tree(
- "/remote",
- json!({
- "1.txt": "remote\nremote\nremote",
- ".env": "SECRET",
- }),
- )
- .await;
-
- store
- .update(cx, |store, cx| {
- store.create_dev_server_project(
- client::DevServerId(resp.dev_server_id),
- "/remote".to_string(),
- cx,
- )
- })
- .await
- .unwrap();
-
- cx.executor().run_until_parked();
-
- let workspace = store
- .update(cx, |store, cx| {
- let projects = store.dev_server_projects();
- assert_eq!(projects.len(), 1);
- assert_eq!(projects[0].paths, vec!["/remote"]);
- workspace::join_dev_server_project(
- projects[0].id,
- projects[0].project_id.unwrap(),
- client_app_state,
- None,
- cx,
- )
- })
- .await
- .unwrap();
-
- cx.executor().run_until_parked();
-
- (dev_server, workspace)
-}
-
-#[gpui::test]
-async fn test_dev_server_leave_room(
- cx1: &mut gpui::TestAppContext,
- cx2: &mut gpui::TestAppContext,
- cx3: &mut gpui::TestAppContext,
-) {
- let (server, client1, client2, channel_id) = TestServer::start2(cx1, cx2).await;
-
- let (_dev_server, remote_workspace) =
- create_dev_server_project(&server, client1.app_state.clone(), cx1, cx3).await;
-
- cx1.update(|cx| {
- workspace::join_channel(
- channel_id,
- client1.app_state.clone(),
- Some(remote_workspace),
- cx,
- )
- })
- .await
- .unwrap();
- cx1.executor().run_until_parked();
-
- remote_workspace
- .update(cx1, |ws, cx| {
- assert!(ws.project().read(cx).is_shared());
- })
- .unwrap();
-
- join_channel(channel_id, &client2, cx2).await.unwrap();
- cx2.executor().run_until_parked();
-
- cx1.update(|cx| ActiveCall::global(cx).update(cx, |active_call, cx| active_call.hang_up(cx)))
- .await
- .unwrap();
-
- cx1.executor().run_until_parked();
-
- let (workspace, cx2) = client2.active_workspace(cx2);
- cx2.update(|cx| assert!(workspace.read(cx).project().read(cx).is_disconnected(cx)));
-}
-
-#[gpui::test]
-async fn test_dev_server_delete(
- cx1: &mut gpui::TestAppContext,
- cx2: &mut gpui::TestAppContext,
- cx3: &mut gpui::TestAppContext,
-) {
- let (server, client1, client2, channel_id) = TestServer::start2(cx1, cx2).await;
-
- let (_dev_server, remote_workspace) =
- create_dev_server_project(&server, client1.app_state.clone(), cx1, cx3).await;
-
- cx1.update(|cx| {
- workspace::join_channel(
- channel_id,
- client1.app_state.clone(),
- Some(remote_workspace),
- cx,
- )
- })
- .await
- .unwrap();
- cx1.executor().run_until_parked();
-
- remote_workspace
- .update(cx1, |ws, cx| {
- assert!(ws.project().read(cx).is_shared());
- })
- .unwrap();
-
- join_channel(channel_id, &client2, cx2).await.unwrap();
- cx2.executor().run_until_parked();
-
- cx1.update(|cx| {
- dev_server_projects::Store::global(cx).update(cx, |store, cx| {
- store.delete_dev_server_project(store.dev_server_projects().first().unwrap().id, cx)
- })
- })
- .await
- .unwrap();
-
- cx1.executor().run_until_parked();
-
- let (workspace, cx2) = client2.active_workspace(cx2);
- cx2.update(|cx| assert!(workspace.read(cx).project().read(cx).is_disconnected(cx)));
-
- cx1.update(|cx| {
- dev_server_projects::Store::global(cx).update(cx, |store, _| {
- assert_eq!(store.dev_server_projects().len(), 0);
- })
- })
-}
-
-#[gpui::test]
-async fn test_dev_server_rename(
- cx1: &mut gpui::TestAppContext,
- cx2: &mut gpui::TestAppContext,
- cx3: &mut gpui::TestAppContext,
-) {
- let (server, client1, client2, channel_id) = TestServer::start2(cx1, cx2).await;
-
- let (_dev_server, remote_workspace) =
- create_dev_server_project(&server, client1.app_state.clone(), cx1, cx3).await;
-
- cx1.update(|cx| {
- workspace::join_channel(
- channel_id,
- client1.app_state.clone(),
- Some(remote_workspace),
- cx,
- )
- })
- .await
- .unwrap();
- cx1.executor().run_until_parked();
-
- remote_workspace
- .update(cx1, |ws, cx| {
- assert!(ws.project().read(cx).is_shared());
- })
- .unwrap();
-
- join_channel(channel_id, &client2, cx2).await.unwrap();
- cx2.executor().run_until_parked();
-
- cx1.update(|cx| {
- dev_server_projects::Store::global(cx).update(cx, |store, cx| {
- store.rename_dev_server(
- store.dev_servers().first().unwrap().id,
- "name-edited".to_string(),
- None,
- cx,
- )
- })
- })
- .await
- .unwrap();
-
- cx1.executor().run_until_parked();
-
- cx1.update(|cx| {
- dev_server_projects::Store::global(cx).update(cx, |store, _| {
- assert_eq!(store.dev_servers().first().unwrap().name, "name-edited");
- })
- })
-}
-
-#[gpui::test]
-async fn test_dev_server_refresh_access_token(
- cx1: &mut gpui::TestAppContext,
- cx2: &mut gpui::TestAppContext,
- cx3: &mut gpui::TestAppContext,
- cx4: &mut gpui::TestAppContext,
-) {
- let (server, client1, client2, channel_id) = TestServer::start2(cx1, cx2).await;
-
- let (_dev_server, remote_workspace) =
- create_dev_server_project(&server, client1.app_state.clone(), cx1, cx3).await;
-
- cx1.update(|cx| {
- workspace::join_channel(
- channel_id,
- client1.app_state.clone(),
- Some(remote_workspace),
- cx,
- )
- })
- .await
- .unwrap();
- cx1.executor().run_until_parked();
-
- remote_workspace
- .update(cx1, |ws, cx| {
- assert!(ws.project().read(cx).is_shared());
- })
- .unwrap();
-
- join_channel(channel_id, &client2, cx2).await.unwrap();
- cx2.executor().run_until_parked();
-
- // Regenerate the access token
- let new_token_response = cx1
- .update(|cx| {
- dev_server_projects::Store::global(cx).update(cx, |store, cx| {
- store.regenerate_dev_server_token(store.dev_servers().first().unwrap().id, cx)
- })
- })
- .await
- .unwrap();
-
- cx1.executor().run_until_parked();
-
- // Assert that the other client was disconnected
- let (workspace, cx2) = client2.active_workspace(cx2);
- cx2.update(|cx| assert!(workspace.read(cx).project().read(cx).is_disconnected(cx)));
-
- // Assert that the owner of the dev server does not see the dev server as online anymore
- let (workspace, cx1) = client1.active_workspace(cx1);
- cx1.update(|cx| {
- assert!(workspace.read(cx).project().read(cx).is_disconnected(cx));
- dev_server_projects::Store::global(cx).update(cx, |store, _| {
- assert_eq!(
- store.dev_servers().first().unwrap().status,
- DevServerStatus::Offline
- );
- })
- });
-
- // Reconnect the dev server with the new token
- let _dev_server = server
- .create_dev_server(new_token_response.access_token, cx4)
- .await;
-
- cx1.executor().run_until_parked();
-
- // Assert that the dev server is online again
- cx1.update(|cx| {
- dev_server_projects::Store::global(cx).update(cx, |store, _| {
- assert_eq!(store.dev_servers().len(), 1);
- assert_eq!(
- store.dev_servers().first().unwrap().status,
- DevServerStatus::Online
- );
- })
- });
-}
-
-#[gpui::test]
-async fn test_dev_server_reconnect(
- cx1: &mut gpui::TestAppContext,
- cx2: &mut gpui::TestAppContext,
- cx3: &mut gpui::TestAppContext,
-) {
- let (mut server, client1) = TestServer::start1(cx1).await;
- let channel_id = server
- .make_channel("test", None, (&client1, cx1), &mut [])
- .await;
-
- let (_dev_server, remote_workspace) =
- create_dev_server_project(&server, client1.app_state.clone(), cx1, cx3).await;
-
- cx1.update(|cx| {
- workspace::join_channel(
- channel_id,
- client1.app_state.clone(),
- Some(remote_workspace),
- cx,
- )
- })
- .await
- .unwrap();
- cx1.executor().run_until_parked();
-
- remote_workspace
- .update(cx1, |ws, cx| {
- assert!(ws.project().read(cx).is_shared());
- })
- .unwrap();
-
- drop(client1);
-
- let client2 = server.create_client(cx2, "user_a").await;
-
- let store = cx2.update(|cx| dev_server_projects::Store::global(cx).clone());
-
- store
- .update(cx2, |store, cx| {
- let projects = store.dev_server_projects();
- workspace::join_dev_server_project(
- projects[0].id,
- projects[0].project_id.unwrap(),
- client2.app_state.clone(),
- None,
- cx,
- )
- })
- .await
- .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,
- cx2: &mut gpui::TestAppContext,
- cx3: &mut gpui::TestAppContext,
-) {
- let (server, client1) = TestServer::start1(cx1).await;
- let _channel_id = server
- .make_channel("test", None, (&client1, cx1), &mut [])
- .await;
-
- // Creating a project with a path that does exist should not fail
- let (_dev_server, _) =
- create_dev_server_project(&server, client1.app_state.clone(), cx1, cx2).await;
-
- cx1.executor().run_until_parked();
-
- let store = cx1.update(|cx| dev_server_projects::Store::global(cx).clone());
-
- let resp = store
- .update(cx1, |store, cx| {
- store.create_dev_server("server-2".to_string(), None, cx)
- })
- .await
- .unwrap();
-
- cx1.executor().run_until_parked();
-
- let _dev_server = server.create_dev_server(resp.access_token, cx3).await;
-
- cx1.executor().run_until_parked();
-
- // Creating a remote project with a path that does not exist should fail
- let result = store
- .update(cx1, |store, cx| {
- store.create_dev_server_project(
- client::DevServerId(resp.dev_server_id),
- "/notfound".to_string(),
- cx,
- )
- })
- .await;
-
- cx1.executor().run_until_parked();
-
- let error = result.unwrap_err();
- assert!(matches!(
- error.error_code(),
- ErrorCode::DevServerProjectPathDoesNotExist
- ));
-}
-
-#[gpui::test]
-async fn test_save_as_remote(cx1: &mut gpui::TestAppContext, cx2: &mut gpui::TestAppContext) {
- let (server, client1) = TestServer::start1(cx1).await;
-
- // Creating a project with a path that does exist should not fail
- let (dev_server, remote_workspace) =
- create_dev_server_project(&server, client1.app_state.clone(), cx1, cx2).await;
-
- let mut cx = VisualTestContext::from_window(remote_workspace.into(), cx1);
-
- cx.simulate_keystrokes("cmd-p 1 enter");
- cx.simulate_keystrokes("cmd-shift-s");
- cx.simulate_input("2.txt");
- cx.simulate_keystrokes("enter");
-
- cx.executor().run_until_parked();
-
- let title = remote_workspace
- .update(&mut cx, |ws, cx| {
- let active_item = ws.active_item(cx).unwrap();
- active_item.tab_description(0, cx).unwrap()
- })
- .unwrap();
-
- assert_eq!(title, "2.txt");
-
- let path = Path::new("/remote/2.txt");
- assert_eq!(
- dev_server.fs().load(path).await.unwrap(),
- "remote\nremote\nremote"
- );
-}
-
-#[gpui::test]
-async fn test_new_file_remote(cx1: &mut gpui::TestAppContext, cx2: &mut gpui::TestAppContext) {
- let (server, client1) = TestServer::start1(cx1).await;
-
- // Creating a project with a path that does exist should not fail
- let (dev_server, remote_workspace) =
- create_dev_server_project(&server, client1.app_state.clone(), cx1, cx2).await;
-
- let mut cx = VisualTestContext::from_window(remote_workspace.into(), cx1);
-
- cx.simulate_keystrokes("cmd-n");
- cx.simulate_input("new!");
- cx.simulate_keystrokes("cmd-shift-s");
- cx.simulate_input("2.txt");
- cx.simulate_keystrokes("enter");
-
- cx.executor().run_until_parked();
-
- let title = remote_workspace
- .update(&mut cx, |ws, cx| {
- ws.active_item(cx).unwrap().tab_description(0, cx).unwrap()
- })
- .unwrap();
-
- assert_eq!(title, "2.txt");
-
- let path = Path::new("/remote/2.txt");
- assert_eq!(dev_server.fs().load(path).await.unwrap(), "new!");
-}
@@ -1,5 +1,4 @@
use crate::{
- auth::split_dev_server_token,
db::{tests::TestDb, NewUserParams, UserId},
executor::Executor,
rpc::{Principal, Server, ZedVersion, CLEANUP_TIMEOUT, RECONNECT_TIMEOUT},
@@ -319,135 +318,6 @@ impl TestServer {
client
}
- pub async fn create_dev_server(
- &self,
- access_token: String,
- cx: &mut TestAppContext,
- ) -> TestClient {
- cx.update(|cx| {
- if cx.has_global::<SettingsStore>() {
- panic!("Same cx used to create two test clients")
- }
- let settings = SettingsStore::test(cx);
- cx.set_global(settings);
- release_channel::init(SemanticVersion::default(), cx);
- client::init_settings(cx);
- });
- let (dev_server_id, _) = split_dev_server_token(&access_token).unwrap();
-
- let clock = Arc::new(FakeSystemClock::default());
- let http = FakeHttpClient::with_404_response();
- let mut client = cx.update(|cx| Client::new(clock, http.clone(), cx));
- let server = self.server.clone();
- let db = self.app_state.db.clone();
- let connection_killers = self.connection_killers.clone();
- let forbid_connections = self.forbid_connections.clone();
- Arc::get_mut(&mut client)
- .unwrap()
- .set_id(1)
- .set_dev_server_token(client::DevServerToken(access_token.clone()))
- .override_establish_connection(move |credentials, cx| {
- assert_eq!(
- credentials,
- &Credentials::DevServer {
- token: client::DevServerToken(access_token.to_string())
- }
- );
-
- let server = server.clone();
- let db = db.clone();
- let connection_killers = connection_killers.clone();
- let forbid_connections = forbid_connections.clone();
- cx.spawn(move |cx| async move {
- if forbid_connections.load(SeqCst) {
- Err(EstablishConnectionError::other(anyhow!(
- "server is forbidding connections"
- )))
- } else {
- let (client_conn, server_conn, killed) =
- Connection::in_memory(cx.background_executor().clone());
- let (connection_id_tx, connection_id_rx) = oneshot::channel();
- let dev_server = db
- .get_dev_server(dev_server_id)
- .await
- .expect("retrieving dev_server failed");
- cx.background_executor()
- .spawn(server.handle_connection(
- server_conn,
- "dev-server".to_string(),
- Principal::DevServer(dev_server),
- ZedVersion(SemanticVersion::new(1, 0, 0)),
- None,
- Some(connection_id_tx),
- Executor::Deterministic(cx.background_executor().clone()),
- ))
- .detach();
- let connection_id = connection_id_rx.await.map_err(|e| {
- EstablishConnectionError::Other(anyhow!(
- "{} (is server shutting down?)",
- e
- ))
- })?;
- connection_killers
- .lock()
- .insert(connection_id.into(), killed);
- Ok(client_conn)
- }
- })
- });
-
- let fs = FakeFs::new(cx.executor());
- let user_store = cx.new_model(|cx| UserStore::new(client.clone(), cx));
- let workspace_store = cx.new_model(|cx| WorkspaceStore::new(client.clone(), cx));
- let language_registry = Arc::new(LanguageRegistry::test(cx.executor()));
- let session = cx.new_model(|cx| AppSession::new(Session::test(), cx));
- let app_state = Arc::new(workspace::AppState {
- client: client.clone(),
- user_store: user_store.clone(),
- workspace_store,
- languages: language_registry,
- fs: fs.clone(),
- build_window_options: |_, _| Default::default(),
- node_runtime: NodeRuntime::unavailable(),
- session,
- });
-
- cx.update(|cx| {
- theme::init(theme::LoadThemes::JustBase, cx);
- Project::init(&client, cx);
- client::init(&client, cx);
- language::init(cx);
- editor::init(cx);
- workspace::init(app_state.clone(), cx);
- call::init(client.clone(), user_store.clone(), cx);
- channel::init(&client, user_store.clone(), cx);
- notifications::init(client.clone(), user_store, cx);
- collab_ui::init(&app_state, cx);
- file_finder::init(cx);
- menu::init();
- headless::init(
- client.clone(),
- headless::AppState {
- languages: app_state.languages.clone(),
- user_store: app_state.user_store.clone(),
- fs: fs.clone(),
- node_runtime: app_state.node_runtime.clone(),
- },
- cx,
- )
- })
- .await
- .unwrap();
-
- TestClient {
- app_state,
- username: "dev-server".to_string(),
- channel_store: cx.read(ChannelStore::global).clone(),
- notification_store: cx.read(NotificationStore::global).clone(),
- state: Default::default(),
- }
- }
-
pub fn disconnect_client(&self, peer_id: PeerId) {
self.connection_killers
.lock()