From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59885) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNtf3-0003VO-Lq for qemu-devel@nongnu.org; Thu, 14 Jul 2016 23:19:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bNtex-0002ag-MW for qemu-devel@nongnu.org; Thu, 14 Jul 2016 23:19:30 -0400 Received: from ozlabs.org ([103.22.144.67]:46428) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNtew-0002Xf-Fo for qemu-devel@nongnu.org; Thu, 14 Jul 2016 23:19:27 -0400 Date: Fri, 15 Jul 2016 13:21:06 +1000 From: David Gibson Message-ID: <20160715032106.GV14615@voom.fritz.box> References: <1468490266-3468-1-git-send-email-thuth@redhat.com> <1468490266-3468-3-git-send-email-thuth@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="WcQ7DTTOeW3GIUV5" Content-Disposition: inline In-Reply-To: <1468490266-3468-3-git-send-email-thuth@redhat.com> Subject: Re: [Qemu-devel] [PATCH 2/2] tests: Check serial output of firmware boot of some machines List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Thomas Huth Cc: qemu-devel@nongnu.org, Eric Blake , Markus Armbruster , Paolo Bonzini , Peter Maydell , Richard Henderson , Peter Crosthwaite , Eduardo Habkost --WcQ7DTTOeW3GIUV5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Jul 14, 2016 at 11:57:46AM +0200, Thomas Huth wrote: > Some of the machines that we have got a firmware image for write > some output to the serial console while booting up. We can use > this output to make sure that the machine is basically working, > so this adds a test that checks the output of these machines > for some well-known "magic" strings. >=20 > Signed-off-by: Thomas Huth I love this idea. A couple of queries about the implemntation. > --- > tests/Makefile.include | 8 ++++ > tests/boot-serial-test.c | 110 +++++++++++++++++++++++++++++++++++++++++= ++++++ > 2 files changed, 118 insertions(+) > create mode 100644 tests/boot-serial-test.c >=20 > diff --git a/tests/Makefile.include b/tests/Makefile.include > index b7784d3..ba1cc8d 100644 > --- a/tests/Makefile.include > +++ b/tests/Makefile.include > @@ -194,6 +194,7 @@ check-qtest-i386-y +=3D tests/hd-geo-test$(EXESUF) > gcov-files-i386-y +=3D hw/block/hd-geometry.c > check-qtest-i386-y +=3D tests/boot-order-test$(EXESUF) > check-qtest-i386-y +=3D tests/bios-tables-test$(EXESUF) > +check-qtest-i386-y +=3D tests/boot-serial-test$(EXESUF) > check-qtest-i386-y +=3D tests/pxe-test$(EXESUF) > check-qtest-i386-y +=3D tests/rtc-test$(EXESUF) > check-qtest-i386-y +=3D tests/ipmi-kcs-test$(EXESUF) > @@ -241,6 +242,8 @@ check-qtest-x86_64-y +=3D $(check-qtest-i386-y) > gcov-files-i386-y +=3D i386-softmmu/hw/timer/mc146818rtc.c > gcov-files-x86_64-y =3D $(subst i386-softmmu/,x86_64-softmmu/,$(gcov-fil= es-i386-y)) > =20 > +check-qtest-alpha-y =3D tests/boot-serial-test$(EXESUF) > + > check-qtest-mips-y =3D tests/endianness-test$(EXESUF) > check-qtest-mips64-y =3D tests/endianness-test$(EXESUF) > check-qtest-mips64el-y =3D tests/endianness-test$(EXESUF) > @@ -248,12 +251,14 @@ check-qtest-mips64el-y =3D tests/endianness-test$(E= XESUF) > check-qtest-ppc-y =3D tests/endianness-test$(EXESUF) > check-qtest-ppc-y +=3D tests/boot-order-test$(EXESUF) > check-qtest-ppc-y +=3D tests/prom-env-test$(EXESUF) > +check-qtest-ppc-y +=3D tests/boot-serial-test$(EXESUF) > =20 > check-qtest-ppc64-y =3D tests/endianness-test$(EXESUF) > check-qtest-ppc64-y +=3D tests/boot-order-test$(EXESUF) > check-qtest-ppc64-y +=3D tests/spapr-phb-test$(EXESUF) > gcov-files-ppc64-y +=3D ppc64-softmmu/hw/ppc/spapr_pci.c > check-qtest-ppc64-y +=3D tests/prom-env-test$(EXESUF) > +check-qtest-ppc64-y +=3D tests/boot-serial-test$(EXESUF) > =20 > check-qtest-sh4-y =3D tests/endianness-test$(EXESUF) > check-qtest-sh4eb-y =3D tests/endianness-test$(EXESUF) > @@ -277,6 +282,8 @@ gcov-files-arm-y +=3D arm-softmmu/hw/block/virtio-blk= =2Ec > check-qtest-microblazeel-y =3D $(check-qtest-microblaze-y) > check-qtest-xtensaeb-y =3D $(check-qtest-xtensa-y) > =20 > +check-qtest-s390x-y =3D tests/boot-serial-test$(EXESUF) > + > check-qtest-generic-y +=3D tests/qom-test$(EXESUF) > =20 > qapi-schema +=3D alternate-any.json > @@ -575,6 +582,7 @@ tests/ipmi-kcs-test$(EXESUF): tests/ipmi-kcs-test.o > tests/ipmi-bt-test$(EXESUF): tests/ipmi-bt-test.o > tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o > 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 $(libqos-obj-y) > tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-o= bj-y) > diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c > new file mode 100644 > index 0000000..3263dcd > --- /dev/null > +++ b/tests/boot-serial-test.c > @@ -0,0 +1,110 @@ > +/* > + * Test serial output of some machines. > + * > + * Copyright 2016 Thomas Huth, Red Hat Inc. > + * > + * This work is licensed under the terms of the GNU GPL, version 2 > + * or later. See the COPYING file in the top-level directory. > + * > + * This test is used to check that the serial output of the firmware > + * (that we provide for some machines) contains an expected string. > + * Thus we check that the firmware still boots at least to a certain > + * point and so we know that the machine is not completely broken. > + */ > + > +#include "qemu/osdep.h" > +#include "libqtest.h" > + > +typedef struct testdef { > + const char *arch; /* Target architecture */ > + const char *machine; /* Name of the machine */ > + const char *extra; /* Additional parameters */ > + const char *expect; /* Expected string in the serial output */ > +} testdef_t; > + > +static testdef_t tests[] =3D { > + { "alpha", "clipper", "", "PCI:" }, > + { "ppc", "ppce500", "", "U-Boot" }, > + { "ppc", "prep", "", "Open Hack'Ware BIOS" }, > + { "ppc64", "ppce500", "", "U-Boot" }, > + { "ppc64", "prep", "", "Open Hack'Ware BIOS" }, > + { "ppc64", "pseries", "", "Open Firmware" }, > + { "i386", "isapc", "-device sga", "SGABIOS" }, > + { "i386", "pc", "-device sga", "SGABIOS" }, > + { "i386", "q35", "-device sga", "SGABIOS" }, > + { "x86_64", "isapc", "-device sga", "SGABIOS" }, > + { "x86_64", "pc", "-device sga", "SGABIOS" }, > + { "x86_64", "q35", "-device sga", "SGABIOS" }, > + { "s390x", "s390-ccw-virtio", > + "-nodefaults -device sclpconsole,chardev=3Dserial0", "virtio devic= e" }, > + { NULL } > +}; > + > +static void check_guest_output(const testdef_t *test, int fd) > +{ > + bool output_ok =3D false; > + int i, pos =3D 0; > + char ch; > + > + /* Poll serial output... Wait at most 30 seconds */ > + for (i =3D 0; i < 3000; ++i) { > + while (read(fd, &ch, 1) =3D=3D 1) { It might be a good idea to check for actual errors from read() here. > + if (ch =3D=3D test->expect[pos]) { > + pos +=3D 1; > + if (test->expect[pos] =3D=3D '\0') { > + /* We've reached the end of the expected string! */ > + output_ok =3D true; > + goto done; > + } > + } else { > + pos =3D 0; > + } > + } > + g_usleep(10000); > + } > + > +done: > + g_assert(output_ok); > +} > + > +static void test_machine(const void *data) > +{ > + const testdef_t *test =3D data; > + char *args; > + char tmpname[] =3D "/tmp/qtest-boot-serial-XXXXXX"; > + int fd; > + > + fd =3D mkstemp(tmpname); > + g_assert(fd !=3D -1); > + > + args =3D g_strdup_printf("-M %s,accel=3Dtcg -chardev file,id=3Dseria= l0,path=3D%s" > + " -serial chardev:serial0 %s", test->machine, > + tmpname, test->extra); > + > + qtest_start(args); > + unlink(tmpname); > + > + check_guest_output(test, fd); > + qtest_quit(global_qtest); > + > + g_free(args); > + close(fd); > +} > + > +int main(int argc, char *argv[]) > +{ > + const char *arch =3D qtest_get_arch(); > + int i; > + > + g_test_init(&argc, &argv, NULL); > + > + for (i =3D 0; tests[i].arch !=3D NULL; i++) { > + if (strcmp(arch, tests[i].arch) =3D=3D 0) { > + char *name =3D g_strdup_printf("boot-serial/%s", tests[i].ma= chine); > + qtest_add_data_func(name, &tests[i], test_machine); Do we need some conditionals in case certain machine types are configured out? > + g_free(name); > + } > + } > + > + return g_test_run(); > +} --=20 David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson --WcQ7DTTOeW3GIUV5 Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXiFaiAAoJEGw4ysog2bOSV40P/R5rwb/NDJ/2QgCCZcwEwREO +h22tvP0Fmz5t0/cs/BgrAY+zt7Ny9QE37Y3OwneMVBX1keIfoSyAjuDHhwGMwpE 9mS4cTlf82zQu7e4etf/lTQ8rLD9pZRnHnXeq2PHVvW8cwq4BQuwgqiNj7oBhZUi lrZUoZfYHKZyDSBRcxawE20cFevPrRuNV6yW9JheW65O9GgixsVvZbxx58l9DeIN pZ6whD6wgQms+w0xMvBMhKaHWOgsXQgobG31SEEO/Jk6G/L2bh8y8s7ETCBAqLVx w3JWcojEGuNuOMAobOTHKN26d+lvExe/ynLnYS9+lhuykRVrx89TOlfRpkdeMh1O 8Qx0Qq8CkBx1wffNKuObKmPDL89Myun8yCjkY3nXQM8nXHdcwVShYjEu1hV3QV46 ZRCHBz+l2ODf1o5b3qWOSJC4UjvLrs97h+FwvVNI7Xyg+8mgM70RpzU+x0U0blzY ntlTMkUo+a+jD9kZ2YD+ifa/CWS6zMJIizlzGvHwBJPxihBctXJMQFucvzF6/9Jr 4/RCvhWtB6wprl+vmMxd4vqJBE74GThoq29jxrpP/yJ5cls7XNyudWOuDPF6ijh0 rwdp98FKmSCXcx1q56NIRgmzMu7CTq/+EXobaM3O8RB2xkcF/J32Kgl5GWOrJWoV MaZrtr1yrj0PIdtBSH+b =riz1 -----END PGP SIGNATURE----- --WcQ7DTTOeW3GIUV5--