tests: make the shortcuts-test mutex poison-tolerant

Same pattern as the language lock: one test panicking while holding
shortcuts_test_lock cascaded into 15 PoisonError failures on Windows
CI (the real failure — one lost undo keystroke dispatch — was
invisible under the fallout). Every acquisition now recovers the guard
instead of unwrapping, so a single flaky test fails alone.
This commit is contained in:
2026-08-21 17:22:47 +08:00
parent cada2f4c3a
commit 7323a6d2be
3 changed files with 26 additions and 26 deletions
+6 -6
View File
@@ -894,7 +894,7 @@ mod tests {
#[test]
#[cfg(target_os = "macos")]
fn display_shortcut_formats_labels() {
let _guard = shortcuts_test_lock().lock().unwrap();
let _guard = shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
assert_eq!(
display_shortcut(ActionId::Redo).as_deref(),
Some("⇧⌘Z")
@@ -958,7 +958,7 @@ mod tests {
/// only carries the entries that differ from the registry defaults.
#[test]
fn shortcuts_file_round_trips_through_the_override_table() {
let _guard = shortcuts_test_lock().lock().unwrap();
let _guard = shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
reset_all_custom_shortcuts();
let dir = temp_dir("roundtrip");
let path = format!("{dir}/shortcuts");
@@ -998,7 +998,7 @@ mod tests {
/// an all-default table removes the file entirely (the C++ behavior).
#[test]
fn save_writes_only_entries_that_differ_from_default() {
let _guard = shortcuts_test_lock().lock().unwrap();
let _guard = shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
reset_all_custom_shortcuts();
let dir = temp_dir("diff");
let path = format!("{dir}/shortcuts");
@@ -1021,7 +1021,7 @@ mod tests {
/// defaults stay intact until overridden.
#[test]
fn effective_keys_fall_back_to_defaults() {
let _guard = shortcuts_test_lock().lock().unwrap();
let _guard = shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
reset_all_custom_shortcuts();
// Delete defaults to ["delete", "backspace"].
assert_eq!(
@@ -1045,7 +1045,7 @@ mod tests {
/// none).
#[test]
fn stealing_a_key_moves_the_binding_away() {
let _guard = shortcuts_test_lock().lock().unwrap();
let _guard = shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
reset_all_custom_shortcuts();
let canon = canonical_key("secondary-c").expect("copy's key parses");
assert_eq!(owner_of_shortcut(&canon), Some(ActionId::Copy));
@@ -1071,7 +1071,7 @@ mod tests {
#[test]
#[cfg(target_os = "macos")]
fn display_shortcut_uses_the_effective_key() {
let _guard = shortcuts_test_lock().lock().unwrap();
let _guard = shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
set_custom_shortcut("saveproj", vec!["cmd-alt-s".to_string()]);
assert_eq!(
display_shortcut(ActionId::SaveProject).as_deref(),
+19 -19
View File
@@ -2749,7 +2749,7 @@ mod tests {
/// language — and the whole menu bar flips language with `i18n`.
#[test]
fn language_menu_tracks_the_active_language() {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
@@ -2820,7 +2820,7 @@ mod tests {
/// The theme submenu's checkmark follows the `dark` flag.
#[test]
fn theme_menu_checkmark_follows_dark_flag() {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
@@ -2852,7 +2852,7 @@ mod tests {
/// shell reads from the dock's live visible-panel set).
#[test]
fn window_menu_lists_all_panels_and_checks_the_open_ones() {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
crate::i18n::set_language_code("en-US");
@@ -2885,7 +2885,7 @@ mod tests {
/// round trip that used to leave a dismissed inspector unrecoverable.
#[gpui::test]
async fn window_menu_toggle_closes_and_reopens_the_inspector(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (_window, root) = mock_shell(cx);
@@ -2939,7 +2939,7 @@ mod tests {
async fn closing_a_panel_via_its_tab_unchecks_it_in_the_window_menu(
cx: &mut TestAppContext,
) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
@@ -2971,7 +2971,7 @@ mod tests {
/// across both languages.
#[test]
fn file_and_edit_menus_cover_the_project_lifecycle() {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
@@ -3029,7 +3029,7 @@ mod tests {
/// entity's weak handle (regression test for the Preferences crash).
#[gpui::test]
async fn preferences_dialog_opens_without_crashing(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
crate::i18n::set_language_code("en-US");
@@ -3066,7 +3066,7 @@ mod tests {
/// action.
#[test]
fn every_shortcut_maps_to_a_menu_item() {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
crate::i18n::set_language_code("en-US");
@@ -3112,7 +3112,7 @@ mod tests {
/// every platform.
#[test]
fn menu_shortcut_labels_match_the_table() {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
crate::i18n::set_language_code("en-US");
@@ -3148,7 +3148,7 @@ mod tests {
/// bubbles to the shell's key listener and dispatches 回放 → 播放/暂停).
#[gpui::test]
async fn space_toggles_program_playback(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
@@ -3180,7 +3180,7 @@ mod tests {
/// the still-unwired ripple-to-in/out (q/w).
#[gpui::test]
async fn keymap_defaults_dispatch_their_actions(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
@@ -3293,7 +3293,7 @@ mod tests {
/// at the playhead.
#[gpui::test]
async fn edit_shortcuts_dispatch_to_the_engine(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
@@ -3349,7 +3349,7 @@ mod tests {
/// dialog's text fields must never trigger editing actions).
#[gpui::test]
async fn shortcuts_are_suppressed_while_a_modal_is_open(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _guard = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
@@ -3413,7 +3413,7 @@ mod tests {
/// default key), and Escape dismisses it.
#[gpui::test]
async fn action_search_opens_from_the_slash_key(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _lang = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
// A leftover real shortcuts file must not shadow the default `/`
@@ -3452,7 +3452,7 @@ mod tests {
async fn action_search_arrows_and_enter_dispatch_the_selection(
cx: &mut TestAppContext,
) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _lang = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
crate::actions::reset_all_custom_shortcuts();
@@ -3490,7 +3490,7 @@ mod tests {
async fn preferences_opens_from_its_shortcut_with_the_keyboard_tab(
cx: &mut TestAppContext,
) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _lang = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
crate::actions::reset_all_custom_shortcuts();
@@ -3524,7 +3524,7 @@ mod tests {
/// override layer + interceptor + save path in one flow).
#[gpui::test]
async fn keyboard_tab_capture_assigns_a_shortcut(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _lang = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
crate::actions::reset_all_custom_shortcuts();
@@ -3578,7 +3578,7 @@ mod tests {
/// Escape handler).
#[gpui::test]
async fn keyboard_tab_capture_escape_cancels_without_closing(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _lang = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
crate::actions::reset_all_custom_shortcuts();
@@ -3620,7 +3620,7 @@ mod tests {
/// key drives the action, the displaced default key no longer does.
#[gpui::test]
async fn custom_shortcut_overrides_are_live_after_rebind(cx: &mut TestAppContext) {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _lang = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let (window, root) = mock_shell(cx);
crate::actions::reset_all_custom_shortcuts();
+1 -1
View File
@@ -2336,7 +2336,7 @@ mod tests {
#[test]
fn keyboard_rows_cover_the_menu_bar() {
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap();
let _guard = crate::actions::shortcuts_test_lock().lock().unwrap_or_else(|e| e.into_inner());
let _lang = crate::i18n::lang_test_lock().lock().unwrap_or_else(|e| e.into_inner());
crate::i18n::set_language_code("en-US");
let rows = crate::app::menu_action_paths();