| use backtrace::Backtrace; | |
| use core::ffi::c_void; | |
| // This test only works on platforms which have a working `symbol_address` | |
| // function for frames which reports the starting address of a symbol. As a | |
| // result it's only enabled on a few platforms. | |
| const ENABLED: bool = cfg!(all( | |
| // Windows hasn't really been tested, and macOS doesn't support actually | |
| // finding an enclosing frame, so disable this | |
| target_os = "linux", | |
| // On ARM finding the enclosing function is simply returning the ip itself. | |
| not(target_arch = "arm"), | |
| )); | |
| #[test] | |
| #[inline(never)] | |
| fn backtrace_new_unresolved_should_start_with_call_site_trace() { | |
| if !ENABLED { | |
| return; | |
| } | |
| let mut b = Backtrace::new_unresolved(); | |
| b.resolve(); | |
| println!("{b:?}"); | |
| assert!(!b.frames().is_empty()); | |
| let this_ip = backtrace_new_unresolved_should_start_with_call_site_trace as *mut c_void; | |
| println!("this_ip: {:p}", this_ip); | |
| let frame_ip = b.frames().first().unwrap().symbol_address(); | |
| assert_eq!(this_ip, frame_ip); | |
| } | |
| #[test] | |
| #[inline(never)] | |
| fn backtrace_new_should_start_with_call_site_trace() { | |
| if !ENABLED { | |
| return; | |
| } | |
| let b = Backtrace::new(); | |
| println!("{b:?}"); | |
| assert!(!b.frames().is_empty()); | |
| let this_ip = backtrace_new_should_start_with_call_site_trace as *mut c_void; | |
| let frame_ip = b.frames().first().unwrap().symbol_address(); | |
| assert_eq!(this_ip, frame_ip); | |
| let trace = format!("{b:?}"); | |
| // FIXME: need more stacktrace content tests | |
| assert!(trace.ends_with("\n")); | |
| } |