summaryrefslogtreecommitdiff
path: root/cli/lsp/testing/execution.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2022-12-05 16:17:49 -0500
committerGitHub <noreply@github.com>2022-12-05 16:17:49 -0500
commit2fab4583ef3db0a3d8438ffa07f9e64db8190433 (patch)
tree506d4a6c5dbddda1265bbc632bf0d4014f895ce4 /cli/lsp/testing/execution.rs
parent3863aaf8ae183685759bfdae037c36d05223e06f (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.rs38
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);