1 extern crate iovec;
2 extern crate mio;
3 extern crate tempdir;
4 extern crate mio_uds;
5 
6 use std::io::prelude::*;
7 use std::time::Duration;
8 
9 use iovec::IoVec;
10 use mio::*;
11 use mio_uds::*;
12 use tempdir::TempDir;
13 
14 macro_rules! t {
15     ($e:expr) => (match $e {
16         Ok(e) => e,
17         Err(e) => panic!("{} failed with {}", stringify!($e), e),
18     })
19 }
20 
21 #[test]
listener()22 fn listener() {
23     let td = t!(TempDir::new("uds"));
24     let a = t!(UnixListener::bind(td.path().join("foo")));
25     assert!(t!(a.accept()).is_none());
26     t!(a.local_addr());
27     assert!(t!(a.take_error()).is_none());
28     let b = t!(a.try_clone());
29     assert!(t!(b.accept()).is_none());
30 
31     let poll = t!(Poll::new());
32     let mut events = Events::with_capacity(1024);
33 
34     t!(poll.register(&a, Token(1), Ready::readable(), PollOpt::edge()));
35 
36     let s = t!(UnixStream::connect(td.path().join("foo")));
37 
38     assert_eq!(t!(poll.poll(&mut events, None)), 1);
39 
40     let (s2, addr) = t!(a.accept()).unwrap();
41 
42     assert_eq!(t!(s.peer_addr()).as_pathname(), t!(s2.local_addr()).as_pathname());
43     assert_eq!(t!(s.local_addr()).as_pathname(), t!(s2.peer_addr()).as_pathname());
44     assert_eq!(addr.as_pathname(), t!(s.local_addr()).as_pathname());
45 }
46 
47 #[test]
stream()48 fn stream() {
49     let poll = t!(Poll::new());
50     let mut events = Events::with_capacity(1024);
51     let (mut a, mut b) = t!(UnixStream::pair());
52 
53     let both = Ready::readable() | Ready::writable();
54     t!(poll.register(&a, Token(1), both, PollOpt::edge()));
55     t!(poll.register(&b, Token(2), both, PollOpt::edge()));
56 
57     assert_eq!(t!(poll.poll(&mut events, Some(Duration::new(0, 0)))), 2);
58     assert_eq!(events.get(0).unwrap().readiness(), Ready::writable());
59     assert_eq!(events.get(1).unwrap().readiness(), Ready::writable());
60 
61     assert_eq!(t!(a.write(&[3])), 1);
62 
63     assert_eq!(t!(poll.poll(&mut events, Some(Duration::new(0, 0)))), 1);
64     assert!(events.get(0).unwrap().readiness().is_readable());
65     assert_eq!(events.get(0).unwrap().token(), Token(2));
66 
67     assert_eq!(t!(b.read(&mut [0; 1024])), 1);
68 }
69 
70 #[test]
stream_iovec()71 fn stream_iovec() {
72     let poll = t!(Poll::new());
73     let mut events = Events::with_capacity(1024);
74     let (a, b) = t!(UnixStream::pair());
75 
76     let both = Ready::readable() | Ready::writable();
77     t!(poll.register(&a, Token(1), both, PollOpt::edge()));
78     t!(poll.register(&b, Token(2), both, PollOpt::edge()));
79 
80     assert_eq!(t!(poll.poll(&mut events, Some(Duration::new(0, 0)))), 2);
81     assert_eq!(events.get(0).unwrap().readiness(), Ready::writable());
82     assert_eq!(events.get(1).unwrap().readiness(), Ready::writable());
83 
84     let send = b"Hello, World!";
85     let vecs: [&IoVec;2] = [ (&send[..6]).into(),
86                              (&send[6..]).into() ];
87 
88     assert_eq!(t!(a.write_bufs(&vecs)), send.len());
89 
90     assert_eq!(t!(poll.poll(&mut events, Some(Duration::new(0, 0)))), 1);
91     assert!(events.get(0).unwrap().readiness().is_readable());
92     assert_eq!(events.get(0).unwrap().token(), Token(2));
93 
94     let mut recv = [0; 13];
95     {
96         let (mut first, mut last) = recv.split_at_mut(6);
97         let mut vecs: [&mut IoVec;2] = [ first.into(), last.into() ];
98         assert_eq!(t!(b.read_bufs(&mut vecs)), send.len());
99     }
100     assert_eq!(&send[..], &recv[..]);
101 }
102