1 #![cfg_attr(not(io_safety_is_in_std), allow(unused_imports))]
2 #![cfg(feature = "close")]
3
4 #[cfg(any(unix, windows))]
5 use io_lifetimes::example_ffi::*;
6 #[cfg(windows)]
7 use io_lifetimes::{InvalidHandleError, OwnedHandle};
8 #[cfg(windows)]
9 use std::{convert::TryInto, os::windows::io::RawHandle, ptr::null_mut};
10 #[cfg(windows)]
11 use windows_sys::Win32::Storage::FileSystem::{
12 FILE_ATTRIBUTE_NORMAL, FILE_GENERIC_READ, OPEN_EXISTING,
13 };
14
15 #[cfg(all(io_safety_is_in_std, unix))]
16 #[test]
test_file_not_foundnull17 fn test_file_not_found() {
18 assert!(unsafe {
19 open(
20 "/dev/no/such/file\0".as_ptr() as *const _,
21 O_RDONLY | O_CLOEXEC,
22 )
23 }
24 .is_none());
25 }
26
27 #[cfg(windows)]
28 #[test]
test_file_not_foundnull29 fn test_file_not_found() {
30 let handle: Result<OwnedHandle, InvalidHandleError> = unsafe {
31 CreateFileW(
32 [
33 'C' as u16, ':' as _, '/' as _, 'n' as _, 'o' as _, '/' as _, 's' as _, 'u' as _,
34 'c' as _, 'h' as _, '/' as _, 'f' as _, 'i' as _, 'l' as _, 'e' as _, 0,
35 ]
36 .as_ptr(),
37 FILE_GENERIC_READ,
38 0,
39 null_mut(),
40 OPEN_EXISTING,
41 FILE_ATTRIBUTE_NORMAL,
42 null_mut() as RawHandle as HANDLE,
43 )
44 }
45 .try_into();
46 assert!(handle.is_err());
47 assert_eq!(
48 std::io::Error::last_os_error().kind(),
49 std::io::ErrorKind::NotFound
50 );
51 }
52
53 #[cfg(all(io_safety_is_in_std, unix))]
54 #[test]
test_file_foundnull55 fn test_file_found() {
56 assert!(unsafe { open("Cargo.toml\0".as_ptr() as *const _, O_RDONLY | O_CLOEXEC) }.is_some());
57 }
58
59 #[cfg(windows)]
60 #[test]
test_file_foundnull61 fn test_file_found() {
62 let handle: Result<OwnedHandle, InvalidHandleError> = unsafe {
63 CreateFileW(
64 [
65 'C' as u16, 'a' as _, 'r' as _, 'g' as _, 'o' as _, '.' as _, 't' as _, 'o' as _,
66 'm' as _, 'l' as _, 0,
67 ]
68 .as_ptr(),
69 FILE_GENERIC_READ,
70 0,
71 null_mut(),
72 OPEN_EXISTING,
73 FILE_ATTRIBUTE_NORMAL,
74 null_mut() as RawHandle as HANDLE,
75 )
76 }
77 .try_into();
78 assert!(handle.is_ok());
79 }
80