diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2022-12-05 16:17:49 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-05 16:17:49 -0500 |
commit | 2fab4583ef3db0a3d8438ffa07f9e64db8190433 (patch) | |
tree | 506d4a6c5dbddda1265bbc632bf0d4014f895ce4 /cli/lsp/testing/execution.rs | |
parent | 3863aaf8ae183685759bfdae037c36d05223e06f (diff) |
fix(test): improve how `--fail-fast` shuts down when hitting limit (#16956)
Closes #15650
Diffstat (limited to 'cli/lsp/testing/execution.rs')
-rw-r--r-- | cli/lsp/testing/execution.rs | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/cli/lsp/testing/execution.rs b/cli/lsp/testing/execution.rs index bd4f07621..f0ab1c8fc 100644 --- a/cli/lsp/testing/execution.rs +++ b/cli/lsp/testing/execution.rs @@ -13,6 +13,7 @@ use crate::lsp::logging::lsp_log; use crate::ops; use crate::proc_state; use crate::tools::test; +use crate::tools::test::FailFastTracker; use crate::tools::test::TestEventSender; use crate::util::checksum; use crate::worker::create_main_worker_for_test_or_bench; @@ -144,25 +145,29 @@ impl LspTestFilter { } } +#[allow(clippy::too_many_arguments)] async fn test_specifier( ps: proc_state::ProcState, permissions: Permissions, specifier: ModuleSpecifier, mode: test::TestMode, - sender: &TestEventSender, + sender: TestEventSender, + fail_fast_tracker: FailFastTracker, token: CancellationToken, filter: test::TestFilter, ) -> Result<(), AnyError> { if !token.is_cancelled() { + let stdout = StdioPipe::File(sender.stdout()); + let stderr = StdioPipe::File(sender.stderr()); let mut worker = create_main_worker_for_test_or_bench( &ps, specifier.clone(), permissions, - vec![ops::testing::init(sender.clone(), filter)], + vec![ops::testing::init(sender, fail_fast_tracker, filter)], Stdio { stdin: StdioPipe::Inherit, - stdout: StdioPipe::File(sender.stdout()), - stderr: StdioPipe::File(sender.stderr()), + stdout, + stderr, }, ) .await?; @@ -262,19 +267,17 @@ impl TestRun { ) .await?; - let (sender, mut receiver) = mpsc::unbounded_channel::<test::TestEvent>(); - let sender = TestEventSender::new(sender); - let (concurrent_jobs, fail_fast) = if let DenoSubcommand::Test(test_flags) = ps.options.sub_command() { - ( - test_flags.concurrent_jobs.into(), - test_flags.fail_fast.map(|count| count.into()), - ) + (test_flags.concurrent_jobs.into(), test_flags.fail_fast) } else { unreachable!("Should always be Test subcommand."); }; + let (sender, mut receiver) = mpsc::unbounded_channel::<test::TestEvent>(); + let sender = TestEventSender::new(sender); + let fail_fast_tracker = FailFastTracker::new(fail_fast); + let mut queue = self.queue.iter().collect::<Vec<&ModuleSpecifier>>(); queue.sort(); @@ -288,6 +291,7 @@ impl TestRun { let ps = ps.clone(); let permissions = permissions.clone(); let mut sender = sender.clone(); + let fail_fast_tracker = fail_fast_tracker.clone(); let lsp_filter = self.filters.get(&specifier); let filter = test::TestFilter { substring: None, @@ -305,13 +309,17 @@ impl TestRun { let tests = tests_.clone(); tokio::task::spawn_blocking(move || { + if fail_fast_tracker.should_stop() { + return Ok(()); + } let origin = specifier.to_string(); let file_result = run_local(test_specifier( ps, permissions, specifier, test::TestMode::Executable, - &sender, + sender.clone(), + fail_fast_tracker, token, filter, )); @@ -427,12 +435,6 @@ impl TestRun { ); } } - - if let Some(count) = fail_fast { - if summary.failed >= count { - break; - } - } } let elapsed = Instant::now().duration_since(earlier); |