All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL v8 00/35] Misc patches for 2018-12-18
@ 2019-01-11 14:50 Paolo Bonzini
  2019-01-11 14:50 ` [Qemu-devel] [PULL 22/35] test: replace gtester with a TAP driver Paolo Bonzini
  2019-01-11 16:45 ` [Qemu-devel] [PULL v8 00/35] Misc patches for 2018-12-18 Peter Maydell
  0 siblings, 2 replies; 3+ messages in thread
From: Paolo Bonzini @ 2019-01-11 14:50 UTC (permalink / raw)
  To: qemu-devel

The following changes since commit a311f891abf3833c1e4c5a62a6e5b0f1b81f22c3:

  Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-4.0-pull-request' into staging (2019-01-10 17:49:54 +0000)

are available in the Git repository at:

  git://github.com/bonzini/qemu.git tags/for-upstream

for you to fetch changes up to 7d37435bd5801bb49e1c4b550fedd1c5fe143131:

  avoid TABs in files that only contain a few (2019-01-11 15:46:56 +0100)

----------------------------------------------------------------
* HAX support for Linux hosts (Alejandro)
* esp bugfixes (Guenter)
* Windows build cleanup (Marc-André)
* checkpatch logic improvements (Paolo)
* coalesced range bugfix (Paolo)
* switch testsuite to TAP (Paolo)
* QTAILQ rewrite (Paolo)
* block/iscsi.c cancellation fixes (Stefan)
* improve selection of the default accelerator (Thomas)

----------------------------------------------------------------
v7->v8: dropped Debian dockerfile changes altogether

Alexandro Sanchez Bach (1):
      hax: Support for Linux hosts

Guenter Roeck (2):
      esp-pci: Fix status register write erase control
      scsi: esp: Defer command completion until previous interrupts have been handled

Marc-André Lureau (4):
      build-sys: don't include windows.h, osdep.h does it
      build-sys: move windows defines in osdep.h header
      build-sys: build with Vista API by default
      qga: drop < Vista compatibility

Paolo Bonzini (21):
      checkpatch: fix premature exit when no input or --mailback
      checkpatch: check Signed-off-by in --mailback mode
      checkpatch: improve handling of multiple patches or files
      checkpatch: colorize output to terminal
      pam: wrap MemoryRegion initialization in a transaction
      memory: extract flat_range_coalesced_io_{del,add}
      memory: avoid unnecessary coalesced_io_del operations
      memory: update coalesced_range on transaction_commit
      test: execute g_test_run when tests are skipped
      test: replace gtester with a TAP driver
      qemu/queue.h: do not access tqe_prev directly
      vfio: make vfio_address_spaces static
      qemu/queue.h: leave head structs anonymous unless necessary
      qemu/queue.h: typedef QTAILQ heads
      qemu/queue.h: remove Q_TAILQ_{HEAD,ENTRY}
      qemu/queue.h: reimplement QTAILQ without pointer-to-pointers
      qemu/queue.h: simplify reverse access to QTAILQ
      checkpatch: warn about qemu/queue.h head structs that are not typedef-ed
      scripts: add script to convert multiline comments into 4-line format
      remove space-tab sequences
      avoid TABs in files that only contain a few

Peng Hao (1):
      hw/watchdog/wdt_i6300esb: remove a unnecessary comment

Stefan Hajnoczi (4):
      block/iscsi: drop unused IscsiAIOCB->buf field
      block/iscsi: take iscsilun->mutex in iscsi_timed_check_events()
      block/iscsi: fix ioctl cancel use-after-free
      block/iscsi: cancel libiscsi task when ABORT TASK TMF completes

