summaryrefslogtreecommitdiffstats
path: root/third_party/rust/tokio-0.1.11/tests/pipe-hup.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /third_party/rust/tokio-0.1.11/tests/pipe-hup.rs
parentInitial commit. (diff)
downloadfirefox-upstream.tar.xz
firefox-upstream.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/tokio-0.1.11/tests/pipe-hup.rs')
-rw-r--r--third_party/rust/tokio-0.1.11/tests/pipe-hup.rs88
1 files changed, 88 insertions, 0 deletions
diff --git a/third_party/rust/tokio-0.1.11/tests/pipe-hup.rs b/third_party/rust/tokio-0.1.11/tests/pipe-hup.rs
new file mode 100644
index 0000000000..a23ae7f6ba
--- /dev/null
+++ b/third_party/rust/tokio-0.1.11/tests/pipe-hup.rs
@@ -0,0 +1,88 @@
+#![cfg(unix)]
+
+extern crate env_logger;
+extern crate futures;
+extern crate libc;
+extern crate mio;
+extern crate tokio;
+extern crate tokio_io;
+
+use std::fs::File;
+use std::io::{self, Write};
+use std::os::unix::io::{AsRawFd, FromRawFd};
+use std::thread;
+use std::time::Duration;
+
+use mio::event::Evented;
+use mio::unix::{UnixReady, EventedFd};
+use mio::{PollOpt, Ready, Token};
+use tokio::reactor::{Handle, PollEvented2};
+use tokio_io::io::read_to_end;
+use futures::Future;
+
+macro_rules! t {
+ ($e:expr) => (match $e {
+ Ok(e) => e,
+ Err(e) => panic!("{} failed with {:?}", stringify!($e), e),
+ })
+}
+
+struct MyFile(File);
+
+impl MyFile {
+ fn new(file: File) -> MyFile {
+ unsafe {
+ let r = libc::fcntl(file.as_raw_fd(), libc::F_SETFL, libc::O_NONBLOCK);
+ assert!(r != -1, "fcntl error: {}", io::Error::last_os_error());
+ }
+ MyFile(file)
+ }
+}
+
+impl io::Read for MyFile {
+ fn read(&mut self, bytes: &mut [u8]) -> io::Result<usize> {
+ self.0.read(bytes)
+ }
+}
+
+impl Evented for MyFile {
+ fn register(&self, poll: &mio::Poll, token: Token, interest: Ready, opts: PollOpt)
+ -> io::Result<()> {
+ let hup: Ready = UnixReady::hup().into();
+ EventedFd(&self.0.as_raw_fd()).register(poll, token, interest | hup, opts)
+ }
+ fn reregister(&self, poll: &mio::Poll, token: Token, interest: Ready, opts: PollOpt)
+ -> io::Result<()> {
+ let hup: Ready = UnixReady::hup().into();
+ EventedFd(&self.0.as_raw_fd()).reregister(poll, token, interest | hup, opts)
+ }
+ fn deregister(&self, poll: &mio::Poll) -> io::Result<()> {
+ EventedFd(&self.0.as_raw_fd()).deregister(poll)
+ }
+}
+
+#[test]
+fn hup() {
+ drop(env_logger::try_init());
+
+ let handle = Handle::default();
+ unsafe {
+ let mut pipes = [0; 2];
+ assert!(libc::pipe(pipes.as_mut_ptr()) != -1,
+ "pipe error: {}", io::Error::last_os_error());
+ let read = File::from_raw_fd(pipes[0]);
+ let mut write = File::from_raw_fd(pipes[1]);
+ let t = thread::spawn(move || {
+ write.write_all(b"Hello!\n").unwrap();
+ write.write_all(b"Good bye!\n").unwrap();
+ thread::sleep(Duration::from_millis(100));
+ });
+
+ let source = PollEvented2::new_with_handle(MyFile::new(read), &handle).unwrap();
+
+ let reader = read_to_end(source, Vec::new());
+ let (_, content) = t!(reader.wait());
+ assert_eq!(&b"Hello!\nGood bye!\n"[..], &content[..]);
+ t.join().unwrap();
+ }
+}