Skip to content

Commit 557fc4f

Browse files
committed
test(trim-paths): verify current behavior with -Ztrim-paths
1 parent fd893b2 commit 557fc4f

File tree

1 file changed

+349
-0
lines changed

1 file changed

+349
-0
lines changed

tests/testsuite/profile_trim_paths.rs

Lines changed: 349 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
//! Tests for `-Ztrim-paths`.
22
3+
use cargo_test_support::basic_manifest;
4+
use cargo_test_support::git;
5+
use cargo_test_support::paths;
36
use cargo_test_support::project;
7+
use cargo_test_support::registry::Package;
48

59
#[cargo_test]
610
fn gated_manifest() {
@@ -57,3 +61,348 @@ Caused by:
5761
)
5862
.run();
5963
}
64+
65+
#[cargo_test(nightly, reason = "-Zremap-path-scope is unstable")]
66+
fn release_profile_default_to_object() {
67+
let p = project()
68+
.file(
69+
"Cargo.toml",
70+
r#"
71+
[package]
72+
name = "foo"
73+
version = "0.0.1"
74+
"#,
75+
)
76+
.file("src/lib.rs", "")
77+
.build();
78+
79+
p.cargo("build --release --verbose -Ztrim-paths")
80+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
81+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
82+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
83+
.run();
84+
}
85+
86+
#[cargo_test(nightly, reason = "-Zremap-path-scope is unstable")]
87+
fn one_option() {
88+
let build = |option| {
89+
let p = project()
90+
.file(
91+
"Cargo.toml",
92+
&format!(
93+
r#"
94+
[package]
95+
name = "foo"
96+
version = "0.0.1"
97+
98+
[profile.dev]
99+
trim-paths = "{option}"
100+
"#
101+
),
102+
)
103+
.file("src/lib.rs", "")
104+
.build();
105+
106+
p.cargo("build -v -Ztrim-paths")
107+
};
108+
109+
for option in ["macro", "diagnostics", "object", "all"] {
110+
build(option)
111+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
112+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
113+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
114+
.run();
115+
}
116+
build("none")
117+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
118+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
119+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
120+
.run();
121+
}
122+
123+
#[cargo_test(nightly, reason = "-Zremap-path-scope is unstable")]
124+
fn multiple_options() {
125+
let p = project()
126+
.file(
127+
"Cargo.toml",
128+
r#"
129+
[package]
130+
name = "foo"
131+
version = "0.0.1"
132+
133+
[profile.dev]
134+
trim-paths = ["diagnostics", "macro", "object"]
135+
"#,
136+
)
137+
.file("src/lib.rs", "")
138+
.build();
139+
140+
p.cargo("build --verbose -Ztrim-paths")
141+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
142+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
143+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
144+
.run();
145+
}
146+
147+
#[cargo_test(nightly, reason = "-Zremap-path-scope is unstable")]
148+
fn registry_dependency() {
149+
Package::new("bar", "0.0.1")
150+
.file("Cargo.toml", &basic_manifest("bar", "0.0.1"))
151+
.file("src/lib.rs", r#"pub fn f() { println!("{}", file!()); }"#)
152+
.publish();
153+
let p = project()
154+
.file(
155+
"Cargo.toml",
156+
r#"
157+
[package]
158+
name = "foo"
159+
version = "0.0.1"
160+
161+
[dependencies]
162+
bar = "0.0.1"
163+
164+
[profile.dev]
165+
trim-paths = "object"
166+
"#,
167+
)
168+
.file("src/main.rs", "fn main() { bar::f(); }")
169+
.build();
170+
171+
let registry_src = paths::home().join(".cargo/registry/src");
172+
let registry_src = registry_src.display();
173+
174+
p.cargo("run --verbose -Ztrim-paths")
175+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
176+
.with_stdout(format!("{registry_src}/[..]/bar-0.0.1/src/lib.rs"))
177+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
178+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
179+
.run();
180+
}
181+
182+
#[cargo_test(nightly, reason = "-Zremap-path-scope is unstable")]
183+
fn git_dependency() {
184+
let git_project = git::new("bar", |project| {
185+
project
186+
.file("Cargo.toml", &basic_manifest("bar", "0.0.1"))
187+
.file("src/lib.rs", r#"pub fn f() { println!("{}", file!()); }"#)
188+
});
189+
let url = git_project.url();
190+
191+
let p = project()
192+
.file(
193+
"Cargo.toml",
194+
&format!(
195+
r#"
196+
[package]
197+
name = "foo"
198+
version = "0.0.1"
199+
200+
[dependencies]
201+
bar = {{ git = "{url}" }}
202+
203+
[profile.dev]
204+
trim-paths = "object"
205+
"#
206+
),
207+
)
208+
.file("src/main.rs", "fn main() { bar::f(); }")
209+
.build();
210+
211+
let git_checkouts_src = paths::home().join(".cargo/git/checkouts");
212+
let git_checkouts_src = git_checkouts_src.display();
213+
214+
p.cargo("run --verbose -Ztrim-paths")
215+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
216+
.with_stdout(format!("{git_checkouts_src}/bar-[..]/[..]/src/lib.rs"))
217+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
218+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
219+
.run();
220+
}
221+
222+
#[cargo_test(nightly, reason = "-Zremap-path-scope is unstable")]
223+
fn path_dependency() {
224+
let p = project()
225+
.file(
226+
"Cargo.toml",
227+
r#"
228+
[package]
229+
name = "foo"
230+
version = "0.0.1"
231+
232+
[dependencies]
233+
bar = { path = "cocktail-bar" }
234+
235+
[profile.dev]
236+
trim-paths = "object"
237+
"#,
238+
)
239+
.file("src/main.rs", "fn main() { bar::f(); }")
240+
.file("cocktail-bar/Cargo.toml", &basic_manifest("bar", "0.0.1"))
241+
.file(
242+
"cocktail-bar/src/lib.rs",
243+
r#"pub fn f() { println!("{}", file!()); }"#,
244+
)
245+
.build();
246+
247+
p.cargo("run --verbose -Ztrim-paths")
248+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
249+
.with_stdout("cocktail-bar/src/lib.rs")
250+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
251+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
252+
.run();
253+
}
254+
255+
#[cargo_test(nightly, reason = "-Zremap-path-scope is unstable")]
256+
fn path_dependency_outside_workspace() {
257+
let bar = project()
258+
.at("bar")
259+
.file("Cargo.toml", &basic_manifest("bar", "0.0.1"))
260+
.file("src/lib.rs", r#"pub fn f() { println!("{}", file!()); }"#)
261+
.build();
262+
let bar_path = bar.url().to_file_path().unwrap();
263+
let bar_path = bar_path.display();
264+
265+
let p = project()
266+
.file(
267+
"Cargo.toml",
268+
r#"
269+
[package]
270+
name = "foo"
271+
version = "0.0.1"
272+
273+
[dependencies]
274+
bar = { path = "../bar" }
275+
276+
[profile.dev]
277+
trim-paths = "object"
278+
"#,
279+
)
280+
.file("src/main.rs", "fn main() { bar::f(); }")
281+
.build();
282+
283+
p.cargo("run --verbose -Ztrim-paths")
284+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
285+
.with_stdout(format!("{bar_path}/src/lib.rs"))
286+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
287+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
288+
.run();
289+
}
290+
291+
#[cargo_test(nightly, reason = "-Zremap-path-scope is unstable")]
292+
fn diagnostics_works() {
293+
Package::new("bar", "0.0.1")
294+
.file("Cargo.toml", &basic_manifest("bar", "0.0.1"))
295+
.file("src/lib.rs", r#"pub fn f() { let unused = 0; }"#)
296+
.publish();
297+
let p = project()
298+
.file(
299+
"Cargo.toml",
300+
r#"
301+
[package]
302+
name = "foo"
303+
version = "0.0.1"
304+
305+
[dependencies]
306+
bar = "0.0.1"
307+
308+
[profile.dev]
309+
trim-paths = "diagnostics"
310+
"#,
311+
)
312+
.file("src/lib.rs", "")
313+
.build();
314+
315+
let registry_src = paths::home().join(".cargo/registry/src");
316+
let registry_src = registry_src.display();
317+
318+
p.cargo("build -vv -Ztrim-paths")
319+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
320+
.with_stderr_contains(format!("[..]{registry_src}/[..]/bar-0.0.1/src/lib.rs:1[..]"))
321+
.with_stderr_contains("[..]unused_variables[..]")
322+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
323+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
324+
.run();
325+
}
326+
327+
#[cfg(target_os = "linux")]
328+
#[cargo_test(requires_readelf, nightly, reason = "-Zremap-path-scope is unstable")]
329+
fn object_works() {
330+
use std::os::unix::ffi::OsStrExt;
331+
332+
let run_readelf = |path| {
333+
std::process::Command::new("readelf")
334+
.arg("-wi")
335+
.arg(path)
336+
.output()
337+
.expect("readelf works")
338+
};
339+
340+
let registry_src = paths::home().join(".cargo/registry/src");
341+
let registry_src_bytes = registry_src.as_os_str().as_bytes();
342+
343+
Package::new("bar", "0.0.1")
344+
.file("Cargo.toml", &basic_manifest("bar", "0.0.1"))
345+
.file("src/lib.rs", r#"pub fn f() { println!("{}", file!()); }"#)
346+
.publish();
347+
348+
let p = project()
349+
.file(
350+
"Cargo.toml",
351+
r#"
352+
[package]
353+
name = "foo"
354+
version = "0.0.1"
355+
356+
[dependencies]
357+
bar = "0.0.1"
358+
"#,
359+
)
360+
.file("src/main.rs", "fn main() { bar::f(); }")
361+
.build();
362+
363+
let pkg_root = p.root();
364+
let pkg_root = pkg_root.as_os_str().as_bytes();
365+
366+
p.cargo("build").run();
367+
368+
let bin_path = p.bin("foo");
369+
assert!(bin_path.is_file());
370+
let stdout = run_readelf(bin_path).stdout;
371+
// TODO: re-enable this check when rustc bootstrap disables remapping
372+
// <https://github.com/rust-lang/cargo/pull/12625#discussion_r1371714791>
373+
// assert!(memchr::memmem::find(&stdout, rust_src).is_some());
374+
assert!(memchr::memmem::find(&stdout, registry_src_bytes).is_some());
375+
assert!(memchr::memmem::find(&stdout, pkg_root).is_some());
376+
377+
p.cargo("clean").run();
378+
379+
p.change_file(
380+
"Cargo.toml",
381+
r#"
382+
[package]
383+
name = "foo"
384+
version = "0.0.1"
385+
386+
[dependencies]
387+
bar = "0.0.1"
388+
389+
[profile.dev]
390+
trim-paths = "object"
391+
"#,
392+
);
393+
394+
p.cargo("build --verbose -Ztrim-paths")
395+
.masquerade_as_nightly_cargo(&["-Ztrim-paths"])
396+
.with_stderr_does_not_contain("[..]-Zremap-path-scope=[..]")
397+
.with_stderr_does_not_contain("[..]--remap-path-prefix=[..]")
398+
.run();
399+
400+
let bin_path = p.bin("foo");
401+
assert!(bin_path.is_file());
402+
let stdout = run_readelf(bin_path).stdout;
403+
// TODO: re-enable this check when rustc bootstrap disables remapping
404+
// <https://github.com/rust-lang/cargo/pull/12625#discussion_r1371714791>
405+
// assert!(memchr::memmem::find(&stdout, rust_src).is_some());
406+
assert!(memchr::memmem::find(&stdout, registry_src_bytes).is_some());
407+
assert!(memchr::memmem::find(&stdout, pkg_root).is_some());
408+
}

0 commit comments

Comments
 (0)