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