summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/file_fetcher.rs2
-rw-r--r--cli/tests/integration/coverage_tests.rs14
-rw-r--r--cli/tools/coverage.rs85
3 files changed, 67 insertions, 34 deletions
diff --git a/cli/file_fetcher.rs b/cli/file_fetcher.rs
index 1c3b093ff..2a7b86727 100644
--- a/cli/file_fetcher.rs
+++ b/cli/file_fetcher.rs
@@ -328,7 +328,7 @@ impl FileFetcher {
/// Fetch cached remote file.
///
/// This is a recursive operation if source file has redirections.
- fn fetch_cached(
+ pub(crate) fn fetch_cached(
&self,
specifier: &ModuleSpecifier,
redirect_limit: i64,
diff --git a/cli/tests/integration/coverage_tests.rs b/cli/tests/integration/coverage_tests.rs
index feba0769e..637185e29 100644
--- a/cli/tests/integration/coverage_tests.rs
+++ b/cli/tests/integration/coverage_tests.rs
@@ -20,9 +20,11 @@ fn final_blankline() {
}
fn run_coverage_text(test_name: &str, extension: &str) {
+ let deno_dir = TempDir::new().expect("tempdir fail");
let tempdir = TempDir::new().expect("tempdir fail");
let tempdir = tempdir.path().join("cov");
- let status = util::deno_cmd()
+
+ let status = util::deno_cmd_with_deno_dir(deno_dir.path())
.current_dir(util::testdata_path())
.arg("test")
.arg("--quiet")
@@ -36,17 +38,19 @@ fn run_coverage_text(test_name: &str, extension: &str) {
assert!(status.success());
- let output = util::deno_cmd()
+ let output = util::deno_cmd_with_deno_dir(deno_dir.path())
.current_dir(util::testdata_path())
.arg("coverage")
- .arg("--quiet")
.arg("--unstable")
.arg(format!("{}/", tempdir.to_str().unwrap()))
.stdout(std::process::Stdio::piped())
- .stderr(std::process::Stdio::inherit())
+ .stderr(std::process::Stdio::piped())
.output()
.expect("failed to spawn coverage reporter");
+ // Verify there's no "Check" being printed
+ assert!(output.stderr.is_empty());
+
let actual =
util::strip_ansi_codes(std::str::from_utf8(&output.stdout).unwrap())
.to_string();
@@ -64,7 +68,7 @@ fn run_coverage_text(test_name: &str, extension: &str) {
assert!(output.status.success());
- let output = util::deno_cmd()
+ let output = util::deno_cmd_with_deno_dir(deno_dir.path())
.current_dir(util::testdata_path())
.arg("coverage")
.arg("--quiet")
diff --git a/cli/tools/coverage.rs b/cli/tools/coverage.rs
index 888344fe1..3cec35606 100644
--- a/cli/tools/coverage.rs
+++ b/cli/tools/coverage.rs
@@ -1,7 +1,6 @@
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
use crate::colors;
-use crate::emit;
use crate::flags::CoverageFlags;
use crate::flags::Flags;
use crate::fs_util::collect_files;
@@ -11,11 +10,12 @@ use crate::tools::fmt::format_json;
use deno_ast::MediaType;
use deno_ast::ModuleSpecifier;
+use deno_core::anyhow::anyhow;
+use deno_core::anyhow::Context;
use deno_core::error::AnyError;
use deno_core::serde_json;
use deno_core::url::Url;
use deno_core::LocalInspectorSession;
-use deno_runtime::permissions::Permissions;
use regex::Regex;
use serde::Deserialize;
use serde::Serialize;
@@ -643,40 +643,69 @@ pub async fn cover_files(
for script_coverage in script_coverages {
let module_specifier =
deno_core::resolve_url_or_path(&script_coverage.url)?;
- ps.prepare_module_load(
- vec![module_specifier.clone()],
- false,
- emit::TypeLib::UnstableDenoWindow,
- Permissions::allow_all(),
- Permissions::allow_all(),
- false,
- )
- .await?;
-
- let module_source = ps.load(module_specifier.clone(), None, false)?;
- let script_source = &module_source.code;
+ let maybe_file = if module_specifier.scheme() == "file" {
+ ps.file_fetcher.get_source(&module_specifier)
+ } else {
+ ps.file_fetcher
+ .fetch_cached(&module_specifier, 10)
+ .with_context(|| {
+ format!("Failed to fetch \"{}\" from cache.", module_specifier)
+ })?
+ };
+ let file = maybe_file.ok_or_else(|| {
+ anyhow!("Failed to fetch \"{}\" from cache.
+ Before generating coverage report, run `deno test --coverage` to ensure consistent state.",
+ module_specifier
+ )
+ })?;
+
+ // Check if file was transpiled
+ let transpiled_source = match file.media_type {
+ MediaType::JavaScript
+ | MediaType::Unknown
+ | MediaType::Cjs
+ | MediaType::Mjs
+ | MediaType::Json => file.source.as_ref().clone(),
+ MediaType::Dts | MediaType::Dmts | MediaType::Dcts => "".to_string(),
+ MediaType::TypeScript
+ | MediaType::Jsx
+ | MediaType::Mts
+ | MediaType::Cts
+ | MediaType::Tsx => {
+ let emit_path = ps
+ .dir
+ .gen_cache
+ .get_cache_filename_with_extension(&file.specifier, "js")
+ .unwrap_or_else(|| {
+ unreachable!("Unable to get cache filename: {}", &file.specifier)
+ });
+ match ps.dir.gen_cache.get(&emit_path) {
+ Ok(b) => String::from_utf8(b).unwrap(),
+ Err(_) => {
+ return Err(anyhow!(
+ "Missing transpiled source code for: \"{}\".
+ Before generating coverage report, run `deno test --coverage` to ensure consistent state.",
+ file.specifier,
+ ))
+ }
+ }
+ }
+ MediaType::Wasm | MediaType::TsBuildInfo | MediaType::SourceMap => {
+ unreachable!()
+ }
+ };
+
+ let original_source = &file.source;
let maybe_source_map = ps.get_source_map(&script_coverage.url);
- let maybe_cached_source = ps
- .file_fetcher
- .get_source(&module_specifier)
- .map(|f| f.source);
let coverage_report = generate_coverage_report(
&script_coverage,
- script_source,
+ &transpiled_source,
&maybe_source_map,
);
- let file_text = if let Some(original_source) =
- maybe_source_map.and(maybe_cached_source.as_ref())
- {
- original_source.as_str()
- } else {
- script_source
- };
-
- reporter.report(&coverage_report, file_text);
+ reporter.report(&coverage_report, original_source);
}
reporter.done();