Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/afaerber/tags/qom-devices-for-2…
Browse files Browse the repository at this point in the history
….0' into staging

QOM/QTest infrastructure fixes

* Revised QTest SIGABRT fix
* Test cleanups for non-POSIX hosts
* QTest test cases for NVMe, virtio-9p, pvpanic, i82801b11
* QTest API addition for reading events
* TMP105 fix and regression test

# gpg: Signature made Mon 31 Mar 2014 22:08:10 BST using RSA key ID 3E7E013F
# gpg: Good signature from "Andreas Färber <afaerber@suse.de>"
# gpg:                 aka "Andreas Färber <afaerber@suse.com>"

* remotes/afaerber/tags/qom-devices-for-2.0:
  tmp105-test: Test QOM property and precision
  tmp105-test: Add a second sensor and test that one
  tmp105-test: Wrap simple building blocks for testing
  tmp105: Read temperature in milli-celsius
  tests: Add i82801b11 qtest
  pvpanic-test: Assert pause event
  qtest: Factor out qtest_qmp_receive()
  tests: Add pvpanic qtest
  tests: Add virtio-9p qtest
  tests: Add nvme qtest
  nvme: Permit zero-length block devices
  tests: Correctly skip qtest on non-POSIX hosts
  tests: Skip POSIX-only tests on Windows
  tests: Remove unsupported tests for MinGW
  qtest: Keep list of qtest instances for SIGABRT handler
  Revert "qtest: Fix crash if SIGABRT during qtest_init()"

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Mar 31, 2014
2 parents 63678e1 + 7373fc7 commit 95224e8
Show file tree
Hide file tree
Showing 12 changed files with 388 additions and 48 deletions.
2 changes: 2 additions & 0 deletions MAINTAINERS
Expand Up @@ -623,6 +623,7 @@ M: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
S: Supported
F: hw/9pfs/
F: fsdev/
F: tests/virtio-9p-test.c
T: git git://github.com/kvaneesh/QEMU.git

virtio-blk
Expand All @@ -648,6 +649,7 @@ nvme
M: Keith Busch <keith.busch@intel.com>
S: Supported
F: hw/block/nvme*
F: tests/nvme-test.c

Xilinx EDK
M: Peter Crosthwaite <peter.crosthwaite@petalogix.com>
Expand Down
4 changes: 2 additions & 2 deletions hw/block/nvme.c
Expand Up @@ -752,8 +752,8 @@ static int nvme_init(PCIDevice *pci_dev)
return -1;
}

