#[macro_use]
mod sys_common;
use std::net::{Shutdown, TcpListener, TcpStream};
use std::sync::{Arc, Condvar, Mutex};
use std::thread;
use system_interface::io::IsReadWrite;
#[cfg(feature = "cap_std_impls")]
use {cap_fs_ext::OpenOptions, sys_common::io::tmpdir};
#[cfg(feature = "cap_std_impls")]
#[test]
fn file_is_read_write() {
let tmpdir = tmpdir();
let file = check!(tmpdir.open_with(
"file",
OpenOptions::new()
.create(true)
.truncate(true)
.write(true)
.read(true)
));
assert_eq!(check!(file.is_read_write()), (true, true));
let file = check!(tmpdir.open_with("file", OpenOptions::new().append(true).read(true)));
assert_eq!(check!(file.is_read_write()), (true, true));
let file = check!(tmpdir.open_with(
"file",
OpenOptions::new()
.create(true)
.truncate(true)
.write(true)
.read(false)
));
assert_eq!(check!(file.is_read_write()), (false, true));
let file = check!(tmpdir.open_with(
"file",
OpenOptions::new()
.create(false)
.truncate(false)
.write(false)
.read(true)
));
assert_eq!(check!(file.is_read_write()), (true, false));
}
#[test]
fn socket_is_read_write() {
let pair = Arc::new((Mutex::new(0_u16), Condvar::new()));
let pair_clone = Arc::clone(&pair);
let _t = thread::spawn(move || {
let listener = TcpListener::bind("localhost:0").unwrap();
let (lock, cvar) = &*pair_clone;
let mut port = lock.lock().unwrap();
*port = listener.local_addr().unwrap().port();
drop(port);
cvar.notify_one();
let stream = listener.accept().unwrap().0;
assert_eq!(stream.is_read_write().unwrap(), (true, true));
thread::park();
});
let (lock, cvar) = &*pair;
let mut port = lock.lock().unwrap();
while *port == 0 {
port = cvar.wait(port).unwrap();
}
let stream = TcpStream::connect(("localhost", *port)).unwrap();
assert_eq!(stream.is_read_write().unwrap(), (true, true));
stream.shutdown(Shutdown::Read).unwrap();
assert_eq!(stream.is_read_write().unwrap(), (false, true));
stream.shutdown(Shutdown::Write).unwrap();
assert_eq!(stream.is_read_write().unwrap(), (false, false));
}
#[test]
fn socket_is_write_read() {
let pair = Arc::new((Mutex::new(0_u16), Condvar::new()));
let pair_clone = Arc::clone(&pair);
let _t = thread::spawn(move || {
let listener = TcpListener::bind("localhost:0").unwrap();
let (lock, cvar) = &*pair_clone;
let mut port = lock.lock().unwrap();
*port = listener.local_addr().unwrap().port();
drop(port);
cvar.notify_one();
let stream = listener.accept().unwrap().0;
assert_eq!(stream.is_read_write().unwrap(), (true, true));
thread::park();
});
let (lock, cvar) = &*pair;
let mut port = lock.lock().unwrap();
while *port == 0 {
port = cvar.wait(port).unwrap();
}
let stream = TcpStream::connect(("localhost", *port)).unwrap();
assert_eq!(stream.is_read_write().unwrap(), (true, true));
stream.shutdown(Shutdown::Write).unwrap();
assert_eq!(stream.is_read_write().unwrap(), (true, false));
stream.shutdown(Shutdown::Read).unwrap();
assert_eq!(stream.is_read_write().unwrap(), (false, false));
}