Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit f0c23fc

Browse files
committedJan 28, 2025
Auto merge of #135818 - jieyouxu:migrate-translation, r=compiler-errors
tests: Port `translation` to rmake.rs Part of #121876. This PR partially supersedes #129011 and is co-authored with `@Oneirical.` ## Summary This PR ports `tests/run-make/translation` to rmake.rs. Notable changes from the Makefile version include: - We now actually fail if the rustc invocations fail... The Makefile did not have `SHELL=/bin/bash -o pipefail`, so all the piped rustc invocations to grep vacuously succeeded, even if the broken ftl test case actually regressed over time and ICEs on current master. - That test case is converted to assert it fails with a FIXME backlinking to #135817. - The test coverage is expanded to not ignore windows. Instead, the test now uses symlink capability detection to gate test execution. - Added some backlinks to relevant tracking issues and the initial translation infra implementation PR. ## Review advice Best reviewed commit-by-commit. r? compiler try-job: aarch64-apple
2 parents aa6f5ab + 717b16e commit f0c23fc

File tree

5 files changed

+210
-81
lines changed

5 files changed

+210
-81
lines changed
 

‎src/tools/run-make-support/src/command.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -388,9 +388,15 @@ impl CompletedProcess {
388388
self
389389
}
390390

391+
/// Check the **exit status** of the process. On Unix, this is *not* the **wait status**.
392+
///
393+
/// See [`std::process::ExitStatus::code`]. This is not to be confused with
394+
/// [`std::process::ExitCode`].
391395
#[track_caller]
392396
pub fn assert_exit_code(&self, code: i32) -> &Self {
393-
assert!(self.output.status.code() == Some(code));
397+
// FIXME(jieyouxu): this should really be named `exit_status`, because std has an `ExitCode`
398+
// that means a different thing.
399+
assert_eq!(self.output.status.code(), Some(code));
394400
self
395401
}
396402
}

‎src/tools/run-make-support/src/external_deps/rustc.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::ffi::{OsStr, OsString};
2-
use std::path::Path;
2+
use std::path::{Path, PathBuf};
3+
use std::str::FromStr as _;
34

45
use crate::command::Command;
56
use crate::env::env_var;
@@ -390,3 +391,10 @@ impl Rustc {
390391
self
391392
}
392393
}
394+
395+
/// Query the sysroot path corresponding `rustc --print=sysroot`.
396+
#[track_caller]
397+
pub fn sysroot() -> PathBuf {
398+
let path = rustc().print("sysroot").run().stdout_utf8();
399+
PathBuf::from_str(path.trim()).unwrap()
400+
}
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
run-make/split-debuginfo/Makefile
22
run-make/symbol-mangling-hashed/Makefile
3-
run-make/translation/Makefile

‎tests/run-make/translation/Makefile

-78
This file was deleted.

‎tests/run-make/translation/rmake.rs

