use std::str;
use std::usize;
-use serde_json::{self, Value};
-use url::Url;
-use hamcrest as ham;
use cargo::util::ProcessBuilder;
use cargo::util::ProcessError;
+use hamcrest as ham;
+use serde_json::{self, Value};
+use url::Url;
use cargotest::support::paths::CargoPathExt;
macro_rules! t {
- ($e:expr) => (match $e {
- Ok(e) => e,
- Err(e) => panic!("{} failed with {}", stringify!($e), e),
- })
+ ($e:expr) => {
+ match $e {
+ Ok(e) => e,
+ Err(e) => panic!("{} failed with {}", stringify!($e), e),
+ }
+ };
}
-pub mod paths;
-pub mod git;
-pub mod registry;
pub mod cross_compile;
+pub mod git;
+pub mod paths;
pub mod publish;
+pub mod registry;
/*
*
if let Some(ref objects) = self.expect_json {
let stdout = str::from_utf8(&actual.stdout)
.map_err(|_| "stdout was not utf8 encoded".to_owned())?;
- let lines = stdout.lines().collect::<Vec<_>>();
+ let lines = stdout
+ .lines()
+ .filter(|line| line.starts_with("{"))
+ .collect::<Vec<_>>();
if lines.len() != objects.len() {
return Err(format!(
"expected {} json lines, got {}, stdout:\n{}",
};
}
if a.len() > 0 {
- Err(format!("Output included extra lines:\n\
- {}\n", a.join("\n")))
+ Err(format!(
+ "Output included extra lines:\n\
+ {}\n",
+ a.join("\n")
+ ))
} else {
Ok(())
}
);
}
}
+
+#[test]
+fn profile_override_hierarchy() {
+ // Test that the precedence rules are correct for different types.
+ let p = project("foo")
+ .file(
+ "Cargo.toml",
+ r#"
+ cargo-features = ["profile-overrides"]
+
+ [workspace]
+ members = ["m1", "m2", "m3"]
+
+ [profile.dev]
+ codegen-units = 1
+
+ [profile.dev.overrides.m2]
+ codegen-units = 2
+
+ [profile.dev.overrides."*"]
+ codegen-units = 3
+
+ [profile.dev.build-override]
+ codegen-units = 4
+ "#)
+
+ // m1
+ .file("m1/Cargo.toml",
+ r#"
+ [package]
+ name = "m1"
+ version = "0.0.1"
+
+ [dependencies]
+ m2 = { path = "../m2" }
+ dep = { path = "../../dep" }
+ "#)
+ .file("m1/src/lib.rs",
+ r#"
+ extern crate m2;
+ extern crate dep;
+ "#)
+ .file("m1/build.rs",
+ r#"fn main() {}"#)
+
+ // m2
+ .file("m2/Cargo.toml",
+ r#"
+ [package]
+ name = "m2"
+ version = "0.0.1"
+
+ [dependencies]
+ m3 = { path = "../m3" }
+
+ [build-dependencies]
+ m3 = { path = "../m3" }
+ dep = { path = "../../dep" }
+ "#)
+ .file("m2/src/lib.rs",
+ r#"
+ extern crate m3;
+ "#)
+ .file("m2/build.rs",
+ r#"
+ extern crate m3;
+ extern crate dep;
+ fn main() {}
+ "#)
+
+ // m3
+ .file("m3/Cargo.toml", &basic_lib_manifest("m3"))
+ .file("m3/src/lib.rs", "")
+ .build();
+
+ // dep (outside of workspace)
+ let _dep = project("dep")
+ .file("Cargo.toml", &basic_lib_manifest("dep"))
+ .file("src/lib.rs", "")
+ .build();
+
+ // Profiles should be:
+ // m3: 4 (as build.rs dependency)
+ // m3: 1 (as [profile.dev] as workspace member)
+ // dep: 3 (as [profile.dev.overrides."*"] as non-workspace member)
+ // m1 build.rs: 4 (as [profile.dev.build-override])
+ // m2 build.rs: 2 (as [profile.dev.overrides.m2])
+ // m2: 2 (as [profile.dev.overrides.m2])
+ // m1: 1 (as [profile.dev])
+
+ assert_that(
+ p.cargo("build -v").masquerade_as_nightly_cargo(),
+ execs().with_status(0).with_stderr_unordered("\
+[COMPILING] m3 [..]
+[COMPILING] dep [..]
+[RUNNING] `rustc --crate-name m3 m3[/]src[/]lib.rs --crate-type lib --emit=dep-info,link -C codegen-units=4 [..]
+[RUNNING] `rustc --crate-name dep [..]dep[/]src[/]lib.rs --crate-type lib --emit=dep-info,link -C codegen-units=3 [..]
+[RUNNING] `rustc --crate-name m3 m3[/]src[/]lib.rs --crate-type lib --emit=dep-info,link -C codegen-units=1 [..]
+[RUNNING] `rustc --crate-name build_script_build m1[/]build.rs --crate-type bin --emit=dep-info,link -C codegen-units=4 [..]
+[COMPILING] m2 [..]
+[RUNNING] `rustc --crate-name build_script_build m2[/]build.rs --crate-type bin --emit=dep-info,link -C codegen-units=2 [..]
+[RUNNING] `[..][/]m1-[..][/]build-script-build`
+[RUNNING] `[..][/]m2-[..][/]build-script-build`
+[RUNNING] `rustc --crate-name m2 m2[/]src[/]lib.rs --crate-type lib --emit=dep-info,link -C codegen-units=2 [..]
+[COMPILING] m1 [..]
+[RUNNING] `rustc --crate-name m1 m1[/]src[/]lib.rs --crate-type lib --emit=dep-info,link -C codegen-units=1 [..]
+[FINISHED] dev [unoptimized + debuginfo] [..]
+",
+ ),
+ );
+}
-use cargotest::support::{execs, project};
+use cargotest::support::{basic_lib_manifest, execs, project};
use hamcrest::assert_that;
const CARGO_RUSTC_ERROR: &'static str =
execs().with_status(0),
);
}
+
+#[test]
+fn rustc_fingerprint() {
+ // Verify that the fingerprint includes the rustc args.
+ let p = project("foo")
+ .file("Cargo.toml", &basic_lib_manifest("foo"))
+ .file("src/lib.rs", "")
+ .build();
+
+ assert_that(
+ p.cargo("rustc -v -- -C debug-assertions"),
+ execs().with_status(0).with_stderr(
+ "\
+[COMPILING] foo [..]
+[RUNNING] `rustc [..]-C debug-assertions [..]
+[FINISHED] [..]
+",
+ ),
+ );
+
+ assert_that(
+ p.cargo("rustc -v -- -C debug-assertions"),
+ execs().with_status(0).with_stderr(
+ "\
+[FRESH] foo [..]
+[FINISHED] [..]
+",
+ ),
+ );
+
+ assert_that(
+ p.cargo("rustc -v"),
+ execs()
+ .with_status(0)
+ .with_stderr_does_not_contain("-C debug-assertions")
+ .with_stderr(
+ "\
+[COMPILING] foo [..]
+[RUNNING] `rustc [..]
+[FINISHED] [..]
+",
+ ),
+ );
+
+ assert_that(
+ p.cargo("rustc -v"),
+ execs().with_status(0).with_stderr(
+ "\
+[FRESH] foo [..]
+[FINISHED] [..]
+",
+ ),
+ );
+}
use std::str;
use cargo;
-use cargotest::{is_nightly, rustc_host, sleep_ms};
-use cargotest::support::{basic_bin_manifest, basic_lib_manifest, cargo_exe, execs, project};
+use cargo::util::process;
use cargotest::support::paths::CargoPathExt;
use cargotest::support::registry::Package;
+use cargotest::support::{basic_bin_manifest, basic_lib_manifest, cargo_exe, execs, project};
+use cargotest::{is_nightly, rustc_host, sleep_ms};
use hamcrest::{assert_that, existing_file, is_not};
-use cargo::util::process;
#[test]
fn cargo_test_simple() {
.with_status(101),
);
}
+
+#[test]
+fn json_artifact_includes_test_flag() {
+ // Verify that the JSON artifact output includes `test` flag.
+ let p = project("foo")
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+ authors = []
+
+ [profile.test]
+ opt-level = 1
+ "#,
+ )
+ .file("src/lib.rs", "")
+ .build();
+
+ assert_that(
+ p.cargo("test -v --message-format=json"),
+ execs().with_status(0).with_json(
+ r#"
+ {
+ "reason":"compiler-artifact",
+ "profile": {
+ "debug_assertions": true,
+ "debuginfo": 2,
+ "opt_level": "0",
+ "overflow_checks": true,
+ "test": false
+ },
+ "features": [],
+ "package_id":"foo 0.0.1 ([..])",
+ "target":{
+ "kind":["lib"],
+ "crate_types":["lib"],
+ "name":"foo",
+ "src_path":"[..]lib.rs"
+ },
+ "filenames":["[..].rlib"],
+ "fresh": false
+ }
+
+ {
+ "reason":"compiler-artifact",
+ "profile": {
+ "debug_assertions": true,
+ "debuginfo": 2,
+ "opt_level": "1",
+ "overflow_checks": true,
+ "test": true
+ },
+ "features": [],
+ "package_id":"foo 0.0.1 ([..])",
+ "target":{
+ "kind":["lib"],
+ "crate_types":["lib"],
+ "name":"foo",
+ "src_path":"[..]lib.rs"
+ },
+ "filenames":["[..][/]foo-[..]"],
+ "fresh": false
+ }
+"#,
+ ),
+ );
+}