Skip to content

Commit 6b5b057

Browse files
author
chenglong
committed
refactor(test): split QOM tests into focused cases
1 parent 8337b99 commit 6b5b057

1 file changed

Lines changed: 155 additions & 110 deletions

File tree

tests/test_qom.c

Lines changed: 155 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
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
2120
static char lifecycle_events[16];
2221
static 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

Comments
 (0)