bs_size = bdrv_getlength(n->conf.bs);
if (bs_size <= 0) {
bs_size = bdrv_getlength(n->conf.bs);
if (bs_size < 0) {
return -1;
}

Expand Down
8 changes: 5 additions & 3 deletions hw/misc/tmp105.c
Expand Up @@ -56,12 +56,14 @@ static void tmp105_get_temperature(Object *obj, Visitor *v, void *opaque,
const char *name, Error **errp)
{
TMP105State *s = TMP105(obj);
int64_t value = s->temperature;
int64_t value = s->temperature * 1000 / 256;

visit_type_int(v, &value, name, errp);
}

/* Units are 0.001 centigrades relative to 0 C. */
/* Units are 0.001 centigrades relative to 0 C. s->temperature is 8.8
* fixed point, so units are 1/256 centigrades. A simple ratio will do.
*/
static void tmp105_set_temperature(Object *obj, Visitor *v, void *opaque,
const char *name, Error **errp)
{
Expand All @@ -78,7 +80,7 @@ static void tmp105_set_temperature(Object *obj, Visitor *v, void *opaque,
return;
}

s->temperature = ((int16_t) (temp * 0x800 / 128000)) << 4;
s->temperature = (int16_t) (temp * 256 / 1000);

tmp105_alarm_update(s);
}
Expand Down
23 changes: 20 additions & 3 deletions tests/Makefile
Expand Up @@ -35,7 +35,7 @@ check-unit-y += tests/test-visitor-serialization$(EXESUF)
check-unit-y += tests/test-iov$(EXESUF)
gcov-files-test-iov-y = util/iov.c
check-unit-y += tests/test-aio$(EXESUF)
check-unit-y += tests/test-rfifolock$(EXESUF)
check-unit-$(CONFIG_POSIX) += tests/test-rfifolock$(EXESUF)
check-unit-y += tests/test-throttle$(EXESUF)
gcov-files-test-aio-$(CONFIG_WIN32) = aio-win32.c
gcov-files-test-aio-$(CONFIG_POSIX) = aio-posix.c
Expand All @@ -59,7 +59,7 @@ check-unit-y += tests/test-bitops$(EXESUF)
check-unit-y += tests/test-qdev-global-props$(EXESUF)
check-unit-y += tests/check-qom-interface$(EXESUF)
gcov-files-check-qom-interface-y = qom/object.c
check-unit-y += tests/test-vmstate$(EXESUF)
check-unit-$(CONFIG_POSIX) += tests/test-vmstate$(EXESUF)

check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh

Expand All @@ -84,6 +84,11 @@ check-qtest-virtio-y += tests/virtio-rng-test$(EXESUF)
gcov-files-virtio-y += hw/virtio/virtio-rng.c
check-qtest-virtio-y += tests/virtio-scsi-test$(EXESUF)
gcov-files-virtio-y += i386-softmmu/hw/scsi/virtio-scsi.c
ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
check-qtest-virtio-y += tests/virtio-9p-test$(EXESUF)
gcov-files-virtio-y += hw/9pfs/virtio-9p.c
gcov-files-virtio-y += i386-softmmu/hw/9pfs/virtio-9p-device.c
endif
check-qtest-virtio-y += tests/virtio-serial-test$(EXESUF)
gcov-files-virtio-y += i386-softmmu/hw/char/virtio-serial-bus.c
check-qtest-virtio-y += $(check-qtest-virtioserial-y)
Expand All @@ -100,6 +105,8 @@ check-qtest-pci-y += tests/eepro100-test$(EXESUF)
gcov-files-pci-y += hw/net/eepro100.c
check-qtest-pci-y += tests/ne2000-test$(EXESUF)
gcov-files-pci-y += hw/net/ne2000.c
check-qtest-pci-y += tests/nvme-test$(EXESUF)
gcov-files-pci-y += hw/block/nvme.c
check-qtest-pci-y += $(check-qtest-virtio-y)
gcov-files-pci-y += $(gcov-files-virtio-y) hw/virtio/virtio-pci.c
check-qtest-pci-y += tests/tpci200-test$(EXESUF)
Expand All @@ -126,6 +133,10 @@ check-qtest-i386-y += tests/vmxnet3-test$(EXESUF)
gcov-files-i386-y += hw/net/vmxnet3.c
gcov-files-i386-y += hw/net/vmxnet_rx_pkt.c
gcov-files-i386-y += hw/net/vmxnet_tx_pkt.c
check-qtest-i386-y += tests/pvpanic-test$(EXESUF)
gcov-files-i386-y += i386-softmmu/hw/misc/pvpanic.c
check-qtest-i386-y += tests/i82801b11-test$(EXESUF)
gcov-files-i386-y += hw/pci-bridge/i82801b11.c
check-qtest-x86_64-y = $(check-qtest-i386-y)
gcov-files-i386-y += i386-softmmu/hw/timer/mc146818rtc.c
gcov-files-x86_64-y = $(subst i386-softmmu/,x86_64-softmmu/,$(gcov-files-i386-y))
Expand Down Expand Up @@ -265,20 +276,26 @@ tests/virtio-blk-test$(EXESUF): tests/virtio-blk-test.o
tests/virtio-net-test$(EXESUF): tests/virtio-net-test.o
tests/virtio-rng-test$(EXESUF): tests/virtio-rng-test.o
tests/virtio-scsi-test$(EXESUF): tests/virtio-scsi-test.o
tests/virtio-9p-test$(EXESUF): tests/virtio-9p-test.o
tests/virtio-serial-test$(EXESUF): tests/virtio-serial-test.o
tests/virtio-console-test$(EXESUF): tests/virtio-console-test.o
tests/tpci200-test$(EXESUF): tests/tpci200-test.o
tests/ipoctal232-test$(EXESUF): tests/ipoctal232-test.o
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/nvme-test$(EXESUF): tests/nvme-test.o
tests/pvpanic-test$(EXESUF): tests/pvpanic-test.o
tests/i82801b11-test$(EXESUF): tests/i82801b11-test.o
tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o

# QTest rules

TARGETS=$(patsubst %-softmmu,%, $(filter %-softmmu,$(TARGET_DIRS)))
ifeq ($(CONFIG_POSIX),y)
QTEST_TARGETS=$(foreach TARGET,$(TARGETS), $(if $(check-qtest-$(TARGET)-y), $(TARGET),))
check-qtest-$(CONFIG_POSIX)=$(foreach TARGET,$(TARGETS), $(check-qtest-$(TARGET)-y))
check-qtest-y=$(foreach TARGET,$(TARGETS), $(check-qtest-$(TARGET)-y))
endif

qtest-obj-y = tests/libqtest.o libqemuutil.a libqemustub.a
$(check-qtest-y): $(qtest-obj-y)
Expand Down
33 changes: 33 additions & 0 deletions tests/i82801b11-test.c
@@ -0,0 +1,33 @@
/*
* QTest testcase for i82801b11
*
* Copyright (c) 2014 SUSE LINUX Products GmbH
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/

#include <glib.h>
#include <string.h>
#include "libqtest.h"
#include "qemu/osdep.h"

/* Tests only initialization so far. TODO: Replace with functional tests */
static void nop(void)
{
}

int main(int argc, char **argv)
{
int ret;

g_test_init(&argc, &argv, NULL);
qtest_add_func("/i82801b11/nop", nop);

qtest_start("-machine q35 -device i82801b11-bridge,bus=pcie.0,addr=1e.0");
ret = g_test_run();

qtest_end();

return ret;
}
65 changes: 48 additions & 17 deletions tests/libqtest.c
Expand Up @@ -48,6 +48,9 @@ struct QTestState
struct sigaction sigact_old; /* restored on exit */
};

