xref: /qemu/rust/qemu-api/tests/tests.rs (revision 7bd8e3ef63330e870cf4644d21c285cce35c703d)
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 
58c80c472SPaolo Bonzini use std::ffi::CStr;
6cde3c425SPaolo Bonzini 
7cde3c425SPaolo Bonzini use qemu_api::{
8*7bd8e3efSPaolo Bonzini     bindings::*, c_str, declare_properties, define_property, definitions::ObjectImpl,
9*7bd8e3efSPaolo Bonzini     device_class::DeviceImpl, impl_device_class, prelude::*, zeroable::Zeroable,
10cde3c425SPaolo Bonzini };
11cde3c425SPaolo Bonzini 
12cde3c425SPaolo Bonzini #[test]
13cde3c425SPaolo Bonzini fn test_device_decl_macros() {
14cde3c425SPaolo Bonzini     // Test that macros can compile.
150a65e412SManos Pitsidianakis     pub static VMSTATE: VMStateDescription = VMStateDescription {
16718e255fSPaolo Bonzini         name: c_str!("name").as_ptr(),
17cde3c425SPaolo Bonzini         unmigratable: true,
180a65e412SManos Pitsidianakis         ..Zeroable::ZERO
190a65e412SManos Pitsidianakis     };
20cde3c425SPaolo Bonzini 
21f3518400SJunjie Mao     #[derive(qemu_api_macros::offsets)]
22cde3c425SPaolo Bonzini     #[repr(C)]
23cde3c425SPaolo Bonzini     #[derive(qemu_api_macros::Object)]
24cde3c425SPaolo Bonzini     pub struct DummyState {
25cde3c425SPaolo Bonzini         pub _parent: DeviceState,
26cde3c425SPaolo Bonzini         pub migrate_clock: bool,
27cde3c425SPaolo Bonzini     }
28cde3c425SPaolo Bonzini 
29cde3c425SPaolo Bonzini     #[repr(C)]
30cde3c425SPaolo Bonzini     pub struct DummyClass {
31cde3c425SPaolo Bonzini         pub _parent: DeviceClass,
32cde3c425SPaolo Bonzini     }
33cde3c425SPaolo Bonzini 
34cde3c425SPaolo Bonzini     declare_properties! {
35cde3c425SPaolo Bonzini         DUMMY_PROPERTIES,
36cde3c425SPaolo Bonzini             define_property!(
37718e255fSPaolo Bonzini                 c_str!("migrate-clk"),
38cde3c425SPaolo Bonzini                 DummyState,
39cde3c425SPaolo Bonzini                 migrate_clock,
40cde3c425SPaolo Bonzini                 unsafe { &qdev_prop_bool },
41cde3c425SPaolo Bonzini                 bool
42cde3c425SPaolo Bonzini             ),
43cde3c425SPaolo Bonzini     }
44cde3c425SPaolo Bonzini 
45*7bd8e3efSPaolo Bonzini     unsafe impl ObjectType for DummyState {
46cde3c425SPaolo Bonzini         type Class = DummyClass;
47718e255fSPaolo Bonzini         const TYPE_NAME: &'static CStr = c_str!("dummy");
48*7bd8e3efSPaolo Bonzini     }
49*7bd8e3efSPaolo Bonzini 
50*7bd8e3efSPaolo Bonzini     impl ObjectImpl for DummyState {
51*7bd8e3efSPaolo Bonzini         const PARENT_TYPE_NAME: Option<&'static CStr> =
52*7bd8e3efSPaolo Bonzini             Some(<DeviceState as ObjectType>::TYPE_NAME);
53*7bd8e3efSPaolo Bonzini         const ABSTRACT: bool = false;
54cde3c425SPaolo Bonzini     }
55cde3c425SPaolo Bonzini 
568c80c472SPaolo Bonzini     impl DeviceImpl for DummyState {
578c80c472SPaolo Bonzini         fn properties() -> &'static [Property] {
588c80c472SPaolo Bonzini             &DUMMY_PROPERTIES
59cde3c425SPaolo Bonzini         }
608c80c472SPaolo Bonzini         fn vmsd() -> Option<&'static VMStateDescription> {
618c80c472SPaolo Bonzini             Some(&VMSTATE)
628c80c472SPaolo Bonzini         }
638c80c472SPaolo Bonzini     }
648c80c472SPaolo Bonzini 
658c80c472SPaolo Bonzini     impl_device_class!(DummyState);
66cde3c425SPaolo Bonzini 
67cde3c425SPaolo Bonzini     unsafe {
68cde3c425SPaolo Bonzini         module_call_init(module_init_type::MODULE_INIT_QOM);
697a35e2fbSPaolo Bonzini         object_unref(object_new(DummyState::TYPE_NAME.as_ptr()).cast());
70cde3c425SPaolo Bonzini     }
71cde3c425SPaolo Bonzini }
72