Skip to content

Commit 83d3032

Browse files
committed
Fix tests on Linux
Linux's recvfrom(2) does not set the from address for Unix-domain datagram sockets.
1 parent 30bb1ad commit 83d3032

File tree

1 file changed

+45
-33
lines changed

1 file changed

+45
-33
lines changed

test/sys/test_socket.rs

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -162,57 +162,69 @@ pub fn test_socketpair() {
162162
}
163163

164164
mod recvfrom {
165+
use nix::Result;
165166
use nix::sys::socket::*;
166167
use std::thread;
168+
use super::*;
169+
170+
const MSG: &'static [u8] = b"Hello, World!";
171+
172+
fn sendrecv<F>(rsock: RawFd, ssock: RawFd, f: F) -> Option<SockAddr>
173+
where F: Fn(RawFd, &[u8], MsgFlags) -> Result<usize> + Send + 'static
174+
{
175+
let mut buf: [u8; 13] = [0u8; 13];
176+
let mut l = 0;
177+
let mut from = None;
167178

168-
#[test]
169-
pub fn datagram() {
170-
let msg = b"Hello, World!";
171-
let (fd1, fd2) = socketpair(AddressFamily::Unix, SockType::Datagram,
172-
None, SockFlag::empty()).unwrap();
173179
let send_thread = thread::spawn(move || {
174180
let mut l = 0;
175-
while l < std::mem::size_of_val(msg) {
176-
let flags = MsgFlags::empty();
177-
l += send(fd1, &msg[l..], flags).unwrap();
181+
while l < std::mem::size_of_val(MSG) {
182+
l += f(ssock, &MSG[l..], MsgFlags::empty()).unwrap();
178183
}
179184
});
180185

181-
let mut buf: [u8; 13] = [0u8; 13];
182-
let mut l = 0;
183-
184-
while l < std::mem::size_of_val(msg) {
185-
let (len, from) = recvfrom(fd2, &mut buf[l..]).unwrap();
186+
while l < std::mem::size_of_val(MSG) {
187+
let (len, from_) = recvfrom(rsock, &mut buf[l..]).unwrap();
188+
from = from_;
186189
l += len;
187-
assert_eq!(AddressFamily::Unix, from.unwrap().family());
188190
}
189-
assert_eq!(&buf, msg);
191+
assert_eq!(&buf, MSG);
190192
send_thread.join().unwrap();
193+
from
191194
}
192195

193196
#[test]
194197
pub fn stream() {
195-
let msg = b"Hello, World!";
196-
let (fd1, fd2) = socketpair(AddressFamily::Unix, SockType::Stream,
198+
let (fd2, fd1) = socketpair(AddressFamily::Unix, SockType::Stream,
197199
None, SockFlag::empty()).unwrap();
198-
let send_thread = thread::spawn(move || {
199-
let mut l = 0;
200-
while l < std::mem::size_of_val(msg) {
201-
let flags = MsgFlags::empty();
202-
l += send(fd1, &msg[l..], flags).unwrap();
203-
}
200+
// Ignore from for stream sockets
201+
let _ = sendrecv(fd1, fd2, |s, m, flags| {
202+
send(s, m, flags)
204203
});
204+
}
205205

206-
let mut buf: [u8; 13] = [0u8; 13];
207-
let mut l = 0;
208-
209-
while l < std::mem::size_of_val(msg) {
210-
let (len, _from) = recvfrom(fd2, &mut buf[l..]).unwrap();
211-
l += len;
212-
// Ignore _from for stream sockets
213-
}
214-
assert_eq!(&buf, msg);
215-
send_thread.join().unwrap();
206+
#[test]
207+
pub fn udp() {
208+
let std_sa = SocketAddr::from_str("127.0.0.1:6789").unwrap();
209+
let inet_addr = InetAddr::from_std(&std_sa);
210+
let sock_addr = SockAddr::new_inet(inet_addr);
211+
let rsock = socket(AddressFamily::Inet,
212+
SockType::Datagram,
213+
SockFlag::empty(),
214+
None
215+
).unwrap();
216+
bind(rsock, &sock_addr).unwrap();
217+
let ssock = socket(
218+
AddressFamily::Inet,
219+
SockType::Datagram,
220+
SockFlag::empty(),
221+
None,
222+
).expect("send socket failed");
223+
let from = sendrecv(rsock, ssock, move |s, m, flags| {
224+
sendto(s, m, &sock_addr, flags)
225+
});
226+
// UDP sockets should set the from address
227+
assert_eq!(AddressFamily::Inet, from.unwrap().family());
216228
}
217229
}
218230

0 commit comments

Comments
 (0)