[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 15/37] qdev-monitor-test: add device_add leak test
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL v2 15/37] qdev-monitor-test: add device_add leak test cases |
Date: |
Fri, 8 Nov 2013 11:12:09 +0100 |
Ensure that the device_add error code path deletes device objects.
Failure to do so not only leaks the objects but can also keep other
objects (like drive or netdev) alive due to qdev properties holding
references.
Signed-off-by: Stefan Hajnoczi <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
tests/Makefile | 2 ++
tests/qdev-monitor-test.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 83 insertions(+)
create mode 100644 tests/qdev-monitor-test.c
diff --git a/tests/Makefile b/tests/Makefile
index 973f497..379cdd9 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -69,6 +69,7 @@ check-qtest-i386-y += tests/i440fx-test$(EXESUF)
check-qtest-i386-y += tests/fw_cfg-test$(EXESUF)
check-qtest-i386-y += tests/qom-test$(EXESUF)
check-qtest-i386-y += tests/blockdev-test$(EXESUF)
+check-qtest-i386-y += tests/qdev-monitor-test$(EXESUF)
check-qtest-x86_64-y = $(check-qtest-i386-y)
gcov-files-i386-y += i386-softmmu/hw/mc146818rtc.c
gcov-files-x86_64-y = $(subst
i386-softmmu/,x86_64-softmmu/,$(gcov-files-i386-y))
@@ -202,6 +203,7 @@ tests/i440fx-test$(EXESUF): tests/i440fx-test.o
$(libqos-pc-obj-y)
tests/fw_cfg-test$(EXESUF): tests/fw_cfg-test.o $(libqos-pc-obj-y)
tests/qom-test$(EXESUF): tests/qom-test.o
tests/blockdev-test$(EXESUF): tests/blockdev-test.o $(libqos-pc-obj-y)
+tests/qdev-monitor-test$(EXESUF): tests/qdev-monitor-test.o $(libqos-pc-obj-y)
tests/qemu-iotests/socket_scm_helper$(EXESUF):
tests/qemu-iotests/socket_scm_helper.o
# QTest rules
diff --git a/tests/qdev-monitor-test.c b/tests/qdev-monitor-test.c
new file mode 100644
index 0000000..33a8ea4
--- /dev/null
+++ b/tests/qdev-monitor-test.c
@@ -0,0 +1,81 @@
+/*
+ * qdev-monitor.c test cases
+ *
+ * Copyright (C) 2013 Red Hat Inc.
+ *
+ * Authors:
+ * Stefan Hajnoczi <address@hidden>
+ *
+ * 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 <string.h>
+#include <glib.h>
+#include "libqtest.h"
+#include "qapi/qmp/qjson.h"
+
+static void test_device_add(void)
+{
+ QDict *response;
+ QDict *error;
+
+ qtest_start("-drive if=none,id=drive0");
+
+ /* Make device_add fail. If this leaks the virtio-blk-pci device then a
+ * reference to drive0 will also be held (via qdev properties).
+ */
+ response = qmp("{\"execute\": \"device_add\","
+ " \"arguments\": {"
+ " \"driver\": \"virtio-blk-pci\","
+ " \"drive\": \"drive0\""
+ "}}");
+ g_assert(response);
+ error = qdict_get_qdict(response, "error");
+ g_assert(!strcmp(qdict_get_try_str(error, "class") ?: "",
+ "GenericError"));
+ g_assert(!strcmp(qdict_get_try_str(error, "desc") ?: "",
+ "Device initialization failed."));
+ QDECREF(response);
+
+ /* Delete the drive */
+ response = qmp("{\"execute\": \"human-monitor-command\","
+ " \"arguments\": {"
+ " \"command-line\": \"drive_del drive0\""
+ "}}");
+ g_assert(response);
+ g_assert(!strcmp(qdict_get_try_str(response, "return") ?: "(null)", ""));
+ QDECREF(response);
+
+ /* Try to re-add the drive. This fails with duplicate IDs if a leaked
+ * virtio-blk-pci exists that holds a reference to the old drive0.
+ */
+ response = qmp("{\"execute\": \"human-monitor-command\","
+ " \"arguments\": {"
+ " \"command-line\": \"drive_add pci-addr=auto
if=none,id=drive0\""
+ "}}");
+ g_assert(response);
+ g_assert(!strcmp(qdict_get_try_str(response, "return") ?: "",
+ "OK\r\n"));
+ QDECREF(response);
+
+ qtest_end();
+}
+
+int main(int argc, char **argv)
+{
+ const char *arch = qtest_get_arch();
+
+ /* Check architecture */
+ if (strcmp(arch, "i386") && strcmp(arch, "x86_64")) {
+ g_test_message("Skipping test for non-x86\n");
+ return 0;
+ }
+
+ /* Run the tests */
+ g_test_init(&argc, &argv, NULL);
+
+ qtest_add_func("/qmp/device_add", test_device_add);
+
+ return g_test_run();
+}
--
1.8.3.1
- [Qemu-devel] [PULL v2 30/37] block: vhdx - move more endian translations to vhdx-endian.c, (continued)
- [Qemu-devel] [PULL v2 30/37] block: vhdx - move more endian translations to vhdx-endian.c, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 03/37] block/raw-posix: fix FreeBSD compilation, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 32/37] block: vhdx - fix comment typos in header, fix incorrect struct fields, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 07/37] block: qemu-iotests, add quotes to $TEST_IMG usage in 019, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 08/37] block: qemu-iotests, removes duplicate double quotes in 039, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 33/37] block: vhdx - add .bdrv_create() support, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 37/37] block: Round up total_sectors, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 10/37] block: qemu-iotests, add quotes to $TEST_IMG usage in 061, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 36/37] block: vhdx qemu-iotest - log replay of data sector, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 11/37] blockdev: fix drive_init() opts and bs_opts leaks, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 15/37] qdev-monitor-test: add device_add leak test cases,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL v2 21/37] block: vhdx - log support struct and defines, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 22/37] block: vhdx - break endian translation functions out, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 26/37] block: vhdx - add region overlap detection for image files, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 28/37] block: vhdx write support, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 31/37] block: vhdx - break out code operations to functions, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 35/37] block: qemu-iotests for vhdx, add write test support, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 34/37] block: vhdx - update _make_test_img() to filter out vhdx options, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 23/37] block: vhdx - update log guid in header, and first write tracker, Stefan Hajnoczi, 2013/11/08
- [Qemu-devel] [PULL v2 19/37] block: vhdx - add header update capability., Stefan Hajnoczi, 2013/11/08