Skip to content

Commit 4c6b6bb

Browse files
committed
Add testing for anonymous pipe
Signed-off-by: Jiahao XU <[email protected]>
1 parent b7af685 commit 4c6b6bb

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed

library/std/src/sys/anonymous_pipe.rs renamed to library/std/src/sys/anonymous_pipe/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,3 +295,6 @@ mod windows {
295295
}
296296
}
297297
}
298+
299+
#[cfg(test)]
300+
mod tests;
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
use super::*;
2+
use crate::io::{Read, Write};
3+
4+
#[test]
5+
fn pipe_creation_and_rw() {
6+
let (mut rx, mut tx) = pipe().unwrap();
7+
tx.write_all(b"12345").unwrap();
8+
drop(tx);
9+
10+
let mut s = String::new();
11+
rx.read_to_string(&mut s).unwrap();
12+
assert_eq!(s, "12345");
13+
}
14+
15+
#[test]
16+
fn pipe_try_clone_and_rw() {
17+
let (mut rx, mut tx) = pipe().unwrap();
18+
tx.try_clone().unwrap().write_all(b"12").unwrap();
19+
tx.write_all(b"345").unwrap();
20+
drop(tx);
21+
22+
let mut s = String::new();
23+
rx.try_clone().unwrap().take(3).read_to_string(&mut s).unwrap();
24+
assert_eq!(s, "123");
25+
26+
s.clear();
27+
rx.read_to_string(&mut s).unwrap();
28+
assert_eq!(s, "45");
29+
}
30+
31+
#[cfg(unix)]
32+
mod unix_specific {
33+
use super::*;
34+
35+
use crate::{
36+
fs::File,
37+
io,
38+
os::fd::{AsRawFd, OwnedFd},
39+
};
40+
41+
#[test]
42+
fn pipe_owned_fd_round_trip_conversion() {
43+
let (rx, tx) = pipe().unwrap();
44+
let raw_fds = (rx.as_raw_fd(), tx.as_raw_fd());
45+
let (rx_owned_fd, tx_owned_fd) = (OwnedFd::from(rx), OwnedFd::from(tx));
46+
47+
let rx = PipeReader::try_from(rx_owned_fd).unwrap();
48+
let tx = PipeWriter::try_from(tx_owned_fd).unwrap();
49+
assert_eq!(raw_fds, (rx.as_raw_fd(), tx.as_raw_fd()));
50+
}
51+
52+
#[test]
53+
fn convert_from_non_pipe_to_pipe_reader_shall_fail() {
54+
let file = File::open("/dev/zero").unwrap();
55+
let err = PipeReader::try_from(OwnedFd::from(file)).unwrap_err();
56+
57+
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
58+
assert_eq!(format!("{}", err.get_ref().unwrap()), "Not a pipe");
59+
}
60+
61+
#[test]
62+
fn convert_from_non_pipe_to_pipe_writer_shall_fail() {
63+
let file = File::options().write(true).open("/dev/null").unwrap();
64+
let err = PipeWriter::try_from(OwnedFd::from(file)).unwrap_err();
65+
66+
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
67+
assert_eq!(format!("{}", err.get_ref().unwrap()), "Not a pipe");
68+
}
69+
70+
#[test]
71+
fn convert_pipe_writer_to_pipe_reader_shall_fail() {
72+
let (_, tx) = pipe().unwrap();
73+
let fd = tx.as_raw_fd();
74+
let err = PipeReader::try_from(OwnedFd::from(tx)).unwrap_err();
75+
76+
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
77+
assert_eq!(format!("{}", err.get_ref().unwrap()), format!("Pipe {fd} is not readable"));
78+
}
79+
80+
#[test]
81+
fn convert_pipe_reader_to_pipe_writer_shall_fail() {
82+
let (rx, _) = pipe().unwrap();
83+
let fd = rx.as_raw_fd();
84+
let err = PipeWriter::try_from(OwnedFd::from(rx)).unwrap_err();
85+
86+
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
87+
assert_eq!(format!("{}", err.get_ref().unwrap()), format!("Pipe {fd} is not writable"));
88+
}
89+
}
90+
91+
#[cfg(windows)]
92+
mod windows_specific {
93+
use super::*;
94+
95+
use crate::{
96+
io,
97+
os::windows::io::{AsHandle, AsRawHandle, OwnedHandle},
98+
};
99+
100+
#[test]
101+
fn pipe_owned_handle_round_trip_conversion() {
102+
let (rx, tx) = pipe().unwrap();
103+
let raw_handles = (rx.as_raw_handle(), tx.as_raw_handle());
104+
let (rx_owned_handle, tx_owned_handle) = (OwnedHandle::from(rx), OwnedHandle::from(tx));
105+
106+
let rx = PipeReader::try_from(rx_owned_handle).unwrap();
107+
let tx = PipeWriter::try_from(tx_owned_handle).unwrap();
108+
assert_eq!(raw_handles, (rx.as_raw_handle(), tx.as_raw_handle()));
109+
}
110+
111+
#[test]
112+
fn convert_from_non_pipe_to_pipe_reader_shall_fail() {
113+
let file = io::stdin().as_handle().try_clone_to_owned().unwrap();
114+
let err = PipeReader::try_from(OwnedHandle::from(file)).unwrap_err();
115+
116+
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
117+
assert_eq!(format!("{}", err.get_ref().unwrap()), "Not a pipe");
118+
}
119+
120+
#[test]
121+
fn convert_from_non_pipe_to_pipe_writer_shall_fail() {
122+
let file = io::stdout().as_handle().try_clone_to_owned().unwrap();
123+
let err = PipeWriter::try_from(OwnedHandle::from(file)).unwrap_err();
124+
125+
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
126+
assert_eq!(format!("{}", err.get_ref().unwrap()), "Not a pipe");
127+
}
128+
}

0 commit comments

Comments
 (0)