1 /* 2 * QNull unit-tests. 3 * 4 * Copyright (C) 2016 Red Hat Inc. 5 * 6 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. 7 * See the COPYING.LIB file in the top-level directory. 8 */ 9 #include "qemu/osdep.h" 10 11 #include "qapi/qmp/qnull.h" 12 #include "qemu-common.h" 13 #include "qapi/qobject-input-visitor.h" 14 #include "qapi/qobject-output-visitor.h" 15 #include "qapi/error.h" 16 17 /* 18 * Public Interface test-cases 19 * 20 * (with some violations to access 'private' data) 21 */ 22 23 static void qnull_ref_test(void) 24 { 25 QObject *obj; 26 27 g_assert(qnull_.base.refcnt == 1); 28 obj = QOBJECT(qnull()); 29 g_assert(obj); 30 g_assert(obj == QOBJECT(&qnull_)); 31 g_assert(qnull_.base.refcnt == 2); 32 g_assert(qobject_type(obj) == QTYPE_QNULL); 33 qobject_unref(obj); 34 g_assert(qnull_.base.refcnt == 1); 35 } 36 37 static void qnull_visit_test(void) 38 { 39 QObject *obj; 40 Visitor *v; 41 QNull *null; 42 43 /* 44 * Most tests of interactions between QObject and visitors are in 45 * test-qmp-*-visitor; but these tests live here because they 46 * depend on layering violations to check qnull_ refcnt. 47 */ 48 49 g_assert(qnull_.base.refcnt == 1); 50 obj = QOBJECT(qnull()); 51 v = qobject_input_visitor_new(obj); 52 qobject_unref(obj); 53 visit_type_null(v, NULL, &null, &error_abort); 54 g_assert(obj == QOBJECT(&qnull_)); 55 qobject_unref(null); 56 visit_free(v); 57 58 null = NULL; 59 v = qobject_output_visitor_new(&obj); 60 visit_type_null(v, NULL, &null, &error_abort); 61 visit_complete(v, &obj); 62 g_assert(obj == QOBJECT(&qnull_)); 63 qobject_unref(null); 64 qobject_unref(obj); 65 visit_free(v); 66 67 g_assert(qnull_.base.refcnt == 1); 68 } 69 70 int main(int argc, char **argv) 71 { 72 g_test_init(&argc, &argv, NULL); 73 74 g_test_add_func("/public/qnull_ref", qnull_ref_test); 75 g_test_add_func("/public/qnull_visit", qnull_visit_test); 76 77 return g_test_run(); 78 } 79