Thomas Huth (1):
      accel: Improve selection of the default accelerator

 accel/accel.c                              |  18 +-
 accel/kvm/kvm-all.c                        |   4 +-
 accel/tcg/translate-all.c                  |   4 -
 block/bochs.c                              |  22 +-
 block/file-posix.c                         |   2 +-
 block/file-win32.c                         |   8 +-
 block/gluster.c                            |   2 +-
 block/iscsi.c                              |  47 +++-
 block/linux-aio.c                          |   4 +-
 block/mirror.c                             |   2 +-
 block/qcow2-bitmap.c                       |   4 +-
 block/qcow2-cluster.c                      |   2 +-
 block/qcow2.h                              |   5 +-
 block/sheepdog.c                           |   6 +-
 block/vhdx.h                               |   2 +-
 block/vpc.c                                |   2 +-
 blockdev.c                                 |   4 +-
 bsd-user/elfload.c                         |   2 +-
 bsd-user/x86_64/target_syscall.h           |   2 +-
 configure                                  |   3 -
 contrib/elf2dmp/main.c                     |   2 +-
 contrib/ivshmem-client/ivshmem-client.h    |   4 +-
 contrib/ivshmem-server/ivshmem-server.h    |   5 +-
 cpus-common.c                              |   2 +-
 crypto/aes.c                               |  28 +--
 disas/alpha.c                              |   8 +-
 disas/arm.c                                |   2 +-
 disas/i386.c                               |   4 +-
 disas/m68k.c                               |   4 +-
 dump.c                                     |   2 +-
 exec.c                                     |   5 +-
 fsdev/qemu-fsdev.c                         |   2 +-
 hw/alpha/typhoon.c                         |  12 +-
 hw/arm/stellaris.c                         |   2 +-
 hw/block/nvme.h                            |   8 +-
 hw/block/xen_disk.c                        |   6 +-
 hw/char/sh_serial.c                        |  18 +-
 hw/char/virtio-serial-bus.c                |   2 +-
 hw/char/xen_console.c                      |  58 ++---
 hw/core/loader.c                           |  28 +--
 hw/core/qdev.c                             |   4 +-
 hw/core/reset.c                            |   2 +-
 hw/display/tc6393xb.c                      |   6 +-
 hw/display/vga.c                           |   8 +-
 hw/display/virtio-gpu-3d.c                 |   6 +-
 hw/dma/pxa2xx_dma.c                        |   4 +-
 hw/dma/soc_dma.c                           |   2 +-
 hw/gpio/max7310.c                          |   2 +-
 hw/i386/xen/xen-hvm.c                      |   4 +-
 hw/i386/xen/xen-mapcache.c                 |   2 +-
 hw/ide/core.c                              |  94 +++----
 hw/input/lm832x.c                          |   2 +-
 hw/input/pckbd.c                           |   2 +-
 hw/input/tsc210x.c                         |   2 +-
 hw/intc/apic.c                             |   2 +-
 hw/mips/gt64xxx_pci.c                      |   6 +-
 hw/mips/mips_r4k.c                         |   4 +-
 hw/misc/max111x.c                          |   6 +-
 hw/misc/omap_l4.c                          |   4 +-
 hw/net/mipsnet.c                           |  16 +-
 hw/net/ne2000.c                            |  44 ++--
 hw/net/rocker/rocker.c                     |   2 +-
 hw/net/virtio-net.c                        |   4 +-
 hw/net/vmxnet3.c                           |   6 +-
 hw/pci-host/pam.c                          |   2 +
 hw/pci/msix.c                              |   2 +-
 hw/pci/pci.c                               |  44 ++--
 hw/pci/pci_bridge.c                        |   2 +-
 hw/ppc/ppc405_uc.c                         |   2 +-
 hw/ppc/prep.c                              |   4 +-
 hw/ppc/spapr_iommu.c                       |   2 +-
 hw/scsi/esp-pci.c                          |  10 +-
 hw/scsi/esp.c                              |  33 ++-
 hw/scsi/lsi53c895a.c                       |   6 +-
 hw/scsi/scsi-bus.c                         |   2 +-
 hw/scsi/trace-events                       |   1 +
 hw/sh4/r2d.c                               |  16 +-
 hw/usb/ccid-card-emulated.c                |   4 +-
 hw/usb/combined-packet.c                   |   2 +-
 hw/usb/dev-bluetooth.c                     |   2 +-
 hw/usb/dev-hid.c                           |   6 +-
 hw/usb/dev-hub.c                           |  14 +-
 hw/usb/dev-mtp.c                           |   4 +-
 hw/usb/dev-network.c                       |   2 +-
 hw/usb/hcd-ehci.c                          |   2 +-
 hw/usb/hcd-ehci.h                          |   2 +-
 hw/usb/hcd-uhci.c                          |   8 +-
 hw/usb/xen-usb.c                           |   6 +-
 hw/vfio/common.c                           |   4 +-
 hw/watchdog/watchdog.c                     |   2 +-
 hw/watchdog/wdt_i6300esb.c                 |   1 -
 hw/xen/xen_devconfig.c                     |   2 +-
 hw/xen/xen_pvdev.c                         |   4 +-
 hw/xenpv/xen_domainbuild.c                 |   8 +-
 include/elf.h                              |  10 +-
 include/exec/memory.h                      |   6 +-
 include/hw/acpi/acpi.h                     |  14 +-
 include/hw/elf_ops.h                       |   2 +-
 include/hw/ide/internal.h                  |   2 +-
 include/hw/qdev-core.h                     |   2 +-
 include/hw/scsi/esp.h                      |   2 +
 include/hw/sh4/sh_intc.h                   |  20 +-
 include/hw/usb.h                           |   2 +-
 include/hw/vfio/vfio-common.h              |   4 +-
 include/hw/vfio/vfio-platform.h            |   2 +-
 include/hw/xen/io/ring.h                   |   4 +-
 include/net/net.h                          |   2 +-
 include/qemu/acl.h                         |  14 +-
 include/qemu/iov.h                         |   2 +-
 include/qemu/option_int.h                  |   2 +-
 include/qemu/osdep.h                       |  17 ++
 include/qemu/queue.h                       | 153 +++++-------
 include/qemu/rcu_queue.h                   |  45 ++--
 include/qom/cpu.h                          |   9 +-
 include/scsi/constants.h                   |   2 +-
 include/sysemu/accel.h                     |   2 +-
 include/sysemu/balloon.h                   |   2 +-
 include/sysemu/kvm.h                       |   2 -
 include/sysemu/memory_mapping.h            |   2 +-
 include/sysemu/rng.h                       |   2 +-
 linux-user/elfload.c                       |   2 +-
 linux-user/linuxload.c                     |  14 +-
 linux-user/main.c                          |   4 +-
 linux-user/mmap.c                          |  10 +-
 linux-user/qemu.h                          |   4 +-
 linux-user/signal.c                        |  16 +-
 linux-user/strace.c                        |   4 +-
 linux-user/syscall.c                       |   2 +-
 linux-user/syscall_defs.h                  |   4 +-
 linux-user/uaccess.c                       |   2 +-
 linux-user/vm86.c                          |   2 +-
 linux-user/x86_64/target_syscall.h         |   2 +-
 memory.c                                   |  97 +++++---
 memory_mapping.c                           |   2 +-
 migration/block-dirty-bitmap.c             |   2 +-
 migration/block.c                          |   4 +-
 migration/ram.c                            |   2 +-
 monitor.c                                  |   4 +-
 net/checksum.c                             |   2 +-
 net/filter.c                               |   2 +-
 net/net.c                                  |   2 +-
 net/queue.c                                |   2 +-
 net/slirp.c                                |   2 +-
 qga/commands-posix.c                       |   2 +-
 qga/commands-win32.c                       |  70 +-----
 qtest.c                                    |   4 +-
 rules.mak                                  |   4 +-
 scripts/checkpatch.pl                      |  95 ++++++--
 scripts/cocci-macro-file.h                 |  24 +-
 scripts/fix-multiline-comments.sh          |  62 +++++
 scripts/gtester-cat                        |  26 --
 scripts/tap-driver.pl                      | 378 +++++++++++++++++++++++++++++
 scripts/tap-merge.pl                       | 110 +++++++++
 slirp/ip_input.c                           |   4 +-
 slirp/slirp.c                              |   2 +-
 slirp/tcp_input.c                          |  10 +-
 slirp/tcp_output.c                         |   4 +-
 slirp/tcp_timer.c                          |   2 +-
 slirp/udp.c                                |   2 +-
 target/alpha/translate.c                   |   2 +-
 target/arm/kvm.c                           |   2 +-
 target/cris/helper.c                       |   2 +-
 target/cris/mmu.h                          |  10 +-
 target/cris/translate_v10.inc.c            |   2 +-
 target/i386/Makefile.objs                  |   6 +-
 target/i386/hax-i386.h                     |   6 +-
 target/i386/hax-mem.c                      |   2 +-
 target/i386/{hax-darwin.c => hax-posix.c}  |   0
 target/i386/{hax-darwin.h => hax-posix.h}  |   0
 target/i386/translate.c                    |  12 +-
 target/mips/translate.c                    |   2 +-
 target/tilegx/translate.c                  |   2 +-
 tcg/i386/tcg-target.inc.c                  |   4 +-
 tcg/tcg.c                                  |   4 +-
 tcg/tcg.h                                  |   6 +-
 tests/Makefile.include                     |  75 ++++--
 tests/cdrom-test.c                         |   2 +-
 tests/docker/dockerfiles/centos7.docker    |   1 +
 tests/docker/dockerfiles/fedora.docker     |   1 +
 tests/ivshmem-test.c                       |   5 +-
 tests/libqos/malloc.c                      |   2 +-
 tests/migration-test.c                     |   8 +-
 tests/tcg/alpha/test-cond.c                |   4 +-
 tests/tcg/arm/hello-arm.c                  |  20 +-
 tests/tcg/cris/check_glibc_kernelversion.c |   8 +-
 tests/tcg/cris/check_mmap3.c               |   2 +-
 tests/tcg/cris/check_openpf1.c             |   2 +-
 tests/tcg/cris/check_settls1.c             |   2 +-
 tests/tcg/i386/hello-i386.c                |  14 +-
 tests/tcg/mips/hello-mips.c                |  10 +-
 tests/tcg/multiarch/sha1.c                 |  12 +-
 tests/test-crypto-pbkdf.c                  |   3 +-
 tests/test-rcu-list.c                      |   2 +-
 tests/test-vmstate.c                       |   8 +-
 tests/vhost-user-test.c                    |   4 +-
 ui/console.c                               |   4 +-
 ui/input.c                                 |  14 +-
 ui/keymaps.h                               |   4 +-
 ui/qemu-pixman.c                           |   2 +-
 ui/vnc-enc-zywrle-template.c               |   4 +-
 ui/vnc.c                                   |   4 +-
 util/bitops.c                              |   4 +-
 util/osdep.c                               |   4 +-
 util/qemu-option.c                         |   4 +-
 util/qemu-sockets.c                        |   4 +-
 util/qemu-thread-win32.c                   |   4 -
 vl.c                                       |   4 +-
 207 files changed, 1498 insertions(+), 897 deletions(-)
 create mode 100755 scripts/fix-multiline-comments.sh
 delete mode 100755 scripts/gtester-cat
 create mode 100755 scripts/tap-driver.pl
 create mode 100755 scripts/tap-merge.pl
 rename target/i386/{hax-darwin.c => hax-posix.c} (100%)
 rename target/i386/{hax-darwin.h => hax-posix.h} (100%)
