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