Add requirements to cargo_test.

This commit is contained in:
Eric Huss 2021-09-08 23:10:33 -07:00
parent 85e79fcc29
commit 1c3640e05c
29 changed files with 427 additions and 878 deletions

View file

@ -1,19 +1,87 @@
extern crate proc_macro;
use proc_macro::*;
use std::process::Command;
use std::sync::Once;
#[proc_macro_attribute]
pub fn cargo_test(attr: TokenStream, item: TokenStream) -> TokenStream {
// Ideally these options would be embedded in the test itself. However, I
// find it very helpful to have the test clearly state whether or not it
// is ignored. It would be nice to have some kind of runtime ignore
// support (such as
// https://internals.rust-lang.org/t/pre-rfc-skippable-tests/14611).
//
// Unfortunately a big drawback here is that if the environment changes
// (such as the existence of the `git` CLI), this will not trigger a
// rebuild and the test will still be ignored. In theory, something like
// `tracked_env` or `tracked_path`
// (https://github.com/rust-lang/rust/issues/99515) could help with this,
// 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 is_not_nightly = || !version().1;
for rule in split_rules(attr) {
match rule.as_str() {
"build_std_real" => {
// Only run the "real" build-std tests on nightly and with an
// 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();
}
"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"));
}
"nightly" => {
requires_reason = true;
ignore |= is_not_nightly();
}
"disable_git_cli" => {
ignore |= disable_git_cli();
}
s if s.starts_with("requires_") => {
let command = &s[9..];
ignore |= !has_command(command);
}
s if s.starts_with(">=1.") => {
requires_reason = true;
let min_minor = s[4..].parse().unwrap();
ignore |= version().0 < min_minor;
}
s if s.starts_with("reason=") => {
found_reason = true;
}
_ => panic!("unknown rule {:?}", rule),
}
}
if requires_reason && !found_reason {
panic!(
"#[cargo_test] with a rule also requires a reason, \
such as #[cargo_test(nightly, reason = \"needs -Z unstable-thing\")]"
);
}
let span = Span::call_site();
let mut ret = TokenStream::new();
ret.extend(Some(TokenTree::from(Punct::new('#', Spacing::Alone))));
let test = TokenTree::from(Ident::new("test", span));
ret.extend(Some(TokenTree::from(Group::new(
Delimiter::Bracket,
test.into(),
))));
let build_std = contains_ident(&attr, "build_std");
let add_attr = |ret: &mut TokenStream, attr_name| {
ret.extend(Some(TokenTree::from(Punct::new('#', Spacing::Alone))));
let attr = TokenTree::from(Ident::new(attr_name, span));
ret.extend(Some(TokenTree::from(Group::new(
Delimiter::Bracket,
attr.into(),
))));
};
add_attr(&mut ret, "test");
if ignore {
add_attr(&mut ret, "ignore");
}
for token in item {
let group = match token {
@ -38,17 +106,6 @@ pub fn cargo_test(attr: TokenStream, item: TokenStream) -> TokenStream {
};"#,
);
// If this is a `build_std` test (aka `tests/build-std/*.rs`) then they
// only run on nightly and they only run when specifically instructed to
// on CI.
if build_std {
let ts = to_token_stream("if !cargo_test_support::is_nightly() { return }");
new_body.extend(ts);
let ts = to_token_stream(
"if std::env::var(\"CARGO_RUN_BUILD_STD_TESTS\").is_err() { return }",
);
new_body.extend(ts);
}
new_body.extend(group.stream());
ret.extend(Some(TokenTree::from(Group::new(
group.delimiter(),
@ -59,13 +116,86 @@ pub fn cargo_test(attr: TokenStream, item: TokenStream) -> TokenStream {
ret
}
fn contains_ident(t: &TokenStream, ident: &str) -> bool {
t.clone().into_iter().any(|t| match t {
TokenTree::Ident(i) => i.to_string() == ident,
fn split_rules(t: TokenStream) -> Vec<String> {
let tts: Vec<_> = t.into_iter().collect();
tts.split(|tt| match tt {
TokenTree::Punct(p) => p.as_char() == ',',
_ => false,
})
.filter(|parts| !parts.is_empty())
.map(|parts| {
parts
.into_iter()
.map(|part| part.to_string())
.collect::<String>()
})
.collect()
}
fn to_token_stream(code: &str) -> TokenStream {
code.parse().unwrap()
}
static mut VERSION: (u32, bool) = (0, false);
fn version() -> &'static (u32, bool) {
static INIT: Once = Once::new();
INIT.call_once(|| {
let output = Command::new("rustc")
.arg("-V")
.output()
.expect("rustc should run");
let stdout = std::str::from_utf8(&output.stdout).expect("utf8");
let vers = stdout.split_whitespace().skip(1).next().unwrap();
let is_nightly = option_env!("CARGO_TEST_DISABLE_NIGHTLY").is_none()
&& (vers.contains("-nightly") || vers.contains("-dev"));
let minor = vers.split('.').skip(1).next().unwrap().parse().unwrap();
unsafe { VERSION = (minor, is_nightly) }
});
unsafe { &VERSION }
}
fn disable_git_cli() -> bool {
// mingw git on Windows does not support Windows-style file URIs.
// Appveyor in the rust repo has that git up front in the PATH instead
// of Git-for-Windows, which causes this to fail.
matches!(option_env!("CARGO_TEST_DISABLE_GIT_CLI"), Some("1"))
}
fn has_command(command: &str) -> bool {
let output = match Command::new(command).arg("--version").output() {
Ok(output) => output,
Err(e) => {
// hg is not installed on GitHub macos.
// Consider installing it if Cargo gains more hg support, but
// otherwise it isn't critical.
if is_ci() && !(cfg!(target_os = "macos") && command == "hg") {
panic!(
"expected command `{}` to be somewhere in PATH: {}",
command, e
);
}
return false;
}
};
if !output.status.success() {
panic!(
"expected command `{}` to be runnable, got error {}:\n\
stderr:{}\n\
stdout:{}\n",
command,
output.status,
String::from_utf8_lossy(&output.stderr),
String::from_utf8_lossy(&output.stdout)
);
}
true
}
/// Whether or not this running in a Continuous Integration environment.
fn is_ci() -> bool {
// Consider using `tracked_env` instead of option_env! when it is stabilized.
// `tracked_env` will handle changes, but not require rebuilding the macro
// itself like option_env does.
option_env!("CI").is_some() || option_env!("TF_BUILD").is_some()
}

View file

@ -1128,6 +1128,10 @@ pub fn rustc_host_env() -> String {
pub fn is_nightly() -> bool {
let vv = &RUSTC_INFO.verbose_version;
// CARGO_TEST_DISABLE_NIGHTLY is set in rust-lang/rust's CI so that all
// nightly-only tests are disabled there. Otherwise, it could make it
// difficult to land changes which would need to be made simultaneously in
// rust-lang/cargo and rust-lan/rust, which isn't possible.
env::var("CARGO_TEST_DISABLE_NIGHTLY").is_err()
&& (vv.contains("-nightly") || vv.contains("-dev"))
}
@ -1350,16 +1354,6 @@ pub fn slow_cpu_multiplier(main: u64) -> Duration {
Duration::from_secs(*SLOW_CPU_MULTIPLIER * main)
}
pub fn command_is_available(cmd: &str) -> bool {
if let Err(e) = process(cmd).arg("-V").exec_with_output() {
eprintln!("{} not available, skipping tests", cmd);
eprintln!("{:?}", e);
false
} else {
true
}
}
#[cfg(windows)]
pub fn symlink_supported() -> bool {
if is_ci() {

View file

@ -50,13 +50,7 @@ fn <description>() {
}
```
`#[cargo_test]`:
- This is used in place of `#[test]`
- This attribute injects code which does some setup before starting the
test, creating a filesystem "sandbox" under the "cargo integration test"
directory for each test such as
`/path/to/cargo/target/cit/t123/`
- The sandbox will contain a `home` directory that will be used instead of your normal home directory
The [`#[cargo_test]` attribute](#cargo_test-attribute) is used in place of `#[test]` to inject some setup code.
[`ProjectBuilder`] via `project()`:
- Each project is in a separate directory in the sandbox
@ -68,6 +62,39 @@ fn <description>() {
- See [`support::compare`] for an explanation of the string pattern matching.
Patterns are used to make it easier to match against the expected output.
#### `#[cargo_test]` attribute
The `#[cargo_test]` attribute injects code which does some setup before starting the test.
It will create a filesystem "sandbox" under the "cargo integration test" directory for each test, such as `/path/to/cargo/target/tmp/cit/t123/`.
The sandbox will contain a `home` directory that will be used instead of your normal home directory.
The `#[cargo_test`] attribute takes several options that will affect how the test is generated.
They are listed in parentheses separated with commas, such as:
```rust,ignore
#[cargo_test(nightly, reason = "-Zfoo is unstable")]
```
The options it supports are:
* `nightly` — This will cause the test to be ignored if not running on the nightly toolchain.
This is useful for tests that use unstable options in `rustc` or `rustdoc`.
These tests are run in Cargo's CI, but are disabled in rust-lang/rust's CI due to the difficulty of updating both repos simultaneously.
A `reason` field is required to explain why it is nightly-only.
* `build_std_real` — This is a "real" `-Zbuild-std` test (in the `build_std` integration test).
This only runs on nightly, and only if the environment variable `CARGO_RUN_BUILD_STD_TESTS` is set (these tests on run on Linux).
* `build_std_mock` — This is a "mock" `-Zbuild-std` test (which uses a mock standard library).
This only runs on nightly, and is disabled for windows-gnu.
* `requires_` — This indicates a command that is required to be installed to be run.
For example, `requires_rustmft` means the test will only run if the executable `rustfmt` is installed.
These tests are *always* run on CI.
This is mainly used to avoid requiring contributors from having every dependency installed.
* `>=1.64` — This indicates that the test will only run with the given version of `rustc` or newer.
This can be used when a new `rustc` feature has been stabilized that the test depends on.
If this is specified, a `reason` is required to explain why it is being checked.
* `disable_git_cli` — This is needed for `git-fetch-with-cli` tests.
This disables the test in rust-lang/rust's CI due to a compatibility issue.
#### Testing Nightly Features
If you are testing a Cargo feature that only works on "nightly" Cargo, then
@ -79,16 +106,15 @@ p.cargo("build").masquerade_as_nightly_cargo(&["print-im-a-teapot"])
```
If you are testing a feature that only works on *nightly rustc* (such as
benchmarks), then you should exit the test if it is not running with nightly
rust, like this:
benchmarks), then you should use the `nightly` option of the `cargo_test`
attribute, like this:
```rust,ignore
if !is_nightly() {
// Add a comment here explaining why this is necessary.
return;
}
#[cargo_test(nightly, reason = "-Zfoo is unstable")]
```
This will cause the test to be ignored if not running on the nightly toolchain.
#### Specifying Dependencies
You should not write any tests that use the network such as contacting
@ -201,16 +227,15 @@ the name of the feature as the reason, like this:
```
If you are testing a feature that only works on *nightly rustc* (such as
benchmarks), then you should exit the test if it is not running with nightly
rust, like this:
benchmarks), then you should use the `nightly` option of the `cargo_test`
attribute, like this:
```rust,ignore
if !is_nightly() {
// Add a comment here explaining why this is necessary.
return;
}
#[cargo_test(nightly, reason = "-Zfoo is unstable")]
```
This will cause the test to be ignored if not running on the nightly toolchain.
### Platform-specific Notes
When checking output, use `/` for paths even on Windows: the actual output

View file

@ -13,7 +13,7 @@
//! not catching any regressions that `tests/testsuite/standard_lib.rs` isn't
//! already catching.
//!
//! All tests here should use `#[cargo_test(build_std)]` to indicate that
//! All tests here should use `#[cargo_test(build_std_real)]` to indicate that
//! boilerplate should be generated to require the nightly toolchain and the
//! `CARGO_RUN_BUILD_STD_TESTS` env var to be set to actually run these tests.
//! Otherwise the tests are skipped.
@ -59,7 +59,7 @@ impl BuildStd for Execs {
}
}
#[cargo_test(build_std)]
#[cargo_test(build_std_real)]
fn basic() {
let p = project()
.file(
@ -127,7 +127,7 @@ fn basic() {
assert_eq!(p.glob(deps_dir.join("*.dylib")).count(), 0);
}
#[cargo_test(build_std)]
#[cargo_test(build_std_real)]
fn cross_custom() {
let p = project()
.file(
@ -170,7 +170,7 @@ fn cross_custom() {
.run();
}
#[cargo_test(build_std)]
#[cargo_test(build_std_real)]
fn custom_test_framework() {
let p = project()
.file(

View file

@ -1,15 +1,10 @@
//! Tests for the `cargo bench` command.
use cargo_test_support::is_nightly;
use cargo_test_support::paths::CargoPathExt;
use cargo_test_support::{basic_bin_manifest, basic_lib_manifest, basic_manifest, project};
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn cargo_bench_simple() {
if !is_nightly() {
return;
}
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file(
@ -51,12 +46,8 @@ fn cargo_bench_simple() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_bench_implicit() {
if !is_nightly() {
return;
}
let p = project()
.file(
"src/main.rs",
@ -99,12 +90,8 @@ fn bench_bench_implicit() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_bin_implicit() {
if !is_nightly() {
return;
}
let p = project()
.file(
"src/main.rs",
@ -146,12 +133,8 @@ fn bench_bin_implicit() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_tarname() {
if !is_nightly() {
return;
}
let p = project()
.file(
"benches/bin1.rs",
@ -183,12 +166,8 @@ fn bench_tarname() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_multiple_targets() {
if !is_nightly() {
return;
}
let p = project()
.file(
"benches/bin1.rs",
@ -223,12 +202,8 @@ fn bench_multiple_targets() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn cargo_bench_verbose() {
if !is_nightly() {
return;
}
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file(
@ -255,12 +230,8 @@ fn cargo_bench_verbose() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn many_similar_names() {
if !is_nightly() {
return;
}
let p = project()
.file(
"src/lib.rs",
@ -302,12 +273,8 @@ fn many_similar_names() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn cargo_bench_failing_test() {
if !is_nightly() {
return;
}
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file(
@ -356,12 +323,8 @@ fn cargo_bench_failing_test() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_with_lib_dep() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -424,12 +387,8 @@ fn bench_with_lib_dep() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_with_deep_lib_dep() {
if !is_nightly() {
return;
}
let p = project()
.at("bar")
.file(
@ -487,12 +446,8 @@ fn bench_with_deep_lib_dep() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn external_bench_explicit() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -546,12 +501,8 @@ fn external_bench_explicit() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn external_bench_implicit() {
if !is_nightly() {
return;
}
let p = project()
.file(
"src/lib.rs",
@ -593,12 +544,8 @@ fn external_bench_implicit() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_autodiscover_2015() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -670,12 +617,8 @@ https://github.com/rust-lang/cargo/issues/5330
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn dont_run_examples() {
if !is_nightly() {
return;
}
let p = project()
.file("src/lib.rs", "")
.file(
@ -686,12 +629,8 @@ fn dont_run_examples() {
p.cargo("bench").run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn pass_through_command_line() {
if !is_nightly() {
return;
}
let p = project()
.file(
"src/lib.rs",
@ -727,12 +666,8 @@ fn pass_through_command_line() {
// Regression test for running cargo-bench twice with
// tests in an rlib
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn cargo_bench_twice() {
if !is_nightly() {
return;
}
let p = project()
.file("Cargo.toml", &basic_lib_manifest("foo"))
.file(
@ -754,12 +689,8 @@ fn cargo_bench_twice() {
}
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn lib_bin_same_name() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -811,12 +742,8 @@ fn lib_bin_same_name() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn lib_with_standard_name() {
if !is_nightly() {
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("syntax", "0.0.1"))
.file(
@ -861,12 +788,8 @@ fn lib_with_standard_name() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn lib_with_standard_name2() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -911,12 +834,8 @@ fn lib_with_standard_name2() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_dylib() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1005,12 +924,8 @@ fn bench_dylib() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_twice_with_build_cmd() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1054,12 +969,8 @@ fn bench_twice_with_build_cmd() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_with_examples() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1141,12 +1052,8 @@ fn bench_with_examples() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn test_a_bench() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1181,12 +1088,8 @@ fn test_a_bench() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn test_bench_no_run() {
if !is_nightly() {
return;
}
let p = project()
.file("src/lib.rs", "")
.file(
@ -1216,12 +1119,8 @@ fn test_bench_no_run() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn test_bench_no_run_emit_json() {
if !is_nightly() {
return;
}
let p = project()
.file("src/lib.rs", "")
.file(
@ -1249,12 +1148,8 @@ fn test_bench_no_run_emit_json() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn test_bench_no_fail_fast() {
if !is_nightly() {
return;
}
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file(
@ -1294,12 +1189,8 @@ fn test_bench_no_fail_fast() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn test_bench_multiple_packages() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1387,12 +1278,8 @@ fn test_bench_multiple_packages() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_all_workspace() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1444,12 +1331,8 @@ fn bench_all_workspace() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_all_exclude() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1493,12 +1376,8 @@ test bar ... bench: [..] ns/iter (+/- [..])",
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_all_exclude_glob() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1542,12 +1421,8 @@ test bar ... bench: [..] ns/iter (+/- [..])",
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_all_virtual_manifest() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1595,12 +1470,8 @@ fn bench_all_virtual_manifest() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_virtual_manifest_glob() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1649,12 +1520,8 @@ fn bench_virtual_manifest_glob() {
}
// https://github.com/rust-lang/cargo/issues/4287
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn legacy_bench_name() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1691,12 +1558,8 @@ please set bench.path in Cargo.toml",
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_virtual_manifest_all_implied() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -1741,12 +1604,8 @@ fn bench_virtual_manifest_all_implied() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn json_artifact_includes_executable_for_benchmark() {
if !is_nightly() {
return;
}
let p = project()
.file(
"benches/benchmark.rs",

View file

@ -6104,12 +6104,8 @@ fn target_directory_backup_exclusion() {
assert!(!&cachedir_tag.is_file());
}
#[cargo_test]
#[cargo_test(>=1.64, reason = "--diagnostic-width is stabilized in 1.64")]
fn simple_terminal_width() {
if !is_nightly() {
// --diagnostic-width is stabilized in 1.64
return;
}
let p = project()
.file(
"src/lib.rs",

View file

@ -1,7 +1,7 @@
//! Tests for `cargo-features` definitions.
use cargo_test_support::registry::Package;
use cargo_test_support::{is_nightly, project, registry};
use cargo_test_support::{project, registry};
#[cargo_test]
fn feature_required() {
@ -215,14 +215,8 @@ release and is no longer necessary to be listed in the manifest
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zallow-features is unstable")]
fn allow_features() {
if !is_nightly() {
// -Zallow-features on rustc is nightly only
eprintln!("skipping test allow_features without nightly rustc");
return;
}
let p = project()
.file(
"Cargo.toml",
@ -286,14 +280,8 @@ Caused by:
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zallow-features is unstable")]
fn allow_features_to_rustc() {
if !is_nightly() {
// -Zallow-features on rustc is nightly only
eprintln!("skipping test allow_features_to_rustc without nightly rustc");
return;
}
let p = project()
.file(
"Cargo.toml",
@ -329,14 +317,8 @@ fn allow_features_to_rustc() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zallow-features is unstable")]
fn allow_features_in_cfg() {
if !is_nightly() {
// -Zallow-features on rustc is nightly only
eprintln!("skipping test allow_features_in_cfg without nightly rustc");
return;
}
let p = project()
.file(
"Cargo.toml",

View file

@ -1,6 +1,6 @@
//! Tests for -Zcheck-cfg.
use cargo_test_support::{basic_manifest, is_nightly, project};
use cargo_test_support::{basic_manifest, project};
macro_rules! x {
($tool:tt => $what:tt $(of $who:tt)?) => {{
@ -29,13 +29,8 @@ macro_rules! x {
}};
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn features() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -58,13 +53,8 @@ fn features() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn features_with_deps() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -93,13 +83,8 @@ fn features_with_deps() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn features_with_opt_deps() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -129,13 +114,8 @@ fn features_with_opt_deps() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn features_with_namespaced_features() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -163,13 +143,8 @@ fn features_with_namespaced_features() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn well_known_names() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("src/main.rs", "fn main() {}")
@ -181,13 +156,8 @@ fn well_known_names() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn well_known_values() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("src/main.rs", "fn main() {}")
@ -199,13 +169,8 @@ fn well_known_values() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn cli_all_options() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -230,13 +195,8 @@ fn cli_all_options() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn features_with_cargo_check() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -259,13 +219,8 @@ fn features_with_cargo_check() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn well_known_names_with_check() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("src/main.rs", "fn main() {}")
@ -277,13 +232,8 @@ fn well_known_names_with_check() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn well_known_values_with_check() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("src/main.rs", "fn main() {}")
@ -295,13 +245,8 @@ fn well_known_values_with_check() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn features_test() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -324,13 +269,8 @@ fn features_test() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn features_doctest() {
if !is_nightly() {
// --check-cfg is a nightly only rustc and rustdoc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -355,13 +295,8 @@ fn features_doctest() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn well_known_names_test() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("src/main.rs", "fn main() {}")
@ -373,13 +308,8 @@ fn well_known_names_test() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn well_known_values_test() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("src/main.rs", "fn main() {}")
@ -391,13 +321,8 @@ fn well_known_values_test() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn well_known_names_doctest() {
if !is_nightly() {
// --check-cfg is a nightly only rustc and rustdoc command line
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("src/lib.rs", "#[allow(dead_code)] fn foo() {}")
@ -410,13 +335,8 @@ fn well_known_names_doctest() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn well_known_values_doctest() {
if !is_nightly() {
// --check-cfg is a nightly only rustc and rustdoc command line
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("src/lib.rs", "#[allow(dead_code)] fn foo() {}")
@ -429,13 +349,8 @@ fn well_known_values_doctest() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn features_doc() {
if !is_nightly() {
// --check-cfg is a nightly only rustdoc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -459,13 +374,8 @@ fn features_doc() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn build_script_feedback() {
if !is_nightly() {
// rustc-check-cfg: is only availaible on nightly
return;
}
let p = project()
.file(
"Cargo.toml",
@ -490,13 +400,8 @@ fn build_script_feedback() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn build_script_doc() {
if !is_nightly() {
// rustc-check-cfg: is only availaible on nightly
return;
}
let p = project()
.file(
"Cargo.toml",
@ -530,12 +435,8 @@ fn build_script_doc() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn build_script_override() {
if !is_nightly() {
// rustc-check-cfg: is only availaible on nightly
return;
}
let target = cargo_test_support::rustc_host();
let p = project()
@ -570,13 +471,8 @@ fn build_script_override() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn build_script_test() {
if !is_nightly() {
// rustc-check-cfg: is only availaible on nightly
return;
}
let p = project()
.file(
"Cargo.toml",
@ -630,13 +526,8 @@ fn build_script_test() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn config_valid() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file(
"Cargo.toml",
@ -668,13 +559,8 @@ fn config_valid() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--check-cfg is unstable")]
fn config_invalid() {
if !is_nightly() {
// --check-cfg is a nightly only rustc command line
return;
}
let p = project()
.file(
"Cargo.toml",

View file

@ -2,8 +2,8 @@
//!
//! See `cargo_test_support::cross_compile` for more detail.
use cargo_test_support::rustc_host;
use cargo_test_support::{basic_bin_manifest, basic_manifest, cross_compile, project};
use cargo_test_support::{is_nightly, rustc_host};
#[cargo_test]
fn simple_cross() {
@ -411,15 +411,11 @@ fn linker() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "plugins are unstable")]
fn plugin_with_extra_dylib_dep() {
if cross_compile::disabled() {
return;
}
if !is_nightly() {
// plugins are unstable
return;
}
let foo = project()
.file(
@ -1298,15 +1294,11 @@ fn cross_test_dylib() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zdoctest-xcompile is unstable")]
fn doctest_xcompile_linker() {
if cross_compile::disabled() {
return;
}
if !is_nightly() {
// -Zdoctest-xcompile is unstable
return;
}
let target = cross_compile::alternate();
let p = project()

View file

@ -1,6 +1,5 @@
//! Tests for custom json target specifications.
use cargo_test_support::is_nightly;
use cargo_test_support::{basic_manifest, project};
use std::fs;
@ -34,12 +33,8 @@ const SIMPLE_SPEC: &str = r#"
}
"#;
#[cargo_test]
#[cargo_test(nightly, reason = "requires features no_core, lang_items")]
fn custom_target_minimal() {
if !is_nightly() {
// Requires features no_core, lang_items
return;
}
let p = project()
.file(
"src/lib.rs",
@ -66,12 +61,8 @@ fn custom_target_minimal() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "requires features no_core, lang_items, auto_traits")]
fn custom_target_dependency() {
if !is_nightly() {
// Requires features no_core, lang_items, auto_traits
return;
}
let p = project()
.file(
"Cargo.toml",
@ -122,12 +113,8 @@ fn custom_target_dependency() {
p.cargo("build --lib --target custom-target.json -v").run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "requires features no_core, lang_items")]
fn custom_bin_target() {
if !is_nightly() {
// Requires features no_core, lang_items
return;
}
let p = project()
.file(
"src/main.rs",
@ -143,13 +130,9 @@ fn custom_bin_target() {
p.cargo("build --target custom-bin-target.json -v").run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "requires features no_core, lang_items")]
fn changing_spec_rebuilds() {
// Changing the .json file will trigger a rebuild.
if !is_nightly() {
// Requires features no_core, lang_items
return;
}
let p = project()
.file(
"src/lib.rs",
@ -190,13 +173,9 @@ fn changing_spec_rebuilds() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "requires features no_core, lang_items")]
fn changing_spec_relearns_crate_types() {
// Changing the .json file will invalidate the cache of crate types.
if !is_nightly() {
// Requires features no_core, lang_items
return;
}
let p = project()
.file(
"Cargo.toml",
@ -235,13 +214,9 @@ fn changing_spec_relearns_crate_types() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "requires features no_core, lang_items")]
fn custom_target_ignores_filepath() {
// Changing the path of the .json file will not trigger a rebuild.
if !is_nightly() {
// Requires features no_core, lang_items
return;
}
let p = project()
.file(
"src/lib.rs",

View file

@ -5,7 +5,7 @@ use cargo_test_support::compare::assert_match_exact;
use cargo_test_support::paths::{self, CargoPathExt};
use cargo_test_support::registry::Package;
use cargo_test_support::{
basic_bin_manifest, basic_manifest, is_nightly, main_file, project, rustc_host, Project,
basic_bin_manifest, basic_manifest, main_file, project, rustc_host, Project,
};
use filetime::FileTime;
use std::fs;
@ -228,13 +228,8 @@ fn no_rewrite_if_no_change() {
);
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Z binary-dep-depinfo is unstable")]
fn relative_depinfo_paths_ws() {
if !is_nightly() {
// -Z binary-dep-depinfo is unstable (https://github.com/rust-lang/rust/issues/63012)
return;
}
// Test relative dep-info paths in a workspace with --target with
// proc-macros and other dependency kinds.
Package::new("regdep", "0.1.0")
@ -366,13 +361,8 @@ fn relative_depinfo_paths_ws() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Z binary-dep-depinfo is unstable")]
fn relative_depinfo_paths_no_ws() {
if !is_nightly() {
// -Z binary-dep-depinfo is unstable (https://github.com/rust-lang/rust/issues/63012)
return;
}
// Test relative dep-info paths without a workspace with proc-macros and
// other dependency kinds.
Package::new("regdep", "0.1.0")
@ -533,12 +523,8 @@ fn reg_dep_source_not_tracked() {
);
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Z binary-dep-depinfo is unstable")]
fn canonical_path() {
if !is_nightly() {
// -Z binary-dep-depinfo is unstable (https://github.com/rust-lang/rust/issues/63012)
return;
}
if !cargo_test_support::symlink_supported() {
return;
}

View file

@ -4,7 +4,7 @@ use cargo::core::compiler::RustDocFingerprint;
use cargo_test_support::paths::CargoPathExt;
use cargo_test_support::registry::Package;
use cargo_test_support::{basic_lib_manifest, basic_manifest, git, project};
use cargo_test_support::{is_nightly, rustc_host, symlink_supported, tools};
use cargo_test_support::{rustc_host, symlink_supported, tools};
use std::fs;
use std::str;
@ -748,12 +748,8 @@ fn doc_same_name() {
p.cargo("doc").run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "no_core, lang_items requires nightly")]
fn doc_target() {
if !is_nightly() {
// no_core, lang_items requires nightly.
return;
}
const TARGET: &str = "arm-unknown-linux-gnueabihf";
let p = project()
@ -1310,13 +1306,8 @@ fn doc_workspace_open_help_message() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zextern-html-root-url is unstable")]
fn doc_extern_map_local() {
if !is_nightly() {
// -Zextern-html-root-url is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -2050,13 +2041,8 @@ fn crate_versions_flag_is_overridden() {
asserts(output_documentation());
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zdoctest-in-workspace is unstable")]
fn doc_test_in_workspace() {
if !is_nightly() {
// -Zdoctest-in-workspace is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -2357,13 +2343,8 @@ fn doc_fingerprint_unusual_behavior() {
assert!(real_doc.join("somefile").exists());
}
#[cargo_test]
#[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
fn scrape_examples_basic() {
if !is_nightly() {
// -Z rustdoc-scrape-examples is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -2397,13 +2378,8 @@ fn scrape_examples_basic() {
assert!(p.build_dir().join("doc/src/ex/ex.rs.html").exists());
}
#[cargo_test]
#[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
fn scrape_examples_avoid_build_script_cycle() {
if !is_nightly() {
// -Z rustdoc-scrape-examples is unstable
return;
}
let p = project()
// package with build dependency
.file(
@ -2444,13 +2420,8 @@ fn scrape_examples_avoid_build_script_cycle() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
fn scrape_examples_complex_reverse_dependencies() {
if !is_nightly() {
// -Z rustdoc-scrape-examples is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -2506,13 +2477,8 @@ fn scrape_examples_complex_reverse_dependencies() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
fn scrape_examples_crate_with_dash() {
if !is_nightly() {
// -Z rustdoc-scrape-examples is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -2535,12 +2501,8 @@ fn scrape_examples_crate_with_dash() {
assert!(doc_html.contains("Examples found in repository"));
}
#[cargo_test]
#[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
fn scrape_examples_missing_flag() {
if !is_nightly() {
return;
}
let p = project()
.file(
"Cargo.toml",
@ -2560,13 +2522,8 @@ fn scrape_examples_missing_flag() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
fn scrape_examples_configure_profile() {
if !is_nightly() {
// -Z rustdoc-scrape-examples is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -2593,13 +2550,8 @@ fn scrape_examples_configure_profile() {
assert!(doc_html.contains("More examples"));
}
#[cargo_test]
#[cargo_test(nightly, reason = "rustdoc scrape examples flags are unstable")]
fn scrape_examples_issue_10545() {
if !is_nightly() {
// -Z rustdoc-scrape-examples is unstable
return;
}
let p = project()
.file(
"Cargo.toml",

View file

@ -1,7 +1,7 @@
//! Tests for edition setting.
use cargo::core::Edition;
use cargo_test_support::{basic_lib_manifest, is_nightly, project};
use cargo_test_support::{basic_lib_manifest, project};
#[cargo_test]
fn edition_works_for_build_script() {
@ -82,15 +82,11 @@ Caused by:
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "fundamentally always nightly")]
fn edition_unstable() {
// During the period where a new edition is coming up, but not yet stable,
// this test will verify that it can be used with `cargo-features`. If
// there is no next edition, it does nothing.
if !is_nightly() {
// This test is fundamentally always nightly.
return;
}
let next = match Edition::LATEST_UNSTABLE {
Some(next) => next,
None => {

View file

@ -907,15 +907,11 @@ fn prepare_for_latest_stable() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "fundamentally always nightly")]
fn prepare_for_already_on_latest_unstable() {
// During the period where a new edition is coming up, but not yet stable,
// this test will check what happens if you are already on the latest. If
// there is no next edition, it does nothing.
if !is_nightly() {
// This test is fundamentally always nightly.
return;
}
let next_edition = match Edition::LATEST_UNSTABLE {
Some(next) => next,
None => {

View file

@ -9,7 +9,7 @@
use super::config::write_config_toml;
use cargo_test_support::registry::Package;
use cargo_test_support::{basic_manifest, is_nightly, project, Project};
use cargo_test_support::{basic_manifest, project, Project};
// An arbitrary lint (unused_variables) that triggers a lint.
// We use a special flag to force it to generate a report.
@ -24,12 +24,11 @@ fn simple_project() -> Project {
.build()
}
#[cargo_test]
#[cargo_test(
nightly,
reason = "-Zfuture-incompat-test requires nightly (permanently)"
)]
fn output_on_stable() {
if !is_nightly() {
// -Zfuture-incompat-test requires nightly (permanently)
return;
}
let p = simple_project();
p.cargo("check")
@ -54,13 +53,11 @@ fn no_gate_future_incompat_report() {
.run();
}
#[cargo_test]
#[cargo_test(
nightly,
reason = "-Zfuture-incompat-test requires nightly (permanently)"
)]
fn test_zero_future_incompat() {
if !is_nightly() {
// -Zfuture-incompat-test requires nightly (permanently)
return;
}
let p = project()
.file("Cargo.toml", &basic_manifest("foo", "0.0.0"))
.file("src/main.rs", "fn main() {}")
@ -88,13 +85,11 @@ note: 0 dependencies had future-incompatible warnings
.run();
}
#[cargo_test]
#[cargo_test(
nightly,
reason = "-Zfuture-incompat-test requires nightly (permanently)"
)]
fn test_single_crate() {
if !is_nightly() {
// -Zfuture-incompat-test requires nightly (permanently)
return;
}
let p = simple_project();
for command in &["build", "check", "rustc", "test"] {
@ -144,13 +139,11 @@ frequency = 'never'
}
}
#[cargo_test]
#[cargo_test(
nightly,
reason = "-Zfuture-incompat-test requires nightly (permanently)"
)]
fn test_multi_crate() {
if !is_nightly() {
// -Zfuture-incompat-test requires nightly (permanently)
return;
}
Package::new("first-dep", "0.0.1")
.file("src/lib.rs", FUTURE_EXAMPLE)
.publish();
@ -267,13 +260,11 @@ fn test_multi_crate() {
assert_eq!(lines.next(), None);
}
#[cargo_test]
#[cargo_test(
nightly,
reason = "-Zfuture-incompat-test requires nightly (permanently)"
)]
fn color() {
if !is_nightly() {
// -Zfuture-incompat-test requires nightly (permanently)
return;
}
let p = simple_project();
p.cargo("check")
@ -291,13 +282,11 @@ fn color() {
.run();
}
#[cargo_test]
#[cargo_test(
nightly,
reason = "-Zfuture-incompat-test requires nightly (permanently)"
)]
fn bad_ids() {
if !is_nightly() {
// -Zfuture-incompat-test requires nightly (permanently)
return;
}
let p = simple_project();
p.cargo("report future-incompatibilities --id 1")
@ -326,13 +315,11 @@ Available IDs are: 1
.run();
}
#[cargo_test]
#[cargo_test(
nightly,
reason = "-Zfuture-incompat-test requires nightly (permanently)"
)]
fn suggestions_for_updates() {
if !is_nightly() {
// -Zfuture-incompat-test requires nightly (permanently)
return;
}
Package::new("with_updates", "1.0.0")
.file("src/lib.rs", FUTURE_EXAMPLE)
.publish();

View file

@ -1,6 +1,5 @@
//! Tests for git support.
use std::env;
use std::fs;
use std::io::prelude::*;
use std::net::{TcpListener, TcpStream};
@ -14,13 +13,6 @@ use cargo_test_support::paths::{self, CargoPathExt};
use cargo_test_support::{basic_lib_manifest, basic_manifest, git, main_file, path2url, project};
use cargo_test_support::{sleep_ms, t, Project};
fn disable_git_cli() -> bool {
// mingw git on Windows does not support Windows-style file URIs.
// Appveyor in the rust repo has that git up front in the PATH instead
// of Git-for-Windows, which causes this to fail.
env::var("CARGO_TEST_DISABLE_GIT_CLI") == Ok("1".to_string())
}
#[cargo_test]
fn cargo_compile_simple_git_dep() {
let project = project();
@ -2650,11 +2642,8 @@ fn failed_submodule_checkout() {
t.join().unwrap();
}
#[cargo_test]
#[cargo_test(disable_git_cli)]
fn use_the_cli() {
if disable_git_cli() {
return;
}
let project = project();
let git_project = git::new("dep1", |project| {
project
@ -2754,11 +2743,8 @@ fn templatedir_doesnt_cause_problems() {
p.cargo("build").run();
}
#[cargo_test]
#[cargo_test(disable_git_cli)]
fn git_with_cli_force() {
if disable_git_cli() {
return;
}
// Supports a force-pushed repo.
let git_project = git::new("dep1", |project| {
project
@ -2814,11 +2800,8 @@ fn git_with_cli_force() {
p.rename_run("foo", "foo2").with_stdout("two").run();
}
#[cargo_test]
#[cargo_test(disable_git_cli)]
fn git_fetch_cli_env_clean() {
if disable_git_cli() {
return;
}
// This tests that git-fetch-with-cli works when GIT_DIR environment
// variable is set (for whatever reason).
let git_dep = git::new("dep1", |project| {
@ -3517,12 +3500,9 @@ fn corrupted_checkout() {
_corrupted_checkout(false);
}
#[cargo_test]
#[cargo_test(disable_git_cli)]
fn corrupted_checkout_with_cli() {
// Test what happens if the checkout is corrupted somehow with git cli.
if disable_git_cli() {
return;
}
_corrupted_checkout(true);
}

View file

@ -3,7 +3,6 @@
use std::env;
use std::ffi::OsStr;
use std::path::PathBuf;
use std::process::Command;
use cargo_test_support::git;
use cargo_test_support::paths;
@ -90,11 +89,8 @@ fn run_test(path_env: Option<&OsStr>) {
);
}
#[cargo_test]
#[cargo_test(requires_git)]
fn use_git_gc() {
if Command::new("git").arg("--version").output().is_err() {
return;
}
run_test(None);
}

View file

@ -1,15 +1,11 @@
use cargo_test_support::compare::assert_ui;
use cargo_test_support::prelude::*;
use cargo_test_support::{command_is_available, Project};
use cargo_test_support::Project;
use cargo_test_support::curr_dir;
#[cargo_test]
#[cargo_test(requires_rustfmt)]
fn formats_source() {
if !command_is_available("rustfmt") {
return;
}
let project = Project::from_template(curr_dir!().join("in"));
let project_root = &project.root();

View file

@ -1,5 +1,4 @@
//! Tests for the `cargo init` command.
use std::process::Command;
mod auto_git;
mod bin_already_exists_explicit;
@ -39,15 +38,3 @@ mod simple_hg_ignore_exists;
mod simple_lib;
mod unknown_flags;
mod with_argument;
pub fn mercurial_available() -> bool {
let result = Command::new("hg")
.arg("--version")
.output()
.map(|o| o.status.success())
.unwrap_or(false);
if !result {
println!("`hg` not available, skipping test");
}
result
}

View file

@ -2,15 +2,10 @@ use cargo_test_support::compare::assert_ui;
use cargo_test_support::prelude::*;
use cargo_test_support::Project;
use crate::init::mercurial_available;
use cargo_test_support::curr_dir;
#[cargo_test]
#[cargo_test(requires_hg)]
fn simple_hg() {
if !mercurial_available() {
return;
}
let project = Project::from_template(curr_dir!().join("in"));
let project_root = &project.root();

View file

@ -1,5 +1,6 @@
//! Tests for the jobserver protocol.
use cargo_util::is_ci;
use std::net::TcpListener;
use std::process::Command;
use std::thread;
@ -64,7 +65,7 @@ fn makes_jobserver_used() {
} else {
"make"
};
if Command::new(make).arg("--version").output().is_err() {
if !is_ci() && Command::new(make).arg("--version").output().is_err() {
return;
}
@ -176,7 +177,7 @@ fn jobserver_and_j() {
} else {
"make"
};
if Command::new(make).arg("--version").output().is_err() {
if !is_ci() && Command::new(make).arg("--version").output().is_err() {
return;
}

View file

@ -1,15 +1,10 @@
//! Tests for rustc plugins.
use cargo_test_support::rustc_host;
use cargo_test_support::{basic_manifest, project};
use cargo_test_support::{is_nightly, rustc_host};
#[cargo_test]
#[cargo_test(nightly, reason = "plugins are unstable")]
fn plugin_to_the_max() {
if !is_nightly() {
// plugins are unstable
return;
}
let foo = project()
.file(
"Cargo.toml",
@ -103,13 +98,8 @@ fn plugin_to_the_max() {
foo.cargo("doc").run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "plugins are unstable")]
fn plugin_with_dynamic_native_dependency() {
if !is_nightly() {
// plugins are unstable
return;
}
let build = project()
.at("builder")
.file(
@ -335,13 +325,8 @@ fn native_plugin_dependency_with_custom_linker() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "requires rustc_private")]
fn panic_abort_plugins() {
if !is_nightly() {
// requires rustc_private
return;
}
let p = project()
.file(
"Cargo.toml",
@ -383,13 +368,8 @@ fn panic_abort_plugins() {
p.cargo("build").run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "requires rustc_private")]
fn shared_panic_abort_plugins() {
if !is_nightly() {
// requires rustc_private
return;
}
let p = project()
.file(
"Cargo.toml",

View file

@ -1,6 +1,5 @@
//! Tests for proc-macros.
use cargo_test_support::is_nightly;
use cargo_test_support::project;
#[cargo_test]
@ -203,13 +202,8 @@ fn impl_and_derive() {
p.cargo("run").with_stdout("X { success: true }").run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "plugins are unstable")]
fn plugin_and_proc_macro() {
if !is_nightly() {
// plugins are unstable
return;
}
let p = project()
.file(
"Cargo.toml",

View file

@ -1,9 +1,8 @@
//! Tests for profiles.
use std::env;
use cargo_test_support::project;
use cargo_test_support::registry::Package;
use std::env;
#[cargo_test]
fn profile_overrides() {

View file

@ -1,14 +1,10 @@
//! Tests for public/private dependencies.
use cargo_test_support::project;
use cargo_test_support::registry::Package;
use cargo_test_support::{is_nightly, project};
#[cargo_test]
#[cargo_test(nightly, reason = "exported_private_dependencies lint is unstable")]
fn exported_priv_warning() {
if !is_nightly() {
// exported_private_dependencies lint is unstable
return;
}
Package::new("priv_dep", "0.1.0")
.file("src/lib.rs", "pub struct FromPriv;")
.publish();
@ -46,12 +42,8 @@ src/lib.rs:3:13: warning: type `[..]FromPriv` from private dependency 'priv_dep'
.run()
}
#[cargo_test]
#[cargo_test(nightly, reason = "exported_private_dependencies lint is unstable")]
fn exported_pub_dep() {
if !is_nightly() {
// exported_private_dependencies lint is unstable
return;
}
Package::new("pub_dep", "0.1.0")
.file("src/lib.rs", "pub struct FromPub;")
.publish();

View file

@ -414,13 +414,8 @@ fn test_multiple_required_features() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_default_features() {
if !is_nightly() {
// #[bench] is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -487,13 +482,8 @@ Consider enabling them by passing, e.g., `--features=\"a\"`
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_arg_features() {
if !is_nightly() {
// #[bench] is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -535,13 +525,8 @@ fn bench_arg_features() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "bench")]
fn bench_multiple_required_features() {
if !is_nightly() {
// #[bench] is unstable
return;
}
let p = project()
.file(
"Cargo.toml",

View file

@ -1,7 +1,7 @@
//! Tests for the -Zrustdoc-map feature.
use cargo_test_support::registry::{self, Package};
use cargo_test_support::{is_nightly, paths, project, Project};
use cargo_test_support::{paths, project, Project};
fn basic_project() -> Project {
Package::new("bar", "1.0.0")
@ -41,13 +41,9 @@ fn ignores_on_stable() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "--extern-html-root-url is unstable")]
fn simple() {
// Basic test that it works with crates.io.
if !is_nightly() {
// --extern-html-root-url is unstable
return;
}
let p = basic_project();
p.cargo("doc -v --no-deps -Zrustdoc-map")
.masquerade_as_nightly_cargo(&["rustdoc-map"])
@ -59,15 +55,12 @@ fn simple() {
assert!(myfun.contains(r#"href="https://docs.rs/bar/1.0.0/bar/struct.Straw.html""#));
}
#[cargo_test]
// Broken, temporarily disable until https://github.com/rust-lang/rust/pull/82776 is resolved.
#[ignore]
#[cargo_test]
// #[cargo_test(nightly, reason = "--extern-html-root-url is unstable")]
fn std_docs() {
// Mapping std docs somewhere else.
if !is_nightly() {
// --extern-html-root-url is unstable
return;
}
// For local developers, skip this test if docs aren't installed.
let docs = std::path::Path::new(&paths::sysroot()).join("share/doc/rust/html");
if !docs.exists() {
@ -114,13 +107,9 @@ fn std_docs() {
assert!(myfun.contains(r#"href="https://example.com/rust/core/option/enum.Option.html""#));
}
#[cargo_test]
#[cargo_test(nightly, reason = "--extern-html-root-url is unstable")]
fn renamed_dep() {
// Handles renamed dependencies.
if !is_nightly() {
// --extern-html-root-url is unstable
return;
}
Package::new("bar", "1.0.0")
.file("src/lib.rs", "pub struct Straw;")
.publish();
@ -157,13 +146,9 @@ fn renamed_dep() {
assert!(myfun.contains(r#"href="https://docs.rs/bar/1.0.0/bar/struct.Straw.html""#));
}
#[cargo_test]
#[cargo_test(nightly, reason = "--extern-html-root-url is unstable")]
fn lib_name() {
// Handles lib name != package name.
if !is_nightly() {
// --extern-html-root-url is unstable
return;
}
Package::new("bar", "1.0.0")
.file(
"Cargo.toml",
@ -210,13 +195,9 @@ fn lib_name() {
assert!(myfun.contains(r#"href="https://docs.rs/bar/1.0.0/rumpelstiltskin/struct.Straw.html""#));
}
#[cargo_test]
#[cargo_test(nightly, reason = "--extern-html-root-url is unstable")]
fn alt_registry() {
// Supports other registry names.
if !is_nightly() {
// --extern-html-root-url is unstable
return;
}
registry::alt_init();
Package::new("bar", "1.0.0")
.alternative(true)
@ -290,15 +271,11 @@ fn alt_registry() {
assert!(gold.contains(r#"href="https://docs.rs/grimm/1.0.0/grimm/struct.Gold.html""#));
}
#[cargo_test]
#[cargo_test(nightly, reason = "--extern-html-root-url is unstable")]
fn multiple_versions() {
// What happens when there are multiple versions.
// NOTE: This is currently broken behavior. Rustdoc does not provide a way
// to match renamed dependencies.
if !is_nightly() {
// --extern-html-root-url is unstable
return;
}
Package::new("bar", "1.0.0")
.file("src/lib.rs", "pub struct Spin;")
.publish();
@ -342,13 +319,9 @@ fn multiple_versions() {
assert!(fn2.contains(r#"href="https://docs.rs/bar/2.0.0/bar/struct.Straw.html""#));
}
#[cargo_test]
#[cargo_test(nightly, reason = "--extern-html-root-url is unstable")]
fn rebuilds_when_changing() {
// Make sure it rebuilds if the map changes.
if !is_nightly() {
// --extern-html-root-url is unstable
return;
}
let p = basic_project();
p.cargo("doc -v --no-deps -Zrustdoc-map")
.masquerade_as_nightly_cargo(&["rustdoc-map"])

View file

@ -6,7 +6,7 @@
use cargo_test_support::registry::{Dependency, Package};
use cargo_test_support::ProjectBuilder;
use cargo_test_support::{is_nightly, paths, project, rustc_host, Execs};
use cargo_test_support::{paths, project, rustc_host, Execs};
use std::path::{Path, PathBuf};
struct Setup {
@ -14,19 +14,7 @@ struct Setup {
real_sysroot: String,
}
fn setup() -> Option<Setup> {
if !is_nightly() {
// -Zbuild-std is nightly
// We don't want these tests to run on rust-lang/rust.
return None;
}
if cfg!(all(target_os = "windows", target_env = "gnu")) {
// FIXME: contains object files that we don't handle yet:
// https://github.com/rust-lang/wg-cargo-std-aware/issues/46
return None;
}
fn setup() -> Setup {
// Our mock sysroot requires a few packages from crates.io, so make sure
// they're "published" to crates.io. Also edit their code a bit to make sure
// that they have access to our custom crates with custom apis.
@ -122,10 +110,10 @@ fn setup() -> Option<Setup> {
.build();
p.cargo("build").run();
Some(Setup {
Setup {
rustc_wrapper: p.bin("foo"),
real_sysroot: paths::sysroot(),
})
}
}
fn enable_build_std(e: &mut Execs, setup: &Setup) {
@ -184,12 +172,9 @@ impl BuildStd for Execs {
}
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn basic() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
@ -248,12 +233,10 @@ fn basic() {
p.cargo("test").build_std(&setup).target_host().run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn simple_lib_std() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project().file("src/lib.rs", "").build();
p.cargo("build -v")
.build_std(&setup)
@ -269,22 +252,18 @@ fn simple_lib_std() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn simple_bin_std() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project().file("src/main.rs", "fn main() {}").build();
p.cargo("run -v").build_std(&setup).target_host().run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn lib_nostd() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -303,12 +282,10 @@ fn lib_nostd() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn check_core() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file("src/lib.rs", "#![no_std] fn unused_fn() {}")
.build();
@ -320,12 +297,9 @@ fn check_core() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn depend_same_as_std() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
@ -357,12 +331,10 @@ fn depend_same_as_std() {
p.cargo("build -v").build_std(&setup).target_host().run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn test() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -385,12 +357,10 @@ fn test() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn target_proc_macro() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -406,12 +376,10 @@ fn target_proc_macro() {
p.cargo("build -v").build_std(&setup).target_host().run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn bench() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -430,12 +398,10 @@ fn bench() {
p.cargo("bench -v").build_std(&setup).target_host().run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn doc() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -449,12 +415,10 @@ fn doc() {
p.cargo("doc -v").build_std(&setup).target_host().run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn check_std() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -487,12 +451,10 @@ fn check_std() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn doctest() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -513,13 +475,11 @@ fn doctest() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn no_implicit_alloc() {
// Demonstrate that alloc is not implicitly in scope.
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -539,17 +499,15 @@ fn no_implicit_alloc() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn macro_expanded_shadow() {
// This tests a bug caused by the previous use of `--extern` to directly
// load sysroot crates. This necessitated the switch to `--sysroot` to
// retain existing behavior. See
// https://github.com/rust-lang/wg-cargo-std-aware/issues/40 for more
// detail.
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -565,15 +523,13 @@ fn macro_expanded_shadow() {
p.cargo("build -v").build_std(&setup).target_host().run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn ignores_incremental() {
// Incremental is not really needed for std, make sure it is disabled.
// Incremental also tends to have bugs that affect std libraries more than
// any other crate.
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project().file("src/lib.rs", "").build();
p.cargo("build")
.env("CARGO_INCREMENTAL", "1")
@ -593,12 +549,10 @@ fn ignores_incremental() {
.starts_with("foo-"));
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn cargo_config_injects_compiler_builtins() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -625,12 +579,10 @@ fn cargo_config_injects_compiler_builtins() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn different_features() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"src/lib.rs",
@ -648,13 +600,11 @@ fn different_features() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn no_roots() {
// Checks for a bug where it would panic if there are no roots.
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project().file("tests/t1.rs", "").build();
p.cargo("build")
.build_std(&setup)
@ -663,13 +613,11 @@ fn no_roots() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn proc_macro_only() {
// Checks for a bug where it would panic if building a proc-macro only
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project()
.file(
"Cargo.toml",
@ -691,12 +639,10 @@ fn proc_macro_only() {
.run();
}
#[cargo_test]
#[cargo_test(build_std_mock)]
fn fetch() {
let setup = match setup() {
Some(s) => s,
None => return,
};
let setup = setup();
let p = project().file("src/main.rs", "fn main() {}").build();
p.cargo("fetch")
.build_std(&setup)

View file

@ -5,7 +5,7 @@ use cargo_test_support::registry::Package;
use cargo_test_support::{
basic_bin_manifest, basic_lib_manifest, basic_manifest, cargo_exe, project,
};
use cargo_test_support::{cross_compile, is_nightly, paths};
use cargo_test_support::{cross_compile, paths};
use cargo_test_support::{rustc_host, sleep_ms};
use std::fs;
@ -3983,12 +3983,8 @@ fn test_dep_with_dev() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zdoctest-xcompile is unstable")]
fn cargo_test_doctest_xcompile_ignores() {
if !is_nightly() {
// -Zdoctest-xcompile is unstable
return;
}
// -Zdoctest-xcompile also enables --enable-per-target-ignores which
// allows the ignore-TARGET syntax.
let p = project()
@ -4038,15 +4034,11 @@ fn cargo_test_doctest_xcompile_ignores() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zdoctest-xcompile is unstable")]
fn cargo_test_doctest_xcompile() {
if !cross_compile::can_run_on_host() {
return;
}
if !is_nightly() {
// -Zdoctest-xcompile is unstable
return;
}
let p = project()
.file("Cargo.toml", &basic_lib_manifest("foo"))
.file(
@ -4078,15 +4070,11 @@ fn cargo_test_doctest_xcompile() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zdoctest-xcompile is unstable")]
fn cargo_test_doctest_xcompile_runner() {
if !cross_compile::can_run_on_host() {
return;
}
if !is_nightly() {
// -Zdoctest-xcompile is unstable
return;
}
let runner = project()
.file("Cargo.toml", &basic_bin_manifest("runner"))
@ -4159,15 +4147,11 @@ fn cargo_test_doctest_xcompile_runner() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zdoctest-xcompile is unstable")]
fn cargo_test_doctest_xcompile_no_runner() {
if !cross_compile::can_run_on_host() {
return;
}
if !is_nightly() {
// -Zdoctest-xcompile is unstable
return;
}
let p = project()
.file("Cargo.toml", &basic_lib_manifest("foo"))
@ -4202,13 +4186,8 @@ fn cargo_test_doctest_xcompile_no_runner() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zpanic-abort-tests in rustc is unstable")]
fn panic_abort_tests() {
if !is_nightly() {
// -Zpanic-abort-tests in rustc is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -4247,13 +4226,8 @@ fn panic_abort_tests() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zpanic-abort-tests in rustc is unstable")]
fn panic_abort_only_test() {
if !is_nightly() {
// -Zpanic-abort-tests in rustc is unstable
return;
}
let p = project()
.file(
"Cargo.toml",
@ -4288,13 +4262,8 @@ fn panic_abort_only_test() {
.run();
}
#[cargo_test]
#[cargo_test(nightly, reason = "-Zpanic-abort-tests in rustc is unstable")]
fn panic_abort_test_profile_inherits() {
if !is_nightly() {
// -Zpanic-abort-tests in rustc is unstable
return;
}
let p = project()
.file(
"Cargo.toml",