-- 
2.20.1

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Qemu-devel] [PULL 22/35] test: replace gtester with a TAP driver
  2019-01-11 14:50 [Qemu-devel] [PULL v8 00/35] Misc patches for 2018-12-18 Paolo Bonzini
@ 2019-01-11 14:50 ` Paolo Bonzini
  2019-01-11 16:45 ` [Qemu-devel] [PULL v8 00/35] Misc patches for 2018-12-18 Peter Maydell
  1 sibling, 0 replies; 3+ messages in thread
From: Paolo Bonzini @ 2019-01-11 14:50 UTC (permalink / raw)
  To: qemu-devel

gtester is deprecated by upstream glib (see for example the announcement
at https://blog.gtk.org/2018/07/11/news-from-glib-2-58/) and it does
not support tests that call g_test_skip in some glib stable releases.

glib suggests instead using Automake's TAP support, which gtest itself
supports since version 2.38 (QEMU's minimum requirement is 2.40).
We do not support Automake, but we can use Automake's code to beautify
the TAP output.  I chose to use the Perl copy rather than the shell/awk
one, with some changes so that it can accept TAP through stdin, in order
to reuse Perl's TAP parsing package.  This also avoids duplicating the
parser between tap-driver.pl and tap-merge.pl.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1543513531-1151-3-git-send-email-pbonzini@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 rules.mak                               |   4 +-
 scripts/gtester-cat                     |  26 --
 scripts/tap-driver.pl                   | 378 ++++++++++++++++++++++++
 scripts/tap-merge.pl                    | 110 +++++++
 tests/Makefile.include                  |  75 +++--
 tests/docker/dockerfiles/centos7.docker |   1 +
 tests/docker/dockerfiles/fedora.docker  |   1 +
 7 files changed, 543 insertions(+), 52 deletions(-)
 delete mode 100755 scripts/gtester-cat
 create mode 100755 scripts/tap-driver.pl
 create mode 100755 scripts/tap-merge.pl

diff --git a/rules.mak b/rules.mak
index bbb2667928..86e033d815 100644
--- a/rules.mak
+++ b/rules.mak
@@ -132,7 +132,9 @@ modules:
 #  otherwise print the 'quiet' output in the format "  NAME     args to print"
 # NAME should be a short name of the command, 7 letters or fewer.
 # If called with only a single argument, will print nothing in quiet mode.
-quiet-command = $(if $(V),$1,$(if $(2),@printf "  %-7s %s\n" $2 $3 && $1, @$1))
+quiet-command-run = $(if $(V),,$(if $2,printf "  %-7s %s\n" $2 $3 && ))$1
+quiet-@ = $(if $(V),,@)
+quiet-command = $(quiet-@)$(call quiet-command-run,$1,$2,$3)
 
 # cc-option
 # Usage: CFLAGS+=$(call cc-option, -falign-functions=0, -malign-functions=0)
diff --git a/scripts/gtester-cat b/scripts/gtester-cat
deleted file mode 100755
index 061a952cad..0000000000
--- a/scripts/gtester-cat
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh
-#
-# Copyright IBM, Corp. 2012
-#
-# Authors:
-#  Anthony Liguori <aliguori@us.ibm.com>
-#
-# This work is licensed under the terms of the GNU GPLv2 or later.
-# See the COPYING file in the top-level directory.
-
-cat <<EOF
-<?xml version="1.0"?>
-<gtester>
- <info>
-  <package>qemu</package>
-  <version>0.0</version>
-  <revision>rev</revision>
- </info>
-EOF
-
-sed \
-  -e '/<?xml/d' \
-  -e '/^<gtester>$/d' \
-  -e '/<info>/,/<\/info>/d' \
-  -e '$b' \
-  -e '/^<\/gtester>$/d' "$@"
diff --git a/scripts/tap-driver.pl b/scripts/tap-driver.pl
new file mode 100755
index 0000000000..5e59b5db49
--- /dev/null
+++ b/scripts/tap-driver.pl
@@ -0,0 +1,378 @@
+#! /usr/bin/env perl
+# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# ---------------------------------- #
+#  Imports, static data, and setup.  #
+# ---------------------------------- #
+
+use warnings FATAL => 'all';
+use strict;
+use Getopt::Long ();
+use TAP::Parser;
+use Term::ANSIColor qw(:constants);
+
+my $ME = "tap-driver.pl";
+my $VERSION = "2018-11-30";
+
+my $USAGE = <<'END';
+Usage:
+  tap-driver [--test-name=TEST] [--color={always|never|auto}]
+             [--verbose] [--show-failures-only]
+END
+
+my $HELP = "$ME: TAP-aware test driver for QEMU testsuite harness." .
+           "\n" . $USAGE;
+
+# It's important that NO_PLAN evaluates "false" as a boolean.
+use constant NO_PLAN => 0;
+use constant EARLY_PLAN => 1;
+use constant LATE_PLAN => 2;
+
+use constant DIAG_STRING => "#";
+
+# ------------------- #
+#  Global variables.  #
+# ------------------- #
+
+my $testno = 0;     # Number of test results seen so far.
+my $bailed_out = 0; # Whether a "Bail out!" directive has been seen.
+my $failed = 0;     # Final exit code
+
+# Whether the TAP plan has been seen or not, and if yes, which kind
+# it is ("early" is seen before any test result, "late" otherwise).
+my $plan_seen = NO_PLAN;
+
+# ----------------- #
+#  Option parsing.  #
+# ----------------- #
+
+my %cfg = (
+  "color" => 0,
+  "verbose" => 0,
+  "show-failures-only" => 0,
+);
+
+my $color = "auto";
+my $test_name = undef;
+
+# Perl's Getopt::Long allows options to take optional arguments after a space.
+# Prevent --color by itself from consuming other arguments
+foreach (@ARGV) {
+  if ($_ eq "--color" || $_ eq "-color") {
+    $_ = "--color=$color";
+  }
+}
+
+Getopt::Long::GetOptions
+  (
+    'help' => sub { print $HELP; exit 0; },
+    'version' => sub { print "$ME $VERSION\n"; exit 0; },
+    'test-name=s' => \$test_name,
+    'color=s'  => \$color,
+    'show-failures-only' => sub { $cfg{"show-failures-only"} = 1; },
+    'verbose' => sub { $cfg{"verbose"} = 1; },
+  ) or exit 1;
+
+if ($color =~ /^always$/i) {
+  $cfg{'color'} = 1;
+} elsif ($color =~ /^never$/i) {
+  $cfg{'color'} = 0;
+} elsif ($color =~ /^auto$/i) {
+  $cfg{'color'} = (-t STDOUT);
+} else {
+  die "Invalid color mode: $color\n";
+}
+
+# ------------- #
+#  Prototypes.  #
+# ------------- #
+
+sub colored ($$);
+sub decorate_result ($);
+sub extract_tap_comment ($);
+sub handle_tap_bailout ($);
+sub handle_tap_plan ($);
+sub handle_tap_result ($);
+sub is_null_string ($);
+sub main ();
+sub report ($;$);
+sub stringify_result_obj ($);
+sub testsuite_error ($);
+
+# -------------- #
+#  Subroutines.  #
+# -------------- #
+
+# If the given string is undefined or empty, return true, otherwise
+# return false.  This function is useful to avoid pitfalls like:
+#   if ($message) { print "$message\n"; }
+# which wouldn't print anything if $message is the literal "0".
+sub is_null_string ($)
+{
+  my $str = shift;
+  return ! (defined $str and length $str);
+}
+
+sub stringify_result_obj ($)
+{
+  my $result_obj = shift;
+  if ($result_obj->is_unplanned || $result_obj->number != $testno)
+    {
+      return "ERROR";
+    }
+  elsif ($plan_seen == LATE_PLAN)
+    {
+      return "ERROR";
+    }
+  elsif (!$result_obj->directive)
+    {
+      return $result_obj->is_ok ? "PASS" : "FAIL";
+    }
+  elsif ($result_obj->has_todo)
+    {
+      return $result_obj->is_actual_ok ? "XPASS" : "XFAIL";
+    }
+  elsif ($result_obj->has_skip)
+    {
+      return $result_obj->is_ok ? "SKIP" : "FAIL";
+    }
+  die "$ME: INTERNAL ERROR"; # NOTREACHED
+}
+
+sub colored ($$)
+{
+  my ($color_string, $text) = @_;
+  return $color_string . $text . RESET;
+}
+
+sub decorate_result ($)
+{
+  my $result = shift;
+  return $result unless $cfg{"color"};
+  my %color_for_result =
+    (
+      "ERROR" => BOLD.MAGENTA,
+      "PASS"  => GREEN,
+      "XPASS" => BOLD.YELLOW,
+      "FAIL"  => BOLD.RED,
+      "XFAIL" => YELLOW,
+      "SKIP"  => BLUE,
+    );
+  if (my $color = $color_for_result{$result})
+    {
+      return colored ($color, $result);
+    }
+  else
+    {
+      return $result; # Don't colorize unknown stuff.
+    }
+}
+
+sub report ($;$)
+{
+  my ($msg, $result, $explanation) = (undef, @_);
+  if ($result =~ /^(?:X?(?:PASS|FAIL)|SKIP|ERROR)/)
+    {
+      # Output on console might be colorized.
+      $msg = decorate_result($result);
+      if ($result =~ /^(?:PASS|XFAIL|SKIP)/)
+        {
+          return if $cfg{"show-failures-only"};
+        }
+      else
+        {
+          $failed = 1;
+        }
+    }
+  elsif ($result eq "#")
+    {
+      $msg = "  ";
+    }
+  else
+    {
+      die "$ME: INTERNAL ERROR"; # NOTREACHED
+    }
+  $msg .= " $explanation" if defined $explanation;
+  print $msg . "\n";
+}
+
+sub testsuite_error ($)
+{
+  report "ERROR", "- $_[0]";
+}
+
+sub handle_tap_result ($)
+{
+  $testno++;
+  my $result_obj = shift;
+
+  my $test_result = stringify_result_obj $result_obj;
+  my $string = $result_obj->number;
+
+  my $description = $result_obj->description;
+  $string .= " $test_name" unless is_null_string $test_name;
+  $string .= " $description" unless is_null_string $description;
+
+  if ($plan_seen == LATE_PLAN)
+    {
+      $string .= " # AFTER LATE PLAN";
+    }
+  elsif ($result_obj->is_unplanned)
+    {
+      $string .= " # UNPLANNED";
+    }
+  elsif ($result_obj->number != $testno)
+    {
+      $string .= " # OUT-OF-ORDER (expecting $testno)";
+    }
+  elsif (my $directive = $result_obj->directive)
+    {
+      $string .= " # $directive";
+      my $explanation = $result_obj->explanation;
+      $string .= " $explanation"
+        unless is_null_string $explanation;
+    }
+
+  report $test_result, $string;
+}
+
+sub handle_tap_plan ($)
+{
+  my $plan = shift;
+  if ($plan_seen)
+    {
+      # Error, only one plan per stream is acceptable.
+      testsuite_error "multiple test plans";
+      return;
+    }
+  # The TAP plan can come before or after *all* the TAP results; we speak
+  # respectively of an "early" or a "late" plan.  If we see the plan line
+  # after at least one TAP result has been seen, assume we have a late
+  # plan; in this case, any further test result seen after the plan will
+  # be flagged as an error.
+  $plan_seen = ($testno >= 1 ? LATE_PLAN : EARLY_PLAN);
+  # If $testno > 0, we have an error ("too many tests run") that will be
+  # automatically dealt with later, so don't worry about it here.  If
+  # $plan_seen is true, we have an error due to a repeated plan, and that
+  # has already been dealt with above.  Otherwise, we have a valid "plan
+  # with SKIP" specification, and should report it as a particular kind
+  # of SKIP result.
+  if ($plan->directive && $testno == 0)
+    {
+      my $explanation = is_null_string ($plan->explanation) ?
+                        undef : "- " . $plan->explanation;
+      report "SKIP", $explanation;
+    }
+}
+
+sub handle_tap_bailout ($)
+{
+  my ($bailout, $msg) = ($_[0], "Bail out!");
+  $bailed_out = 1;
+  $msg .= " " . $bailout->explanation
+    unless is_null_string $bailout->explanation;
+  testsuite_error $msg;
+}
+
+sub extract_tap_comment ($)
+{
+  my $line = shift;
+  if (index ($line, DIAG_STRING) == 0)
+    {
+      # Strip leading `DIAG_STRING' from `$line'.
+      $line = substr ($line, length (DIAG_STRING));
+      # And strip any leading and trailing whitespace left.
+      $line =~ s/(?:^\s*|\s*$)//g;
+      # Return what is left (if any).
+      return $line;
+    }
+  return "";
+}
+
+sub main ()
+{
+  my $iterator = TAP::Parser::Iterator::Stream->new(\*STDIN);
+  my $parser = TAP::Parser->new ({iterator => $iterator });
+
+  while (defined (my $cur = $parser->next))
+    {
+      # Parsing of TAP input should stop after a "Bail out!" directive.
+      next if $bailed_out;
+
+      if ($cur->is_plan)
+        {
+          handle_tap_plan ($cur);
+        }
+      elsif ($cur->is_test)
+        {
+          handle_tap_result ($cur);
+        }
+      elsif ($cur->is_bailout)
+        {
+          handle_tap_bailout ($cur);
+        }
+      elsif ($cfg{"verbose"})
+        {
+          my $comment = extract_tap_comment ($cur->raw);
+          report "#", "$comment" if length $comment;
+       }
+    }
+  # A "Bail out!" directive should cause us to ignore any following TAP
+  # error.
+  if (!$bailed_out)
+    {
+      if (!$plan_seen)
+        {
+          testsuite_error "missing test plan";
+        }
+      elsif ($parser->tests_planned != $parser->tests_run)
+        {
+          my ($planned, $run) = ($parser->tests_planned, $parser->tests_run);
+          my $bad_amount = $run > $planned ? "many" : "few";
+          testsuite_error (sprintf "too %s tests run (expected %d, got %d)",
+                                   $bad_amount, $planned, $run);
+        }
+    }
+}
+
+# ----------- #
+#  Main code. #
+# ----------- #
+
+main;
+exit($failed);
+
+# Local Variables:
+# perl-indent-level: 2
+# perl-continued-statement-offset: 2
+# perl-continued-brace-offset: 0
+# perl-brace-offset: 0
+# perl-brace-imaginary-offset: 0
+# perl-label-offset: -2
+# cperl-indent-level: 2
+# cperl-brace-offset: 0
+# cperl-continued-brace-offset: 0
+# cperl-label-offset: -2
+# cperl-extra-newline-before-brace: t
+# cperl-merge-trailing-else: nil
+# cperl-continued-statement-offset: 2
+# End:
diff --git a/scripts/tap-merge.pl b/scripts/tap-merge.pl
new file mode 100755
index 0000000000..59e3fa5007
--- /dev/null
+++ b/scripts/tap-merge.pl
@@ -0,0 +1,110 @@
+#! /usr/bin/env perl
+# Copyright (C) 2018 Red Hat, Inc.
+#
+# Author: Paolo Bonzini <pbonzini@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# ---------------------------------- #
+#  Imports, static data, and setup.  #
+# ---------------------------------- #
+
+use warnings FATAL => 'all';
+use strict;
+use Getopt::Long ();
+use TAP::Parser;
+
+my $ME = "tap-merge.pl";
+my $VERSION = "2018-11-30";
+
+my $HELP = "$ME: merge multiple TAP inputs from stdin.";
+
+use constant DIAG_STRING => "#";
+
+# ----------------- #
+#  Option parsing.  #
+# ----------------- #
+
+Getopt::Long::GetOptions
+  (
+    'help' => sub { print $HELP; exit 0; },
+    'version' => sub { print "$ME $VERSION\n"; exit 0; },
+  );
+
+# -------------- #
+#  Subroutines.  #
+# -------------- #
+
+sub main ()
+{
+  my $iterator = TAP::Parser::Iterator::Stream->new(\*STDIN);
+  my $parser = TAP::Parser->new ({iterator => $iterator });
+  my $testno = 0;     # Number of test results seen so far.
+  my $bailed_out = 0; # Whether a "Bail out!" directive has been seen.
+
+  while (defined (my $cur = $parser->next))
+    {
+      if ($cur->is_bailout)
+        {
+          $bailed_out = 1;
+          print DIAG_STRING . " " . $cur->as_string . "\n";
+          next;
+        }
+      elsif ($cur->is_plan)
+        {
+          $bailed_out = 0;
+          next;
+        }
+      elsif ($cur->is_test)
+        {
+          $bailed_out = 0 if $cur->number == 1;
+          $testno++;
+          $cur = TAP::Parser::Result::Test->new({
+                          ok => $cur->ok,
+                          test_num => $testno,
+                          directive => $cur->directive,
+                          explanation => $cur->explanation,
+                          description => $cur->description
+                  });
+        }
+      elsif ($cur->is_version)
+        {
+          next if $testno > 0;
+        }
+      print $cur->as_string . "\n" unless $bailed_out;
+    }
+  print "1..$testno\n";
+}
+
+# ----------- #
+#  Main code. #
+# ----------- #
+
+main;
+
+# Local Variables:
+# perl-indent-level: 2
+# perl-continued-statement-offset: 2
+# perl-continued-brace-offset: 0
+# perl-brace-offset: 0
+# perl-brace-imaginary-offset: 0
+# perl-label-offset: -2
+# cperl-indent-level: 2
+# cperl-brace-offset: 0
+# cperl-continued-brace-offset: 0
+# cperl-label-offset: -2
+# cperl-extra-newline-before-brace: t
+# cperl-merge-trailing-else: nil
+# cperl-continued-statement-offset: 2
+# End:
diff --git a/tests/Makefile.include b/tests/Makefile.include
index 9c84bbd829..c17f6d5dfa 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -810,41 +810,68 @@ tests/test-qga$(EXESUF): qemu-ga$(EXESUF)
 tests/test-qga$(EXESUF): tests/test-qga.o $(qtest-obj-y)
 
 SPEED = quick
-GTESTER_OPTIONS = -k $(if $(V),--verbose,-q)
-GCOV_OPTIONS = -n $(if $(V),-f,)
 
 # gtester tests, possibly with verbose output
+# do_test_tap runs all tests, even if some of them fail, while do_test_human
+# stops at the first failure unless -k is given on the command line
+
+define do_test_human_k
+        $(quiet-@)rc=0; $(foreach COMMAND, $1, \
+          $(call quiet-command-run, \
+            export MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} $2; \
+              $(COMMAND) -m=$(SPEED) -k --tap < /dev/null \
+              | ./scripts/tap-driver.pl --test-name="$(notdir $(COMMAND))" $(if $(V),, --show-failures-only) \
+              || rc=$$?;, "TEST", "$@: $(COMMAND)")) exit $$rc
+endef
+define do_test_human_no_k
+        $(foreach COMMAND, $1, \
+          $(call quiet-command, \
+            MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} $2 \
+              $(COMMAND) -m=$(SPEED) -k --tap < /dev/null \
+              | ./scripts/tap-driver.pl --test-name="$(notdir $(COMMAND))" $(if $(V),, --show-failures-only), \
+              "TEST", "$@: $(COMMAND)")
+)
+endef
+do_test_human = \
+        $(if $(findstring k, $(MAKEFLAGS)), $(do_test_human_k), $(do_test_human_no_k))
+
+define do_test_tap
+	$(call quiet-command, \
+          { export MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} $2; \
+            $(foreach COMMAND, $1, \
+	      $(COMMAND) -m=$(SPEED) -k --tap < /dev/null \
+	      | sed "s/^[a-z][a-z]* [0-9]* /&$(notdir $(COMMAND)) /" || true; ) } \
+	      | ./scripts/tap-merge.pl | tee "$@" \
+	      | ./scripts/tap-driver.pl $(if $(V),, --show-failures-only), \
+	  "TAP","$@")
+endef
 
 .PHONY: $(patsubst %, check-qtest-%, $(QTEST_TARGETS))
 $(patsubst %, check-qtest-%, $(QTEST_TARGETS)): check-qtest-%: subdir-%-softmmu $(check-qtest-y)