static GList *qtest_instances;
static struct sigaction sigact_old;

#define g_assert_no_errno(ret) do { \
g_assert_cmpint(ret, !=, -1); \
} while (0)
Expand Down Expand Up @@ -104,7 +107,28 @@ static void kill_qemu(QTestState *s)

static void sigabrt_handler(int signo)
{
kill_qemu(global_qtest);
GList *elem;
for (elem = qtest_instances; elem; elem = elem->next) {
kill_qemu(elem->data);
}
}

static void setup_sigabrt_handler(void)
{
struct sigaction sigact;

/* Catch SIGABRT to clean up on g_assert() failure */
sigact = (struct sigaction){
.sa_handler = sigabrt_handler,
.sa_flags = SA_RESETHAND,
};
sigemptyset(&sigact.sa_mask);
sigaction(SIGABRT, &sigact, &sigact_old);
}

static void cleanup_sigabrt_handler(void)
{
sigaction(SIGABRT, &sigact_old, NULL);
}

QTestState *qtest_init(const char *extra_args)
Expand All @@ -115,26 +139,24 @@ QTestState *qtest_init(const char *extra_args)
gchar *qmp_socket_path;
gchar *command;
const char *qemu_binary;
struct sigaction sigact;

qemu_binary = getenv("QTEST_QEMU_BINARY");
g_assert(qemu_binary != NULL);

global_qtest = s = g_malloc(sizeof(*s));
s = g_malloc(sizeof(*s));

socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());

sock = init_socket(socket_path);
qmpsock = init_socket(qmp_socket_path);