+194
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
//! Smoke test for the rustc diagnostics translation infrastructure.
2+
//!
3+
//! # References
4+
//!
5+
//! - Current tracking issue: <https://github.com/rust-lang/rust/issues/132181>.
6+
//! - Old tracking issue: <https://github.com/rust-lang/rust/issues/100717>
7+
//! - Initial translation infra implementation: <https://github.com/rust-lang/rust/pull/95512>.
8+
9+
// This test uses symbolic links to stub out a fake sysroot to save testing time.
10+
//@ needs-symlink
11+
//@ needs-subprocess
12+
13+
#![deny(warnings)]
14+
15+
use std::path::{Path, PathBuf};
16+
17+
use run_make_support::rustc::sysroot;
18+
use run_make_support::{cwd, rfs, run_in_tmpdir, rustc};
19+
20+
fn main() {
21+
builtin_fallback_bundle();
22+
additional_primary_bundle();
23+
missing_slug_prefers_fallback_bundle();
24+
broken_primary_bundle_prefers_fallback_bundle();
25+
locale_sysroot();
26+
missing_sysroot();
27+
file_sysroot();
28+
}
29+
30+
/// Check that the test works normally, using the built-in fallback bundle.
31+
fn builtin_fallback_bundle() {
32+
rustc().input("test.rs").run_fail().assert_stderr_contains("struct literal body without path");
33+
}
34+
35+
/// Check that a primary bundle can be loaded and will be preferentially used where possible.
36+
fn additional_primary_bundle() {
37+
rustc()
38+
.input("test.rs")
39+
.arg("-Ztranslate-additional-ftl=working.ftl")
40+
.run_fail()
41+
.assert_stderr_contains("this is a test message");
42+
}
43+
44+
/// Check that a primary bundle without the desired message will use the fallback bundle.
45+
fn missing_slug_prefers_fallback_bundle() {
46+
rustc()
47+
.input("test.rs")
48+
.arg("-Ztranslate-additional-ftl=missing.ftl")
49+
.run_fail()
50+
.assert_stderr_contains("struct literal body without path");
51+
}
52+
53+
/// Check that a primary bundle with a broken message (e.g. an interpolated variable is not
54+
/// provided) will use the fallback bundle.
55+
fn broken_primary_bundle_prefers_fallback_bundle() {
56+
// FIXME(#135817): as of the rmake.rs port, the compiler actually ICEs on the additional
57+
// `broken.ftl`, even though the original intention seems to be that it should gracefully
58+
// failover to the fallback bundle. On `aarch64-apple-darwin`, somehow it *doesn't* ICE.
59+
60+
rustc()
61+
.env("RUSTC_ICE", "0") // disable ICE dump file, not needed
62+
.input("test.rs")
63+
.arg("-Ztranslate-additional-ftl=broken.ftl")
64+
.run_fail();
65+
}
66+
67+
#[track_caller]
68+
fn shallow_symlink_dir_entries(src_dir: &Path, dst_dir: &Path) {
69+
for entry in rfs::read_dir(src_dir) {
70+
let entry = entry.unwrap();
71+
let src_entry_path = entry.path();
72+
let src_filename = src_entry_path.file_name().unwrap();
73+
let meta = rfs::symlink_metadata(&src_entry_path);
74+
if meta.is_symlink() || meta.is_file() {
75+
rfs::symlink_file(&src_entry_path, dst_dir.join(src_filename));
76+
} else if meta.is_dir() {
77+
rfs::symlink_dir(&src_entry_path, dst_dir.join(src_filename));
78+
} else {
79+
unreachable!()
80+
}
81+
}
82+
}
83+
84+
#[track_caller]
85+
fn shallow_symlink_dir_entries_materialize_single_dir(
86+
src_dir: &Path,
87+
dst_dir: &Path,
88+
dir_filename: &str,
89+
) {
90+
shallow_symlink_dir_entries(src_dir, dst_dir);
91+
92+
let dst_symlink_meta = rfs::symlink_metadata(dst_dir.join(dir_filename));
93+
94+
if dst_symlink_meta.is_file() || dst_symlink_meta.is_dir() {
95+
unreachable!();
96+
}
97+
98+
#[cfg(windows)]
99+
{
100+
use std::os::windows::fs::FileTypeExt;
101+
if dst_symlink_meta.is_symlink_file() {
102+
rfs::remove_file(dst_dir.join(dir_filename));
103+
} else if dst_symlink_meta.is_symlink_dir() {
104+
rfs::remove_dir(dst_dir.join(dir_filename));
105+
} else {
106+
unreachable!();
107+
}
108+
}
109+
#[cfg(not(windows))]
110+
{
111+
rfs::remove_file(dst_dir.join(dir_filename));
112+
}
113+
114+
rfs::create_dir_all(dst_dir.join(dir_filename));
115+
}
116+
117+
#[track_caller]
118+
fn setup_fakeroot_parents() -> PathBuf {
119+
let sysroot = sysroot();
120+
let fakeroot = cwd().join("fakeroot");
121+
rfs::create_dir_all(&fakeroot);
122+
shallow_symlink_dir_entries_materialize_single_dir(&sysroot, &fakeroot, "lib");
123+
shallow_symlink_dir_entries_materialize_single_dir(
124+
&sysroot.join("lib"),
125+
&fakeroot.join("lib"),
126+
"rustlib",
127+
);
128+
shallow_symlink_dir_entries_materialize_single_dir(
129+
&sysroot.join("lib").join("rustlib"),
130+
&fakeroot.join("lib").join("rustlib"),
131+
"src",
132+
);
133+
shallow_symlink_dir_entries(
134+
&sysroot.join("lib").join("rustlib").join("src"),
135+
&fakeroot.join("lib").join("rustlib").join("src"),
136+
);
137+
fakeroot
138+
}
139+
140+
/// Check that a locale can be loaded from the sysroot given a language identifier by making a local
141+
/// copy of the sysroot and adding the custom locale to it.
142+
fn locale_sysroot() {
143+
run_in_tmpdir(|| {
144+
let fakeroot = setup_fakeroot_parents();
145+
146+
// When download-rustc is enabled, real sysroot will have a share directory. Delete the link
147+
// to it.
148+
let _ = std::fs::remove_file(fakeroot.join("share"));
149+
150+
let fake_locale_path = fakeroot.join("share").join("locale").join("zh-CN");
151+
rfs::create_dir_all(&fake_locale_path);
152+
rfs::symlink_file(
153+
cwd().join("working.ftl"),
154+
fake_locale_path.join("basic-translation.ftl"),
155+
);
156+
157+
rustc()
158+
.env("RUSTC_ICE", "0")
159+
.input("test.rs")
160+
.sysroot(&fakeroot)
161+
.arg("-Ztranslate-lang=zh-CN")
162+
.run_fail()
163+
.assert_stderr_contains("this is a test message");
164+
});
165+
}
166+
167+
/// Check that the compiler errors out when the sysroot requested cannot be found. This test might
168+
/// start failing if there actually exists a Klingon translation of rustc's error messages.
169+
fn missing_sysroot() {
170+
run_in_tmpdir(|| {
171+
rustc()
172+
.input("test.rs")
173+
.arg("-Ztranslate-lang=tlh")
174+
.run_fail()
175+
.assert_stderr_contains("missing locale directory");
176+
});
177+
}
178+
179+
/// Check that the compiler errors out when the directory for the locale in the sysroot is actually
180+
/// a file.
181+
fn file_sysroot() {
182+
run_in_tmpdir(|| {
183+
let fakeroot = setup_fakeroot_parents();
184+
rfs::create_dir_all(fakeroot.join("share").join("locale"));
185+
rfs::write(fakeroot.join("share").join("locale").join("zh-CN"), b"not a dir");
186+
187+
rustc()
188+
.input("test.rs")
189+
.sysroot(&fakeroot)
190+
.arg("-Ztranslate-lang=zh-CN")
191+
.run_fail()
192+
.assert_stderr_contains("is not a directory");
193+
});
194+
}

0 commit comments

Comments
 (0)
Failed to load comments.