-	$(call quiet-command,QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \
-		QTEST_QEMU_IMG=qemu-img$(EXESUF) \
-		MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} \
-		gtester $(GTESTER_OPTIONS) -m=$(SPEED) $(check-qtest-$*-y) $(check-qtest-generic-y),"GTESTER","$@")
+	$(call do_test_human,$(check-qtest-$*-y) $(check-qtest-generic-y), \
+	  QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \
+	  QTEST_QEMU_IMG=qemu-img$(EXESUF))
 
-.PHONY: $(patsubst %, check-%, $(check-unit-y) $(check-speed-y))
-$(patsubst %, check-%, $(check-unit-y) $(check-speed-y)): check-%: %
-	$(call quiet-command, \
-		MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} \
-		gtester $(GTESTER_OPTIONS) -m=$(SPEED) $*,"GTESTER","$*")
+check-unit: $(check-unit-y)
+	$(call do_test_human, $^)
 
-# gtester tests with XML output
+check-speed: $(check-speed-y)
+	$(call do_test_human, $^)
 
-$(patsubst %, check-report-qtest-%.xml, $(QTEST_TARGETS)): check-report-qtest-%.xml: $(check-qtest-y)
-	$(call quiet-command,QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \
-		QTEST_QEMU_IMG=qemu-img$(EXESUF) \
-	  gtester -q $(GTESTER_OPTIONS) -o $@ -m=$(SPEED) $(check-qtest-$*-y) $(check-qtest-generic-y),"GTESTER","$@")
+# gtester tests with TAP output
 
