diff mbox

[RFC,2/3] tests/pxe-test: add testcase using vhost-user-bridge

Message ID 20170712094149.23069-3-jfreimann@redhat.com
State New
Headers show

Commit Message

Jens Freimann July 12, 2017, 9:41 a.m. UTC
From: Jens Freimann <jfreiman@redhat.com>

Add a test to pxe-test using the vhost-user interface. 
Create a vhost-user-bridge process and connect it to qemu.

Signed-off-by: Jens Freimann <jfreimann@redhat.com>
---
 tests/Makefile.include |   4 +-
 tests/pxe-test.c       | 106 ++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 108 insertions(+), 2 deletions(-)

Comments

Maxime Coquelin July 12, 2017, 3:39 p.m. UTC | #1
On 07/12/2017 11:41 AM, Jens Freimann wrote:
> From: Jens Freimann <jfreiman@redhat.com>
> 
> Add a test to pxe-test using the vhost-user interface.
> Create a vhost-user-bridge process and connect it to qemu.
> 
> Signed-off-by: Jens Freimann <jfreimann@redhat.com>
> ---
>   tests/Makefile.include |   4 +-
>   tests/pxe-test.c       | 106 ++++++++++++++++++++++++++++++++++++++++++++++++-
>   2 files changed, 108 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index 18cd06a..eccb27e 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -698,7 +698,8 @@ tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y)
>   tests/boot-serial-test$(EXESUF): tests/boot-serial-test.o $(libqos-obj-y)
>   tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \
>   	tests/boot-sector.o tests/acpi-utils.o $(libqos-obj-y)
> -tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y)
> +tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o \
> +    tests/vhost-user-bridge$(EXESUF) $(libqos-obj-y)
>   tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y)
>   tests/ds1338-test$(EXESUF): tests/ds1338-test.o $(libqos-imx-obj-y)
>   tests/m25p80-test$(EXESUF): tests/m25p80-test.o
> @@ -826,6 +827,7 @@ $(patsubst %, check-qtest-%, $(QTEST_TARGETS)): check-qtest-%: $(check-qtest-y)
>   	$(if $(CONFIG_GCOV),@rm -f *.gcda */*.gcda */*/*.gcda */*/*/*.gcda,)
>   	$(call quiet-command,QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \
>   		QTEST_QEMU_IMG=qemu-img$(EXESUF) \
> +		QTEST_VUBR_BINARY=./tests/vhost-user-bridge$(EXESUF) \
>   		MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$((RANDOM % 255 + 1))} \
>   		gtester $(GTESTER_OPTIONS) -m=$(SPEED) $(check-qtest-$*-y) $(check-qtest-generic-y),"GTESTER","$@")
>   	$(if $(CONFIG_GCOV),@for f in $(gcov-files-$*-y) $(gcov-files-generic-y); do \
> diff --git a/tests/pxe-test.c b/tests/pxe-test.c
> index 34282d3..5a0d182 100644
> --- a/tests/pxe-test.c
> +++ b/tests/pxe-test.c
> @@ -5,7 +5,8 @@
>    *
>    * Authors:
>    *  Michael S. Tsirkin <mst@redhat.com>,
> - *  Victor Kaplansky <victork@redhat.com>
> + *  Victor Kaplansky <victork@redhat.com>,
> + *  Jens Freimann <jfreiman@redhat.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.
> @@ -13,13 +14,115 @@
>   
>   #include "qemu/osdep.h"
>   #include <glib/gstdio.h>
> +#include <glib.h>
>   #include "qemu-common.h"
>   #include "libqtest.h"
>   #include "boot-sector.h"
> +#include <sys/vfs.h>
>   
> +#define LPORT 5555
> +#define RPORT 4444
>   #define NETNAME "net0"
> +#define QEMU_CMD_MEM    "--enable-kvm -m %d -object memory-backend-file,id=mem,size=%dM,"\
> +                        "mem-path=%s,share=on -numa node,memdev=mem -mem-prealloc "
> +#define QEMU_CMD_CHR    " -chardev socket,id=%s,path=%s"
> +#define QEMU_CMD_NETDEV " -device virtio-net-pci,netdev=net0 "\
> +                        " -netdev vhost-user,id=net0,chardev=%s,vhostforce "\
> +                        " -netdev user,id=n0,tftp=./,bootfile=%s "\
> +                        " -netdev socket,id=n1,udp=localhost:%d,localaddr=localhost:%d"
> +#define QEMU_CMD_NET    " -device virtio-net-pci,netdev=n0 "\
> +                        " -device virtio-net-pci,netdev=n1 "
> +
> +#define QEMU_CMD        QEMU_CMD_MEM QEMU_CMD_CHR \
> +                        QEMU_CMD_NETDEV QEMU_CMD_NET
> +
> +#define HUGETLBFS_MAGIC       0x958458f6
> +#define VUBR_SOCK "vubr.sock"
> +#define MEMSZ 1024
>   
>   static char disk[] = "tests/pxe-test-disk-XXXXXX";
> +static const char *root;
> +static const char *tmpfs;
> +static const char *tmpfs2;
Can't these be declared directly in test_pxe_vhost_user()?

> +
> +static const char *init_hugepagefs(const char *path)
> +{
> +    struct statfs fs;
> +    int ret;
> +
> +    if (access(path, R_OK | W_OK | X_OK)) {
> +        g_test_message("access on path (%s): %s\n", path, strerror(errno));
> +        return NULL;
> +    }
> +
> +    do {
> +        ret = statfs(path, &fs);
> +    } while (ret != 0 && errno == EINTR);
> +
> +    if (ret != 0) {
> +        g_test_message("statfs on path (%s): %s\n", path, strerror(errno));
> +        return NULL;
> +    }
> +
> +    if (fs.f_type != HUGETLBFS_MAGIC) {
> +        g_test_message("Warning: path not on HugeTLBFS: %s\n", path);
> +        return NULL;
> +    }
> +
> +    return path;
> +}
> +
> +static void test_pxe_vhost_user(void)
> +{
> +    char template[] = "/tmp/vhost-user-bridge-XXXXXX";
> +    char template2[] = "/tmp/hugepages-XXXXXX";
> +    gchar *vubr_args[] = {NULL, NULL, NULL, NULL};
> +    const char *hugefs;
> +    GError *error = NULL;
> +    char *vubr_binary;
> +    char *qemu_args;
> +    GPid vubr_pid;
> +
> +    tmpfs = mkdtemp(template);
> +    if (!tmpfs) {
> +        g_test_message("mkdtemp on path(%s): %s\n",
> +                       template, strerror(errno));
> +    }
> +    vubr_binary = getenv("QTEST_VUBR_BINARY");
> +    g_assert(vubr_binary);
> +    vubr_args[0] = g_strdup_printf("%s", vubr_binary);
> +    vubr_args[1] = g_strdup_printf("-u");
> +    vubr_args[2] = g_strdup_printf("%s/%s", tmpfs, VUBR_SOCK);
> +    g_spawn_async(NULL, vubr_args, NULL,
> +                  G_SPAWN_SEARCH_PATH_FROM_ENVP |
> +                  G_SPAWN_SEARCH_PATH,
> +                  NULL, NULL, &vubr_pid, &error);
> +    g_assert_no_error(error);
> +
> +    hugefs = getenv("QTEST_HUGETLBFS_PATH");
> +    if (hugefs) {
> +        root = init_hugepagefs(hugefs);
> +        g_assert(root);
> +    } else {
> +        tmpfs2 = mkdtemp(template2);
> +        g_assert(tmpfs2);
> +        root = tmpfs2;
> +    }
> +
> +    qemu_args = g_strdup_printf(QEMU_CMD, MEMSZ, MEMSZ, (root),
> +                                "char0", vubr_args[2], "char0", disk,
> +                                RPORT, LPORT);
> +    qtest_start(qemu_args);
> +    boot_sector_test();
> +    qtest_quit(global_qtest);
> +    g_free(qemu_args);
> +    g_free(vubr_args[0]);
> +    g_free(vubr_args[1]);
> +    g_free(vubr_args[2]);
> +    g_assert_cmpint (g_remove(g_strdup_printf("%s/%s", tmpfs,VUBR_SOCK)),
> +		     ==, 0);
> +    g_assert_cmpint(rmdir(tmpfs), ==, 0);
If created, shouldn't tmpfs2 be cleaned here too?

> +}
>   
>   static void test_pxe_one(const char *params, bool ipv6)
>   {
> @@ -65,6 +168,7 @@ int main(int argc, char *argv[])
>       if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
>           qtest_add_func("pxe/e1000", test_pxe_e1000);
>           qtest_add_func("pxe/virtio", test_pxe_virtio_pci);
> +        qtest_add_func("pxe/vhost-user", test_pxe_vhost_user);
>       } else if (strcmp(arch, "ppc64") == 0) {
>           qtest_add_func("pxe/virtio", test_pxe_virtio_pci);
>           qtest_add_func("pxe/spapr-vlan", test_pxe_spapr_vlan);
>
Jens Freimann July 12, 2017, 3:45 p.m. UTC | #2
On Wed, Jul 12, 2017 at 05:39:31PM +0200, Maxime Coquelin wrote:
>
>
>On 07/12/2017 11:41 AM, Jens Freimann wrote:
>>From: Jens Freimann <jfreiman@redhat.com>
>>
>>Add a test to pxe-test using the vhost-user interface.
>>Create a vhost-user-bridge process and connect it to qemu.
>>
>>Signed-off-by: Jens Freimann <jfreimann@redhat.com>
>>---
>>  tests/Makefile.include |   4 +-
>>  tests/pxe-test.c       | 106 ++++++++++++++++++++++++++++++++++++++++++++++++-
>>  2 files changed, 108 insertions(+), 2 deletions(-)
>>
>>diff --git a/tests/Makefile.include b/tests/Makefile.include
>>index 18cd06a..eccb27e 100644
>>--- a/tests/Makefile.include
>>+++ b/tests/Makefile.include
>>@@ -698,7 +698,8 @@ tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y)
>>  tests/boot-serial-test$(EXESUF): tests/boot-serial-test.o $(libqos-obj-y)
>>  tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \
>>  	tests/boot-sector.o tests/acpi-utils.o $(libqos-obj-y)
>>-tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y)
>>+tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o \
>>+    tests/vhost-user-bridge$(EXESUF) $(libqos-obj-y)
>>  tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y)
>>  tests/ds1338-test$(EXESUF): tests/ds1338-test.o $(libqos-imx-obj-y)
>>  tests/m25p80-test$(EXESUF): tests/m25p80-test.o
>>@@ -826,6 +827,7 @@ $(patsubst %, check-qtest-%, $(QTEST_TARGETS)): check-qtest-%: $(check-qtest-y)
>>  	$(if $(CONFIG_GCOV),@rm -f *.gcda */*.gcda */*/*.gcda */*/*/*.gcda,)
>>  	$(call quiet-command,QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \
>>  		QTEST_QEMU_IMG=qemu-img$(EXESUF) \
>>+		QTEST_VUBR_BINARY=./tests/vhost-user-bridge$(EXESUF) \
>>  		MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$((RANDOM % 255 + 1))} \
>>  		gtester $(GTESTER_OPTIONS) -m=$(SPEED) $(check-qtest-$*-y) $(check-qtest-generic-y),"GTESTER","$@")
>>  	$(if $(CONFIG_GCOV),@for f in $(gcov-files-$*-y) $(gcov-files-generic-y); do \
>>diff --git a/tests/pxe-test.c b/tests/pxe-test.c
>>index 34282d3..5a0d182 100644
>>--- a/tests/pxe-test.c
>>+++ b/tests/pxe-test.c
>>@@ -5,7 +5,8 @@
>>   *
>>   * Authors:
>>   *  Michael S. Tsirkin <mst@redhat.com>,
>>- *  Victor Kaplansky <victork@redhat.com>
>>+ *  Victor Kaplansky <victork@redhat.com>,
>>+ *  Jens Freimann <jfreiman@redhat.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.
>>@@ -13,13 +14,115 @@
>>  #include "qemu/osdep.h"
>>  #include <glib/gstdio.h>
>>+#include <glib.h>
>>  #include "qemu-common.h"
>>  #include "libqtest.h"
>>  #include "boot-sector.h"
>>+#include <sys/vfs.h>
>>+#define LPORT 5555
>>+#define RPORT 4444
>>  #define NETNAME "net0"
>>+#define QEMU_CMD_MEM    "--enable-kvm -m %d -object memory-backend-file,id=mem,size=%dM,"\
>>+                        "mem-path=%s,share=on -numa node,memdev=mem -mem-prealloc "
>>+#define QEMU_CMD_CHR    " -chardev socket,id=%s,path=%s"
>>+#define QEMU_CMD_NETDEV " -device virtio-net-pci,netdev=net0 "\
>>+                        " -netdev vhost-user,id=net0,chardev=%s,vhostforce "\
>>+                        " -netdev user,id=n0,tftp=./,bootfile=%s "\
>>+                        " -netdev socket,id=n1,udp=localhost:%d,localaddr=localhost:%d"
>>+#define QEMU_CMD_NET    " -device virtio-net-pci,netdev=n0 "\
>>+                        " -device virtio-net-pci,netdev=n1 "
>>+
>>+#define QEMU_CMD        QEMU_CMD_MEM QEMU_CMD_CHR \
>>+                        QEMU_CMD_NETDEV QEMU_CMD_NET
>>+
>>+#define HUGETLBFS_MAGIC       0x958458f6
>>+#define VUBR_SOCK "vubr.sock"
>>+#define MEMSZ 1024
>>  static char disk[] = "tests/pxe-test-disk-XXXXXX";
>>+static const char *root;
>>+static const char *tmpfs;
>>+static const char *tmpfs2;
>Can't these be declared directly in test_pxe_vhost_user()?

I think they can.

>>+
>>+static const char *init_hugepagefs(const char *path)
>>+{
>>+    struct statfs fs;
>>+    int ret;
>>+
>>+    if (access(path, R_OK | W_OK | X_OK)) {
>>+        g_test_message("access on path (%s): %s\n", path, strerror(errno));
>>+        return NULL;
>>+    }
>>+
>>+    do {
>>+        ret = statfs(path, &fs);
>>+    } while (ret != 0 && errno == EINTR);
>>+
>>+    if (ret != 0) {
>>+        g_test_message("statfs on path (%s): %s\n", path, strerror(errno));
>>+        return NULL;
>>+    }
>>+
>>+    if (fs.f_type != HUGETLBFS_MAGIC) {
>>+        g_test_message("Warning: path not on HugeTLBFS: %s\n", path);
>>+        return NULL;
>>+    }
>>+
>>+    return path;
>>+}
>>+
>>+static void test_pxe_vhost_user(void)
>>+{
>>+    char template[] = "/tmp/vhost-user-bridge-XXXXXX";
>>+    char template2[] = "/tmp/hugepages-XXXXXX";
>>+    gchar *vubr_args[] = {NULL, NULL, NULL, NULL};
>>+    const char *hugefs;
>>+    GError *error = NULL;
>>+    char *vubr_binary;
>>+    char *qemu_args;
>>+    GPid vubr_pid;
>>+
>>+    tmpfs = mkdtemp(template);
>>+    if (!tmpfs) {
>>+        g_test_message("mkdtemp on path(%s): %s\n",
>>+                       template, strerror(errno));
>>+    }
>>+    vubr_binary = getenv("QTEST_VUBR_BINARY");
>>+    g_assert(vubr_binary);
>>+    vubr_args[0] = g_strdup_printf("%s", vubr_binary);
>>+    vubr_args[1] = g_strdup_printf("-u");
>>+    vubr_args[2] = g_strdup_printf("%s/%s", tmpfs, VUBR_SOCK);
>>+    g_spawn_async(NULL, vubr_args, NULL,
>>+                  G_SPAWN_SEARCH_PATH_FROM_ENVP |
>>+                  G_SPAWN_SEARCH_PATH,
>>+                  NULL, NULL, &vubr_pid, &error);
>>+    g_assert_no_error(error);
>>+
>>+    hugefs = getenv("QTEST_HUGETLBFS_PATH");
>>+    if (hugefs) {
>>+        root = init_hugepagefs(hugefs);
>>+        g_assert(root);
>>+    } else {
>>+        tmpfs2 = mkdtemp(template2);
>>+        g_assert(tmpfs2);
>>+        root = tmpfs2;
>>+    }
>>+
>>+    qemu_args = g_strdup_printf(QEMU_CMD, MEMSZ, MEMSZ, (root),
>>+                                "char0", vubr_args[2], "char0", disk,
>>+                                RPORT, LPORT);
>>+    qtest_start(qemu_args);
>>+    boot_sector_test();
>>+    qtest_quit(global_qtest);
>>+    g_free(qemu_args);
>>+    g_free(vubr_args[0]);
>>+    g_free(vubr_args[1]);
>>+    g_free(vubr_args[2]);
>>+    g_assert_cmpint (g_remove(g_strdup_printf("%s/%s", tmpfs,VUBR_SOCK)),
>>+		     ==, 0);
>>+    g_assert_cmpint(rmdir(tmpfs), ==, 0);
>If created, shouldn't tmpfs2 be cleaned here too?

You're right. I'll add this in the next version.

Thanks for the review!

regards,
Jens
diff mbox

Patch

diff --git a/tests/Makefile.include b/tests/Makefile.include
index 18cd06a..eccb27e 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -698,7 +698,8 @@  tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y)
 tests/boot-serial-test$(EXESUF): tests/boot-serial-test.o $(libqos-obj-y)
 tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \
 	tests/boot-sector.o tests/acpi-utils.o $(libqos-obj-y)
-tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y)
+tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o \
+    tests/vhost-user-bridge$(EXESUF) $(libqos-obj-y)
 tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y)
 tests/ds1338-test$(EXESUF): tests/ds1338-test.o $(libqos-imx-obj-y)
 tests/m25p80-test$(EXESUF): tests/m25p80-test.o
@@ -826,6 +827,7 @@  $(patsubst %, check-qtest-%, $(QTEST_TARGETS)): check-qtest-%: $(check-qtest-y)
 	$(if $(CONFIG_GCOV),@rm -f *.gcda */*.gcda */*/*.gcda */*/*/*.gcda,)
 	$(call quiet-command,QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \
 		QTEST_QEMU_IMG=qemu-img$(EXESUF) \
+		QTEST_VUBR_BINARY=./tests/vhost-user-bridge$(EXESUF) \
 		MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$((RANDOM % 255 + 1))} \
 		gtester $(GTESTER_OPTIONS) -m=$(SPEED) $(check-qtest-$*-y) $(check-qtest-generic-y),"GTESTER","$@")
 	$(if $(CONFIG_GCOV),@for f in $(gcov-files-$*-y) $(gcov-files-generic-y); do \
diff --git a/tests/pxe-test.c b/tests/pxe-test.c
index 34282d3..5a0d182 100644
--- a/tests/pxe-test.c
+++ b/tests/pxe-test.c
@@ -5,7 +5,8 @@ 
  *
  * Authors:
  *  Michael S. Tsirkin <mst@redhat.com>,
- *  Victor Kaplansky <victork@redhat.com>
+ *  Victor Kaplansky <victork@redhat.com>,
+ *  Jens Freimann <jfreiman@redhat.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.
@@ -13,13 +14,115 @@ 
 
 #include "qemu/osdep.h"
 #include <glib/gstdio.h>
+#include <glib.h>
 #include "qemu-common.h"
 #include "libqtest.h"
 #include "boot-sector.h"
+#include <sys/vfs.h>
 
+#define LPORT 5555
+#define RPORT 4444
 #define NETNAME "net0"
+#define QEMU_CMD_MEM    "--enable-kvm -m %d -object memory-backend-file,id=mem,size=%dM,"\
+                        "mem-path=%s,share=on -numa node,memdev=mem -mem-prealloc "
+#define QEMU_CMD_CHR    " -chardev socket,id=%s,path=%s"
+#define QEMU_CMD_NETDEV " -device virtio-net-pci,netdev=net0 "\
+                        " -netdev vhost-user,id=net0,chardev=%s,vhostforce "\
+                        " -netdev user,id=n0,tftp=./,bootfile=%s "\
+                        " -netdev socket,id=n1,udp=localhost:%d,localaddr=localhost:%d"
+#define QEMU_CMD_NET    " -device virtio-net-pci,netdev=n0 "\
+                        " -device virtio-net-pci,netdev=n1 "
+
+#define QEMU_CMD        QEMU_CMD_MEM QEMU_CMD_CHR \
+                        QEMU_CMD_NETDEV QEMU_CMD_NET
+
+#define HUGETLBFS_MAGIC       0x958458f6
+#define VUBR_SOCK "vubr.sock"
+#define MEMSZ 1024
 
 static char disk[] = "tests/pxe-test-disk-XXXXXX";
+static const char *root;
+static const char *tmpfs;
+static const char *tmpfs2;
+
+static const char *init_hugepagefs(const char *path)
+{
+    struct statfs fs;
+    int ret;
+
+    if (access(path, R_OK | W_OK | X_OK)) {
+        g_test_message("access on path (%s): %s\n", path, strerror(errno));
+        return NULL;
+    }
+
+    do {
+        ret = statfs(path, &fs);
+    } while (ret != 0 && errno == EINTR);
+
+    if (ret != 0) {
+        g_test_message("statfs on path (%s): %s\n", path, strerror(errno));
+        return NULL;
+    }
+
+    if (fs.f_type != HUGETLBFS_MAGIC) {
+        g_test_message("Warning: path not on HugeTLBFS: %s\n", path);
+        return NULL;
+    }
+
+    return path;
+}
+
+static void test_pxe_vhost_user(void)
+{
+    char template[] = "/tmp/vhost-user-bridge-XXXXXX";
+    char template2[] = "/tmp/hugepages-XXXXXX";
+    gchar *vubr_args[] = {NULL, NULL, NULL, NULL};
+    const char *hugefs;
+    GError *error = NULL;
+    char *vubr_binary;
+    char *qemu_args;
+    GPid vubr_pid;
+
+    tmpfs = mkdtemp(template);
+    if (!tmpfs) {
+        g_test_message("mkdtemp on path(%s): %s\n",
+                       template, strerror(errno));
+    }
+    vubr_binary = getenv("QTEST_VUBR_BINARY");
+    g_assert(vubr_binary);
+    vubr_args[0] = g_strdup_printf("%s", vubr_binary);
+    vubr_args[1] = g_strdup_printf("-u");
+    vubr_args[2] = g_strdup_printf("%s/%s", tmpfs, VUBR_SOCK);
+    g_spawn_async(NULL, vubr_args, NULL,
+                  G_SPAWN_SEARCH_PATH_FROM_ENVP |
+                  G_SPAWN_SEARCH_PATH,
+                  NULL, NULL, &vubr_pid, &error);
+    g_assert_no_error(error);
+
+    hugefs = getenv("QTEST_HUGETLBFS_PATH");
+    if (hugefs) {
+        root = init_hugepagefs(hugefs);
+        g_assert(root);
+    } else {
+        tmpfs2 = mkdtemp(template2);
+        g_assert(tmpfs2);
+        root = tmpfs2;
+    }
+
+    qemu_args = g_strdup_printf(QEMU_CMD, MEMSZ, MEMSZ, (root),
+                                "char0", vubr_args[2], "char0", disk,
+                                RPORT, LPORT);
+    qtest_start(qemu_args);
+    boot_sector_test();
+    qtest_quit(global_qtest);
+    g_free(qemu_args);
+    g_free(vubr_args[0]);
+    g_free(vubr_args[1]);
+    g_free(vubr_args[2]);
+    g_assert_cmpint (g_remove(g_strdup_printf("%s/%s", tmpfs,VUBR_SOCK)),
+		     ==, 0);
+    g_assert_cmpint(rmdir(tmpfs), ==, 0);
+}
 
 static void test_pxe_one(const char *params, bool ipv6)
 {
@@ -65,6 +168,7 @@  int main(int argc, char *argv[])
     if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
         qtest_add_func("pxe/e1000", test_pxe_e1000);
         qtest_add_func("pxe/virtio", test_pxe_virtio_pci);
+        qtest_add_func("pxe/vhost-user", test_pxe_vhost_user);
     } else if (strcmp(arch, "ppc64") == 0) {
         qtest_add_func("pxe/virtio", test_pxe_virtio_pci);
         qtest_add_func("pxe/spapr-vlan", test_pxe_spapr_vlan);