]> git.proxmox.com Git - cargo.git/commitdiff
Add reasons to all ignored tests.
authorEric Huss <eric@huss.org>
Tue, 2 Aug 2022 19:12:13 +0000 (12:12 -0700)
committerEric Huss <eric@huss.org>
Tue, 2 Aug 2022 19:24:00 +0000 (12:24 -0700)
crates/cargo-test-macro/src/lib.rs
tests/testsuite/advanced_env.rs
tests/testsuite/artifact_dep.rs
tests/testsuite/build_script.rs
tests/testsuite/collisions.rs
tests/testsuite/cross_compile.rs
tests/testsuite/doc.rs
tests/testsuite/old_cargos.rs
tests/testsuite/profile_custom.rs
tests/testsuite/rustdoc_extern_html.rs

index 65a68204a438a766dd1bbc78c93f90f9514bdf5c..1577d3a30dae94fe43f637a5774205acdabd950c 100644 (file)
@@ -20,7 +20,17 @@ pub fn cargo_test(attr: TokenStream, item: TokenStream) -> TokenStream {
     // but they don't really handle the absence of files well.
     let mut ignore = false;
     let mut requires_reason = false;
-    let mut found_reason = false;
+    let mut explicit_reason = None;
+    let mut implicit_reasons = Vec::new();
+    macro_rules! set_ignore {
+        ($predicate:expr, $($arg:tt)*) => {
+            let p = $predicate;
+            ignore |= p;
+            if p {
+                implicit_reasons.push(std::fmt::format(format_args!($($arg)*)));
+            }
+        };
+    }
     let is_not_nightly = !version().1;
     for rule in split_rules(attr) {
         match rule.as_str() {
@@ -29,57 +39,81 @@ pub fn cargo_test(attr: TokenStream, item: TokenStream) -> TokenStream {
                 // explicit opt-in (these generally only work on linux, and
                 // have some extra requirements, and are slow, and can pollute
                 // the environment since it downloads dependencies).
-                ignore |= is_not_nightly;
-                ignore |= option_env!("CARGO_RUN_BUILD_STD_TESTS").is_none();
+                set_ignore!(is_not_nightly, "requires nightly");
+                set_ignore!(
+                    option_env!("CARGO_RUN_BUILD_STD_TESTS").is_none(),
+                    "CARGO_RUN_BUILD_STD_TESTS must be set"
+                );
             }
             "build_std_mock" => {
                 // Only run the "mock" build-std tests on nightly and disable
                 // for windows-gnu which is missing object files (see
                 // https://github.com/rust-lang/wg-cargo-std-aware/issues/46).
-                ignore |= is_not_nightly;
-                ignore |= cfg!(all(target_os = "windows", target_env = "gnu"));
+                set_ignore!(is_not_nightly, "requires nightly");
+                set_ignore!(
+                    cfg!(all(target_os = "windows", target_env = "gnu")),
+                    "does not work on windows-gnu"
+                );
             }
             "nightly" => {
                 requires_reason = true;
-                ignore |= is_not_nightly;
+                set_ignore!(is_not_nightly, "requires nightly");
             }
             s if s.starts_with("requires_") => {
                 let command = &s[9..];
-                ignore |= !has_command(command);
+                set_ignore!(!has_command(command), "{command} not installed");
             }
             s if s.starts_with(">=1.") => {
                 requires_reason = true;
                 let min_minor = s[4..].parse().unwrap();
-                ignore |= version().0 < min_minor;
+                let minor = version().0;
+                set_ignore!(minor < min_minor, "requires rustc 1.{minor} or newer");
             }
             s if s.starts_with("reason=") => {
-                found_reason = true;
+                explicit_reason = Some(s[7..].parse().unwrap());
             }
             _ => panic!("unknown rule {:?}", rule),
         }
     }
-    if requires_reason && !found_reason {
+    if requires_reason && explicit_reason.is_none() {
         panic!(
             "#[cargo_test] with a rule also requires a reason, \
             such as #[cargo_test(nightly, reason = \"needs -Z unstable-thing\")]"
         );
     }
 
+    // Construct the appropriate attributes.
     let span = Span::call_site();
     let mut ret = TokenStream::new();
-    let add_attr = |ret: &mut TokenStream, attr_name| {
+    let add_attr = |ret: &mut TokenStream, attr_name, attr_input| {
         ret.extend(Some(TokenTree::from(Punct::new('#', Spacing::Alone))));
         let attr = TokenTree::from(Ident::new(attr_name, span));
+        let mut attr_stream: TokenStream = attr.into();
+        if let Some(input) = attr_input {
+            attr_stream.extend(input);
+        }
         ret.extend(Some(TokenTree::from(Group::new(
             Delimiter::Bracket,
-            attr.into(),
+            attr_stream,
         ))));
     };
-    add_attr(&mut ret, "test");
+    add_attr(&mut ret, "test", None);
     if ignore {
-        add_attr(&mut ret, "ignore");
+        let reason = explicit_reason
+            .or_else(|| {
+                (!implicit_reasons.is_empty())
+                    .then(|| TokenTree::from(Literal::string(&implicit_reasons.join(", "))).into())
+            })
+            .map(|reason: TokenStream| {
+                let mut stream = TokenStream::new();
+                stream.extend(Some(TokenTree::from(Punct::new('=', Spacing::Alone))));
+                stream.extend(Some(reason));
+                stream
+            });
+        add_attr(&mut ret, "ignore", reason);
     }
 
+    // Find where the function body starts, and add the boilerplate at the start.
     for token in item {
         let group = match token {
             TokenTree::Group(g) => {
index 68d1ee8d5bb634b5d4a1473844916914e87fcf2e..04b86e1310b4b093eb00f92b830b592d2082974b 100644 (file)
@@ -5,7 +5,7 @@ use cargo_test_support::{paths, project, registry::Package};
 #[cargo_test]
 // I don't know why, but `Command` forces all env keys to be upper case on
 // Windows. Seems questionable, since I think Windows is case-preserving.
-#[cfg_attr(windows, ignore)]
+#[cfg_attr(windows, ignore = "broken due to not preserving case on Windows")]
 fn source_config_env() {
     // Try to define [source] with environment variables.
     let p = project()
index 521e59537beaac0dd02dada2ac187f6772443caa..ccc5214f7407a722062fd16b46679a26df0b009f 100644 (file)
@@ -1331,7 +1331,8 @@ fn build_script_deps_adopts_target_platform_if_target_equals_target() {
 }
 
 #[cargo_test]
-#[cfg_attr(target_env = "msvc", ignore)] // TODO(ST): rename bar (dependency) to something else and un-ignore this with RFC-3176
+// TODO(ST): rename bar (dependency) to something else and un-ignore this with RFC-3176
+#[cfg_attr(target_env = "msvc", ignore = "msvc not working")]
 fn profile_override_basic() {
     let p = project()
         .file(
@@ -1450,7 +1451,7 @@ foo v0.0.0 ([CWD])
 //       For reference, see comments by ehuss https://github.com/rust-lang/cargo/pull/9992#discussion_r801086315 and
 //       joshtriplett https://github.com/rust-lang/cargo/pull/9992#issuecomment-1033394197 .
 #[cargo_test]
-#[ignore]
+#[ignore = "broken, need artifact info in index"]
 fn targets_are_picked_up_from_non_workspace_artifact_deps() {
     if cross_compile::disabled() {
         return;
index f7a7f8adc262cd48da8d642d3c8b987aa1c6a935..4a3ba930a127fc9dcc46a8472a63a8521a0d7bbc 100644 (file)
@@ -4236,8 +4236,10 @@ fn rename_with_link_search_path() {
 }
 
 #[cargo_test]
-// Don't have a cdylib cross target on macos.
-#[cfg_attr(target_os = "macos", ignore)]
+#[cfg_attr(
+    target_os = "macos",
+    ignore = "don't have a cdylib cross target on macos"
+)]
 fn rename_with_link_search_path_cross() {
     if cross_compile::disabled() {
         return;
index 3ebf1f920aa30b65fa831c9ba1f1d9bad60d8840..98a4fe6ae32b83dde04588ad618b8d04861f182f 100644 (file)
@@ -91,9 +91,11 @@ This may become a hard error in the future; see <https://github.com/rust-lang/ca
 }
 
 #[cargo_test]
-// --out-dir and examples are currently broken on MSVC and apple.
 // See https://github.com/rust-lang/cargo/issues/7493
-#[cfg_attr(any(target_env = "msvc", target_vendor = "apple"), ignore)]
+#[cfg_attr(
+    any(target_env = "msvc", target_vendor = "apple"),
+    ignore = "--out-dir and examples are currently broken on MSVC and apple"
+)]
 fn collision_export() {
     // `--out-dir` combines some things which can cause conflicts.
     let p = project()
index 859015959bb0ec7810c0c2355aed646851768320..58820fed15c5851a8131774811d7c29f32fce076 100644 (file)
@@ -1206,8 +1206,10 @@ fn platform_specific_variables_reflected_in_build_scripts() {
 }
 
 #[cargo_test]
-// Don't have a dylib cross target on macos.
-#[cfg_attr(target_os = "macos", ignore)]
+#[cfg_attr(
+    target_os = "macos",
+    ignore = "don't have a dylib cross target on macos"
+)]
 fn cross_test_dylib() {
     if cross_compile::disabled() {
         return;
index 06d08a48c3bcc974a0d097956f4ff71037659c69..09d6b2b5f732056566a54b953e6f4dc109e2db37 100644 (file)
@@ -2424,7 +2424,7 @@ fn scrape_examples_avoid_build_script_cycle() {
 // The example is calling a function from a proc-macro, but proc-macros don't
 // export functions. It is not clear what this test is trying to exercise.
 // #[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
-#[ignore]
+#[ignore = "broken, needs fixing"]
 #[cargo_test]
 fn scrape_examples_complex_reverse_dependencies() {
     let p = project()
index 99b93cdd2c90de6c0e04a24e3835966f4e4686f1..a85e13d3b13ed688db6650845eb5fe6f63998578 100644 (file)
@@ -110,7 +110,7 @@ fn default_toolchain_is_stable() -> bool {
 //   The optional dependency `new-baz-dep` should not be activated.
 // * `bar` 1.0.2 has a dependency on `baz` that *requires* the new feature
 //   syntax.
-#[ignore]
+#[ignore = "must be run manually, requires old cargo installations"]
 #[cargo_test]
 fn new_features() {
     let registry = registry::init();
@@ -534,7 +534,7 @@ fn new_features() {
 }
 
 #[cargo_test]
-#[ignore]
+#[ignore = "must be run manually, requires old cargo installations"]
 fn index_cache_rebuild() {
     // Checks that the index cache gets rebuilt.
     //
@@ -618,7 +618,7 @@ foo v0.1.0 [..]
 }
 
 #[cargo_test]
-#[ignore]
+#[ignore = "must be run manually, requires old cargo installations"]
 fn avoids_split_debuginfo_collision() {
     // Test needs two different toolchains.
     // If the default toolchain is stable, then it won't work.
index 226aa60a667ca6bd52c5d170be3ee2f8106589e7..ea6b54c9514f2db313ee7773f21e4635c62d6b17 100644 (file)
@@ -94,7 +94,10 @@ Caused by:
 }
 
 #[cargo_test]
-#[ignore] // dir-name is currently disabled
+// We are currently uncertain if dir-name will ever be exposed to the user.
+// The code for it still roughly exists, but only for the internal profiles.
+// This test was kept in case we ever want to enable support for it again.
+#[ignore = "dir-name is disabled"]
 fn invalid_dir_name() {
     let p = project()
         .file(
index eba60e41313bda43801aae148db472bbdc70811a..9de7394f9f84d39a378185d39405c483df348d74 100644 (file)
@@ -55,8 +55,7 @@ fn simple() {
     assert!(myfun.contains(r#"href="https://docs.rs/bar/1.0.0/bar/struct.Straw.html""#));
 }
 
-// Broken, temporarily disable until https://github.com/rust-lang/rust/pull/82776 is resolved.
-#[ignore]
+#[ignore = "Broken, temporarily disabled until https://github.com/rust-lang/rust/pull/82776 is resolved."]
 #[cargo_test]
 // #[cargo_test(nightly, reason = "--extern-html-root-url is unstable")]
 fn std_docs() {