diff options
author | Peter Maydell | 2021-03-14 16:13:53 +0100 |
---|---|---|
committer | Peter Maydell | 2021-03-14 16:13:53 +0100 |
commit | 757acb9a8295e8be4a37b2cfc1cd947e357fd29c (patch) | |
tree | 881fdcb812a8b8d067d5cb59832b3bb31ce9bcf9 /tests/unit/test-qmp-event.c | |
parent | Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20210314'... (diff) | |
parent | README: Add Documentation blurb (diff) | |
download | qemu-757acb9a8295e8be4a37b2cfc1cd947e357fd29c.tar.gz qemu-757acb9a8295e8be4a37b2cfc1cd947e357fd29c.tar.xz qemu-757acb9a8295e8be4a37b2cfc1cd947e357fd29c.zip |
Merge remote-tracking branch 'remotes/thuth-gitlab/tags/pull-request-2021-03-12' into staging
* Move unit and bench tests into separate directories
* Clean-up and improve gitlab-ci jobs
* Drop the non-working "check-speed" makefile target
* Minor documentation updates
# gpg: Signature made Fri 12 Mar 2021 17:18:45 GMT
# gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5
# gpg: issuer "thuth@redhat.com"
# gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full]
# gpg: aka "Thomas Huth <thuth@redhat.com>" [full]
# gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full]
# gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown]
# Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5
* remotes/thuth-gitlab/tags/pull-request-2021-03-12:
README: Add Documentation blurb
MAINTAINERS: Merge the Gitlab-CI section into the generic CI section
tests: remove "make check-speed" in favor of "make bench"
gitlab-ci.yml: Merge check-crypto-old jobs into the build-crypto-old jobs
gitlab-ci.yml: Merge one of the coroutine jobs with the tcg-disabled job
gitlab-ci.yml: Add some missing dependencies to the jobs
gitlab-ci.yml: Move build-tools-and-docs-debian to a better place
tests: Move benchmarks into a separate folder
tests: Move unit tests into a separate directory
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'tests/unit/test-qmp-event.c')
-rw-r--r-- | tests/unit/test-qmp-event.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/tests/unit/test-qmp-event.c b/tests/unit/test-qmp-event.c new file mode 100644 index 0000000000..7dd0053190 --- /dev/null +++ b/tests/unit/test-qmp-event.c @@ -0,0 +1,154 @@ +/* + * qapi event unit-tests. + * + * Copyright (c) 2014 Wenchao Xia + * + * Authors: + * Wenchao Xia <wenchaoqemu@gmail.com> + * + * 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 "qemu-common.h" +#include "qapi/error.h" +#include "qapi/qmp/qbool.h" +#include "qapi/qmp/qdict.h" +#include "qapi/qmp/qjson.h" +#include "qapi/qmp/qnum.h" +#include "qapi/qmp/qstring.h" +#include "qapi/qmp-event.h" +#include "test-qapi-events.h" +#include "test-qapi-emit-events.h" + +typedef struct TestEventData { + QDict *expect; + bool emitted; +} TestEventData; + +TestEventData *test_event_data; +static GMutex test_event_lock; + +void test_qapi_event_emit(test_QAPIEvent event, QDict *d) +{ + QDict *t; + int64_t s, ms; + + /* Verify that we have timestamp, then remove it to compare other fields */ + t = qdict_get_qdict(d, "timestamp"); + g_assert(t); + s = qdict_get_try_int(t, "seconds", -2); + ms = qdict_get_try_int(t, "microseconds", -2); + if (s == -1) { + g_assert(ms == -1); + } else { + g_assert(s >= 0); + g_assert(ms >= 0 && ms <= 999999); + } + g_assert(qdict_size(t) == 2); + + qdict_del(d, "timestamp"); + + g_assert(qobject_is_equal(QOBJECT(d), QOBJECT(test_event_data->expect))); + test_event_data->emitted = true; +} + +static void event_prepare(TestEventData *data, + const void *unused) +{ + /* Global variable test_event_data was used to pass the expectation, so + test cases can't be executed at same time. */ + g_mutex_lock(&test_event_lock); + test_event_data = data; +} + +static void event_teardown(TestEventData *data, + const void *unused) +{ + test_event_data = NULL; + g_mutex_unlock(&test_event_lock); +} + +static void event_test_add(const char *testpath, + void (*test_func)(TestEventData *data, + const void *user_data)) +{ + g_test_add(testpath, TestEventData, NULL, event_prepare, test_func, + event_teardown); +} + + +/* Test cases */ + +static void test_event_a(TestEventData *data, + const void *unused) +{ + data->expect = qdict_from_jsonf_nofail("{ 'event': 'EVENT_A' }"); + qapi_event_send_event_a(); + g_assert(data->emitted); + qobject_unref(data->expect); +} + +static void test_event_b(TestEventData *data, + const void *unused) +{ + data->expect = qdict_from_jsonf_nofail("{ 'event': 'EVENT_B' }"); + qapi_event_send_event_b(); + g_assert(data->emitted); + qobject_unref(data->expect); +} + +static void test_event_c(TestEventData *data, + const void *unused) +{ + UserDefOne b = { .integer = 2, .string = (char *)"test1" }; + + data->expect = qdict_from_jsonf_nofail( + "{ 'event': 'EVENT_C', 'data': {" + " 'a': 1, 'b': { 'integer': 2, 'string': 'test1' }, 'c': 'test2' } }"); + qapi_event_send_event_c(true, 1, true, &b, "test2"); + g_assert(data->emitted); + qobject_unref(data->expect); +} + +/* Complex type */ +static void test_event_d(TestEventData *data, + const void *unused) +{ + UserDefOne struct1 = { + .integer = 2, .string = (char *)"test1", + .has_enum1 = true, .enum1 = ENUM_ONE_VALUE1, + }; + EventStructOne a = { + .struct1 = &struct1, + .string = (char *)"test2", + .has_enum2 = true, + .enum2 = ENUM_ONE_VALUE2, + }; + + data->expect = qdict_from_jsonf_nofail( + "{ 'event': 'EVENT_D', 'data': {" + " 'a': {" + " 'struct1': { 'integer': 2, 'string': 'test1', 'enum1': 'value1' }," + " 'string': 'test2', 'enum2': 'value2' }," + " 'b': 'test3', 'enum3': 'value3' } }"); + qapi_event_send_event_d(&a, "test3", false, NULL, true, ENUM_ONE_VALUE3); + g_assert(data->emitted); + qobject_unref(data->expect); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + + event_test_add("/event/event_a", test_event_a); + event_test_add("/event/event_b", test_event_b); + event_test_add("/event/event_c", test_event_c); + event_test_add("/event/event_d", test_event_d); + g_test_run(); + + return 0; +} |