Pretty basic for the moment but the interface is pretty simple. Signed-off-by: Anthony Liguori <aligu...@us.ibm.com> --- tests/Makefile | 3 ++ tests/spapr-vty-test.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 tests/spapr-vty-test.c
diff --git a/tests/Makefile b/tests/Makefile index c107489..7c0ce1a 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -67,6 +67,8 @@ gcov-files-sparc64-y += hw/m48t59.c check-qtest-arm-y = tests/tmp105-test$(EXESUF) gcov-files-arm-y += hw/tmp105.c +check-qtest-ppc64-y = tests/spapr-vty-test$(EXESUF) + GENERATED_HEADERS += tests/test-qapi-types.h tests/test-qapi-visit.h tests/test-qmp-commands.h test-obj-y = tests/check-qint.o tests/check-qstring.o tests/check-qdict.o \ @@ -133,6 +135,7 @@ tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y) 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/spapr-vty-test$(EXESUF): tests/spapr-vty-test.o # QTest rules diff --git a/tests/spapr-vty-test.c b/tests/spapr-vty-test.c new file mode 100644 index 0000000..8e3908b --- /dev/null +++ b/tests/spapr-vty-test.c @@ -0,0 +1,89 @@ +/* + * QTest testcase for the sPAPR VTY + * + * Copyright IBM, Corp. 2013 + * + * Authors: + * Anthony Liguori <aligu...@us.ibm.com> + * + * 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 "libqtest.h" + +#include <glib.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> + +#define H_GET_TERM_CHAR 0x54 +#define H_PUT_TERM_CHAR 0x58 + +static char *qmp_ringbuf_read(const char *device, int max_len) +{ + size_t len; + char *ret; + char *ptr; + + ret = qtest_qmp(global_qtest, + "{ 'execute': 'ringbuf-read', " + " 'arguments': { 'device': '%s', 'size': %d } }", + device, max_len); + len = strlen(ret); + + /* Skip pass {"return" */ + ptr = strchr(ret, '"'); + g_assert(ptr != NULL); + ptr = strchr(ptr + 1, '"'); + g_assert(ptr != NULL); + + /* Start of data */ + ptr = strchr(ptr + 1, '"'); + g_assert(ptr != NULL); + ptr += 1; + + len -= ptr - ret; + memmove(ret, ptr, len); + ret[len] = 0; + + ptr = strrchr(ret, '"'); + g_assert(ptr != NULL); + *ptr = 0; + + return ret; +} + +static void vty_ping(void) +{ + const char *greeting = "Hello, world!"; + char *data; + int i; + + for (i = 0; greeting[i]; i++) { + spapr_hcall3(H_PUT_TERM_CHAR, 0, 1, (uint64_t)greeting[i] << 56); + } + + save_restore(); + + data = qmp_ringbuf_read("ring0", 16); + g_assert_cmpstr(data, ==, greeting); +} + +int main(int argc, char **argv) +{ + int ret; + + g_test_init(&argc, &argv, NULL); + + qtest_start("-display none -serial chardev:ring0 " + "-machine pseries -chardev memory,id=ring0,save=on"); + + qtest_add_func("/vty/ping", vty_ping); + ret = g_test_run(); + + qtest_quit(global_qtest); + + return ret; +} -- 1.8.0