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