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