diff options
| author | Albert Larsan <74931857+albertlarsan68@users.noreply.github.com> | 2023-01-05 09:13:28 +0100 |
|---|---|---|
| committer | Albert Larsan <74931857+albertlarsan68@users.noreply.github.com> | 2023-01-11 09:32:08 +0000 |
| commit | cf2dff2b1e3fa55fa5415d524200070d0d7aacfe (patch) | |
| tree | 40a88d9a46aaf3e8870676eb2538378b75a263eb /src/test/ui/backtrace.rs | |
| parent | ca855e6e42787ecd062d81d53336fe6788ef51a9 (diff) | |
Move /src/test to /tests
Diffstat (limited to 'src/test/ui/backtrace.rs')
| -rw-r--r-- | src/test/ui/backtrace.rs | 130 |
1 files changed, 0 insertions, 130 deletions
diff --git a/src/test/ui/backtrace.rs b/src/test/ui/backtrace.rs deleted file mode 100644 index dd73dd9886a..00000000000 --- a/src/test/ui/backtrace.rs +++ /dev/null @@ -1,130 +0,0 @@ -// run-pass -// ignore-android FIXME #17520 -// ignore-emscripten spawning processes is not supported -// ignore-openbsd no support for libbacktrace without filename -// ignore-sgx no processes -// ignore-msvc see #62897 and `backtrace-debuginfo.rs` test -// ignore-fuchsia Backtraces not symbolized -// compile-flags:-g -// compile-flags:-Cstrip=none - -use std::env; -use std::process::{Command, Stdio}; -use std::str; - -#[inline(never)] -fn foo() { - let _v = vec![1, 2, 3]; - if env::var_os("IS_TEST").is_some() { - panic!() - } -} - -#[inline(never)] -fn double() { - struct Double; - - impl Drop for Double { - fn drop(&mut self) { panic!("twice") } - } - - let _d = Double; - - panic!("once"); -} - -fn template(me: &str) -> Command { - let mut m = Command::new(me); - m.env("IS_TEST", "1") - .stdout(Stdio::piped()) - .stderr(Stdio::piped()); - return m; -} - -fn expected(fn_name: &str) -> String { - format!(" backtrace::{}", fn_name) -} - -#[cfg(not(panic = "abort"))] -fn contains_verbose_expected(s: &str, fn_name: &str) -> bool { - // HACK(eddyb) work around the fact that verbosely demangled stack traces - // (from `RUST_BACKTRACE=full`, or, as is the case here, panic-in-panic) - // may contain symbols with hashes in them, i.e. `backtrace[...]::`. - let prefix = " backtrace"; - let suffix = &format!("::{}", fn_name); - s.match_indices(prefix).any(|(i, _)| { - s[i + prefix.len()..] - .trim_start_matches('[') - .trim_start_matches(char::is_alphanumeric) - .trim_start_matches(']') - .starts_with(suffix) - }) -} - -fn runtest(me: &str) { - // Make sure that the stack trace is printed - let p = template(me).arg("fail").env("RUST_BACKTRACE", "1").spawn().unwrap(); - let out = p.wait_with_output().unwrap(); - assert!(!out.status.success()); - let s = str::from_utf8(&out.stderr).unwrap(); - assert!(s.contains("stack backtrace") && s.contains(&expected("foo")), - "bad output: {}", s); - assert!(s.contains(" 0:"), "the frame number should start at 0"); - - // Make sure the stack trace is *not* printed - // (Remove RUST_BACKTRACE from our own environment, in case developer - // is running `make check` with it on.) - let p = template(me).arg("fail").env_remove("RUST_BACKTRACE").spawn().unwrap(); - let out = p.wait_with_output().unwrap(); - assert!(!out.status.success()); - let s = str::from_utf8(&out.stderr).unwrap(); - assert!(!s.contains("stack backtrace") && !s.contains(&expected("foo")), - "bad output2: {}", s); - - // Make sure the stack trace is *not* printed - // (RUST_BACKTRACE=0 acts as if it were unset from our own environment, - // in case developer is running `make check` with it set.) - let p = template(me).arg("fail").env("RUST_BACKTRACE","0").spawn().unwrap(); - let out = p.wait_with_output().unwrap(); - assert!(!out.status.success()); - let s = str::from_utf8(&out.stderr).unwrap(); - assert!(!s.contains("stack backtrace") && !s.contains(" - foo"), - "bad output3: {}", s); - - #[cfg(not(panic = "abort"))] - { - // Make sure a stack trace is printed - let p = template(me).arg("double-fail").spawn().unwrap(); - let out = p.wait_with_output().unwrap(); - assert!(!out.status.success()); - let s = str::from_utf8(&out.stderr).unwrap(); - // loosened the following from double::h to double:: due to - // spurious failures on mac, 32bit, optimized - assert!(s.contains("stack backtrace") && contains_verbose_expected(s, "double"), - "bad output3: {}", s); - - // Make sure a stack trace isn't printed too many times - let p = template(me).arg("double-fail") - .env("RUST_BACKTRACE", "1").spawn().unwrap(); - let out = p.wait_with_output().unwrap(); - assert!(!out.status.success()); - let s = str::from_utf8(&out.stderr).unwrap(); - let mut i = 0; - for _ in 0..2 { - i += s[i + 10..].find("stack backtrace").unwrap() + 10; - } - assert!(s[i + 10..].find("stack backtrace").is_none(), - "bad output4: {}", s); - } -} - -fn main() { - let args: Vec<String> = env::args().collect(); - if args.len() >= 2 && args[1] == "fail" { - foo(); - } else if args.len() >= 2 && args[1] == "double-fail" { - double(); - } else { - runtest(&args[0]); - } -} |
