diff --git a/crates/libtest-json/event.schema.json b/crates/libtest-json/event.schema.json index 0bb3b39..8e22aaf 100644 --- a/crates/libtest-json/event.schema.json +++ b/crates/libtest-json/event.schema.json @@ -5,6 +5,16 @@ { "type": "object", "properties": { + "elapsed_s": { + "anyOf": [ + { + "$ref": "#/$defs/Elapsed" + }, + { + "type": "null" + } + ] + }, "event": { "type": "string", "const": "discover_start" @@ -27,6 +37,16 @@ "description": "Whether selected to be run by the user", "type": "boolean" }, + "elapsed_s": { + "anyOf": [ + { + "$ref": "#/$defs/Elapsed" + }, + { + "type": "null" + } + ] + }, "event": { "type": "string", "const": "discover_case" @@ -62,6 +82,16 @@ { "type": "object", "properties": { + "elapsed_s": { + "anyOf": [ + { + "$ref": "#/$defs/Elapsed" + }, + { + "type": "null" + } + ] + }, "event": { "type": "string", "const": "suite_start" @@ -77,6 +107,16 @@ "name": { "type": "string" }, + "elapsed_s": { + "anyOf": [ + { + "$ref": "#/$defs/Elapsed" + }, + { + "type": "null" + } + ] + }, "event": { "type": "string", "const": "case_start" @@ -157,6 +197,10 @@ } ], "$defs": { + "Elapsed": { + "description": "Time elapsed since process start", + "type": "string" + }, "RunMode": { "type": "string", "enum": [ @@ -164,9 +208,6 @@ "bench" ] }, - "Elapsed": { - "type": "string" - }, "RunStatus": { "type": "string", "enum": [ diff --git a/crates/libtest-json/src/event.rs b/crates/libtest-json/src/event.rs index 26f54d8..f7e0457 100644 --- a/crates/libtest-json/src/event.rs +++ b/crates/libtest-json/src/event.rs @@ -4,7 +4,13 @@ #[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))] #[cfg_attr(feature = "serde", serde(tag = "event"))] pub enum Event { - DiscoverStart, + DiscoverStart { + #[cfg_attr( + feature = "serde", + serde(default, skip_serializing_if = "Option::is_none") + )] + elapsed_s: Option, + }, DiscoverCase { name: String, #[cfg_attr( @@ -18,6 +24,11 @@ pub enum Event { serde(default = "true_default", skip_serializing_if = "is_true") )] run: bool, + #[cfg_attr( + feature = "serde", + serde(default, skip_serializing_if = "Option::is_none") + )] + elapsed_s: Option, }, DiscoverComplete { #[cfg_attr( @@ -26,9 +37,20 @@ pub enum Event { )] elapsed_s: Option, }, - SuiteStart, + SuiteStart { + #[cfg_attr( + feature = "serde", + serde(default, skip_serializing_if = "Option::is_none") + )] + elapsed_s: Option, + }, CaseStart { name: String, + #[cfg_attr( + feature = "serde", + serde(default, skip_serializing_if = "Option::is_none") + )] + elapsed_s: Option, }, CaseComplete { name: String, @@ -71,12 +93,24 @@ impl Event { let mut buffer = String::new(); buffer.open_object().unwrap(); match self { - Self::DiscoverStart => { + Self::DiscoverStart { elapsed_s } => { buffer.key("event").unwrap(); buffer.keyval_sep().unwrap(); buffer.value("discover_start").unwrap(); + + if let Some(elapsed_s) = elapsed_s { + buffer.val_sep().unwrap(); + buffer.key("elapsed_s").unwrap(); + buffer.keyval_sep().unwrap(); + buffer.value(String::from(*elapsed_s)).unwrap(); + } } - Self::DiscoverCase { name, mode, run } => { + Self::DiscoverCase { + name, + mode, + run, + elapsed_s, + } => { buffer.key("event").unwrap(); buffer.keyval_sep().unwrap(); buffer.value("discover_case").unwrap(); @@ -99,11 +133,19 @@ impl Event { buffer.keyval_sep().unwrap(); buffer.value(run).unwrap(); } + + if let Some(elapsed_s) = elapsed_s { + buffer.val_sep().unwrap(); + buffer.key("elapsed_s").unwrap(); + buffer.keyval_sep().unwrap(); + buffer.value(String::from(*elapsed_s)).unwrap(); + } } Self::DiscoverComplete { elapsed_s } => { buffer.key("event").unwrap(); buffer.keyval_sep().unwrap(); buffer.value("discover_complete").unwrap(); + if let Some(elapsed_s) = elapsed_s { buffer.val_sep().unwrap(); buffer.key("elapsed_s").unwrap(); @@ -111,12 +153,19 @@ impl Event { buffer.value(String::from(*elapsed_s)).unwrap(); } } - Self::SuiteStart => { + Self::SuiteStart { elapsed_s } => { buffer.key("event").unwrap(); buffer.keyval_sep().unwrap(); buffer.value("suite_start").unwrap(); + + if let Some(elapsed_s) = elapsed_s { + buffer.val_sep().unwrap(); + buffer.key("elapsed_s").unwrap(); + buffer.keyval_sep().unwrap(); + buffer.value(String::from(*elapsed_s)).unwrap(); + } } - Self::CaseStart { name } => { + Self::CaseStart { name, elapsed_s } => { buffer.key("event").unwrap(); buffer.keyval_sep().unwrap(); buffer.value("case_start").unwrap(); @@ -125,6 +174,13 @@ impl Event { buffer.key("name").unwrap(); buffer.keyval_sep().unwrap(); buffer.value(name).unwrap(); + + if let Some(elapsed_s) = elapsed_s { + buffer.val_sep().unwrap(); + buffer.key("elapsed_s").unwrap(); + buffer.keyval_sep().unwrap(); + buffer.value(String::from(*elapsed_s)).unwrap(); + } } Self::CaseComplete { name, @@ -174,6 +230,7 @@ impl Event { buffer.key("event").unwrap(); buffer.keyval_sep().unwrap(); buffer.value("suite_complete").unwrap(); + if let Some(elapsed_s) = elapsed_s { buffer.val_sep().unwrap(); buffer.key("elapsed_s").unwrap(); @@ -237,6 +294,7 @@ impl RunStatus { } } +/// Time elapsed since process start #[derive(Copy, Clone, Default, Debug, PartialEq, Eq)] #[cfg_attr(feature = "unstable-schema", derive(schemars::JsonSchema))] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] diff --git a/crates/libtest-json/tests/roundtrip.rs b/crates/libtest-json/tests/roundtrip.rs index 6a78208..e85e450 100644 --- a/crates/libtest-json/tests/roundtrip.rs +++ b/crates/libtest-json/tests/roundtrip.rs @@ -17,9 +17,15 @@ fn t(input: libtest_json::Event, snapshot: impl IntoData) { #[test] fn discover_start() { t( - libtest_json::Event::DiscoverStart, + libtest_json::Event::DiscoverStart { elapsed_s: None }, str![[r#"{"event":"discover_start"}"#]], ); + t( + libtest_json::Event::DiscoverStart { + elapsed_s: Some(libtest_json::Elapsed(Default::default())), + }, + str![[r#"{"event":"discover_start","elapsed_s":"0"}"#]], + ); } #[test] @@ -29,6 +35,7 @@ fn discover_case() { name: "Hello\tworld!".to_owned(), mode: libtest_json::RunMode::Test, run: true, + elapsed_s: None, }, str![[r#"{"event":"discover_case","name":"Hello\tworld!"}"#]], ); @@ -38,8 +45,11 @@ fn discover_case() { name: "Hello\tworld!".to_owned(), mode: libtest_json::RunMode::Bench, run: false, + elapsed_s: Some(libtest_json::Elapsed(Default::default())), }, - str![[r#"{"event":"discover_case","name":"Hello\tworld!","mode":"bench","run":false}"#]], + str![[ + r#"{"event":"discover_case","name":"Hello\tworld!","mode":"bench","run":false,"elapsed_s":"0"}"# + ]], ); } @@ -61,9 +71,15 @@ fn discover_complete() { #[test] fn suite_start() { t( - libtest_json::Event::SuiteStart, + libtest_json::Event::SuiteStart { elapsed_s: None }, str![[r#"{"event":"suite_start"}"#]], ); + t( + libtest_json::Event::SuiteStart { + elapsed_s: Some(libtest_json::Elapsed(Default::default())), + }, + str![[r#"{"event":"suite_start","elapsed_s":"0"}"#]], + ); } #[test] @@ -71,9 +87,17 @@ fn case_start() { t( libtest_json::Event::CaseStart { name: "Hello\tworld!".to_owned(), + elapsed_s: None, }, str![[r#"{"event":"case_start","name":"Hello\tworld!"}"#]], ); + t( + libtest_json::Event::CaseStart { + name: "Hello\tworld!".to_owned(), + elapsed_s: Some(libtest_json::Elapsed(Default::default())), + }, + str![[r#"{"event":"case_start","name":"Hello\tworld!","elapsed_s":"0"}"#]], + ); } #[test] diff --git a/crates/libtest2-harness/src/harness.rs b/crates/libtest2-harness/src/harness.rs index a11268c..cd0f1cc 100644 --- a/crates/libtest2-harness/src/harness.rs +++ b/crates/libtest2-harness/src/harness.rs @@ -32,6 +32,8 @@ impl Harness { } pub fn main(mut self) -> ! { + let start = std::time::Instant::now(); + let raw = match self.raw { Ok(raw) => raw, Err(err) => { @@ -57,13 +59,13 @@ impl Harness { eprintln!("{err}"); std::process::exit(1) }); - discover(&opts, &mut self.cases, notifier.as_mut()).unwrap_or_else(|err| { + discover(&start, &opts, &mut self.cases, notifier.as_mut()).unwrap_or_else(|err| { eprintln!("{err}"); std::process::exit(1) }); if !opts.list { - match run(&opts, self.cases, notifier.as_mut()) { + match run(&start, &opts, self.cases, notifier.as_mut()) { Ok(true) => {} Ok(false) => std::process::exit(ERROR_EXIT_CODE), Err(e) => { @@ -183,12 +185,14 @@ fn notifier(opts: &libtest_lexarg::TestOpts) -> std::io::Result>, notifier: &mut dyn notify::Notifier, ) -> std::io::Result<()> { - notifier.notify(notify::Event::DiscoverStart)?; - let timer = std::time::Instant::now(); + notifier.notify(notify::Event::DiscoverStart { + elapsed_s: Some(notify::Elapsed(start.elapsed())), + })?; let matches_filter = |case: &dyn Case, filter: &str| { let test_name = case.name(); @@ -227,25 +231,28 @@ fn discover( name: case.name().to_owned(), mode: RunMode::Test, run: retain_case, + elapsed_s: Some(notify::Elapsed(start.elapsed())), })?; } let mut retain_cases = retain_cases.into_iter(); cases.retain(|_| retain_cases.next().unwrap()); notifier.notify(notify::Event::DiscoverComplete { - elapsed_s: Some(notify::Elapsed(timer.elapsed())), + elapsed_s: Some(notify::Elapsed(start.elapsed())), })?; Ok(()) } fn run( + start: &std::time::Instant, opts: &libtest_lexarg::TestOpts, cases: Vec>, notifier: &mut dyn notify::Notifier, ) -> std::io::Result { - notifier.notify(notify::Event::SuiteStart)?; - let timer = std::time::Instant::now(); + notifier.notify(notify::Event::SuiteStart { + elapsed_s: Some(notify::Elapsed(start.elapsed())), + })?; if opts.no_capture { todo!("`--no-capture` is not yet supported"); @@ -324,6 +331,7 @@ fn run( let name = case.name().to_owned(); let cfg = std::thread::Builder::new().name(name.clone()); + let start = *start; let tx = tx.clone(); let case = std::sync::Arc::new(case); let case_fallback = case.clone(); @@ -333,8 +341,9 @@ fn run( let sync_success_fallback = sync_success.clone(); let join_handle = cfg.spawn(move || { let mut notifier = SenderNotifier { tx: tx.clone() }; - let case_success = run_case(case.as_ref().as_ref(), &state, &mut notifier) - .expect("`SenderNotifier` is infallible"); + let case_success = + run_case(&start, case.as_ref().as_ref(), &state, &mut notifier) + .expect("`SenderNotifier` is infallible"); if !case_success { sync_success.store(case_success, std::sync::atomic::Ordering::Relaxed); } @@ -347,9 +356,13 @@ fn run( Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => { // `ErrorKind::WouldBlock` means hitting the thread limit on some // platforms, so run the test synchronously here instead. - let case_success = - run_case(case_fallback.as_ref().as_ref(), &state_fallback, notifier) - .expect("`SenderNotifier` is infallible"); + let case_success = run_case( + &start, + case_fallback.as_ref().as_ref(), + &state_fallback, + notifier, + ) + .expect("`SenderNotifier` is infallible"); if !case_success { sync_success_fallback .store(case_success, std::sync::atomic::Ordering::Relaxed); @@ -378,7 +391,7 @@ fn run( if !exclusive_cases.is_empty() { notifier.threaded(false); for case in exclusive_cases { - success &= run_case(case.as_ref(), &state, notifier)?; + success &= run_case(start, case.as_ref(), &state, notifier)?; if !success && opts.fail_fast { break; } @@ -386,21 +399,22 @@ fn run( } notifier.notify(notify::Event::SuiteComplete { - elapsed_s: Some(notify::Elapsed(timer.elapsed())), + elapsed_s: Some(notify::Elapsed(start.elapsed())), })?; Ok(success) } fn run_case( + start: &std::time::Instant, case: &dyn Case, state: &State, notifier: &mut dyn notify::Notifier, ) -> std::io::Result { notifier.notify(notify::Event::CaseStart { name: case.name().to_owned(), + elapsed_s: Some(notify::Elapsed(start.elapsed())), })?; - let timer = std::time::Instant::now(); let outcome = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { __rust_begin_short_backtrace(|| case.run(state)) @@ -429,7 +443,7 @@ fn run_case( mode: RunMode::Test, status, message, - elapsed_s: Some(notify::Elapsed(timer.elapsed())), + elapsed_s: Some(notify::Elapsed(start.elapsed())), })?; Ok(status != Some(notify::RunStatus::Failed)) diff --git a/crates/libtest2-harness/src/notify/pretty.rs b/crates/libtest2-harness/src/notify/pretty.rs index 1c827fc..50156c7 100644 --- a/crates/libtest2-harness/src/notify/pretty.rs +++ b/crates/libtest2-harness/src/notify/pretty.rs @@ -31,14 +31,14 @@ impl super::Notifier for PrettyRunNotifier { fn notify(&mut self, event: Event) -> std::io::Result<()> { self.summary.notify(event.clone())?; match event { - Event::DiscoverStart => {} + Event::DiscoverStart { .. } => {} Event::DiscoverCase { name, run, .. } => { if run { self.name_width = name.len().max(self.name_width); } } Event::DiscoverComplete { .. } => {} - Event::SuiteStart => { + Event::SuiteStart { .. } => { self.summary.write_start(&mut self.writer)?; } Event::CaseStart { name, .. } => { diff --git a/crates/libtest2-harness/src/notify/summary.rs b/crates/libtest2-harness/src/notify/summary.rs index 0ae5c4d..4132ce6 100644 --- a/crates/libtest2-harness/src/notify/summary.rs +++ b/crates/libtest2-harness/src/notify/summary.rs @@ -87,7 +87,7 @@ impl Summary { impl super::Notifier for Summary { fn notify(&mut self, event: Event) -> std::io::Result<()> { match event { - Event::DiscoverStart => {} + Event::DiscoverStart { .. } => {} Event::DiscoverCase { run, .. } => { if run { self.num_run += 1; @@ -96,7 +96,7 @@ impl super::Notifier for Summary { } } Event::DiscoverComplete { .. } => {} - Event::SuiteStart => {} + Event::SuiteStart { .. } => {} Event::CaseStart { .. } => {} Event::CaseComplete { name, diff --git a/crates/libtest2-harness/src/notify/terse.rs b/crates/libtest2-harness/src/notify/terse.rs index e5388df..0ab3b68 100644 --- a/crates/libtest2-harness/src/notify/terse.rs +++ b/crates/libtest2-harness/src/notify/terse.rs @@ -19,8 +19,10 @@ impl TerseListNotifier { impl super::Notifier for TerseListNotifier { fn notify(&mut self, event: Event) -> std::io::Result<()> { match event { - Event::DiscoverStart => {} - Event::DiscoverCase { name, mode, run } => { + Event::DiscoverStart { .. } => {} + Event::DiscoverCase { + name, mode, run, .. + } => { if run { let mode = mode.as_str(); writeln!(self.writer, "{name}: {mode}")?; @@ -32,7 +34,7 @@ impl super::Notifier for TerseListNotifier { writeln!(self.writer, "{} tests", self.tests)?; writeln!(self.writer)?; } - Event::SuiteStart => {} + Event::SuiteStart { .. } => {} Event::CaseStart { .. } => {} Event::CaseComplete { .. } => {} Event::SuiteComplete { .. } => {} @@ -60,10 +62,10 @@ impl super::Notifier for TerseRunNotifier { fn notify(&mut self, event: Event) -> std::io::Result<()> { self.summary.notify(event.clone())?; match event { - Event::DiscoverStart => {} + Event::DiscoverStart { .. } => {} Event::DiscoverCase { .. } => {} Event::DiscoverComplete { .. } => {} - Event::SuiteStart => { + Event::SuiteStart { .. } => { self.summary.write_start(&mut self.writer)?; } Event::CaseStart { .. } => {} diff --git a/crates/libtest2-mimic/tests/testsuite/mixed_bag.rs b/crates/libtest2-mimic/tests/testsuite/mixed_bag.rs index dc74494..d01d1e6 100644 --- a/crates/libtest2-mimic/tests/testsuite/mixed_bag.rs +++ b/crates/libtest2-mimic/tests/testsuite/mixed_bag.rs @@ -706,43 +706,52 @@ fn list_json() { str![[r#" [ { + "elapsed_s": "[..]", "event": "discover_start" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bunny", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bear" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "cat" }, @@ -757,43 +766,52 @@ fn list_json() { str![[r#" [ { + "elapsed_s": "[..]", "event": "discover_start" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bunny", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bear" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "cat" }, @@ -817,43 +835,52 @@ fn test_json() { str![[r#" [ { + "elapsed_s": "[..]", "event": "discover_start" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bunny", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bear" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "cat" }, @@ -862,9 +889,11 @@ fn test_json() { "event": "discover_complete" }, { + "elapsed_s": "[..]", "event": "suite_start" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "bear" }, @@ -876,6 +905,7 @@ fn test_json() { "status": "ignored" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "cat" }, @@ -895,76 +925,88 @@ fn test_json() { str![[r#" [ { - "event": "discover_start" + "elapsed_s": "[..]", + "event": "discover_complete" }, { - "event": "discover_case", - "name": "bear" + "elapsed_s": "[..]", + "event": "case_complete", + "message": "fails", + "name": "bear", + "status": "ignored" }, { - "event": "discover_case", - "name": "bunny", - "run": false + "elapsed_s": "[..]", + "event": "case_complete", + "name": "cat" + }, + { + "elapsed_s": "[..]", + "event": "suite_complete" + }, + { + "elapsed_s": "[..]", + "event": "discover_start" }, { + "elapsed_s": "[..]", "event": "discover_case", - "name": "cat" + "name": "bunny", + "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl", "run": false }, { "elapsed_s": "[..]", - "event": "discover_complete" - }, - { - "event": "suite_start" - }, - { - "event": "case_start", + "event": "discover_case", "name": "bear" }, { "elapsed_s": "[..]", - "event": "case_complete", - "message": "fails", - "name": "bear", - "status": "ignored" + "event": "discover_case", + "name": "cat" }, { - "event": "case_start", - "name": "cat" + "elapsed_s": "[..]", + "event": "suite_start" }, { "elapsed_s": "[..]", - "event": "case_complete", - "name": "cat" + "event": "case_start", + "name": "bear" }, { "elapsed_s": "[..]", - "event": "suite_complete" + "event": "case_start", + "name": "cat" } ] "#]] @@ -1058,37 +1100,46 @@ fn fail_fast_json() { str![[r#" [ { + "elapsed_s": "[..]", "event": "discover_start" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bear" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bunny" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "cat" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl" }, @@ -1097,9 +1148,11 @@ fn fail_fast_json() { "event": "discover_complete" }, { + "elapsed_s": "[..]", "event": "suite_start" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "bear" }, @@ -1111,6 +1164,7 @@ fn fail_fast_json() { "status": "ignored" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "bunny" }, @@ -1122,6 +1176,7 @@ fn fail_fast_json() { "status": "ignored" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "cat" }, @@ -1131,6 +1186,7 @@ fn fail_fast_json() { "name": "cat" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "dog" }, diff --git a/crates/libtest2/tests/testsuite/mixed_bag.rs b/crates/libtest2/tests/testsuite/mixed_bag.rs index 2f9cf64..8a5a2e1 100644 --- a/crates/libtest2/tests/testsuite/mixed_bag.rs +++ b/crates/libtest2/tests/testsuite/mixed_bag.rs @@ -713,43 +713,52 @@ fn list_json() { str![[r#" [ { + "elapsed_s": "[..]", "event": "discover_start" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bunny", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bear" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "cat" }, @@ -764,43 +773,52 @@ fn list_json() { str![[r#" [ { + "elapsed_s": "[..]", "event": "discover_start" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bunny", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bear" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "cat" }, @@ -824,43 +842,52 @@ fn test_json() { str![[r#" [ { + "elapsed_s": "[..]", "event": "discover_start" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bunny", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bear" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "cat" }, @@ -869,9 +896,11 @@ fn test_json() { "event": "discover_complete" }, { + "elapsed_s": "[..]", "event": "suite_start" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "bear" }, @@ -883,6 +912,7 @@ fn test_json() { "status": "ignored" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "cat" }, @@ -902,76 +932,88 @@ fn test_json() { str![[r#" [ { - "event": "discover_start" + "elapsed_s": "[..]", + "event": "discover_complete" }, { - "event": "discover_case", - "name": "bear" + "elapsed_s": "[..]", + "event": "case_complete", + "message": "fails", + "name": "bear", + "status": "ignored" }, { - "event": "discover_case", - "name": "bunny", - "run": false + "elapsed_s": "[..]", + "event": "case_complete", + "name": "cat" + }, + { + "elapsed_s": "[..]", + "event": "suite_complete" }, { + "elapsed_s": "[..]", + "event": "discover_start" + }, + { + "elapsed_s": "[..]", "event": "discover_case", - "name": "cat" + "name": "bunny", + "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog", "run": false }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl", "run": false }, { "elapsed_s": "[..]", - "event": "discover_complete" - }, - { - "event": "suite_start" - }, - { - "event": "case_start", + "event": "discover_case", "name": "bear" }, { "elapsed_s": "[..]", - "event": "case_complete", - "message": "fails", - "name": "bear", - "status": "ignored" + "event": "discover_case", + "name": "cat" }, { - "event": "case_start", - "name": "cat" + "elapsed_s": "[..]", + "event": "suite_start" }, { "elapsed_s": "[..]", - "event": "case_complete", + "event": "case_start", "name": "cat" }, { "elapsed_s": "[..]", - "event": "suite_complete" + "event": "case_start", + "name": "bear" } ] "#]] @@ -1065,37 +1107,46 @@ fn fail_fast_json() { str![[r#" [ { + "elapsed_s": "[..]", "event": "discover_start" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bear" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "bunny" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "cat" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "dog" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fly" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "fox" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "frog" }, { + "elapsed_s": "[..]", "event": "discover_case", "name": "owl" }, @@ -1104,9 +1155,11 @@ fn fail_fast_json() { "event": "discover_complete" }, { + "elapsed_s": "[..]", "event": "suite_start" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "bear" }, @@ -1118,6 +1171,7 @@ fn fail_fast_json() { "status": "ignored" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "bunny" }, @@ -1129,6 +1183,7 @@ fn fail_fast_json() { "status": "ignored" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "cat" }, @@ -1138,6 +1193,7 @@ fn fail_fast_json() { "name": "cat" }, { + "elapsed_s": "[..]", "event": "case_start", "name": "dog" },