Integration testing patches
- More Linux kernel record/replay tests (Pavel Dovgalyuk) - Various fixes (Willian Rampazzo, Cleber Rosa) - Split machine_ppc.py per machine (David Gibson) - Add AVOCADO_TESTS command line environment variable (Willian Rampazzo) - Test PowerPC PowerNV 8/9 machines (Cédric Le Goater) -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmFR/jMACgkQ4+MsLN6t wN7iPw//QqstsMTQX7PvjbFxi2VkQtTCTMlgOkqdovs4w5ThHxS9lSvEZeJ0bsMM 1Uutufg7CzVoZuB1aKewiJ5qZ0y3QrNPhdE2hcxFLCZogCmN6Iuyr92URfhP0TIe eMLqiHtPuIsq1zApTxvdn5DMBZnonMFE3rX3wWaK6wHPELNai+28hJr+M3pe98Kt 8xhIKkQ0Cz3QI41wkDzbpwyvYmDuLbSzsCUFp+8codxFHKer873cKGs80CSTNscI s+ZDVHc/ZfX0JXtn3XTnb65A4wuSz8r7PPT5vZ12AbgG6UEzaSOqyx+NcomDV9+S 8jJMI5fWeyrk1S4xSs96ALuYYP50gi8SXZ59WXpduQvMji4pB5EQ3EWtcackZe8p JAPYFEISJa/sLG//6oHlRcYXTHti/aAw4L6a6sLzocYd9qEMsGKr5AlsYkm+TYFF uO4YjcGYJazvJg1n86YgEIzfxcJt7haltUhNcmYltXOtHEJFd7+VRzZosy8v/zQ5 NuPEt5jfsZdRyrnEg7FowI2Y6N9LJqPz9PBVgyIuRKPD86Irw/yDrl92ECnp8f8j VEpKgXrp2stffBhedD4pUvG+4OfeNndvo5ZnV9mSp6LKGa+4hUHMtMpnASpw8gfT Cul7cgtRfexvXKmXvYKCjrwwJ0VO0cQVRd2wzwBlM+5txycvbdg= =1mf1 -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/philmd/tags/integration-testing-20210927' into staging Integration testing patches - More Linux kernel record/replay tests (Pavel Dovgalyuk) - Various fixes (Willian Rampazzo, Cleber Rosa) - Split machine_ppc.py per machine (David Gibson) - Add AVOCADO_TESTS command line environment variable (Willian Rampazzo) - Test PowerPC PowerNV 8/9 machines (Cédric Le Goater) # gpg: Signature made Mon 27 Sep 2021 18:24:03 BST # gpg: using RSA key FAABE75E12917221DCFD6BB2E3E32C2CDEADC0DE # gpg: Good signature from "Philippe Mathieu-Daudé (F4BUG) <f4bug@amsat.org>" [full] # Primary key fingerprint: FAAB E75E 1291 7221 DCFD 6BB2 E3E3 2C2C DEAD C0DE * remotes/philmd/tags/integration-testing-20210927: (22 commits) tests/acceptance: Test powernv machines tests/acceptance/ppc_prep_40p.py: clean up unused import tests/acceptance/ppc_prep_40p.py: NetBSD 7.1.2 location update tests/acceptance/boot_xen.py: removed unused import acceptance/tests/vnc.py: use explicit syntax for enabling passwords Acceptance Tests: improve check-acceptance description qemu: Split machine_ppc.py acceptance tests tests/Makefile: add AVOCADO_TESTS option to make check-acceptance docs/devel/testing: add instruction to run a single acceptance test tests/Makefile: allow control over tags during check-acceptance avocado_qemu: fix inheritance order on LinuxTest class avocado_qemu: explicitly return None to avoid R1710 avocado_qemu: tweak ssh connect method avocado_qemu: fix import module based on isort avocado_qemu: standardize super() call following PEP3135 Acceptance Tests: add standard clean up at test tearDown() Acceptance tests: add myself as a reviewer for the acceptance tests tests/acceptance: Linux boot test for record/replay tests/acceptance: add replay kernel test for alpha tests/acceptance: add replay kernel test for nios2 ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
14f02d8a9e
@ -274,7 +274,6 @@ F: target/ppc/
|
||||
F: hw/ppc/
|
||||
F: include/hw/ppc/
|
||||
F: disas/ppc.c
|
||||
F: tests/acceptance/machine_ppc.py
|
||||
|
||||
RISC-V TCG CPUs
|
||||
M: Palmer Dabbelt <palmer@dabbelt.com>
|
||||
@ -1270,6 +1269,7 @@ L: qemu-ppc@nongnu.org
|
||||
S: Odd Fixes
|
||||
F: hw/ppc/mpc8544ds.c
|
||||
F: hw/ppc/mpc8544_guts.c
|
||||
F: tests/acceptance/ppc_mpc8544ds.py
|
||||
|
||||
New World (mac99)
|
||||
M: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
|
||||
@ -1340,6 +1340,7 @@ F: tests/qtest/spapr*
|
||||
F: tests/qtest/libqos/*spapr*
|
||||
F: tests/qtest/rtas*
|
||||
F: tests/qtest/libqos/rtas*
|
||||
F: tests/acceptance/ppc_pseries.py
|
||||
|
||||
PowerNV (Non-Virtualized)
|
||||
M: Cédric Le Goater <clg@kaod.org>
|
||||
@ -1361,6 +1362,7 @@ M: Edgar E. Iglesias <edgar.iglesias@gmail.com>
|
||||
L: qemu-ppc@nongnu.org
|
||||
S: Odd Fixes
|
||||
F: hw/ppc/virtex_ml507.c
|
||||
F: tests/acceptance/ppc_virtex_ml507.py
|
||||
|
||||
sam460ex
|
||||
M: BALATON Zoltan <balaton@eik.bme.hu>
|
||||
@ -2973,6 +2975,7 @@ F: include/sysemu/replay.h
|
||||
F: docs/replay.txt
|
||||
F: stubs/replay.c
|
||||
F: tests/acceptance/replay_kernel.py
|
||||
F: tests/acceptance/replay_linux.py
|
||||
F: tests/acceptance/reverse_debugging.py
|
||||
F: qapi/replay.json
|
||||
|
||||
@ -3484,6 +3487,7 @@ W: https://trello.com/b/6Qi1pxVn/avocado-qemu
|
||||
R: Cleber Rosa <crosa@redhat.com>
|
||||
R: Philippe Mathieu-Daudé <philmd@redhat.com>
|
||||
R: Wainer dos Santos Moschetta <wainersm@redhat.com>
|
||||
R: Willian Rampazzo <willianr@redhat.com>
|
||||
S: Odd Fixes
|
||||
F: tests/acceptance/
|
||||
|
||||
|
@ -732,6 +732,47 @@ available. On Debian and Ubuntu based systems, depending on the
|
||||
specific version, they may be on packages named ``python3-venv`` and
|
||||
``python3-pip``.
|
||||
|
||||
It is also possible to run tests based on tags using the
|
||||
``make check-acceptance`` command and the ``AVOCADO_TAGS`` environment
|
||||
variable:
|
||||
|
||||
.. code::
|
||||
|
||||
make check-acceptance AVOCADO_TAGS=quick
|
||||
|
||||
Note that tags separated with commas have an AND behavior, while tags
|
||||
separated by spaces have an OR behavior. For more information on Avocado
|
||||
tags, see:
|
||||
|
||||
https://avocado-framework.readthedocs.io/en/latest/guides/user/chapters/tags.html
|
||||
|
||||
To run a single test file, a couple of them, or a test within a file
|
||||
using the ``make check-acceptance`` command, set the ``AVOCADO_TESTS``
|
||||
environment variable with the test files or test names. To run all
|
||||
tests from a single file, use:
|
||||
|
||||
.. code::
|
||||
|
||||
make check-acceptance AVOCADO_TESTS=$FILEPATH
|
||||
|
||||
The same is valid to run tests from multiple test files:
|
||||
|
||||
.. code::
|
||||
|
||||
make check-acceptance AVOCADO_TESTS='$FILEPATH1 $FILEPATH2'
|
||||
|
||||
To run a single test within a file, use:
|
||||
|
||||
.. code::
|
||||
|
||||
make check-acceptance AVOCADO_TESTS=$FILEPATH:$TESTCLASS.$TESTNAME
|
||||
|
||||
The same is valid to run single tests from multiple test files:
|
||||
|
||||
.. code::
|
||||
|
||||
make check-acceptance AVOCADO_TESTS='$FILEPATH1:$TESTCLASS1.$TESTNAME1 $FILEPATH2:$TESTCLASS2.$TESTNAME2'
|
||||
|
||||
The scripts installed inside the virtual environment may be used
|
||||
without an "activation". For instance, the Avocado test runner
|
||||
may be invoked by running:
|
||||
@ -740,6 +781,34 @@ may be invoked by running:
|
||||
|
||||
tests/venv/bin/avocado run $OPTION1 $OPTION2 tests/acceptance/
|
||||
|
||||
Note that if ``make check-acceptance`` was not executed before, it is
|
||||
possible to create the Python virtual environment with the dependencies
|
||||
needed running:
|
||||
|
||||
.. code::
|
||||
|
||||
make check-venv
|
||||
|
||||
It is also possible to run tests from a single file or a single test within
|
||||
a test file. To run tests from a single file within the build tree, use:
|
||||
|
||||
.. code::
|
||||
|
||||
tests/venv/bin/avocado run tests/acceptance/$TESTFILE
|
||||
|
||||
To run a single test within a test file, use:
|
||||
|
||||
.. code::
|
||||
|
||||
tests/venv/bin/avocado run tests/acceptance/$TESTFILE:$TESTCLASS.$TESTNAME
|
||||
|
||||
Valid test names are visible in the output from any previous execution
|
||||
of Avocado or ``make check-acceptance``, and can also be queried using:
|
||||
|
||||
.. code::
|
||||
|
||||
tests/venv/bin/avocado list tests/acceptance
|
||||
|
||||
Manual Installation
|
||||
-------------------
|
||||
|
||||
|
@ -16,7 +16,7 @@ ifneq ($(filter $(all-check-targets), check-softfloat),)
|
||||
@echo " $(MAKE) check-tcg Run TCG tests"
|
||||
@echo " $(MAKE) check-softfloat Run FPU emulation tests"
|
||||
endif
|
||||
@echo " $(MAKE) check-acceptance Run all acceptance (functional) tests"
|
||||
@echo " $(MAKE) check-acceptance Run acceptance (functional) tests for currently configured targets"
|
||||
@echo
|
||||
@echo " $(MAKE) check-report.tap Generates an aggregated TAP test report"
|
||||
@echo " $(MAKE) check-venv Creates a Python venv for tests"
|
||||
@ -88,11 +88,19 @@ clean-tcg: $(CLEAN_TCG_TARGET_RULES)
|
||||
TESTS_VENV_DIR=$(BUILD_DIR)/tests/venv
|
||||
TESTS_VENV_REQ=$(SRC_PATH)/tests/requirements.txt
|
||||
TESTS_RESULTS_DIR=$(BUILD_DIR)/tests/results
|
||||
ifndef AVOCADO_TESTS
|
||||
AVOCADO_TESTS=tests/acceptance
|
||||
endif
|
||||
# Controls the output generated by Avocado when running tests.
|
||||
# Any number of command separated loggers are accepted. For more
|
||||
# information please refer to "avocado --help".
|
||||
AVOCADO_SHOW=app
|
||||
AVOCADO_TAGS=$(patsubst %-softmmu,-t arch:%, $(filter %-softmmu,$(TARGETS)))
|
||||
ifndef AVOCADO_TAGS
|
||||
AVOCADO_CMDLINE_TAGS=$(patsubst %-softmmu,-t arch:%, \
|
||||
$(filter %-softmmu,$(TARGETS)))
|
||||
else
|
||||
AVOCADO_CMDLINE_TAGS=$(addprefix -t , $(AVOCADO_TAGS))
|
||||
endif
|
||||
|
||||
$(TESTS_VENV_DIR): $(TESTS_VENV_REQ)
|
||||
$(call quiet-command, \
|
||||
@ -128,9 +136,10 @@ check-acceptance: check-venv $(TESTS_RESULTS_DIR) get-vm-images
|
||||
$(call quiet-command, \
|
||||
$(TESTS_VENV_DIR)/bin/python -m avocado \
|
||||
--show=$(AVOCADO_SHOW) run --job-results-dir=$(TESTS_RESULTS_DIR) \
|
||||
--filter-by-tags-include-empty --filter-by-tags-include-empty-key \
|
||||
$(AVOCADO_TAGS) \
|
||||
$(if $(GITLAB_CI),,--failfast) tests/acceptance, \
|
||||
$(if $(AVOCADO_TAGS),, --filter-by-tags-include-empty \
|
||||
--filter-by-tags-include-empty-key) \
|
||||
$(AVOCADO_CMDLINE_TAGS) \
|
||||
$(if $(GITLAB_CI),,--failfast) $(AVOCADO_TESTS), \
|
||||
"AVOCADO", "tests/acceptance")
|
||||
|
||||
# Consolidated targets
|
||||
|
@ -12,19 +12,14 @@ import logging
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import uuid
|
||||
import tempfile
|
||||
import time
|
||||
import uuid
|
||||
|
||||
import avocado
|
||||
|
||||
from avocado.utils import cloudinit
|
||||
from avocado.utils import datadrainer
|
||||
from avocado.utils import network
|
||||
from avocado.utils import ssh
|
||||
from avocado.utils import vmimage
|
||||
from avocado.utils import cloudinit, datadrainer, network, ssh, vmimage
|
||||
from avocado.utils.path import find_command
|
||||
|
||||
|
||||
#: The QEMU build root directory. It may also be the source directory
|
||||
#: if building from the source dir, but it's safer to use BUILD_DIR for
|
||||
#: that purpose. Be aware that if this code is moved outside of a source
|
||||
@ -42,11 +37,9 @@ else:
|
||||
sys.path.append(os.path.join(SOURCE_DIR, 'python'))
|
||||
|
||||
from qemu.machine import QEMUMachine
|
||||
from qemu.utils import (
|
||||
get_info_usernet_hostfwd_port,
|
||||
kvm_available,
|
||||
tcg_available,
|
||||
)
|
||||
from qemu.utils import (get_info_usernet_hostfwd_port, kvm_available,
|
||||
tcg_available)
|
||||
|
||||
|
||||
def is_readable_executable_file(path):
|
||||
return os.path.isfile(path) and os.access(path, os.R_OK | os.X_OK)
|
||||
@ -79,6 +72,7 @@ def pick_default_qemu_bin(arch=None):
|
||||
qemu_bin_relative_path)
|
||||
if is_readable_executable_file(qemu_bin_from_bld_dir_path):
|
||||
return qemu_bin_from_bld_dir_path
|
||||
return None
|
||||
|
||||
|
||||
def _console_interaction(test, success_message, failure_message,
|
||||
@ -276,12 +270,13 @@ class Test(avocado.Test):
|
||||
for vm in self._vms.values():
|
||||
vm.shutdown()
|
||||
self._sd = None
|
||||
super().tearDown()
|
||||
|
||||
def fetch_asset(self, name,
|
||||
asset_hash=None, algorithm=None,
|
||||
locations=None, expire=None,
|
||||
find_only=False, cancel_on_missing=True):
|
||||
return super(Test, self).fetch_asset(name,
|
||||
return super().fetch_asset(name,
|
||||
asset_hash=asset_hash,
|
||||
algorithm=algorithm,
|
||||
locations=locations,
|
||||
@ -312,8 +307,7 @@ class LinuxSSHMixIn:
|
||||
self.ssh_session.connect()
|
||||
return
|
||||
except:
|
||||
time.sleep(4)
|
||||
pass
|
||||
time.sleep(i)
|
||||
self.fail('ssh connection timeout')
|
||||
|
||||
def ssh_command(self, command):
|
||||
@ -430,7 +424,7 @@ class LinuxDistro:
|
||||
return self._info.get('kernel_params', None)
|
||||
|
||||
|
||||
class LinuxTest(Test, LinuxSSHMixIn):
|
||||
class LinuxTest(LinuxSSHMixIn, Test):
|
||||
"""Facilitates having a cloud-image Linux based available.
|
||||
|
||||
For tests that indend to interact with guests, this is a better choice
|
||||
@ -469,7 +463,7 @@ class LinuxTest(Test, LinuxSSHMixIn):
|
||||
self.distro.checksum = distro_checksum
|
||||
|
||||
def setUp(self, ssh_pubkey=None, network_device_type='virtio-net'):
|
||||
super(LinuxTest, self).setUp()
|
||||
super().setUp()
|
||||
self._set_distro()
|
||||
self.vm.add_args('-smp', '2')
|
||||
self.vm.add_args('-m', '1024')
|
||||
|
@ -1176,6 +1176,41 @@ class BootLinuxConsole(LinuxKernelTest):
|
||||
tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
|
||||
self.do_test_advcal_2018('19', tar_hash, 'uImage')
|
||||
|
||||
def do_test_ppc64_powernv(self, proc):
|
||||
images_url = ('https://github.com/open-power/op-build/releases/download/v2.7/')
|
||||
|
||||
kernel_url = images_url + 'zImage.epapr'
|
||||
kernel_hash = '0ab237df661727e5392cee97460e8674057a883c5f74381a128fa772588d45cd'
|
||||
kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash,
|
||||
algorithm='sha256')
|
||||
self.vm.set_console()
|
||||
self.vm.add_args('-kernel', kernel_path,
|
||||
'-append', 'console=tty0 console=hvc0',
|
||||
'-device', 'pcie-pci-bridge,id=bridge1,bus=pcie.1,addr=0x0',
|
||||
'-device', 'nvme,bus=pcie.2,addr=0x0,serial=1234',
|
||||
'-device', 'e1000e,bus=bridge1,addr=0x3',
|
||||
'-device', 'nec-usb-xhci,bus=bridge1,addr=0x2')
|
||||
self.vm.launch()
|
||||
|
||||
self.wait_for_console_pattern("CPU: " + proc + " generation processor")
|
||||
self.wait_for_console_pattern("zImage starting: loaded")
|
||||
self.wait_for_console_pattern("Run /init as init process")
|
||||
self.wait_for_console_pattern("Creating 1 MTD partitions")
|
||||
|
||||
def test_ppc_powernv8(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc64
|
||||
:avocado: tags=machine:powernv8
|
||||
"""
|
||||
self.do_test_ppc64_powernv('P8')
|
||||
|
||||
def test_ppc_powernv9(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc64
|
||||
:avocado: tags=machine:powernv9
|
||||
"""
|
||||
self.do_test_ppc64_powernv('P9')
|
||||
|
||||
def test_ppc_g3beige(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc
|
||||
|
@ -13,7 +13,6 @@
|
||||
|
||||
import os
|
||||
|
||||
from avocado import skipIf
|
||||
from avocado_qemu import wait_for_console_pattern
|
||||
from boot_linux_console import LinuxKernelTest
|
||||
|
||||
|
@ -1,69 +0,0 @@
|
||||
# Test that Linux kernel boots on ppc machines and check the console
|
||||
#
|
||||
# Copyright (c) 2018, 2020 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.
|
||||
|
||||
from avocado.utils import archive
|
||||
from avocado_qemu import Test
|
||||
from avocado_qemu import wait_for_console_pattern
|
||||
|
||||
class PpcMachine(Test):
|
||||
|
||||
timeout = 90
|
||||
KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
|
||||
panic_message = 'Kernel panic - not syncing'
|
||||
|
||||
def test_ppc64_pseries(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc64
|
||||
:avocado: tags=machine:pseries
|
||||
"""
|
||||
kernel_url = ('https://archives.fedoraproject.org/pub/archive'
|
||||
'/fedora-secondary/releases/29/Everything/ppc64le/os'
|
||||
'/ppc/ppc64/vmlinuz')
|
||||
kernel_hash = '3fe04abfc852b66653b8c3c897a59a689270bc77'
|
||||
kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
|
||||
|
||||
self.vm.set_console()
|
||||
kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=hvc0'
|
||||
self.vm.add_args('-kernel', kernel_path,
|
||||
'-append', kernel_command_line)
|
||||
self.vm.launch()
|
||||
console_pattern = 'Kernel command line: %s' % kernel_command_line
|
||||
wait_for_console_pattern(self, console_pattern, self.panic_message)
|
||||
|
||||
def test_ppc_mpc8544ds(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc
|
||||
:avocado: tags=machine:mpc8544ds
|
||||
"""
|
||||
tar_url = ('https://www.qemu-advent-calendar.org'
|
||||
'/2020/download/day17.tar.gz')
|
||||
tar_hash = '7a5239542a7c4257aa4d3b7f6ddf08fb6775c494'
|
||||
file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
|
||||
archive.extract(file_path, self.workdir)
|
||||
self.vm.set_console()
|
||||
self.vm.add_args('-kernel', self.workdir + '/creek/creek.bin')
|
||||
self.vm.launch()
|
||||
wait_for_console_pattern(self, 'QEMU advent calendar 2020',
|
||||
self.panic_message)
|
||||
|
||||
def test_ppc_virtex_ml507(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc
|
||||
:avocado: tags=machine:virtex-ml507
|
||||
"""
|
||||
tar_url = ('https://www.qemu-advent-calendar.org'
|
||||
'/2020/download/hippo.tar.gz')
|
||||
tar_hash = '306b95bfe7d147f125aa176a877e266db8ef914a'
|
||||
file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
|
||||
archive.extract(file_path, self.workdir)
|
||||
self.vm.set_console()
|
||||
self.vm.add_args('-kernel', self.workdir + '/hippo/hippo.linux',
|
||||
'-dtb', self.workdir + '/hippo/virtex440-ml507.dtb',
|
||||
'-m', '512')
|
||||
self.vm.launch()
|
||||
wait_for_console_pattern(self, 'QEMU advent calendar 2020',
|
||||
self.panic_message)
|
32
tests/acceptance/ppc_mpc8544ds.py
Normal file
32
tests/acceptance/ppc_mpc8544ds.py
Normal file
@ -0,0 +1,32 @@
|
||||
# Test that Linux kernel boots on ppc machines and check the console
|
||||
#
|
||||
# Copyright (c) 2018, 2020 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.
|
||||
|
||||
from avocado.utils import archive
|
||||
from avocado_qemu import Test
|
||||
from avocado_qemu import wait_for_console_pattern
|
||||
|
||||
class Mpc8544dsMachine(Test):
|
||||
|
||||
timeout = 90
|
||||
KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
|
||||
panic_message = 'Kernel panic - not syncing'
|
||||
|
||||
def test_ppc_mpc8544ds(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc
|
||||
:avocado: tags=machine:mpc8544ds
|
||||
"""
|
||||
tar_url = ('https://www.qemu-advent-calendar.org'
|
||||
'/2020/download/day17.tar.gz')
|
||||
tar_hash = '7a5239542a7c4257aa4d3b7f6ddf08fb6775c494'
|
||||
file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
|
||||
archive.extract(file_path, self.workdir)
|
||||
self.vm.set_console()
|
||||
self.vm.add_args('-kernel', self.workdir + '/creek/creek.bin')
|
||||
self.vm.launch()
|
||||
wait_for_console_pattern(self, 'QEMU advent calendar 2020',
|
||||
self.panic_message)
|
@ -7,7 +7,6 @@
|
||||
|
||||
import os
|
||||
|
||||
from avocado import skipIf
|
||||
from avocado import skipUnless
|
||||
from avocado_qemu import Test
|
||||
from avocado_qemu import wait_for_console_pattern
|
||||
@ -67,8 +66,8 @@ class IbmPrep40pMachine(Test):
|
||||
:avocado: tags=machine:40p
|
||||
:avocado: tags=os:netbsd
|
||||
"""
|
||||
drive_url = ('https://cdn.netbsd.org/pub/NetBSD/iso/7.1.2/'
|
||||
'NetBSD-7.1.2-prep.iso')
|
||||
drive_url = ('https://archive.netbsd.org/pub/NetBSD-archive/'
|
||||
'NetBSD-7.1.2/iso/NetBSD-7.1.2-prep.iso')
|
||||
drive_hash = 'ac6fa2707d888b36d6fa64de6e7fe48e'
|
||||
drive_path = self.fetch_asset(drive_url, asset_hash=drive_hash,
|
||||
algorithm='md5')
|
||||
|
35
tests/acceptance/ppc_pseries.py
Normal file
35
tests/acceptance/ppc_pseries.py
Normal file
@ -0,0 +1,35 @@
|
||||
# Test that Linux kernel boots on ppc machines and check the console
|
||||
#
|
||||
# Copyright (c) 2018, 2020 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.
|
||||
|
||||
from avocado.utils import archive
|
||||
from avocado_qemu import Test
|
||||
from avocado_qemu import wait_for_console_pattern
|
||||
|
||||
class pseriesMachine(Test):
|
||||
|
||||
timeout = 90
|
||||
KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
|
||||
panic_message = 'Kernel panic - not syncing'
|
||||
|
||||
def test_ppc64_pseries(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc64
|
||||
:avocado: tags=machine:pseries
|
||||
"""
|
||||
kernel_url = ('https://archives.fedoraproject.org/pub/archive'
|
||||
'/fedora-secondary/releases/29/Everything/ppc64le/os'
|
||||
'/ppc/ppc64/vmlinuz')
|
||||
kernel_hash = '3fe04abfc852b66653b8c3c897a59a689270bc77'
|
||||
kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
|
||||
|
||||
self.vm.set_console()
|
||||
kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=hvc0'
|
||||
self.vm.add_args('-kernel', kernel_path,
|
||||
'-append', kernel_command_line)
|
||||
self.vm.launch()
|
||||
console_pattern = 'Kernel command line: %s' % kernel_command_line
|
||||
wait_for_console_pattern(self, console_pattern, self.panic_message)
|
34
tests/acceptance/ppc_virtex_ml507.py
Normal file
34
tests/acceptance/ppc_virtex_ml507.py
Normal file
@ -0,0 +1,34 @@
|
||||
# Test that Linux kernel boots on ppc machines and check the console
|
||||
#
|
||||
# Copyright (c) 2018, 2020 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.
|
||||
|
||||
from avocado.utils import archive
|
||||
from avocado_qemu import Test
|
||||
from avocado_qemu import wait_for_console_pattern
|
||||
|
||||
class VirtexMl507Machine(Test):
|
||||
|
||||
timeout = 90
|
||||
KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
|
||||
panic_message = 'Kernel panic - not syncing'
|
||||
|
||||
def test_ppc_virtex_ml507(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc
|
||||
:avocado: tags=machine:virtex-ml507
|
||||
"""
|
||||
tar_url = ('https://www.qemu-advent-calendar.org'
|
||||
'/2020/download/hippo.tar.gz')
|
||||
tar_hash = '306b95bfe7d147f125aa176a877e266db8ef914a'
|
||||
file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
|
||||
archive.extract(file_path, self.workdir)
|
||||
self.vm.set_console()
|
||||
self.vm.add_args('-kernel', self.workdir + '/hippo/hippo.linux',
|
||||
'-dtb', self.workdir + '/hippo/virtex440-ml507.dtb',
|
||||
'-m', '512')
|
||||
self.vm.launch()
|
||||
wait_for_console_pattern(self, 'QEMU advent calendar 2020',
|
||||
self.panic_message)
|
@ -207,6 +207,38 @@ class ReplayKernelNormal(ReplayKernelBase):
|
||||
'-initrd', initrd_path,
|
||||
'-no-reboot'))
|
||||
|
||||
def test_s390x_s390_ccw_virtio(self):
|
||||
"""
|
||||
:avocado: tags=arch:s390x
|
||||
:avocado: tags=machine:s390-ccw-virtio
|
||||
"""
|
||||
kernel_url = ('https://archives.fedoraproject.org/pub/archive'
|
||||
'/fedora-secondary/releases/29/Everything/s390x/os/images'
|
||||
'/kernel.img')
|
||||
kernel_hash = 'e8e8439103ef8053418ef062644ffd46a7919313'
|
||||
kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
|
||||
|
||||
kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=sclp0'
|
||||
console_pattern = 'Kernel command line: %s' % kernel_command_line
|
||||
self.run_rr(kernel_path, kernel_command_line, console_pattern, shift=9)
|
||||
|
||||
def test_alpha_clipper(self):
|
||||
"""
|
||||
:avocado: tags=arch:alpha
|
||||
:avocado: tags=machine:clipper
|
||||
"""
|
||||
kernel_url = ('http://archive.debian.org/debian/dists/lenny/main/'
|
||||
'installer-alpha/20090123lenny10/images/cdrom/vmlinuz')
|
||||
kernel_hash = '3a943149335529e2ed3e74d0d787b85fb5671ba3'
|
||||
kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
|
||||
|
||||
uncompressed_kernel = archive.uncompress(kernel_path, self.workdir)
|
||||
|
||||
kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyS0'
|
||||
console_pattern = 'Kernel command line: %s' % kernel_command_line
|
||||
self.run_rr(uncompressed_kernel, kernel_command_line, console_pattern, shift=9,
|
||||
args=('-nodefaults', ))
|
||||
|
||||
def test_ppc64_pseries(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc64
|
||||
@ -302,6 +334,28 @@ class ReplayKernelNormal(ReplayKernelBase):
|
||||
file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
|
||||
self.do_test_advcal_2018(file_path, 'uImage')
|
||||
|
||||
def test_or1k_sim(self):
|
||||
"""
|
||||
:avocado: tags=arch:or1k
|
||||
:avocado: tags=machine:or1k-sim
|
||||
"""
|
||||
tar_hash = '20334cdaf386108c530ff0badaecc955693027dd'
|
||||
tar_url = ('https://www.qemu-advent-calendar.org'
|
||||
'/2018/download/day20.tar.xz')
|
||||
file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
|
||||
self.do_test_advcal_2018(file_path, 'vmlinux')
|
||||
|
||||
def test_nios2_10m50(self):
|
||||
"""
|
||||
:avocado: tags=arch:nios2
|
||||
:avocado: tags=machine:10m50-ghrd
|
||||
"""
|
||||
tar_hash = 'e4251141726c412ac0407c5a6bceefbbff018918'
|
||||
tar_url = ('https://www.qemu-advent-calendar.org'
|
||||
'/2018/download/day14.tar.xz')
|
||||
file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
|
||||
self.do_test_advcal_2018(file_path, 'vmlinux.elf')
|
||||
|
||||
def test_ppc_g3beige(self):
|
||||
"""
|
||||
:avocado: tags=arch:ppc
|
||||
|
116
tests/acceptance/replay_linux.py
Normal file
116
tests/acceptance/replay_linux.py
Normal file
@ -0,0 +1,116 @@
|
||||
# Record/replay test that boots a complete Linux system via a cloud image
|
||||
#
|
||||
# Copyright (c) 2020 ISP RAS
|
||||
#
|
||||
# Author:
|
||||
# Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
|
||||
#
|
||||
# This work is licensed under the terms of the GNU GPL, version 2 or
|
||||
# later. See the COPYING file in the top-level directory.
|
||||
|
||||
import os
|
||||
import logging
|
||||
import time
|
||||
|
||||
from avocado import skipUnless
|
||||
from avocado.utils import cloudinit
|
||||
from avocado.utils import network
|
||||
from avocado.utils import vmimage
|
||||
from avocado.utils import datadrainer
|
||||
from avocado.utils.path import find_command
|
||||
from avocado_qemu import LinuxTest
|
||||
|
||||
class ReplayLinux(LinuxTest):
|
||||
"""
|
||||
Boots a Linux system, checking for a successful initialization
|
||||
"""
|
||||
|
||||
timeout = 1800
|
||||
chksum = None
|
||||
hdd = 'ide-hd'
|
||||
cd = 'ide-cd'
|
||||
bus = 'ide'
|
||||
|
||||
def setUp(self):
|
||||
super(ReplayLinux, self).setUp()
|
||||
self.boot_path = self.download_boot()
|
||||
self.cloudinit_path = self.prepare_cloudinit()
|
||||
|
||||
def vm_add_disk(self, vm, path, id, device):
|
||||
bus_string = ''
|
||||
if self.bus:
|
||||
bus_string = ',bus=%s.%d' % (self.bus, id,)
|
||||
vm.add_args('-drive', 'file=%s,snapshot,id=disk%s,if=none' % (path, id))
|
||||
vm.add_args('-drive',
|
||||
'driver=blkreplay,id=disk%s-rr,if=none,image=disk%s' % (id, id))
|
||||
vm.add_args('-device',
|
||||
'%s,drive=disk%s-rr%s' % (device, id, bus_string))
|
||||
|
||||
def launch_and_wait(self, record, args, shift):
|
||||
vm = self.get_vm()
|
||||
vm.add_args('-smp', '1')
|
||||
vm.add_args('-m', '1024')
|
||||
vm.add_args('-object', 'filter-replay,id=replay,netdev=hub0port0')
|
||||
if args:
|
||||
vm.add_args(*args)
|
||||
self.vm_add_disk(vm, self.boot_path, 0, self.hdd)
|
||||
self.vm_add_disk(vm, self.cloudinit_path, 1, self.cd)
|
||||
logger = logging.getLogger('replay')
|
||||
if record:
|
||||
logger.info('recording the execution...')
|
||||
mode = 'record'
|
||||
else:
|
||||
logger.info('replaying the execution...')
|
||||
mode = 'replay'
|
||||
replay_path = os.path.join(self.workdir, 'replay.bin')
|
||||
vm.add_args('-icount', 'shift=%s,rr=%s,rrfile=%s' %
|
||||
(shift, mode, replay_path))
|
||||
|
||||
start_time = time.time()
|
||||
|
||||
vm.set_console()
|
||||
vm.launch()
|
||||
console_drainer = datadrainer.LineLogger(vm.console_socket.fileno(),
|
||||
logger=self.log.getChild('console'),
|
||||
stop_check=(lambda : not vm.is_running()))
|
||||
console_drainer.start()
|
||||
if record:
|
||||
cloudinit.wait_for_phone_home(('0.0.0.0', self.phone_home_port),
|
||||
self.name)
|
||||
vm.shutdown()
|
||||
logger.info('finished the recording with log size %s bytes'
|
||||
% os.path.getsize(replay_path))
|
||||
else:
|
||||
vm.event_wait('SHUTDOWN', self.timeout)
|
||||
vm.shutdown(True)
|
||||
logger.info('successfully fihished the replay')
|
||||
elapsed = time.time() - start_time
|
||||
logger.info('elapsed time %.2f sec' % elapsed)
|
||||
return elapsed
|
||||
|
||||
def run_rr(self, args=None, shift=7):
|
||||
t1 = self.launch_and_wait(True, args, shift)
|
||||
t2 = self.launch_and_wait(False, args, shift)
|
||||
logger = logging.getLogger('replay')
|
||||
logger.info('replay overhead {:.2%}'.format(t2 / t1 - 1))
|
||||
|
||||
@skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
|
||||
class ReplayLinuxX8664(ReplayLinux):
|
||||
"""
|
||||
:avocado: tags=arch:x86_64
|
||||
:avocado: tags=accel:tcg
|
||||
"""
|
||||
|
||||
chksum = 'e3c1b309d9203604922d6e255c2c5d098a309c2d46215d8fc026954f3c5c27a0'
|
||||
|
||||
def test_pc_i440fx(self):
|
||||
"""
|
||||
:avocado: tags=machine:pc
|
||||
"""
|
||||
self.run_rr(shift=1)
|
||||
|
||||
def test_pc_q35(self):
|
||||
"""
|
||||
:avocado: tags=machine:q35
|
||||
"""
|
||||
self.run_rr(shift=3)
|
@ -45,7 +45,7 @@ class Vnc(Test):
|
||||
'Could not set password')
|
||||
|
||||
def test_change_password(self):
|
||||
self.vm.add_args('-nodefaults', '-S', '-vnc', ':0,password')
|
||||
self.vm.add_args('-nodefaults', '-S', '-vnc', ':0,password=on')
|
||||
self.vm.launch()
|
||||
self.assertTrue(self.vm.qmp('query-vnc')['return']['enabled'])
|
||||
set_password_response = self.vm.qmp('change-vnc-password',
|
||||
|
Loading…
Reference in New Issue
Block a user