-check-report-unit.xml: $(check-unit-y)
-	$(call quiet-command,gtester -q $(GTESTER_OPTIONS) -o $@ -m=$(SPEED) $^,"GTESTER","$@")
+$(patsubst %, check-report-qtest-%.tap, $(QTEST_TARGETS)): check-report-qtest-%.tap: $(check-qtest-y)
+	$(call do_test_tap, $(check-qtest-$*-y) $(check-qtest-generic-y), \
+	  QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \
+	  QTEST_QEMU_IMG=qemu-img$(EXESUF))
 
-# Reports and overall runs
+check-report-unit.tap: $(check-unit-y)
+	$(call do_test_tap,$^)
 
-check-report.xml: $(patsubst %,check-report-qtest-%.xml, $(QTEST_TARGETS)) check-report-unit.xml
-	$(call quiet-command,$(SRC_PATH)/scripts/gtester-cat $^ > $@,"GEN","$@")
+# Reports and overall runs
 
-check-report.html: check-report.xml
-	$(call quiet-command,gtester-report $< > $@,"GEN","$@")
+check-report.tap: $(patsubst %,check-report-qtest-%.tap, $(QTEST_TARGETS)) check-report-unit.tap
+	$(call quiet-command,./scripts/tap-merge.py $^ > $@,"GEN","$@")
 
 # Per guest TCG tests
 
