-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Some test code cleanup #8266
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Some test code cleanup #8266
Changes from all commits
e66ecf6
51dbbf3
920e9f0
4a54933
21343ab
01ef7c7
90bf72c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,179 +3,26 @@ | |
//! | ||
//! See [Eating your own dog food](https://en.wikipedia.org/wiki/Eating_your_own_dog_food) for context | ||
|
||
// Dogfood cannot run on Windows | ||
#![cfg(not(windows))] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The windows and mac runners are our slowest runners in CI and also the current bottleneck. This added another 1-2min to the windows runner. So I wonder if we should only run those tests on There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for reviewing this. Maybe I can find a way to get the best of both worlds using a flag or environment variable. |
||
#![feature(once_cell)] | ||
#![cfg_attr(feature = "deny-warnings", deny(warnings))] | ||
#![warn(rust_2018_idioms, unused_lifetimes)] | ||
|
||
use std::lazy::SyncLazy; | ||
use std::path::PathBuf; | ||
use std::process::Command; | ||
use test_utils::IS_RUSTC_TEST_SUITE; | ||
|
||
mod cargo; | ||
|
||
static CLIPPY_PATH: SyncLazy<PathBuf> = SyncLazy::new(|| { | ||
let mut path = std::env::current_exe().unwrap(); | ||
assert!(path.pop()); // deps | ||
path.set_file_name("cargo-clippy"); | ||
path | ||
}); | ||
mod test_utils; | ||
|
||
#[test] | ||
fn dogfood_clippy() { | ||
// run clippy on itself and fail the test if lint warnings are reported | ||
if cargo::is_rustc_test_suite() { | ||
return; | ||
} | ||
let root_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); | ||
|
||
let mut command = Command::new(&*CLIPPY_PATH); | ||
command | ||
.current_dir(root_dir) | ||
.env("CARGO_INCREMENTAL", "0") | ||
.arg("clippy") | ||
.arg("--all-targets") | ||
.arg("--all-features") | ||
.arg("--") | ||
.args(&["-D", "clippy::all"]) | ||
.args(&["-D", "clippy::pedantic"]) | ||
.arg("-Cdebuginfo=0"); // disable debuginfo to generate less data in the target dir | ||
|
||
// internal lints only exist if we build with the internal feature | ||
if cfg!(feature = "internal") { | ||
command.args(&["-D", "clippy::internal"]); | ||
} | ||
|
||
let output = command.output().unwrap(); | ||
|
||
println!("status: {}", output.status); | ||
println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); | ||
println!("stderr: {}", String::from_utf8_lossy(&output.stderr)); | ||
|
||
assert!(output.status.success()); | ||
} | ||
|
||
fn test_no_deps_ignores_path_deps_in_workspaces() { | ||
if cargo::is_rustc_test_suite() { | ||
return; | ||
} | ||
let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")); | ||
let target_dir = root.join("target").join("dogfood"); | ||
let cwd = root.join("clippy_workspace_tests"); | ||
|
||
// Make sure we start with a clean state | ||
Command::new("cargo") | ||
.current_dir(&cwd) | ||
.env("CARGO_TARGET_DIR", &target_dir) | ||
.arg("clean") | ||
.args(&["-p", "subcrate"]) | ||
.args(&["-p", "path_dep"]) | ||
.output() | ||
.unwrap(); | ||
|
||
// `path_dep` is a path dependency of `subcrate` that would trigger a denied lint. | ||
// Make sure that with the `--no-deps` argument Clippy does not run on `path_dep`. | ||
let output = Command::new(&*CLIPPY_PATH) | ||
.current_dir(&cwd) | ||
.env("CARGO_INCREMENTAL", "0") | ||
.arg("clippy") | ||
.args(&["-p", "subcrate"]) | ||
.arg("--no-deps") | ||
.arg("--") | ||
.arg("-Cdebuginfo=0") // disable debuginfo to generate less data in the target dir | ||
.args(&["--cfg", r#"feature="primary_package_test""#]) | ||
.output() | ||
.unwrap(); | ||
println!("status: {}", output.status); | ||
println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); | ||
println!("stderr: {}", String::from_utf8_lossy(&output.stderr)); | ||
|
||
assert!(output.status.success()); | ||
|
||
let lint_path_dep = || { | ||
// Test that without the `--no-deps` argument, `path_dep` is linted. | ||
let output = Command::new(&*CLIPPY_PATH) | ||
.current_dir(&cwd) | ||
.env("CARGO_INCREMENTAL", "0") | ||
.arg("clippy") | ||
.args(&["-p", "subcrate"]) | ||
.arg("--") | ||
.arg("-Cdebuginfo=0") // disable debuginfo to generate less data in the target dir | ||
.args(&["--cfg", r#"feature="primary_package_test""#]) | ||
.output() | ||
.unwrap(); | ||
println!("status: {}", output.status); | ||
println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); | ||
println!("stderr: {}", String::from_utf8_lossy(&output.stderr)); | ||
|
||
assert!(!output.status.success()); | ||
assert!( | ||
String::from_utf8(output.stderr) | ||
.unwrap() | ||
.contains("error: empty `loop {}` wastes CPU cycles") | ||
); | ||
}; | ||
|
||
// Make sure Cargo is aware of the removal of `--no-deps`. | ||
lint_path_dep(); | ||
|
||
let successful_build = || { | ||
let output = Command::new(&*CLIPPY_PATH) | ||
.current_dir(&cwd) | ||
.env("CARGO_INCREMENTAL", "0") | ||
.arg("clippy") | ||
.args(&["-p", "subcrate"]) | ||
.arg("--") | ||
.arg("-Cdebuginfo=0") // disable debuginfo to generate less data in the target dir | ||
.output() | ||
.unwrap(); | ||
println!("status: {}", output.status); | ||
println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); | ||
println!("stderr: {}", String::from_utf8_lossy(&output.stderr)); | ||
|
||
assert!(output.status.success()); | ||
|
||
output | ||
}; | ||
|
||
// Trigger a sucessful build, so Cargo would like to cache the build result. | ||
successful_build(); | ||
|
||
// Make sure there's no spurious rebuild when nothing changes. | ||
let stderr = String::from_utf8(successful_build().stderr).unwrap(); | ||
assert!(!stderr.contains("Compiling")); | ||
assert!(!stderr.contains("Checking")); | ||
assert!(stderr.contains("Finished")); | ||
|
||
// Make sure Cargo is aware of the new `--cfg` flag. | ||
lint_path_dep(); | ||
} | ||
|
||
#[test] | ||
fn dogfood_subprojects() { | ||
// run clippy on remaining subprojects and fail the test if lint warnings are reported | ||
if cargo::is_rustc_test_suite() { | ||
if IS_RUSTC_TEST_SUITE { | ||
return; | ||
} | ||
|
||
// NOTE: `path_dep` crate is omitted on purpose here | ||
for project in &[ | ||
"clippy_workspace_tests", | ||
"clippy_workspace_tests/src", | ||
"clippy_workspace_tests/subcrate", | ||
"clippy_workspace_tests/subcrate/src", | ||
flip1995 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
"clippy_dev", | ||
"clippy_lints", | ||
"clippy_utils", | ||
"rustc_tools_util", | ||
] { | ||
run_clippy_for_project(project); | ||
// "" is the root package | ||
for package in &["", "clippy_dev", "clippy_lints", "clippy_utils", "rustc_tools_util"] { | ||
run_clippy_for_package(package); | ||
} | ||
|
||
// NOTE: Since tests run in parallel we can't run cargo commands on the same workspace at the | ||
// same time, so we test this immediately after the dogfood for workspaces. | ||
test_no_deps_ignores_path_deps_in_workspaces(); | ||
} | ||
|
||
#[test] | ||
|
@@ -191,7 +38,7 @@ fn run_metadata_collection_lint() { | |
|
||
// Run collection as is | ||
std::env::set_var("ENABLE_METADATA_COLLECTION", "1"); | ||
run_clippy_for_project("clippy_lints"); | ||
run_clippy_for_package("clippy_lints"); | ||
|
||
// Check if cargo caching got in the way | ||
if let Ok(file) = File::open(metadata_output_path) { | ||
|
@@ -214,13 +61,13 @@ fn run_metadata_collection_lint() { | |
.unwrap(); | ||
|
||
// Running the collection again | ||
run_clippy_for_project("clippy_lints"); | ||
run_clippy_for_package("clippy_lints"); | ||
} | ||
|
||
fn run_clippy_for_project(project: &str) { | ||
fn run_clippy_for_package(project: &str) { | ||
let root_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); | ||
|
||
let mut command = Command::new(&*CLIPPY_PATH); | ||
let mut command = Command::new(&*test_utils::CARGO_CLIPPY_PATH); | ||
|
||
command | ||
.current_dir(root_dir.join(project)) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
#![allow(dead_code)] // see https://github.com/rust-lang/rust/issues/46379 | ||
|
||
use std::lazy::SyncLazy; | ||
use std::path::PathBuf; | ||
|
||
pub static CARGO_CLIPPY_PATH: SyncLazy<PathBuf> = SyncLazy::new(|| { | ||
let mut path = std::env::current_exe().unwrap(); | ||
assert!(path.pop()); // deps | ||
path.set_file_name("cargo-clippy"); | ||
path | ||
}); | ||
|
||
pub const IS_RUSTC_TEST_SUITE: bool = option_env!("RUSTC_TEST_SUITE").is_some(); |
Uh oh!
There was an error while loading. Please reload this page.