Skip to content

Commit 45af538

Browse files
stefano-garzarellaasomers
authored andcommitted
Rework vsock test
We mainly provide VsockAddr, so let's try to test well that VsockAddr mapping to libc::sockaddr_vm is correct. Let's remove all interactions with the socket, since vsock may or may not be available in the environment. Testing socket(), bind(), listen(), connect(), etc. caused unexpected failures, and it's out of scope of this crate. So let's simplify the vsock test focussing on VsockAddr. This should work also on graviton, so let's try to re-enable it. Fixes nix-rust#1934 Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
1 parent 94a3745 commit 45af538

File tree

2 files changed

+28
-42
lines changed

2 files changed

+28
-42
lines changed

.cirrus.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ task:
142142
arm_container:
143143
image: rust:1.56
144144
env:
145-
RUSTFLAGS: --cfg graviton -D warnings
146145
TARGET: aarch64-unknown-linux-gnu
147146
- name: Linux x86_64
148147
container:

test/sys/test_socket.rs

Lines changed: 28 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2175,57 +2175,44 @@ pub fn test_recv_ipv6pktinfo() {
21752175
}
21762176

21772177
#[cfg(any(target_os = "android", target_os = "linux"))]
2178-
#[cfg_attr(graviton, ignore = "Not supported by the CI environment")]
21792178
#[test]
21802179
pub fn test_vsock() {
2181-
use nix::errno::Errno;
2182-
use nix::sys::socket::{
2183-
bind, connect, listen, socket, AddressFamily, SockFlag, SockType,
2184-
VsockAddr,
2185-
};
2186-
use nix::unistd::close;
2187-
use std::thread;
2180+
use nix::sys::socket::SockaddrLike;
2181+
use nix::sys::socket::{AddressFamily, VsockAddr};
2182+
use std::convert::TryInto;
2183+
use std::mem;
21882184

21892185
let port: u32 = 3000;
21902186

2191-
let s1 = socket(
2192-
AddressFamily::Vsock,
2193-
SockType::Stream,
2194-
SockFlag::empty(),
2195-
None,
2196-
)
2197-
.expect("socket failed");
2187+
let addr_local = VsockAddr::new(libc::VMADDR_CID_LOCAL, port);
2188+
assert_eq!(addr_local.cid(), libc::VMADDR_CID_LOCAL);
2189+
assert_eq!(addr_local.port(), port);
21982190

2199-
// VMADDR_CID_HYPERVISOR is reserved, so we expect an EADDRNOTAVAIL error.
2200-
let sockaddr_hv = VsockAddr::new(libc::VMADDR_CID_HYPERVISOR, port);
2201-
assert_eq!(bind(s1, &sockaddr_hv).err(), Some(Errno::EADDRNOTAVAIL));
2191+
let addr_any = VsockAddr::new(libc::VMADDR_CID_ANY, libc::VMADDR_PORT_ANY);
2192+
assert_eq!(addr_any.cid(), libc::VMADDR_CID_ANY);
2193+
assert_eq!(addr_any.port(), libc::VMADDR_PORT_ANY);
22022194

2203-
let sockaddr_any = VsockAddr::new(libc::VMADDR_CID_ANY, port);
2204-
assert_eq!(bind(s1, &sockaddr_any), Ok(()));
2205-
listen(s1, 10).expect("listen failed");
2195+
assert_ne!(addr_local, addr_any);
2196+
assert_ne!(calculate_hash(&addr_local), calculate_hash(&addr_any));
22062197

2207-
let thr = thread::spawn(move || {
2208-
let cid: u32 = libc::VMADDR_CID_HOST;
2198+
let addr1 = VsockAddr::new(libc::VMADDR_CID_HOST, port);
2199+
let addr2 = VsockAddr::new(libc::VMADDR_CID_HOST, port);
2200+
assert_eq!(addr1, addr2);
2201+
assert_eq!(calculate_hash(&addr1), calculate_hash(&addr2));
22092202

2210-
let s2 = socket(
2211-
AddressFamily::Vsock,
2212-
SockType::Stream,
2213-
SockFlag::empty(),
2214-
None,
2203+
let addr3 = unsafe {
2204+
VsockAddr::from_raw(
2205+
addr2.as_ref() as *const libc::sockaddr_vm as *const libc::sockaddr,
2206+
Some(mem::size_of::<libc::sockaddr_vm>().try_into().unwrap()),
22152207
)
2216-
.expect("socket failed");
2217-
2218-
let sockaddr_host = VsockAddr::new(cid, port);
2219-
2220-
// The current implementation does not support loopback devices, so,
2221-
// for now, we expect a failure on the connect.
2222-
assert_ne!(connect(s2, &sockaddr_host), Ok(()));
2223-
2224-
close(s2).unwrap();
2225-
});
2226-
2227-
close(s1).unwrap();
2228-
thr.join().unwrap();
2208+
}
2209+
.unwrap();
2210+
assert_eq!(
2211+
addr3.as_ref().svm_family,
2212+
AddressFamily::Vsock as libc::sa_family_t
2213+
);
2214+
assert_eq!(addr3.as_ref().svm_cid, addr1.cid());
2215+
assert_eq!(addr3.as_ref().svm_port, addr1.port());
22292216
}
22302217

22312218
// Disable the test on emulated platforms because it fails in Cirrus-CI. Lack

0 commit comments

Comments
 (0)