@@ -959,8 +986,6 @@ check-acceptance: check-venv $(TESTS_RESULTS_DIR)
 .PHONY: check-qapi-schema check-qtest check-unit check check-clean
 check-qapi-schema: $(patsubst %,check-%, $(check-qapi-schema-y)) check-tests/qapi-schema/doc-good.texi
 check-qtest: $(patsubst %,check-qtest-%, $(QTEST_TARGETS))
-check-unit: $(patsubst %,check-%, $(check-unit-y))
-check-speed: $(patsubst %,check-%, $(check-speed-y))
 check-block: $(patsubst %,check-%, $(check-block-y))
 check: check-qapi-schema check-unit check-qtest check-decodetree
 check-clean:
diff --git a/tests/docker/dockerfiles/centos7.docker b/tests/docker/dockerfiles/centos7.docker
index 0a04bfbed8..e0f18f5a41 100644
--- a/tests/docker/dockerfiles/centos7.docker
+++ b/tests/docker/dockerfiles/centos7.docker
@@ -22,6 +22,7 @@ ENV PACKAGES \
     mesa-libEGL-devel \
     mesa-libgbm-devel \
     nettle-devel \
+    perl-Test-Harness \
     pixman-devel \
     SDL-devel \
     spice-glib-devel \
diff --git a/tests/docker/dockerfiles/fedora.docker b/tests/docker/dockerfiles/fedora.docker
index 0c4eb9e49c..1d0e3dc4ec 100644
--- a/tests/docker/dockerfiles/fedora.docker
+++ b/tests/docker/dockerfiles/fedora.docker
@@ -70,6 +70,7 @@ ENV PACKAGES \
     nss-devel \
     numactl-devel \
     perl \
