mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-16 22:16:53 +00:00
Auto merge of #126490 - Oneirical:testicide, r=jieyouxu
Migrate `extern-flag-fun`, `incremental-debugger-visualiser` and `incremental-session-fail` `run-make` tests to `rmake.rs` Part of #121876 and the associated [Google Summer of Code project](https://blog.rust-lang.org/2024/05/01/gsoc-2024-selected-projects.html). try-job: arm-android try-job: armhf-gnu try-job: test-various try-job: x86_64-msvc try-job: dist-i686-mingw
This commit is contained in:
commit
67cfc3a558
@ -303,6 +303,34 @@ pub fn set_host_rpath(cmd: &mut Command) {
|
||||
});
|
||||
}
|
||||
|
||||
/// Read the contents of a file that cannot simply be read by
|
||||
/// read_to_string, due to invalid utf8 data, then assert that it contains `expected`.
|
||||
#[track_caller]
|
||||
pub fn invalid_utf8_contains<P: AsRef<Path>>(path: P, expected: &str) {
|
||||
let buffer = fs_wrapper::read(path.as_ref());
|
||||
if !String::from_utf8_lossy(&buffer).contains(expected) {
|
||||
eprintln!("=== FILE CONTENTS (LOSSY) ===");
|
||||
eprintln!("{}", String::from_utf8_lossy(&buffer));
|
||||
eprintln!("=== SPECIFIED TEXT ===");
|
||||
eprintln!("{}", expected);
|
||||
panic!("specified text was not found in file");
|
||||
}
|
||||
}
|
||||
|
||||
/// Read the contents of a file that cannot simply be read by
|
||||
/// read_to_string, due to invalid utf8 data, then assert that it does not contain `expected`.
|
||||
#[track_caller]
|
||||
pub fn invalid_utf8_not_contains<P: AsRef<Path>>(path: P, expected: &str) {
|
||||
let buffer = fs_wrapper::read(path.as_ref());
|
||||
if String::from_utf8_lossy(&buffer).contains(expected) {
|
||||
eprintln!("=== FILE CONTENTS (LOSSY) ===");
|
||||
eprintln!("{}", String::from_utf8_lossy(&buffer));
|
||||
eprintln!("=== SPECIFIED TEXT ===");
|
||||
eprintln!("{}", expected);
|
||||
panic!("specified text was unexpectedly found in file");
|
||||
}
|
||||
}
|
||||
|
||||
/// Copy a directory into another.
|
||||
pub fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) {
|
||||
fn copy_dir_all_inner(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> io::Result<()> {
|
||||
|
@ -40,7 +40,6 @@ run-make/error-writing-dependencies/Makefile
|
||||
run-make/export-executable-symbols/Makefile
|
||||
run-make/extern-diff-internal-name/Makefile
|
||||
run-make/extern-flag-disambiguates/Makefile
|
||||
run-make/extern-flag-fun/Makefile
|
||||
run-make/extern-flag-pathless/Makefile
|
||||
run-make/extern-flag-rename-transitive/Makefile
|
||||
run-make/extern-fn-explicit-align/Makefile
|
||||
@ -64,8 +63,6 @@ run-make/glibc-staticlib-args/Makefile
|
||||
run-make/include_bytes_deps/Makefile
|
||||
run-make/incr-add-rust-src-component/Makefile
|
||||
run-make/incr-foreign-head-span/Makefile
|
||||
run-make/incremental-debugger-visualizer/Makefile
|
||||
run-make/incremental-session-fail/Makefile
|
||||
run-make/inline-always-many-cgu/Makefile
|
||||
run-make/interdependent-c-libraries/Makefile
|
||||
run-make/intrinsic-unreachable/Makefile
|
||||
|
@ -1,20 +0,0 @@
|
||||
# ignore-cross-compile
|
||||
include ../tools.mk
|
||||
|
||||
all:
|
||||
$(RUSTC) bar.rs --crate-type=rlib
|
||||
$(RUSTC) bar.rs --crate-type=rlib -C extra-filename=-a
|
||||
$(RUSTC) bar-alt.rs --crate-type=rlib
|
||||
$(RUSTC) foo.rs --extern bar=no-exist && exit 1 || exit 0
|
||||
$(RUSTC) foo.rs --extern bar=foo.rs && exit 1 || exit 0
|
||||
$(RUSTC) foo.rs \
|
||||
--extern bar=$(TMPDIR)/libbar.rlib \
|
||||
--extern bar=$(TMPDIR)/libbar-alt.rlib \
|
||||
&& exit 1 || exit 0
|
||||
$(RUSTC) foo.rs \
|
||||
--extern bar=$(TMPDIR)/libbar.rlib \
|
||||
--extern bar=$(TMPDIR)/libbar-a.rlib
|
||||
$(RUSTC) foo.rs --extern bar=$(TMPDIR)/libbar.rlib
|
||||
# Try to be sneaky and load a private crate from with a non-private name.
|
||||
$(RUSTC) rustc.rs -Zforce-unstable-if-unmarked --crate-type=rlib
|
||||
$(RUSTC) gated_unstable.rs --extern alloc=$(TMPDIR)/librustc.rlib 2>&1 | $(CGREP) 'rustc_private'
|
38
tests/run-make/extern-flag-fun/rmake.rs
Normal file
38
tests/run-make/extern-flag-fun/rmake.rs
Normal file
@ -0,0 +1,38 @@
|
||||
// The --extern flag can override the default crate search of
|
||||
// the compiler and directly fetch a given path. There are a few rules
|
||||
// to follow: for example, there can't be more than one rlib, the crates must
|
||||
// be valid ("no-exist" in this test), and private crates can't be loaded
|
||||
// as non-private. This test checks that these rules are enforced.
|
||||
// See https://github.com/rust-lang/rust/pull/15319
|
||||
|
||||
use run_make_support::{rust_lib_name, rustc};
|
||||
|
||||
fn main() {
|
||||
rustc().input("bar.rs").crate_type("rlib").run();
|
||||
// Exactly the same rlib as the first line, only the filename changes.
|
||||
rustc().input("bar.rs").crate_type("rlib").extra_filename("-a").run();
|
||||
rustc().input("bar-alt.rs").crate_type("rlib").run();
|
||||
// The crate must be valid.
|
||||
rustc().input("foo.rs").extern_("bar", "no-exist").run_fail();
|
||||
rustc().input("foo.rs").extern_("bar", "foo.rs").run_fail();
|
||||
// Compilation fails with two different rlibs.
|
||||
rustc()
|
||||
.input("foo.rs")
|
||||
.extern_("bar", rust_lib_name("bar"))
|
||||
.extern_("bar", rust_lib_name("bar-alt"))
|
||||
.run_fail();
|
||||
// Even though this one has seemingly two rlibs, they are one and the same.
|
||||
rustc()
|
||||
.input("foo.rs")
|
||||
.extern_("bar", rust_lib_name("bar"))
|
||||
.extern_("bar", rust_lib_name("bar-a"))
|
||||
.run();
|
||||
rustc().input("foo.rs").extern_("bar", rust_lib_name("bar")).run();
|
||||
// Try to be sneaky and load a private crate from with a non-private name.
|
||||
rustc().input("rustc.rs").arg("-Zforce-unstable-if-unmarked").crate_type("rlib").run();
|
||||
rustc()
|
||||
.input("gated_unstable.rs")
|
||||
.extern_("alloc", rust_lib_name("rustc"))
|
||||
.run_fail()
|
||||
.assert_stderr_contains("rustc_private");
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
include ../tools.mk
|
||||
|
||||
# This test makes sure that changes to files referenced via #[debugger_visualizer]
|
||||
# are picked up when compiling incrementally.
|
||||
|
||||
# We have to copy the source to $(TMPDIR) because Github CI mounts the source
|
||||
# directory as readonly. We need to apply modifications to some of the source
|
||||
# file.
|
||||
SRC_DIR := $(TMPDIR)/src
|
||||
INCR_CACHE_DIR := $(TMPDIR)/incremental
|
||||
|
||||
all:
|
||||
rm -rf $(TMPDIR)/*
|
||||
mkdir $(SRC_DIR)
|
||||
cp ./foo.rs $(SRC_DIR)
|
||||
echo "GDB script v1" > $(SRC_DIR)/foo.py
|
||||
echo "Natvis v1" > $(SRC_DIR)/foo.natvis
|
||||
$(RUSTC) $(SRC_DIR)/foo.rs \
|
||||
--crate-type=rlib \
|
||||
--emit metadata \
|
||||
-C incremental=$(INCR_CACHE_DIR) \
|
||||
-Z incremental-verify-ich
|
||||
$(CGREP) "GDB script v1" < $(TMPDIR)/libfoo.rmeta
|
||||
$(CGREP) "Natvis v1" < $(TMPDIR)/libfoo.rmeta
|
||||
|
||||
# Change only the GDB script and check that the change has been picked up
|
||||
echo "GDB script v2" > $(SRC_DIR)/foo.py
|
||||
$(RUSTC) $(SRC_DIR)/foo.rs \
|
||||
--crate-type=rlib \
|
||||
--emit metadata \
|
||||
-C incremental=$(INCR_CACHE_DIR) \
|
||||
-Z incremental-verify-ich
|
||||
|
||||
$(CGREP) "GDB script v2" < $(TMPDIR)/libfoo.rmeta
|
||||
$(CGREP) -v "GDB script v1" < $(TMPDIR)/libfoo.rmeta
|
||||
$(CGREP) "Natvis v1" < $(TMPDIR)/libfoo.rmeta
|
||||
|
||||
# Now change the Natvis version and check that the change has been picked up
|
||||
echo "Natvis v2" > $(SRC_DIR)/foo.natvis
|
||||
$(RUSTC) $(SRC_DIR)/foo.rs \
|
||||
--crate-type=rlib \
|
||||
--emit metadata \
|
||||
-C incremental=$(INCR_CACHE_DIR) \
|
||||
-Z incremental-verify-ich
|
||||
|
||||
$(CGREP) "GDB script v2" < $(TMPDIR)/libfoo.rmeta
|
||||
$(CGREP) -v "GDB script v1" < $(TMPDIR)/libfoo.rmeta
|
||||
$(CGREP) "Natvis v2" < $(TMPDIR)/libfoo.rmeta
|
||||
$(CGREP) -v "Natvis v1" < $(TMPDIR)/libfoo.rmeta
|
56
tests/run-make/incremental-debugger-visualizer/rmake.rs
Normal file
56
tests/run-make/incremental-debugger-visualizer/rmake.rs
Normal file
@ -0,0 +1,56 @@
|
||||
// This test ensures that changes to files referenced via #[debugger_visualizer]
|
||||
// (in this case, foo.py and foo.natvis) are picked up when compiling incrementally.
|
||||
// See https://github.com/rust-lang/rust/pull/111641
|
||||
|
||||
use run_make_support::{fs_wrapper, invalid_utf8_contains, invalid_utf8_not_contains, rustc};
|
||||
use std::io::Read;
|
||||
|
||||
fn main() {
|
||||
fs_wrapper::create_file("foo.py");
|
||||
fs_wrapper::write("foo.py", "GDB script v1");
|
||||
fs_wrapper::create_file("foo.natvis");
|
||||
fs_wrapper::write("foo.natvis", "Natvis v1");
|
||||
rustc()
|
||||
.input("foo.rs")
|
||||
.crate_type("rlib")
|
||||
.emit("metadata")
|
||||
.incremental("incremental")
|
||||
.arg("-Zincremental-verify-ich")
|
||||
.run();
|
||||
|
||||
invalid_utf8_contains("libfoo.rmeta", "GDB script v1");
|
||||
invalid_utf8_contains("libfoo.rmeta", "Natvis v1");
|
||||
|
||||
// Change only the GDB script and check that the change has been picked up
|
||||
fs_wrapper::remove_file("foo.py");
|
||||
fs_wrapper::create_file("foo.py");
|
||||
fs_wrapper::write("foo.py", "GDB script v2");
|
||||
rustc()
|
||||
.input("foo.rs")
|
||||
.crate_type("rlib")
|
||||
.emit("metadata")
|
||||
.incremental("incremental")
|
||||
.arg("-Zincremental-verify-ich")
|
||||
.run();
|
||||
|
||||
invalid_utf8_contains("libfoo.rmeta", "GDB script v2");
|
||||
invalid_utf8_not_contains("libfoo.rmeta", "GDB script v1");
|
||||
invalid_utf8_contains("libfoo.rmeta", "Natvis v1");
|
||||
|
||||
// Now change the Natvis version and check that the change has been picked up
|
||||
fs_wrapper::remove_file("foo.natvis");
|
||||
fs_wrapper::create_file("foo.natvis");
|
||||
fs_wrapper::write("foo.natvis", "Natvis v2");
|
||||
rustc()
|
||||
.input("foo.rs")
|
||||
.crate_type("rlib")
|
||||
.emit("metadata")
|
||||
.incremental("incremental")
|
||||
.arg("-Zincremental-verify-ich")
|
||||
.run();
|
||||
|
||||
invalid_utf8_contains("libfoo.rmeta", "GDB script v2");
|
||||
invalid_utf8_not_contains("libfoo.rmeta", "GDB script v1");
|
||||
invalid_utf8_not_contains("libfoo.rmeta", "Natvis v1");
|
||||
invalid_utf8_contains("libfoo.rmeta", "Natvis v2");
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
include ../tools.mk
|
||||
|
||||
SESSION_DIR := $(TMPDIR)/session
|
||||
OUTPUT_FILE := $(TMPDIR)/build-output
|
||||
|
||||
all:
|
||||
echo $(TMPDIR)
|
||||
# Make it so that rustc will fail to create a session directory.
|
||||
touch $(SESSION_DIR)
|
||||
# Check exit code is 1 for an error, and not 101 for ICE.
|
||||
$(RUSTC) foo.rs --crate-type=rlib -C incremental=$(SESSION_DIR) > $(OUTPUT_FILE) 2>&1; [ $$? -eq 1 ]
|
||||
$(CGREP) "could not create incremental compilation crate directory" < $(OUTPUT_FILE)
|
||||
# -v tests are fragile, hopefully this text won't change
|
||||
$(CGREP) -v "internal compiler error" < $(OUTPUT_FILE)
|
15
tests/run-make/incremental-session-fail/rmake.rs
Normal file
15
tests/run-make/incremental-session-fail/rmake.rs
Normal file
@ -0,0 +1,15 @@
|
||||
// Failing to create the directory where output incremental
|
||||
// files would be stored used to cause an ICE (Internal Compiler
|
||||
// Error). This was patched in #85698, and this test checks that
|
||||
// the ensuing compilation failure is not an ICE.
|
||||
// See https://github.com/rust-lang/rust/pull/85698
|
||||
|
||||
use run_make_support::{fs_wrapper, rustc};
|
||||
|
||||
fn main() {
|
||||
fs_wrapper::create_file("session");
|
||||
// rustc should fail to create the session directory here.
|
||||
let out = rustc().input("foo.rs").crate_type("rlib").incremental("session").run_fail();
|
||||
out.assert_stderr_contains("could not create incremental compilation crate directory");
|
||||
out.assert_stderr_not_contains("internal compiler error");
|
||||
}
|
Loading…
Reference in New Issue
Block a user