mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-27 07:48:55 +00:00
dragonball: add more unit test for device manager
Added more unit tests for device manager. Fixes: #4899 Signed-off-by: wllenyj <wllenyj@linux.alibaba.com>
This commit is contained in:
parent
2333700237
commit
57336835da
@ -1011,3 +1011,168 @@ impl DeviceManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
|
use kvm_ioctls::Kvm;
|
||||||
|
use test_utils::skip_if_not_root;
|
||||||
|
use vm_memory::{GuestAddress, MmapRegion};
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
use crate::vm::CpuTopology;
|
||||||
|
|
||||||
|
impl DeviceManager {
|
||||||
|
pub fn new_test_mgr() -> Self {
|
||||||
|
let kvm = Kvm::new().unwrap();
|
||||||
|
let vm = kvm.create_vm().unwrap();
|
||||||
|
let vm_fd = Arc::new(vm);
|
||||||
|
let epoll_manager = EpollManager::default();
|
||||||
|
let res_manager = Arc::new(ResourceManager::new(None));
|
||||||
|
let logger = slog_scope::logger().new(slog::o!());
|
||||||
|
|
||||||
|
DeviceManager {
|
||||||
|
vm_fd: Arc::clone(&vm_fd),
|
||||||
|
con_manager: ConsoleManager::new(epoll_manager, &logger),
|
||||||
|
io_manager: Arc::new(ArcSwap::new(Arc::new(IoManager::new()))),
|
||||||
|
io_lock: Arc::new(Mutex::new(())),
|
||||||
|
irq_manager: Arc::new(KvmIrqManager::new(vm_fd.clone())),
|
||||||
|
res_manager,
|
||||||
|
|
||||||
|
legacy_manager: None,
|
||||||
|
#[cfg(feature = "virtio-blk")]
|
||||||
|
block_manager: BlockDeviceMgr::default(),
|
||||||
|
#[cfg(feature = "virtio-fs")]
|
||||||
|
fs_manager: Arc::new(Mutex::new(FsDeviceMgr::default())),
|
||||||
|
#[cfg(feature = "virtio-net")]
|
||||||
|
virtio_net_manager: VirtioNetDeviceMgr::default(),
|
||||||
|
#[cfg(feature = "virtio-vsock")]
|
||||||
|
vsock_manager: VsockDeviceMgr::default(),
|
||||||
|
#[cfg(target_arch = "aarch64")]
|
||||||
|
mmio_device_info: HashMap::new(),
|
||||||
|
|
||||||
|
logger,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_create_device_manager() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
let mgr = DeviceManager::new_test_mgr();
|
||||||
|
let _ = mgr.io_manager();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
#[test]
|
||||||
|
fn test_create_devices() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
use crate::vm::VmConfigInfo;
|
||||||
|
|
||||||
|
let epoll_manager = EpollManager::default();
|
||||||
|
let vmm = Arc::new(Mutex::new(crate::vmm::tests::create_vmm_instance()));
|
||||||
|
let event_mgr = crate::event_manager::EventManager::new(&vmm, epoll_manager).unwrap();
|
||||||
|
let mut vm = crate::vm::tests::create_vm_instance();
|
||||||
|
let vm_config = VmConfigInfo {
|
||||||
|
vcpu_count: 1,
|
||||||
|
max_vcpu_count: 1,
|
||||||
|
cpu_pm: "off".to_string(),
|
||||||
|
mem_type: "shmem".to_string(),
|
||||||
|
mem_file_path: "".to_string(),
|
||||||
|
mem_size_mib: 16,
|
||||||
|
serial_path: None,
|
||||||
|
cpu_topology: CpuTopology {
|
||||||
|
threads_per_core: 1,
|
||||||
|
cores_per_die: 1,
|
||||||
|
dies_per_socket: 1,
|
||||||
|
sockets: 1,
|
||||||
|
},
|
||||||
|
vpmu_feature: 0,
|
||||||
|
};
|
||||||
|
vm.set_vm_config(vm_config);
|
||||||
|
vm.init_guest_memory().unwrap();
|
||||||
|
vm.setup_interrupt_controller().unwrap();
|
||||||
|
let vm_as = vm.vm_as().cloned().unwrap();
|
||||||
|
let kernel_temp_file = vmm_sys_util::tempfile::TempFile::new().unwrap();
|
||||||
|
let kernel_file = kernel_temp_file.into_file();
|
||||||
|
let mut cmdline = crate::vm::KernelConfigInfo::new(
|
||||||
|
kernel_file,
|
||||||
|
None,
|
||||||
|
linux_loader::cmdline::Cmdline::new(0x1000),
|
||||||
|
);
|
||||||
|
|
||||||
|
let address_space = vm.vm_address_space().cloned();
|
||||||
|
let mgr = vm.device_manager_mut();
|
||||||
|
let guard = mgr.io_manager.load();
|
||||||
|
let mut lcr = [0u8];
|
||||||
|
// 0x3f8 is the adddress of serial device
|
||||||
|
guard.pio_read(0x3f8 + 3, &mut lcr).unwrap_err();
|
||||||
|
assert_eq!(lcr[0], 0x0);
|
||||||
|
|
||||||
|
mgr.create_interrupt_manager().unwrap();
|
||||||
|
mgr.create_devices(
|
||||||
|
vm_as,
|
||||||
|
event_mgr.epoll_manager(),
|
||||||
|
&mut cmdline,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
address_space.as_ref(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let guard = mgr.io_manager.load();
|
||||||
|
guard.pio_read(0x3f8 + 3, &mut lcr).unwrap();
|
||||||
|
assert_eq!(lcr[0], 0x3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "virtio-fs")]
|
||||||
|
#[test]
|
||||||
|
fn test_handler_insert_region() {
|
||||||
|
skip_if_not_root!();
|
||||||
|
|
||||||
|
use dbs_virtio_devices::VirtioRegionHandler;
|
||||||
|
use lazy_static::__Deref;
|
||||||
|
use vm_memory::{GuestAddressSpace, GuestMemory, GuestMemoryRegion};
|
||||||
|
|
||||||
|
let vm = crate::test_utils::tests::create_vm_for_test();
|
||||||
|
let ctx = DeviceOpContext::new(
|
||||||
|
Some(vm.epoll_manager().clone()),
|
||||||
|
vm.device_manager(),
|
||||||
|
Some(vm.vm_as().unwrap().clone()),
|
||||||
|
vm.vm_address_space().cloned(),
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
let guest_addr = GuestAddress(0x200000000000);
|
||||||
|
|
||||||
|
let cache_len = 1024 * 1024 * 1024;
|
||||||
|
let mmap_region = MmapRegion::build(
|
||||||
|
None,
|
||||||
|
cache_len as usize,
|
||||||
|
libc::PROT_NONE,
|
||||||
|
libc::MAP_ANONYMOUS | libc::MAP_NORESERVE | libc::MAP_PRIVATE,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let guest_mmap_region =
|
||||||
|
Arc::new(vm_memory::GuestRegionMmap::new(mmap_region, guest_addr).unwrap());
|
||||||
|
|
||||||
|
let mut handler = DeviceVirtioRegionHandler {
|
||||||
|
vm_as: ctx.get_vm_as().unwrap(),
|
||||||
|
address_space: ctx.address_space.as_ref().unwrap().clone(),
|
||||||
|
};
|
||||||
|
handler.insert_region(guest_mmap_region).unwrap();
|
||||||
|
let mut find_region = false;
|
||||||
|
let find_region_ptr = &mut find_region;
|
||||||
|
|
||||||
|
let guard = vm.vm_as().unwrap().clone().memory();
|
||||||
|
|
||||||
|
let mem = guard.deref();
|
||||||
|
for region in mem.iter() {
|
||||||
|
if region.start_addr() == guest_addr && region.len() == cache_len {
|
||||||
|
*find_region_ptr = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert!(find_region);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -827,4 +827,10 @@ pub mod tests {
|
|||||||
.state = mstate;
|
.state = mstate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_vm_instance() -> Vm {
|
||||||
|
let instance_info = Arc::new(RwLock::new(InstanceInfo::default()));
|
||||||
|
let epoll_manager = EpollManager::default();
|
||||||
|
Vm::new(None, instance_info, epoll_manager).unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user