use crate::ffi::CString; use crate::hint::black_box; use crate::path::Path; use crate::sys::common::small_c_string::run_path_with_cstr; use core::iter::repeat; #[test] fn stack_allocation_works() { let path = Path::new("abc"); let result = run_path_with_cstr(path, |p| { assert_eq!(p, &*CString::new(path.as_os_str().bytes()).unwrap()); Ok(42) }); assert_eq!(result.unwrap(), 42); } #[test] fn stack_allocation_fails() { let path = Path::new("ab\0"); assert!(run_path_with_cstr::<(), _>(path, |_| unreachable!()).is_err()); } #[test] fn heap_allocation_works() { let path = repeat("a").take(384).collect::(); let path = Path::new(&path); let result = run_path_with_cstr(path, |p| { assert_eq!(p, &*CString::new(path.as_os_str().bytes()).unwrap()); Ok(42) }); assert_eq!(result.unwrap(), 42); } #[test] fn heap_allocation_fails() { let mut path = repeat("a").take(384).collect::(); path.push('\0'); let path = Path::new(&path); assert!(run_path_with_cstr::<(), _>(path, |_| unreachable!()).is_err()); } #[bench] fn bench_stack_path_alloc(b: &mut test::Bencher) { let path = repeat("a").take(383).collect::(); let p = Path::new(&path); b.iter(|| { run_path_with_cstr(p, |cstr| { black_box(cstr); Ok(()) }) .unwrap(); }); } #[bench] fn bench_heap_path_alloc(b: &mut test::Bencher) { let path = repeat("a").take(384).collect::(); let p = Path::new(&path); b.iter(|| { run_path_with_cstr(p, |cstr| { black_box(cstr); Ok(()) }) .unwrap(); }); }