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