Browse Source
Add a new test, for checking reference counting of qnull(). As
part of the new file, move a previous reference counting change
added in commit a861564 to a more logical place.
Note that while most of the check-q*.c leave visitor stuff to
the test-qmp-*-visitor.c, in this case we actually want the
visitor tests in our new file because we are validating the
reference count of qnull_, which is an internal detail that
test-qmp-*-visitor should not be peeking into (or put another
way, qnull() is the only special case where we don't have
independent allocation of a QObject, so none of the other
visitor tests require the layering violation present in this
test).
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1461879932-9020-14-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
pull/41/head
committed by
Markus Armbruster
4 changed files with 72 additions and 3 deletions
@ -0,0 +1,66 @@ |
|||
/*
|
|||
* QNull unit-tests. |
|||
* |
|||
* Copyright (C) 2016 Red Hat Inc. |
|||
* |
|||
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later. |
|||
* See the COPYING.LIB file in the top-level directory. |
|||
*/ |
|||
#include "qemu/osdep.h" |
|||
#include <glib.h> |
|||
|
|||
#include "qapi/qmp/qobject.h" |
|||
#include "qemu-common.h" |
|||
#include "qapi/qmp-output-visitor.h" |
|||
|
|||
/*
|
|||
* Public Interface test-cases |
|||
* |
|||
* (with some violations to access 'private' data) |
|||
*/ |
|||
|
|||
static void qnull_ref_test(void) |
|||
{ |
|||
QObject *obj; |
|||
|
|||
g_assert(qnull_.refcnt == 1); |
|||
obj = qnull(); |
|||
g_assert(obj); |
|||
g_assert(obj == &qnull_); |
|||
g_assert(qnull_.refcnt == 2); |
|||
g_assert(qobject_type(obj) == QTYPE_QNULL); |
|||
qobject_decref(obj); |
|||
g_assert(qnull_.refcnt == 1); |
|||
} |
|||
|
|||
static void qnull_visit_test(void) |
|||
{ |
|||
QObject *obj; |
|||
QmpOutputVisitor *qov; |
|||
|
|||
/*
|
|||
* Most tests of interactions between QObject and visitors are in |
|||
* test-qmp-*-visitor; but these tests live here because they |
|||
* depend on layering violations to check qnull_ refcnt. |
|||
*/ |
|||
|
|||
g_assert(qnull_.refcnt == 1); |
|||
qov = qmp_output_visitor_new(); |
|||
/* FIXME: Empty visits are ugly, we should have a visit_type_null(). */ |
|||
obj = qmp_output_get_qobject(qov); |
|||
g_assert(obj == &qnull_); |
|||
qobject_decref(obj); |
|||
|
|||
qmp_output_visitor_cleanup(qov); |
|||
g_assert(qnull_.refcnt == 1); |
|||
} |
|||
|
|||
int main(int argc, char **argv) |
|||
{ |
|||
g_test_init(&argc, &argv, NULL); |
|||
|
|||
g_test_add_func("/public/qnull_ref", qnull_ref_test); |
|||
g_test_add_func("/public/qnull_visit", qnull_visit_test); |
|||
|
|||
return g_test_run(); |
|||
} |
|||
Loading…
Reference in new issue