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/main.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/main.rs')
-rw-r--r-- | cli/main.rs | 107 |
1 files changed, 26 insertions, 81 deletions
diff --git a/cli/main.rs b/cli/main.rs index d66bdcee9..6b5c5da27 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -219,7 +219,7 @@ pub fn create_main_worker( ops::runtime_compiler::init(js_runtime); if enable_testing { - ops::test_runner::init(js_runtime); + ops::testing::init(js_runtime); } js_runtime.sync_ops_cache(); @@ -902,6 +902,7 @@ async fn coverage_command( .await } +#[allow(clippy::too_many_arguments)] async fn test_command( flags: Flags, include: Option<Vec<String>>, @@ -910,87 +911,23 @@ async fn test_command( quiet: bool, allow_none: bool, filter: Option<String>, + concurrent_jobs: usize, ) -> Result<(), AnyError> { - let program_state = ProgramState::build(flags.clone()).await?; - let permissions = Permissions::from_options(&flags.clone().into()); - let cwd = std::env::current_dir().expect("No current directory"); - let include = include.unwrap_or_else(|| vec![".".to_string()]); - let test_modules = - tools::test_runner::prepare_test_modules_urls(include, &cwd)?; - - if test_modules.is_empty() { - println!("No matching test modules found"); - if !allow_none { - std::process::exit(1); - } - return Ok(()); - } - let main_module = deno_core::resolve_path("$deno$test.ts")?; - // Create a dummy source file. - let source_file = File { - local: main_module.to_file_path().unwrap(), - maybe_types: None, - media_type: MediaType::TypeScript, - source: tools::test_runner::render_test_file( - test_modules.clone(), - fail_fast, - quiet, - filter, - ), - specifier: main_module.clone(), - }; - // Save our fake file into file fetcher cache - // to allow module access by TS compiler - program_state.file_fetcher.insert_cached(source_file); - - if no_run { - let lib = if flags.unstable { - module_graph::TypeLib::UnstableDenoWindow - } else { - module_graph::TypeLib::DenoWindow - }; - program_state - .prepare_module_load( - main_module.clone(), - lib, - Permissions::allow_all(), - false, - program_state.maybe_import_map.clone(), - ) - .await?; - return Ok(()); - } - - let mut worker = - create_main_worker(&program_state, main_module.clone(), permissions, true); - if let Some(ref coverage_dir) = flags.coverage_dir { env::set_var("DENO_UNSTABLE_COVERAGE_DIR", coverage_dir); } - let mut maybe_coverage_collector = - if let Some(ref coverage_dir) = program_state.coverage_dir { - let session = worker.create_inspector_session(); - let coverage_dir = PathBuf::from(coverage_dir); - let mut coverage_collector = - tools::coverage::CoverageCollector::new(coverage_dir, session); - coverage_collector.start_collecting().await?; - - Some(coverage_collector) - } else { - None - }; - - let execute_result = worker.execute_module(&main_module).await; - execute_result?; - worker.execute("window.dispatchEvent(new Event('load'))")?; - worker.run_event_loop().await?; - worker.execute("window.dispatchEvent(new Event('unload'))")?; - worker.run_event_loop().await?; - - if let Some(coverage_collector) = maybe_coverage_collector.as_mut() { - coverage_collector.stop_collecting().await?; - } + tools::test_runner::run_tests( + flags, + include, + no_run, + fail_fast, + quiet, + allow_none, + filter, + concurrent_jobs, + ) + .await?; Ok(()) } @@ -1125,10 +1062,18 @@ fn get_subcommand( include, allow_none, filter, - } => { - test_command(flags, include, no_run, fail_fast, quiet, allow_none, filter) - .boxed_local() - } + concurrent_jobs, + } => test_command( + flags, + include, + no_run, + fail_fast, + quiet, + allow_none, + filter, + concurrent_jobs, + ) + .boxed_local(), DenoSubcommand::Completions { buf } => { if let Err(e) = write_to_stdout_ignore_sigpipe(&buf) { eprintln!("{}", e); |