xref: /aosp_15_r20/external/crosvm/vhost/tests/linux.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker // TODO(225193541): Enable/add tests for windows.
6*bb4ee6a4SAndroid Build Coastguard Worker #![cfg(any(target_os = "android", target_os = "linux"))]
7*bb4ee6a4SAndroid Build Coastguard Worker 
8*bb4ee6a4SAndroid Build Coastguard Worker use std::path::PathBuf;
9*bb4ee6a4SAndroid Build Coastguard Worker use std::result;
10*bb4ee6a4SAndroid Build Coastguard Worker 
11*bb4ee6a4SAndroid Build Coastguard Worker use base::pagesize;
12*bb4ee6a4SAndroid Build Coastguard Worker use base::Event;
13*bb4ee6a4SAndroid Build Coastguard Worker use net_util::sys::linux::fakes::FakeTap;
14*bb4ee6a4SAndroid Build Coastguard Worker use vhost::net::fakes::FakeNet;
15*bb4ee6a4SAndroid Build Coastguard Worker use vhost::net::NetT;
16*bb4ee6a4SAndroid Build Coastguard Worker use vhost::Error;
17*bb4ee6a4SAndroid Build Coastguard Worker use vhost::Result;
18*bb4ee6a4SAndroid Build Coastguard Worker use vhost::Vhost;
19*bb4ee6a4SAndroid Build Coastguard Worker use vm_memory::GuestAddress;
20*bb4ee6a4SAndroid Build Coastguard Worker use vm_memory::GuestMemory;
21*bb4ee6a4SAndroid Build Coastguard Worker use vm_memory::GuestMemoryError;
22*bb4ee6a4SAndroid Build Coastguard Worker 
create_guest_memory() -> result::Result<GuestMemory, GuestMemoryError>23*bb4ee6a4SAndroid Build Coastguard Worker fn create_guest_memory() -> result::Result<GuestMemory, GuestMemoryError> {
24*bb4ee6a4SAndroid Build Coastguard Worker     let start_addr1 = GuestAddress(0x0);
25*bb4ee6a4SAndroid Build Coastguard Worker     let start_addr2 = GuestAddress(pagesize() as u64);
26*bb4ee6a4SAndroid Build Coastguard Worker     GuestMemory::new(&[
27*bb4ee6a4SAndroid Build Coastguard Worker         (start_addr1, pagesize() as u64),
28*bb4ee6a4SAndroid Build Coastguard Worker         (start_addr2, 4 * pagesize() as u64),
29*bb4ee6a4SAndroid Build Coastguard Worker     ])
30*bb4ee6a4SAndroid Build Coastguard Worker }
31*bb4ee6a4SAndroid Build Coastguard Worker 
assert_ok_or_known_failure<T>(res: Result<T>)32*bb4ee6a4SAndroid Build Coastguard Worker fn assert_ok_or_known_failure<T>(res: Result<T>) {
33*bb4ee6a4SAndroid Build Coastguard Worker     match &res {
34*bb4ee6a4SAndroid Build Coastguard Worker         // FakeNet won't respond to ioctl's
35*bb4ee6a4SAndroid Build Coastguard Worker         Ok(_t) => {}
36*bb4ee6a4SAndroid Build Coastguard Worker         Err(Error::IoctlError(ioe)) if ioe.raw_os_error().unwrap() == 25 => {}
37*bb4ee6a4SAndroid Build Coastguard Worker         Err(e) => panic!("Unexpected Error:\n{}", e),
38*bb4ee6a4SAndroid Build Coastguard Worker     }
39*bb4ee6a4SAndroid Build Coastguard Worker }
40*bb4ee6a4SAndroid Build Coastguard Worker 
create_fake_vhost_net() -> FakeNet<FakeTap>41*bb4ee6a4SAndroid Build Coastguard Worker fn create_fake_vhost_net() -> FakeNet<FakeTap> {
42*bb4ee6a4SAndroid Build Coastguard Worker     FakeNet::<FakeTap>::new(&PathBuf::from("")).unwrap()
43*bb4ee6a4SAndroid Build Coastguard Worker }
44*bb4ee6a4SAndroid Build Coastguard Worker 
45*bb4ee6a4SAndroid Build Coastguard Worker #[test]
test_create_fake_vhost_net()46*bb4ee6a4SAndroid Build Coastguard Worker fn test_create_fake_vhost_net() {
47*bb4ee6a4SAndroid Build Coastguard Worker     create_fake_vhost_net();
48*bb4ee6a4SAndroid Build Coastguard Worker }
49*bb4ee6a4SAndroid Build Coastguard Worker 
50*bb4ee6a4SAndroid Build Coastguard Worker #[test]
set_owner()51*bb4ee6a4SAndroid Build Coastguard Worker fn set_owner() {
52*bb4ee6a4SAndroid Build Coastguard Worker     let vhost_net = create_fake_vhost_net();
53*bb4ee6a4SAndroid Build Coastguard Worker     let res = vhost_net.set_owner();
54*bb4ee6a4SAndroid Build Coastguard Worker     assert_ok_or_known_failure(res);
55*bb4ee6a4SAndroid Build Coastguard Worker }
56*bb4ee6a4SAndroid Build Coastguard Worker 
57*bb4ee6a4SAndroid Build Coastguard Worker #[test]
get_features()58*bb4ee6a4SAndroid Build Coastguard Worker fn get_features() {
59*bb4ee6a4SAndroid Build Coastguard Worker     let vhost_net = create_fake_vhost_net();
60*bb4ee6a4SAndroid Build Coastguard Worker     let res = vhost_net.get_features();
61*bb4ee6a4SAndroid Build Coastguard Worker     assert_ok_or_known_failure(res);
62*bb4ee6a4SAndroid Build Coastguard Worker }
63*bb4ee6a4SAndroid Build Coastguard Worker 
64*bb4ee6a4SAndroid Build Coastguard Worker #[test]
set_features()65*bb4ee6a4SAndroid Build Coastguard Worker fn set_features() {
66*bb4ee6a4SAndroid Build Coastguard Worker     let vhost_net = create_fake_vhost_net();
67*bb4ee6a4SAndroid Build Coastguard Worker     let res = vhost_net.set_features(0);
68*bb4ee6a4SAndroid Build Coastguard Worker     assert_ok_or_known_failure(res);
69*bb4ee6a4SAndroid Build Coastguard Worker }
70*bb4ee6a4SAndroid Build Coastguard Worker 
71*bb4ee6a4SAndroid Build Coastguard Worker #[test]
set_mem_table()72*bb4ee6a4SAndroid Build Coastguard Worker fn set_mem_table() {
73*bb4ee6a4SAndroid Build Coastguard Worker     let vhost_net = create_fake_vhost_net();
74*bb4ee6a4SAndroid Build Coastguard Worker     let gm = create_guest_memory().unwrap();
75*bb4ee6a4SAndroid Build Coastguard Worker     let res = vhost_net.set_mem_table(&gm);
76*bb4ee6a4SAndroid Build Coastguard Worker     assert_ok_or_known_failure(res);
77*bb4ee6a4SAndroid Build Coastguard Worker }
78*bb4ee6a4SAndroid Build Coastguard Worker 
79*bb4ee6a4SAndroid Build Coastguard Worker #[test]
set_vring_num()80*bb4ee6a4SAndroid Build Coastguard Worker fn set_vring_num() {
81*bb4ee6a4SAndroid Build Coastguard Worker     let vhost_net = create_fake_vhost_net();
82*bb4ee6a4SAndroid Build Coastguard Worker     let res = vhost_net.set_vring_num(0, 1);
83*bb4ee6a4SAndroid Build Coastguard Worker     assert_ok_or_known_failure(res);
84*bb4ee6a4SAndroid Build Coastguard Worker }
85*bb4ee6a4SAndroid Build Coastguard Worker 
86*bb4ee6a4SAndroid Build Coastguard Worker #[test]
set_vring_addr()87*bb4ee6a4SAndroid Build Coastguard Worker fn set_vring_addr() {
88*bb4ee6a4SAndroid Build Coastguard Worker     let vhost_net = create_fake_vhost_net();
89*bb4ee6a4SAndroid Build Coastguard Worker     let gm = create_guest_memory().unwrap();
90*bb4ee6a4SAndroid Build Coastguard Worker     let res = vhost_net.set_vring_addr(
91*bb4ee6a4SAndroid Build Coastguard Worker         &gm,
92*bb4ee6a4SAndroid Build Coastguard Worker         1,
93*bb4ee6a4SAndroid Build Coastguard Worker         1,
94*bb4ee6a4SAndroid Build Coastguard Worker         0,
95*bb4ee6a4SAndroid Build Coastguard Worker         0x0,
96*bb4ee6a4SAndroid Build Coastguard Worker         GuestAddress(0x0),
97*bb4ee6a4SAndroid Build Coastguard Worker         GuestAddress(0x0),
98*bb4ee6a4SAndroid Build Coastguard Worker         GuestAddress(0x0),
99*bb4ee6a4SAndroid Build Coastguard Worker         None,
100*bb4ee6a4SAndroid Build Coastguard Worker     );
101*bb4ee6a4SAndroid Build Coastguard Worker     assert_ok_or_known_failure(res);
102*bb4ee6a4SAndroid Build Coastguard Worker }
103*bb4ee6a4SAndroid Build Coastguard Worker 
104*bb4ee6a4SAndroid Build Coastguard Worker #[test]
set_vring_base()105*bb4ee6a4SAndroid Build Coastguard Worker fn set_vring_base() {
106*bb4ee6a4SAndroid Build Coastguard Worker     let vhost_net = create_fake_vhost_net();
107*bb4ee6a4SAndroid Build Coastguard Worker     let res = vhost_net.set_vring_base(0, 1);
108*bb4ee6a4SAndroid Build Coastguard Worker     assert_ok_or_known_failure(res);
109*bb4ee6a4SAndroid Build Coastguard Worker }
110*bb4ee6a4SAndroid Build Coastguard Worker 
111*bb4ee6a4SAndroid Build Coastguard Worker #[test]
set_vring_call()112*bb4ee6a4SAndroid Build Coastguard Worker fn set_vring_call() {
113*bb4ee6a4SAndroid Build Coastguard Worker     let vhost_net = create_fake_vhost_net();
114*bb4ee6a4SAndroid Build Coastguard Worker     let res = vhost_net.set_vring_call(0, &Event::new().unwrap());
115*bb4ee6a4SAndroid Build Coastguard Worker     assert_ok_or_known_failure(res);
116*bb4ee6a4SAndroid Build Coastguard Worker }
117*bb4ee6a4SAndroid Build Coastguard Worker 
118*bb4ee6a4SAndroid Build Coastguard Worker #[test]
set_vring_kick()119*bb4ee6a4SAndroid Build Coastguard Worker fn set_vring_kick() {
120*bb4ee6a4SAndroid Build Coastguard Worker     let vhost_net = create_fake_vhost_net();
121*bb4ee6a4SAndroid Build Coastguard Worker     let res = vhost_net.set_vring_kick(0, &Event::new().unwrap());
122*bb4ee6a4SAndroid Build Coastguard Worker     assert_ok_or_known_failure(res);
123*bb4ee6a4SAndroid Build Coastguard Worker }
124