qemu/rust/qemu-api/tests/tests.rs
Paolo Bonzini cde3c425d1 rust: build integration test for the qemu_api crate
Adjust the integration test to compile with a subset of QEMU object
files, and make it actually create an object of the class it defines.

Follow the Rust filesystem conventions, where tests go in tests/ if
they use the library in the same way any other code would.

Reviewed-by: Junjie Mao <junjie.mao@hotmail.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2024-11-05 14:18:15 +01:00

78 lines
2.2 KiB
Rust

// Copyright 2024, Linaro Limited
// Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
// SPDX-License-Identifier: GPL-2.0-or-later
use core::ffi::CStr;
use qemu_api::{
bindings::*,
declare_properties, define_property,
definitions::{Class, ObjectImpl},
device_class_init, vm_state_description,
};
#[test]
fn test_device_decl_macros() {
// Test that macros can compile.
vm_state_description! {
VMSTATE,
name: c"name",
unmigratable: true,
}
#[repr(C)]
#[derive(qemu_api_macros::Object)]
pub struct DummyState {
pub _parent: DeviceState,
pub migrate_clock: bool,
}
#[repr(C)]
pub struct DummyClass {
pub _parent: DeviceClass,
}
declare_properties! {
DUMMY_PROPERTIES,
define_property!(
c"migrate-clk",
DummyState,
migrate_clock,
unsafe { &qdev_prop_bool },
bool
),
}
device_class_init! {
dummy_class_init,
props => DUMMY_PROPERTIES,
realize_fn => None,
legacy_reset_fn => None,
vmsd => VMSTATE,
}
impl ObjectImpl for DummyState {
type Class = DummyClass;
const TYPE_INFO: qemu_api::bindings::TypeInfo = qemu_api::type_info! { Self };
const TYPE_NAME: &'static CStr = c"dummy";
const PARENT_TYPE_NAME: Option<&'static CStr> = Some(TYPE_DEVICE);
const ABSTRACT: bool = false;
const INSTANCE_INIT: Option<unsafe extern "C" fn(obj: *mut Object)> = None;
const INSTANCE_POST_INIT: Option<unsafe extern "C" fn(obj: *mut Object)> = None;
const INSTANCE_FINALIZE: Option<unsafe extern "C" fn(obj: *mut Object)> = None;
}
impl Class for DummyClass {
const CLASS_INIT: Option<
unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut core::ffi::c_void),
> = Some(dummy_class_init);
const CLASS_BASE_INIT: Option<
unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut core::ffi::c_void),
> = None;
}
unsafe {
module_call_init(module_init_type::MODULE_INIT_QOM);
object_unref(object_new(DummyState::TYPE_NAME.as_ptr()) as *mut _);
}
}