xref: /qemu/rust/qemu-api/tests/tests.rs (revision 8c80c472da6342c5924bc4ea7e87c77ca61477b8)
1cde3c425SPaolo Bonzini // Copyright 2024, Linaro Limited
2cde3c425SPaolo Bonzini // Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
3cde3c425SPaolo Bonzini // SPDX-License-Identifier: GPL-2.0-or-later
4cde3c425SPaolo Bonzini 
5*8c80c472SPaolo Bonzini use std::ffi::CStr;
6cde3c425SPaolo Bonzini 
7cde3c425SPaolo Bonzini use qemu_api::{
8cde3c425SPaolo Bonzini     bindings::*,
9718e255fSPaolo Bonzini     c_str, declare_properties, define_property,
10*8c80c472SPaolo Bonzini     definitions::ObjectImpl,
11*8c80c472SPaolo Bonzini     device_class::{self, DeviceImpl},
12*8c80c472SPaolo Bonzini     impl_device_class,
130a65e412SManos Pitsidianakis     zeroable::Zeroable,
14cde3c425SPaolo Bonzini };
15cde3c425SPaolo Bonzini 
16cde3c425SPaolo Bonzini #[test]
17cde3c425SPaolo Bonzini fn test_device_decl_macros() {
18cde3c425SPaolo Bonzini     // Test that macros can compile.
190a65e412SManos Pitsidianakis     pub static VMSTATE: VMStateDescription = VMStateDescription {
20718e255fSPaolo Bonzini         name: c_str!("name").as_ptr(),
21cde3c425SPaolo Bonzini         unmigratable: true,
220a65e412SManos Pitsidianakis         ..Zeroable::ZERO
230a65e412SManos Pitsidianakis     };
24cde3c425SPaolo Bonzini 
25f3518400SJunjie Mao     #[derive(qemu_api_macros::offsets)]
26cde3c425SPaolo Bonzini     #[repr(C)]
27cde3c425SPaolo Bonzini     #[derive(qemu_api_macros::Object)]
28cde3c425SPaolo Bonzini     pub struct DummyState {
29cde3c425SPaolo Bonzini         pub _parent: DeviceState,
30cde3c425SPaolo Bonzini         pub migrate_clock: bool,
31cde3c425SPaolo Bonzini     }
32cde3c425SPaolo Bonzini 
33cde3c425SPaolo Bonzini     #[repr(C)]
34cde3c425SPaolo Bonzini     pub struct DummyClass {
35cde3c425SPaolo Bonzini         pub _parent: DeviceClass,
36cde3c425SPaolo Bonzini     }
37cde3c425SPaolo Bonzini 
38cde3c425SPaolo Bonzini     declare_properties! {
39cde3c425SPaolo Bonzini         DUMMY_PROPERTIES,
40cde3c425SPaolo Bonzini             define_property!(
41718e255fSPaolo Bonzini                 c_str!("migrate-clk"),
42cde3c425SPaolo Bonzini                 DummyState,
43cde3c425SPaolo Bonzini                 migrate_clock,
44cde3c425SPaolo Bonzini                 unsafe { &qdev_prop_bool },
45cde3c425SPaolo Bonzini                 bool
46cde3c425SPaolo Bonzini             ),
47cde3c425SPaolo Bonzini     }
48cde3c425SPaolo Bonzini 
49cde3c425SPaolo Bonzini     impl ObjectImpl for DummyState {
50cde3c425SPaolo Bonzini         type Class = DummyClass;
51718e255fSPaolo Bonzini         const TYPE_NAME: &'static CStr = c_str!("dummy");
52ce4a144cSPaolo Bonzini         const PARENT_TYPE_NAME: Option<&'static CStr> = Some(device_class::TYPE_DEVICE);
53cde3c425SPaolo Bonzini     }
54cde3c425SPaolo Bonzini 
55*8c80c472SPaolo Bonzini     impl DeviceImpl for DummyState {
56*8c80c472SPaolo Bonzini         fn properties() -> &'static [Property] {
57*8c80c472SPaolo Bonzini             &DUMMY_PROPERTIES
58cde3c425SPaolo Bonzini         }
59*8c80c472SPaolo Bonzini         fn vmsd() -> Option<&'static VMStateDescription> {
60*8c80c472SPaolo Bonzini             Some(&VMSTATE)
61*8c80c472SPaolo Bonzini         }
62*8c80c472SPaolo Bonzini     }
63*8c80c472SPaolo Bonzini 
64*8c80c472SPaolo Bonzini     impl_device_class!(DummyState);
65cde3c425SPaolo Bonzini 
66cde3c425SPaolo Bonzini     unsafe {
67cde3c425SPaolo Bonzini         module_call_init(module_init_type::MODULE_INIT_QOM);
687a35e2fbSPaolo Bonzini         object_unref(object_new(DummyState::TYPE_NAME.as_ptr()).cast());
69cde3c425SPaolo Bonzini     }
70cde3c425SPaolo Bonzini }
71