diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2023-10-05 21:45:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-05 21:45:11 +0100 |
commit | ac464ead49c9f676d7117baa2ab06433e132e188 (patch) | |
tree | 646d0674bb8d585478d3520b61785c7d453044e3 /cli/tools/jupyter/mod.rs | |
parent | 820e93e3e742a22f010f3200312039c50ae0d63a (diff) |
feat(jupyter): support Deno.test() (#20778)
Diffstat (limited to 'cli/tools/jupyter/mod.rs')
-rw-r--r-- | cli/tools/jupyter/mod.rs | 59 |
1 files changed, 53 insertions, 6 deletions
diff --git a/cli/tools/jupyter/mod.rs b/cli/tools/jupyter/mod.rs index fb0860e36..62b298352 100644 --- a/cli/tools/jupyter/mod.rs +++ b/cli/tools/jupyter/mod.rs @@ -3,6 +3,7 @@ use crate::args::Flags; use crate::args::JupyterFlags; use crate::ops; +use crate::tools::jupyter::server::StdioMsg; use crate::tools::repl; use crate::util::logger; use crate::CliFactory; @@ -12,9 +13,17 @@ use deno_core::located_script_name; use deno_core::resolve_url_or_path; use deno_core::serde::Deserialize; use deno_core::serde_json; +use deno_runtime::deno_io::Stdio; +use deno_runtime::deno_io::StdioPipe; use deno_runtime::permissions::Permissions; use deno_runtime::permissions::PermissionsContainer; use tokio::sync::mpsc; +use tokio::sync::mpsc::unbounded_channel; +use tokio::sync::mpsc::UnboundedSender; + +use super::test::reporters::PrettyTestReporter; +use super::test::TestEvent; +use super::test::TestEventSender; mod install; pub(crate) mod jupyter_msg; @@ -71,13 +80,25 @@ pub async fn kernel( connection_filepath ) })?; - + let (test_event_sender, test_event_receiver) = + unbounded_channel::<TestEvent>(); + let test_event_sender = TestEventSender::new(test_event_sender); + let stdout = StdioPipe::File(test_event_sender.stdout()); + let stderr = StdioPipe::File(test_event_sender.stderr()); let mut worker = worker_factory .create_custom_worker( main_module.clone(), permissions, - vec![ops::jupyter::deno_jupyter::init_ops(stdio_tx)], - Default::default(), + vec![ + ops::jupyter::deno_jupyter::init_ops(stdio_tx.clone()), + ops::testing::deno_test::init_ops(test_event_sender.clone()), + ], + // FIXME(nayeemrmn): Test output capturing currently doesn't work. + Stdio { + stdin: StdioPipe::Inherit, + stdout, + stderr, + }, ) .await?; worker.setup_repl().await?; @@ -86,9 +107,35 @@ pub async fn kernel( "Deno[Deno.internal].enableJupyter();", )?; let worker = worker.into_main_worker(); - let repl_session = - repl::ReplSession::initialize(cli_options, npm_resolver, resolver, worker) - .await?; + let mut repl_session = repl::ReplSession::initialize( + cli_options, + npm_resolver, + resolver, + worker, + main_module, + test_event_sender, + test_event_receiver, + ) + .await?; + struct TestWriter(UnboundedSender<StdioMsg>); + impl std::io::Write for TestWriter { + fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> { + self + .0 + .send(StdioMsg::Stdout(String::from_utf8_lossy(buf).into_owned())) + .ok(); + Ok(buf.len()) + } + fn flush(&mut self) -> std::io::Result<()> { + Ok(()) + } + } + repl_session.set_test_reporter_factory(Box::new(move || { + Box::new( + PrettyTestReporter::new(false, true, false, true) + .with_writer(Box::new(TestWriter(stdio_tx.clone()))), + ) + })); server::JupyterServer::start(spec, stdio_rx, repl_session).await?; |