/* Catch SIGABRT to clean up on g_assert() failure */
sigact = (struct sigaction){
.sa_handler = sigabrt_handler,
.sa_flags = SA_RESETHAND,
};
sigemptyset(&sigact.sa_mask);
sigaction(SIGABRT, &sigact, &s->sigact_old);
/* Only install SIGABRT handler once */
if (!qtest_instances) {
setup_sigabrt_handler();
}

qtest_instances = g_list_prepend(qtest_instances, s);

s->qemu_pid = fork();
if (s->qemu_pid == 0) {
Expand Down Expand Up @@ -180,8 +202,12 @@ QTestState *qtest_init(const char *extra_args)

void qtest_quit(QTestState *s)
{
sigaction(SIGABRT, &s->sigact_old, NULL);
global_qtest = NULL;
/* Uninstall SIGABRT handler on last instance */
if (qtest_instances && !qtest_instances->next) {
cleanup_sigabrt_handler();
}

qtest_instances = g_list_remove(qtest_instances, s);

kill_qemu(s);
close(s->fd);
Expand Down Expand Up @@ -319,14 +345,10 @@ static void qmp_response(JSONMessageParser *parser, QList *tokens)
qmp->response = (QDict *)obj;
}

QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
QDict *qtest_qmp_receive(QTestState *s)
{
QMPResponseParser qmp;

/* Send QMP request */
socket_sendf(s->qmp_fd, fmt, ap);

/* Receive reply */
qmp.response = NULL;
json_message_parser_init(&qmp.parser, qmp_response);
while (!qmp.response) {
Expand All @@ -350,6 +372,15 @@ QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
return qmp.response;
}

QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
{
/* Send QMP request */
socket_sendf(s->qmp_fd, fmt, ap);

/* Receive reply */
return qtest_qmp_receive(s);
}

QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
{
va_list ap;
Expand Down
22 changes: 21 additions & 1 deletion tests/libqtest.h
Expand Up @@ -82,6 +82,14 @@ void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap);
*/
QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap);

/**
* qtest_receive:
* @s: #QTestState instance to operate on.
*
* Reads a QMP message from QEMU and returns the response.
*/
QDict *qtest_qmp_receive(QTestState *s);

/**
* qtest_get_irq:
* @s: #QTestState instance to operate on.
Expand Down Expand Up @@ -335,7 +343,8 @@ void qtest_add_func(const char *str, void (*fn));
*/
static inline QTestState *qtest_start(const char *args)
{
return qtest_init(args);
global_qtest = qtest_init(args);
return global_qtest;
}

/**
Expand All @@ -346,6 +355,7 @@ static inline QTestState *qtest_start(const char *args)
static inline void qtest_end(void)
{
qtest_quit(global_qtest);
global_qtest = NULL;
}

/**
Expand All @@ -364,6 +374,16 @@ QDict *qmp(const char *fmt, ...);
*/
void qmp_discard_response(const char *fmt, ...);

/**
* qmp_receive:
*
* Reads a QMP message from QEMU and returns the response.
*/
static inline QDict *qmp_receive(void)
{
return qtest_qmp_receive(global_qtest);
}

/**
* get_irq:
* @num: Interrupt to observe.
Expand Down
34 changes: 34 additions & 0 deletions tests/nvme-test.c
@@ -0,0 +1,34 @@
/*
* QTest testcase for NVMe
*
* Copyright (c) 2014 SUSE LINUX Products GmbH
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/

#include <glib.h>
#include <string.h>
#include "libqtest.h"
#include "qemu/osdep.h"

/* Tests only initialization so far. TODO: Replace with functional tests */
static void nop(void)
{
}

int main(int argc, char **argv)
{
int ret;

g_test_init(&argc, &argv, NULL);
qtest_add_func("/nvme/nop", nop);

qtest_start("-drive id=drv0,if=none,file=/dev/null "
"-device nvme,drive=drv0,serial=foo");
ret = g_test_run();

qtest_end();

return ret;
}

0 comments on commit 95224e8

Please sign in to comment.