diff options
author | Casper Beyer <caspervonb@pm.me> | 2021-04-29 02:17:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-28 20:17:04 +0200 |
commit | c455c28b834683f6516422dbf1b020fbb2c1bbb6 (patch) | |
tree | 96e1484f4853969ae46539c26ffd8d716f409eb7 /cli/ops/testing.rs | |
parent | 0260b488fbba9a43c64641428d3603b8761067a4 (diff) |
feat(test): run test modules in parallel (#9815)
This commit adds support for running test in parallel.
Entire test runner functionality has been rewritten
from JavaScript to Rust and a set of ops was added to support reporting in Rust.
A new "--jobs" flag was added to "deno test" that allows to configure
how many threads will be used. When given no value it defaults to 2.
Diffstat (limited to 'cli/ops/testing.rs')
-rw-r--r-- | cli/ops/testing.rs | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/cli/ops/testing.rs b/cli/ops/testing.rs new file mode 100644 index 000000000..450f55a41 --- /dev/null +++ b/cli/ops/testing.rs @@ -0,0 +1,91 @@ +use crate::tools::test_runner::TestMessage; +use deno_core::error::generic_error; +use deno_core::error::AnyError; +use deno_core::serde_json; +use deno_core::serde_json::json; +use deno_core::serde_json::Value; +use deno_core::JsRuntime; +use deno_core::OpState; +use deno_core::ZeroCopyBuf; +use deno_runtime::ops::worker_host::create_worker_permissions; +use deno_runtime::ops::worker_host::PermissionsArg; +use deno_runtime::permissions::Permissions; +use serde::Deserialize; +use std::sync::mpsc::Sender; +use uuid::Uuid; + +pub fn init(rt: &mut JsRuntime) { + super::reg_sync(rt, "op_pledge_test_permissions", op_pledge_test_permissions); + super::reg_sync( + rt, + "op_restore_test_permissions", + op_restore_test_permissions, + ); + super::reg_sync(rt, "op_post_test_message", op_post_test_message); +} + +#[derive(Clone)] +struct PermissionsHolder(Uuid, Permissions); + +pub fn op_pledge_test_permissions( + state: &mut OpState, + args: Value, + _zero_copy: Option<ZeroCopyBuf>, +) -> Result<Uuid, AnyError> { + deno_runtime::ops::check_unstable(state, "Deno.test.permissions"); + + let token = Uuid::new_v4(); + let parent_permissions = state.borrow::<Permissions>().clone(); + let worker_permissions = { + let permissions: PermissionsArg = serde_json::from_value(args)?; + create_worker_permissions(parent_permissions.clone(), permissions)? + }; + + state.put::<PermissionsHolder>(PermissionsHolder(token, parent_permissions)); + + // NOTE: This call overrides current permission set for the worker + state.put::<Permissions>(worker_permissions); + + Ok(token) +} + +pub fn op_restore_test_permissions( + state: &mut OpState, + token: Uuid, + _zero_copy: Option<ZeroCopyBuf>, +) -> Result<(), AnyError> { + deno_runtime::ops::check_unstable(state, "Deno.test.permissions"); + + if let Some(permissions_holder) = state.try_take::<PermissionsHolder>() { + if token != permissions_holder.0 { + panic!("restore test permissions token does not match the stored token"); + } + + let permissions = permissions_holder.1; + state.put::<Permissions>(permissions); + Ok(()) + } else { + Err(generic_error("no permissions to restore")) + } +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct PostTestMessageArgs { + message: TestMessage, +} + +fn op_post_test_message( + state: &mut OpState, + args: Value, + _zero_copy: Option<ZeroCopyBuf>, +) -> Result<Value, AnyError> { + let args: PostTestMessageArgs = serde_json::from_value(args)?; + let sender = state.borrow::<Sender<TestMessage>>().clone(); + + if sender.send(args.message).is_err() { + Ok(json!(false)) + } else { + Ok(json!(true)) + } +} |