summaryrefslogtreecommitdiffstats
path: root/vendor/ui_test/tests/integration.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/ui_test/tests/integration.rs')
-rw-r--r--vendor/ui_test/tests/integration.rs112
1 files changed, 112 insertions, 0 deletions
diff --git a/vendor/ui_test/tests/integration.rs b/vendor/ui_test/tests/integration.rs
new file mode 100644
index 000000000..a9a77b45f
--- /dev/null
+++ b/vendor/ui_test/tests/integration.rs
@@ -0,0 +1,112 @@
+use std::path::Path;
+
+use colored::Colorize;
+use ui_test::color_eyre::Result;
+use ui_test::*;
+
+fn main() -> Result<()> {
+ run("integrations", Mode::Pass)?;
+ run("integrations", Mode::Panic)?;
+
+ eprintln!("integration tests done");
+
+ Ok(())
+}
+
+fn run(name: &str, mode: Mode) -> Result<()> {
+ eprintln!("\n{} `{name}` tests in mode {mode}", "Running".green());
+ let path = Path::new(file!()).parent().unwrap();
+ let root_dir = path.join(name);
+ let bless = std::env::args().all(|arg| arg != "--check");
+ let mut config = Config {
+ trailing_args: vec!["--".into(), "--test-threads".into(), "1".into()],
+ mode,
+ ..Config::cargo(root_dir.clone())
+ };
+
+ if bless {
+ config.output_conflict_handling = OutputConflictHandling::Bless;
+ }
+
+ config.program.args = vec![
+ "test".into(),
+ "--color".into(),
+ "never".into(),
+ "--quiet".into(),
+ "--jobs".into(),
+ "1".into(),
+ "--no-fail-fast".into(),
+ ];
+
+ config
+ .program
+ .envs
+ .push(("BLESS".into(), bless.then(|| String::new().into())));
+
+ config.stdout_filter("in ([0-9]m )?[0-9\\.]+s", "");
+ config.stderr_filter(r#""--out-dir"(,)? "[^"]+""#, r#""--out-dir"$1 "$$TMP"#);
+ config.stderr_filter(
+ "( *process didn't exit successfully: `[^-]+)-[0-9a-f]+",
+ "$1-HASH",
+ );
+ // Windows io::Error uses "exit code".
+ config.stderr_filter("exit code", "exit status");
+ // The order of the `/deps` directory flag is flaky
+ config.stderr_filter("/deps", "");
+ config.path_stderr_filter(&std::path::Path::new(path), "$DIR");
+ config.stderr_filter("[0-9a-f]+\\.rmeta", "$$HASH.rmeta");
+ // Windows backslashes are sometimes escaped.
+ // Insert the replacement filter at the start to make sure the filter for single backslashes
+ // runs afterwards.
+ config
+ .stderr_filters
+ .insert(0, (Match::Exact(b"\\\\".iter().copied().collect()), b"\\"));
+ config.stderr_filter("\\.exe", b"");
+ config.stderr_filter(r#"(panic.*)\.rs:[0-9]+:[0-9]+"#, "$1.rs");
+ config.stderr_filter(" [0-9]: .*", "");
+ config.stderr_filter("/target/[^/]+/[^/]+/debug", "/target/$$TMP/$$TRIPLE/debug");
+ config.stderr_filter("/target/[^/]+/tests", "/target/$$TMP/tests");
+ // Normalize proc macro filenames on windows to their linux repr
+ config.stderr_filter("/([^/\\.]+)\\.dll", "/lib$1.so");
+ // Normalize proc macro filenames on mac to their linux repr
+ config.stderr_filter("/([^/\\.]+)\\.dylib", "/$1.so");
+ config.stderr_filter("(command: )\"[^<rp][^\"]+", "$1\"$$CMD");
+ config.stderr_filter("(src/.*?\\.rs):[0-9]+:[0-9]+", "$1:LL:CC");
+ config.stderr_filter("program not found", "No such file or directory");
+ config.stderr_filter(" \\(os error [0-9]+\\)", "");
+
+ run_tests_generic(
+ config,
+ |path| {
+ let fail = path
+ .parent()
+ .unwrap()
+ .file_name()
+ .unwrap()
+ .to_str()
+ .unwrap()
+ .ends_with("-fail");
+ if cfg!(windows) && path.components().any(|c| c.as_os_str() == "basic-bin") {
+ // on windows there's also a .pdb file, so we get additional errors that aren't there on other platforms
+ return false;
+ }
+ path.ends_with("Cargo.toml")
+ && path.parent().unwrap().parent().unwrap() == root_dir
+ && match mode {
+ Mode::Pass => !fail,
+ // This is weird, but `cargo test` returns 101 instead of 1 when
+ // multiple [[test]]s exist. If there's only one test, it returns
+ // 1 on failure.
+ Mode::Panic => fail,
+ Mode::Fix | Mode::Run { .. } | Mode::Yolo | Mode::Fail { .. } => unreachable!(),
+ }
+ },
+ |_, _| None,
+ (
+ ui_test::status_emitter::Text,
+ ui_test::status_emitter::Gha::<true> {
+ name: format!("{mode:?}"),
+ },
+ ),
+ )
+}