Skip to content

Commit bec8fb4

Browse files
author
Gleb Pomykalov
committed
Improve tests
1 parent c3acf02 commit bec8fb4

File tree

1 file changed

+32
-31
lines changed

1 file changed

+32
-31
lines changed

test/sys/test_socket.rs

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,10 @@ mod recvfrom {
169169

170170
const MSG: &'static [u8] = b"Hello, World!";
171171

172-
fn sendrecv<Fs, Fr>(rsock: RawFd, ssock: RawFd, f_send: Fs, f_recv: Fr) -> Option<SockAddr>
172+
fn sendrecv<Fs, Fr>(rsock: RawFd, ssock: RawFd, f_send: Fs, mut f_recv: Fr) -> Option<SockAddr>
173173
where
174174
Fs: Fn(RawFd, &[u8], MsgFlags) -> Result<usize> + Send + 'static,
175-
Fr: Fn(usize, Option<SockAddr>),
175+
Fr: FnMut(usize, Option<SockAddr>),
176176
{
177177
let mut buf: [u8; 13] = [0u8; 13];
178178
let mut l = 0;
@@ -240,6 +240,11 @@ mod recvfrom {
240240
pub fn gso() {
241241
require_kernel_version!(udp_offload::gso, ">= 4.18");
242242

243+
// In this test, we send the data and provide a GSO segment size.
244+
// Since we are sending the buffer of size 13, six UDP packets
245+
// with size 2 and two UDP packet with size 1 will be sent.
246+
let segment_size: u16 = 2;
247+
243248
let std_sa = SocketAddr::from_str("127.0.0.1:6791").unwrap();
244249
let inet_addr = InetAddr::from_std(&std_sa);
245250
let sock_addr = SockAddr::new_inet(inet_addr);
@@ -249,9 +254,8 @@ mod recvfrom {
249254
None
250255
).unwrap();
251256

252-
let segment_size = 2;
253-
254-
setsockopt(rsock, UdpGsoSegment, &segment_size).expect("setsockopt UDP_SEGMENT failed");
257+
setsockopt(rsock, UdpGsoSegment, &(segment_size as _))
258+
.expect("setsockopt UDP_SEGMENT failed");
255259

256260
bind(rsock, &sock_addr).unwrap();
257261
let ssock = socket(
@@ -261,48 +265,45 @@ mod recvfrom {
261265
None,
262266
).expect("send socket failed");
263267

264-
let from = sendrecv(rsock, ssock, move |s, m, flags| {
268+
let mut num_packets_received: i32 = 0;
269+
270+
sendrecv(rsock, ssock, move |s, m, flags| {
265271
let iov = [IoVec::from_slice(m)];
266-
let cmsg = ControlMessage::UdpGsoSegments(&2);
272+
let cmsg = ControlMessage::UdpGsoSegments(&segment_size);
267273
sendmsg(s, &iov, &[cmsg], flags, Some(&sock_addr))
268-
}, |len, _| {
269-
assert!(len <= segment_size as usize);
274+
}, {
275+
let num_packets_received_ref = &mut num_packets_received;
276+
277+
move |len, _| {
278+
// check that we receive UDP packets with payload size
279+
// less or equal to segment size
280+
assert!(len <= segment_size as usize);
281+
*num_packets_received_ref += 1;
282+
}
270283
});
271-
// UDP sockets should set the from address
272-
assert_eq!(AddressFamily::Inet, from.unwrap().family());
284+
285+
// Buffer size is 13, we will receive six packets of size 2,
286+
// and one packet of size 1.
287+
assert_eq!(7, num_packets_received);
273288
}
274289

275290
#[test]
276291
pub fn gro() {
277292
require_kernel_version!(udp_offload::gro, ">= 5.3");
278293

294+
// It's hard to guarantee receiving GRO packets. Just checking
295+
// that `setsockopt` doesn't fail with error
296+
279297
let std_sa = SocketAddr::from_str("127.0.0.1:6792").unwrap();
280298
let inet_addr = InetAddr::from_std(&std_sa);
281-
let sock_addr = SockAddr::new_inet(inet_addr);
282299
let rsock = socket(AddressFamily::Inet,
283300
SockType::Datagram,
284301
SockFlag::empty(),
285302
None
286-
).unwrap();
287-
288-
setsockopt(rsock, UdpGroSegment, &true).expect("setsockopt UDP_GRO failed");
289-
290-
bind(rsock, &sock_addr).unwrap();
291-
let ssock = socket(
292-
AddressFamily::Inet,
293-
SockType::Datagram,
294-
SockFlag::empty(),
295-
None,
296-
).expect("send socket failed");
297-
298-
let from = sendrecv(rsock, ssock, move |s, m, flags| {
299-
let iov = [IoVec::from_slice(m)];
300-
let cmsg = ControlMessage::UdpGsoSegments(&2);
301-
sendmsg(s, &iov, &[cmsg], flags, Some(&sock_addr))
302-
}, |_, _| {});
303+
).unwrap();I
303304

304-
// UDP sockets should set the from address
305-
assert_eq!(AddressFamily::Inet, from.unwrap().family());
305+
setsockopt(rsock, UdpGroSegment, &true)
306+
.expect("setsockopt UDP_GRO failed");
306307
}
307308
}
308309
}

0 commit comments

Comments
 (0)