summaryrefslogtreecommitdiff
path: root/cli/ops/testing.rs
diff options
context:
space:
mode:
authorCasper Beyer <caspervonb@pm.me>2021-04-29 02:17:04 +0800
committerGitHub <noreply@github.com>2021-04-28 20:17:04 +0200
commitc455c28b834683f6516422dbf1b020fbb2c1bbb6 (patch)
tree96e1484f4853969ae46539c26ffd8d716f409eb7 /cli/ops/testing.rs
parent0260b488fbba9a43c64641428d3603b8761067a4 (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.rs91
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))
+ }
+}