[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 15/36] qdev-monitor-test: add device_add leak test ca
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL 15/36] qdev-monitor-test: add device_add leak test cases |
Date: |
Thu, 7 Nov 2013 14:12:23 +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 31/36] block: vhdx - break out code operations to functions, (continued)
- [Qemu-devel] [PULL 31/36] block: vhdx - break out code operations to functions, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 32/36] block: vhdx - fix comment typos in header, fix incorrect struct fields, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 36/36] block: vhdx qemu-iotest - log replay of data sector, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 18/36] block: vhdx - minor comments and typo correction., Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 06/36] block: qemu-iotests, add quotes to $TEST_IMG.base usage in 017, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 17/36] block/vpc: fix virtual size for images created with disk2vhd, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 09/36] block: qemu-iotests, add quotes to $TEST_IMG usage for 051, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 11/36] blockdev: fix drive_init() opts and bs_opts leaks, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 28/36] block: vhdx write support, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 16/36] block: Save errno before error_setg_errno, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 15/36] qdev-monitor-test: add device_add leak test cases,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL 07/36] block: qemu-iotests, add quotes to $TEST_IMG usage in 019, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 10/36] block: qemu-iotests, add quotes to $TEST_IMG usage in 061, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 20/36] block: vhdx code movement - VHDXMetadataEntries and BDRVVHDXState to header., Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 34/36] block: vhdx - update _make_test_img() to filter out vhdx options, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 14/36] blockdev-test: add test case for drive_add duplicate IDs, Stefan Hajnoczi, 2013/11/07
- [Qemu-devel] [PULL 35/36] block: qemu-iotests for vhdx, add write test support, Stefan Hajnoczi, 2013/11/07