+    perl-Test-Harness \
     pixman-devel \
     python3 \
     PyYAML \
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PULL v8 00/35] Misc patches for 2018-12-18
  2019-01-11 14:50 [Qemu-devel] [PULL v8 00/35] Misc patches for 2018-12-18 Paolo Bonzini
  2019-01-11 14:50 ` [Qemu-devel] [PULL 22/35] test: replace gtester with a TAP driver Paolo Bonzini
@ 2019-01-11 16:45 ` Peter Maydell
  1 sibling, 0 replies; 3+ messages in thread
From: Peter Maydell @ 2019-01-11 16:45 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: QEMU Developers

On Fri, 11 Jan 2019 at 14:52, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> The following changes since commit a311f891abf3833c1e4c5a62a6e5b0f1b81f22c3:
>
>   Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-4.0-pull-request' into staging (2019-01-10 17:49:54 +0000)
>
> are available in the Git repository at:
>
>   git://github.com/bonzini/qemu.git tags/for-upstream
>
> for you to fetch changes up to 7d37435bd5801bb49e1c4b550fedd1c5fe143131:
>
>   avoid TABs in files that only contain a few (2019-01-11 15:46:56 +0100)
>
> ----------------------------------------------------------------
> * HAX support for Linux hosts (Alejandro)
> * esp bugfixes (Guenter)
> * Windows build cleanup (Marc-André)
> * checkpatch logic improvements (Paolo)
> * coalesced range bugfix (Paolo)
> * switch testsuite to TAP (Paolo)
> * QTAILQ rewrite (Paolo)
> * block/iscsi.c cancellation fixes (Stefan)
> * improve selection of the default accelerator (Thomas)
>
> ----------------------------------------------------------------
> v7->v8: dropped Debian dockerfile changes altogether
>

Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/4.0
for any user-visible changes.

-- PMM

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-01-11 16:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-11 14:50 [Qemu-devel] [PULL v8 00/35] Misc patches for 2018-12-18 Paolo Bonzini
2019-01-11 14:50 ` [Qemu-devel] [PULL 22/35] test: replace gtester with a TAP driver Paolo Bonzini
2019-01-11 16:45 ` [Qemu-devel] [PULL v8 00/35] Misc patches for 2018-12-18 Peter Maydell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.