summaryrefslogtreecommitdiff
path: root/cli/ops/testing.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/ops/testing.rs
parent3863aaf8ae183685759bfdae037c36d05223e06f (diff)
fix(test): improve how `--fail-fast` shuts down when hitting limit (#16956)
Closes #15650
Diffstat (limited to 'cli/ops/testing.rs')
-rw-r--r--cli/ops/testing.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/cli/ops/testing.rs b/cli/ops/testing.rs
index 727ccdf66..9479ebdc1 100644
--- a/cli/ops/testing.rs
+++ b/cli/ops/testing.rs
@@ -1,10 +1,12 @@
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
+use crate::tools::test::FailFastTracker;
use crate::tools::test::TestDescription;
use crate::tools::test::TestEvent;
use crate::tools::test::TestEventSender;
use crate::tools::test::TestFilter;
use crate::tools::test::TestLocation;
+use crate::tools::test::TestResult;
use crate::tools::test::TestStepDescription;
use deno_core::error::generic_error;
@@ -23,7 +25,11 @@ use std::sync::atomic::AtomicUsize;
use std::sync::atomic::Ordering;
use uuid::Uuid;
-pub fn init(sender: TestEventSender, filter: TestFilter) -> Extension {
+pub fn init(
+ sender: TestEventSender,
+ fail_fast_tracker: FailFastTracker,
+ filter: TestFilter,
+) -> Extension {
Extension::builder()
.ops(vec![
op_pledge_test_permissions::decl(),
@@ -32,9 +38,11 @@ pub fn init(sender: TestEventSender, filter: TestFilter) -> Extension {
op_register_test::decl(),
op_register_test_step::decl(),
op_dispatch_test_event::decl(),
+ op_tests_should_stop::decl(),
])
.state(move |state| {
state.put(sender.clone());
+ state.put(fail_fast_tracker.clone());
state.put(filter.clone());
Ok(())
})
@@ -178,7 +186,18 @@ fn op_dispatch_test_event(
state: &mut OpState,
event: TestEvent,
) -> Result<(), AnyError> {
+ if matches!(
+ event,
+ TestEvent::Result(_, TestResult::Cancelled | TestResult::Failed(_), _)
+ ) {
+ state.borrow::<FailFastTracker>().add_failure();
+ }
let mut sender = state.borrow::<TestEventSender>().clone();
sender.send(event).ok();
Ok(())
}
+
+#[op]
+fn op_tests_should_stop(state: &mut OpState) -> bool {
+ state.borrow::<FailFastTracker>().should_stop()
+}