use socketpair::socketpair_stream;
use std::io::{self, Read, Write};
use std::sync::{Arc, Condvar, Mutex};
use std::{str, thread};
#[test]
fn test() -> anyhow::Result<()> {
let (mut a, mut b) = socketpair_stream()?;
let thread_a = thread::spawn(move || -> anyhow::Result<()> {
writeln!(a, "hello world")?;
let mut buf = [0_u8; 4096];
let n = a.read(&mut buf)?;
assert_eq!(str::from_utf8(&buf[..n]).unwrap(), "greetings\n");
writeln!(a, "goodbye")?;
Ok(())
});
let thread_b = thread::spawn(move || -> anyhow::Result<()> {
let mut buf = [0_u8; 4096];
let n = b.read(&mut buf)?;
assert_eq!(str::from_utf8(&buf[..n]).unwrap(), "hello world\n");
writeln!(b, "greetings")?;
let n = b.read(&mut buf)?;
assert_eq!(str::from_utf8(&buf[..n]).unwrap(), "goodbye\n");
Ok(())
});
thread_a.join().unwrap()?;
thread_b.join().unwrap()?;
Ok(())
}
#[test]
fn one_way() -> anyhow::Result<()> {
let (mut a, mut b) = socketpair_stream()?;
let _t = thread::spawn(move || -> io::Result<()> { writeln!(a, "hello world") });
let mut buf = String::new();
b.read_to_string(&mut buf)?;
assert_eq!(buf, "hello world\n");
Ok(())
}
#[test]
fn peek() -> anyhow::Result<()> {
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair_clone = Arc::clone(&pair);
let (mut a, mut b) = socketpair_stream()?;
let _t = thread::spawn(move || -> io::Result<()> {
let (lock, cvar) = &*pair_clone;
let mut started = lock.lock().unwrap();
writeln!(a, "hello world")?;
*started = true;
drop(started);
cvar.notify_one();
Ok(())
});
let (lock, cvar) = &*pair;
let mut started = lock.lock().unwrap();
while !*started {
started = cvar.wait(started).unwrap();
}
assert_eq!(b.num_ready_bytes()?, 12);
let mut buf = vec![0_u8; 11];
assert_eq!(b.peek(&mut buf)?, 11);
assert_eq!(str::from_utf8(&buf).unwrap(), "hello world");
let mut buf = String::new();
b.read_to_string(&mut buf)?;
assert_eq!(buf, "hello world\n");
Ok(())
}
#[test]
fn try_clone() -> anyhow::Result<()> {
let (mut a, mut b) = socketpair_stream()?;
let _t = thread::spawn(move || -> io::Result<()> { writeln!(a, "hello world") });
let mut c = b.try_clone()?;
let mut buf = vec![0_u8; 6];
b.read_exact(&mut buf)?;
assert_eq!(str::from_utf8(&buf).unwrap(), "hello ");
c.read_exact(&mut buf)?;
assert_eq!(str::from_utf8(&buf).unwrap(), "world\n");
Ok(())
}