11#include <assert.h>
2- #include <stdio.h>
32#include <string.h>
43
54#include "miniqom/error.h"
@@ -21,7 +20,7 @@ typedef struct TestLifecycleObject
2120static char lifecycle_events [16 ];
2221static size_t lifecycle_event_count ;
2322
24- static void lifecycle_events_rest (void )
23+ static void lifecycle_events_reset (void )
2524{
2625 lifecycle_event_count = 0 ;
2726 lifecycle_events [0 ] = '\0' ;
@@ -114,171 +113,217 @@ static void test_lifecycle_register_types(void)
114113 type_register_static (& test_lifecycle_failing_child_info );
115114}
116115
117- int main (void )
116+ static void test_type_queries (void )
118117{
119- Error err ;
120- Object * root ;
121- Object * objects ;
122- Object * mem0 ;
123- HostMemoryBackendMemfd * backend ;
118+ Object * obj = object_new (TYPE_MEMORY_BACKEND_MEMFD );
124119
125- type_system_init ();
126- host_memory_backend_register_types ();
127- test_lifecycle_register_types ();
128-
129- error_clear (& err );
130- root = object_new ("object" );
131- objects = object_new ("object" );
132- mem0 = object_new (TYPE_MEMORY_BACKEND_MEMFD );
133-
134- assert (object_is_instance_of (mem0 , TYPE_MEMORY_BACKEND_MEMFD ));
135- assert (object_is_instance_of (mem0 , TYPE_MEMORY_BACKEND ));
136- assert (object_is_instance_of (mem0 , "object" ));
137- assert (!strcmp (object_get_type_name (mem0 ),
120+ assert (obj != NULL );
121+ assert (object_is_instance_of (obj , TYPE_MEMORY_BACKEND_MEMFD ));
122+ assert (object_is_instance_of (obj , TYPE_MEMORY_BACKEND ));
123+ assert (object_is_instance_of (obj , "object" ));
124+ assert (!strcmp (object_get_type_name (obj ),
138125 TYPE_MEMORY_BACKEND_MEMFD ));
139126
140- assert (object_is_a (mem0 , TYPE_MEMORY_BACKEND_MEMFD ));
141- assert (object_is_a (mem0 , TYPE_MEMORY_BACKEND ));
142- assert (object_is_a (mem0 , "object" ));
143- assert (!object_is_a (mem0 , "unknown-type" ));
127+ assert (object_is_a (obj , TYPE_MEMORY_BACKEND_MEMFD ));
128+ assert (object_is_a (obj , TYPE_MEMORY_BACKEND ));
129+ assert (object_is_a (obj , "object" ));
130+ assert (!object_is_a (obj , "unknown-type" ));
144131 assert (object_get_type_name (NULL ) == NULL );
145132 assert (!object_is_a (NULL , "object" ));
146133
134+ object_free (obj );
135+ }
136+
137+ static void test_memory_backend_defaults (void )
138+ {
139+ HostMemoryBackendMemfd * backend ;
140+ Object * obj = object_new (TYPE_MEMORY_BACKEND_MEMFD );
141+
142+ assert (obj != NULL );
143+
144+ backend = (HostMemoryBackendMemfd * )obj ;
145+ assert (backend -> seal );
146+ assert (backend -> parent_obj .share );
147+
148+ object_free (obj );
149+ }
150+
151+ static void test_object_lifecycle (void )
152+ {
153+ Error err ;
154+ Object * obj = object_new (TYPE_MEMORY_BACKEND_MEMFD );
155+
156+ assert (obj != NULL );
147157 error_clear (& err );
148158
149- assert (!object_is_realized (mem0 ));
159+ assert (!object_is_realized (obj ));
150160
151- assert (object_realize (mem0 , & err ));
152- assert (object_is_realized (mem0 ));
161+ assert (object_realize (obj , & err ));
162+ assert (object_is_realized (obj ));
153163
154- assert (!object_realize (mem0 , & err ));
164+ assert (!object_realize (obj , & err ));
155165 assert (!strcmp (err .message , "object is already realized" ));
156- assert (object_is_realized (mem0 ));
166+ assert (object_is_realized (obj ));
157167
158- object_unrealize (mem0 );
159- assert (!object_is_realized (mem0 ));
168+ object_unrealize (obj );
169+ assert (!object_is_realized (obj ));
160170
161- object_unrealize (mem0 );
162- assert (!object_is_realized (mem0 ));
171+ object_unrealize (obj );
172+ assert (!object_is_realized (obj ));
163173
164- assert (object_realize (mem0 , & err ));
165- assert (object_is_realized (mem0 ));
174+ assert (object_realize (obj , & err ));
175+ assert (object_is_realized (obj ));
166176
167- object_unrealize (mem0 );
168- assert (!object_is_realized (mem0 ));
177+ object_unrealize (obj );
178+ assert (!object_is_realized (obj ));
169179
170- backend = (HostMemoryBackendMemfd * )mem0 ;
171- assert (backend -> seal );
172- assert (backend -> parent_obj .share );
180+ object_free (obj );
181+ }
173182
174- assert (object_add_child (root , "objects" , objects , & err ));
175- assert (object_add_child (objects , "mem0" , mem0 , & err ));
176- assert (object_resolve_path (root , "/objects/mem0" ) == mem0 );
183+ static void test_property_get (void )
184+ {
185+ Error err ;
186+ PropertyValue value ;
187+ Object * obj = object_new (TYPE_MEMORY_BACKEND_MEMFD );
188+
189+ assert (obj != NULL );
190+ error_clear (& err );
177191
178- assert (!object_property_set_from_string (mem0 , "swap-storage" ,
192+ assert (!object_property_set_from_string (obj , "swap-storage" ,
179193 "file:///swap" , & err ));
180194 assert (!strcmp (err .message , "swap-storage requires mmoc=on" ));
181195
182196 error_clear (& err );
183- assert (object_property_set_from_string (mem0 , "mmoc" , "on" , & err ));
184- assert (object_property_set_from_string (mem0 , "swap-storage" ,
197+ assert (object_property_set_from_string (obj , "mmoc" , "on" , & err ));
198+ assert (object_property_set_from_string (obj , "swap-storage" ,
185199 "file:///swap" , & err ));
186- assert (object_property_set_from_string (mem0 , "size" , "2G" , & err ));
200+ assert (object_property_set_from_string (obj , "size" , "2G" , & err ));
187201
188- assert (backend -> parent_obj . size == 2ULL * 1024 * 1024 * 1024 );
189- assert (! strcmp ( backend -> parent_obj . swap_storage , "file:///swap" ) );
202+ assert (object_property_get ( obj , " size" , & value , & err ) );
203+ assert (value . u64 == 2ULL * 1024 * 1024 * 1024 );
190204
191- // ====== Freeze properties ======
192- //
193- Object * property_object ;
194- property_object = object_new (TYPE_MEMORY_BACKEND_MEMFD );
195- assert (property_object != NULL );
205+ assert (object_property_get (obj , "mmoc" , & value , & err ));
206+ assert (value .b );
196207
197- PropertyValue property_value ;
198- error_clear ( & err );
208+ assert ( object_property_get ( obj , "share" , & value , & err )) ;
209+ assert ( value . b );
199210
200- assert (object_property_set_from_string (property_object ,
201- "size" ,
202- "2G" ,
203- & err ));
211+ assert (object_property_get (obj , "swap-storage" , & value , & err ));
212+ assert (!strcmp (value .str , "file:///swap" ));
204213
205- assert (object_realize (property_object , & err ));
206- assert (object_is_realized (property_object ));
214+ error_clear (& err );
207215
208- assert (!object_property_set_from_string (property_object ,
209- "size" , "4G" ,
210- & err ));
216+ assert (!object_property_get (obj , "unknown-property" , & value , & err ));
217+ assert (!strcmp (err .message , "property not found" ));
211218
212- assert (!strcmp (err .message , "object is already realized" ));
219+ object_free (obj );
220+ }
213221
214- assert (object_property_get (property_object ,
215- "size" ,
216- & property_value ,
217- & err ));
222+ static void test_property_freeze_after_realize (void )
223+ {
224+ Error err ;
225+ PropertyValue value ;
226+ Object * obj = object_new (TYPE_MEMORY_BACKEND_MEMFD );
218227
219- assert (property_value .u64 == 2ULL * 1024 * 1024 * 1024 );
220- // ====== Test property ======
221- assert (object_property_get (mem0 , "size" ,
222- & property_value , & err ));
223- assert (property_value .u64 == 2ULL * 1024 * 1024 * 1024 );
228+ assert (obj != NULL );
229+ error_clear (& err );
224230
225- assert (object_property_get (mem0 , "mmoc" ,
226- & property_value , & err ));
227- assert (property_value .b );
231+ assert (object_property_set_from_string (obj , "size" , "2G" , & err ));
228232
229- assert (object_property_get (mem0 , "share" ,
230- & property_value , & err ));
231- assert (property_value .b );
233+ assert (object_realize (obj , & err ));
234+ assert (object_is_realized (obj ));
232235
233- assert (object_property_get (mem0 , "swap-storage" ,
234- & property_value , & err ));
235- assert (!strcmp (property_value .str , "file:///swap" ));
236+ assert (!object_property_set_from_string (obj , "size" , "4G" , & err ));
237+ assert (!strcmp (err .message , "object is already realized" ));
236238
237- error_clear (& err );
239+ assert (object_property_get (obj , "size" , & value , & err ));
240+ assert (value .u64 == 2ULL * 1024 * 1024 * 1024 );
238241
239- assert (!object_property_get (mem0 , "unknown-property" ,
240- & property_value , & err ));
241- assert (!strcmp (err .message , "property not found" ));
242+ object_unrealize (obj );
243+ assert (!object_is_realized (obj ));
242244
243- // ====== Test realize callbacks ======
244- error_clear (& err );
245+ assert (object_property_set_from_string (obj , "size" , "4G" , & err ));
246+ assert (object_property_get (obj , "size" , & value , & err ));
247+ assert (value .u64 == 4ULL * 1024 * 1024 * 1024 );
248+
249+ object_free (obj );
250+ }
245251
246- Object * lifecycle_object ;
252+ static void test_inherited_lifecycle_callbacks (void )
253+ {
254+ Error err ;
255+ Object * obj = object_new (TYPE_TEST_LIFECYCLE_CHILD );
247256
248- lifecycle_object = object_new ( TYPE_TEST_LIFECYCLE_CHILD );
249- assert ( lifecycle_object != NULL );
257+ assert ( obj != NULL );
258+ error_clear ( & err );
250259
251- lifecycle_events_rest ();
260+ lifecycle_events_reset ();
252261
253- assert (object_realize (lifecycle_object , & err ));
254- assert (object_is_realized (lifecycle_object ));
262+ assert (object_realize (obj , & err ));
263+ assert (object_is_realized (obj ));
255264 assert (!strcmp (lifecycle_events , "PC" ));
256265
257- lifecycle_events_rest ();
266+ lifecycle_events_reset ();
258267
259- object_unrealize (lifecycle_object );
260- assert (!object_is_realized (lifecycle_object ));
268+ object_unrealize (obj );
269+ assert (!object_is_realized (obj ));
261270 assert (!strcmp (lifecycle_events , "cp" ));
262271
263- object_free (lifecycle_object );
272+ object_free (obj );
273+ }
264274
265- // ===== Test realize failed ======
266- Object * failing_object ;
275+ static void test_realize_failure_rollback (void )
276+ {
277+ Error err ;
278+ Object * obj = object_new (TYPE_TEST_LIFECYCLE_FAILING_CHILD );
267279
268- failing_object = object_new (TYPE_TEST_LIFECYCLE_FAILING_CHILD );
269- assert (failing_object != NULL );
280+ assert (obj != NULL );
270281
271- lifecycle_events_rest ();
282+ lifecycle_events_reset ();
272283 error_clear (& err );
273284
274- assert (!object_realize (failing_object , & err ));
285+ assert (!object_realize (obj , & err ));
275286 assert (!strcmp (err .message , "child realize failed" ));
276- assert (!object_is_realized (failing_object ));
287+ assert (!object_is_realized (obj ));
277288 assert (!strcmp (lifecycle_events , "PFp" ));
278289
279- object_free (failing_object );
290+ object_free (obj );
291+ }
292+
293+ static void test_object_tree (void )
294+ {
295+ Error err ;
296+ Object * root = object_new ("object" );
297+ Object * objects = object_new ("object" );
298+ Object * mem0 = object_new (TYPE_MEMORY_BACKEND_MEMFD );
299+
300+ assert (root != NULL );
301+ assert (objects != NULL );
302+ assert (mem0 != NULL );
303+
304+ error_clear (& err );
305+
306+ assert (object_add_child (root , "objects" , objects , & err ));
307+ assert (object_add_child (objects , "mem0" , mem0 , & err ));
308+ assert (object_resolve_path (root , "/objects/mem0" ) == mem0 );
280309
281- // ======= Release test resources ======
282310 object_free (root );
311+ }
312+
313+ int main (void )
314+ {
315+ type_system_init ();
316+ host_memory_backend_register_types ();
317+ test_lifecycle_register_types ();
318+
319+ test_type_queries ();
320+ test_memory_backend_defaults ();
321+ test_object_lifecycle ();
322+ test_property_get ();
323+ test_property_freeze_after_realize ();
324+ test_inherited_lifecycle_callbacks ();
325+ test_realize_failure_rollback ();
326+ test_object_tree ();
327+
283328 return 0 ;
284329}
0 commit comments