fix: async op error stacktraces (#10080)

Co-authored-by: Aaron O'Mullan <aaron.omullan@gmail.com>
This commit is contained in:
Nayeem Rahman 2021-04-09 16:55:33 +01:00 committed by GitHub
parent c6e7a243d5
commit c86ee742a2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 73 additions and 50 deletions

View file

@ -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<RefCell<OpState>>,
msg: Option<String>,
zero_copy: Option<ZeroCopyBuf>,
) -> 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(
"<init>",
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 (<init>:"));
assert!(e.contains("at async f2 (<init>:"));
}
}