From c86ee742a2522a169bfe40890b946c646aeac1cf Mon Sep 17 00:00:00 2001 From: Nayeem Rahman Date: Fri, 9 Apr 2021 16:55:33 +0100 Subject: fix: async op error stacktraces (#10080) Co-authored-by: Aaron O'Mullan --- core/ops_json.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'core/ops_json.rs') diff --git a/core/ops_json.rs b/core/ops_json.rs index 21c6b219f..0efd44a90 100644 --- a/core/ops_json.rs +++ b/core/ops_json.rs @@ -108,3 +108,51 @@ where }, ) } + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn json_op_async_stack_trace() { + let mut runtime = crate::JsRuntime::new(Default::default()); + + async fn op_throw( + _state: Rc>, + msg: Option, + zero_copy: Option, + ) -> Result<(), AnyError> { + assert_eq!(msg.unwrap(), "hello"); + assert!(zero_copy.is_none()); + Err(crate::error::generic_error("foo")) + } + + runtime.register_op("op_throw", json_op_async(op_throw)); + runtime + .execute( + "", + r#" + // First we initialize the ops cache. This maps op names to their id's. + Deno.core.ops(); + // Register the error class. + Deno.core.registerErrorClass('Error', Error); + + async function f1() { + await Deno.core.jsonOpAsync('op_throw', 'hello'); + } + + async function f2() { + await f1(); + } + + f2(); + "#, + ) + .unwrap(); + let e = runtime.run_event_loop().await.unwrap_err().to_string(); + println!("{}", e); + assert!(e.contains("Error: foo")); + assert!(e.contains("at async f1 (:")); + assert!(e.contains("at async f2 (:")); + } +} -- cgit v1.2.3