mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-23 14:11:48 +00:00
* Patches to speed up and improve the gitlab-CI
* Documentation for the decorators in the "acceptance" tests * One small rework of a libqtest function -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmARBpMRHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbXrmg//ap1z2taLpgUdMVxImdMieqsfzSxMUt75 vkmQvk+rquK8VqwVKGaMsps7aANXDFD2etjAx0zp/9uS6OApNRegRFNb5eOr2oUR RBhnNYkabmAvabn7lFmb2FZ84cCA3c3rY0JsZ44eYcdOOQVLuKMH6//m7gPztmkA BNYh8riAmOTVjL81cJVmA/hKUO7P1eR2+604gRr4t7mP9/I72QG3f12o062c+dWA xXNK8gtqSjgfofZeqU8HYHkJoyi/3N6aGHE4XmojPbE0fzj1gjxlHm0LpIhrpwbI hxkj3fwVh2e89dhMXCYhFKrYjUEQuJPUdLmMRl2KcD9AmNFtM3S+WSi6SX8m9CXR FBYpz5zOk7HHDZKJZ17U0xr5NZ8E0iULc0uLAVm5BqkmiT3DqjaWb0JYe/4rUT7Y XxOX7MHA5AByRfv6IBfKCmRPUXM16W4tvWYHsCzU7ViV7eOxNLl4yY+3YvyfigHf 5MENOAkr3kdL54sDOsARCLs8D6zyXyKyspt13SAoRg7cGxS3WpSKYVKxYeX+VXbs S/mUoKFT1IE8PkiDnQzw5PypPxgc3700AlrIAk9ZQiWol5tfq8QKBf4a9LSpV5Uu 02OlI3ufkdZwALgw9ZJNsSR0hX/rcALwOxlQ4kBcWsT45kxwch0337H+U6bUVnca AJpJfDzlXI0= =CNCA -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/huth-gitlab/tags/pull-request-2021-01-27' into staging * Patches to speed up and improve the gitlab-CI * Documentation for the decorators in the "acceptance" tests * One small rework of a libqtest function # gpg: Signature made Wed 27 Jan 2021 06:22:11 GMT # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * remotes/huth-gitlab/tags/pull-request-2021-01-27: libqtest: Rework qtest_rsp() docs/devel: Explain how acceptance tests can be skipped gitlab-ci.yml: Avoid recompiling the sources in the test jobs gitlab-ci.yml: Exclude some redundant targets in build-without-default-features meson: Do not build optional libraries by default configure: Only check for audio drivers if system-mode is selected gitlab-ci.yml: Avoid some submodules to speed up the CI a little bit gitlab-ci: Test building linux-user targets on CentOS 7 tests/docker: Install static libc package in CentOS 7 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
af47e82269
@ -38,9 +38,12 @@ include:
|
||||
stage: test
|
||||
image: $CI_REGISTRY_IMAGE/qemu/$IMAGE:latest
|
||||
script:
|
||||
- scripts/git-submodule.sh update
|
||||
$(grep GIT_SUBMODULES build/config-host.mak | sed 's/GIT_SUBMODULES=//')
|
||||
- cd build
|
||||
- find . -type f -exec touch {} +
|
||||
- make $MAKE_CHECK_ARGS
|
||||
# Avoid recompiling by hiding ninja with NINJA=":"
|
||||
- make NINJA=":" $MAKE_CHECK_ARGS
|
||||
|
||||
.acceptance_template: &acceptance_definition
|
||||
cache:
|
||||
@ -109,6 +112,7 @@ build-system-ubuntu:
|
||||
<<: *native_build_job_definition
|
||||
variables:
|
||||
IMAGE: ubuntu2004
|
||||
CONFIGURE_ARGS: --enable-fdt=system --enable-slirp=system
|
||||
TARGETS: aarch64-softmmu alpha-softmmu cris-softmmu hppa-softmmu
|
||||
moxie-softmmu microblazeel-softmmu mips64el-softmmu
|
||||
MAKE_CHECK_ARGS: check-build
|
||||
@ -140,6 +144,7 @@ build-system-debian:
|
||||
<<: *native_build_job_definition
|
||||
variables:
|
||||
IMAGE: debian-amd64
|
||||
CONFIGURE_ARGS: --enable-fdt=system
|
||||
TARGETS: arm-softmmu avr-softmmu i386-softmmu mipsel-softmmu
|
||||
riscv64-softmmu sh4eb-softmmu sparc-softmmu xtensaeb-softmmu
|
||||
MAKE_CHECK_ARGS: check-build
|
||||
@ -185,6 +190,7 @@ build-system-fedora:
|
||||
variables:
|
||||
IMAGE: fedora
|
||||
CONFIGURE_ARGS: --disable-gcrypt --enable-nettle --enable-docs
|
||||
--enable-fdt=system --enable-slirp=system --enable-capstone=system
|
||||
TARGETS: tricore-softmmu microblaze-softmmu mips-softmmu
|
||||
xtensa-softmmu m68k-softmmu riscv32-softmmu ppc-softmmu sparc64-softmmu
|
||||
MAKE_CHECK_ARGS: check-build
|
||||
@ -216,7 +222,7 @@ build-system-centos:
|
||||
<<: *native_build_job_definition
|
||||
variables:
|
||||
IMAGE: centos8
|
||||
CONFIGURE_ARGS: --disable-nettle --enable-gcrypt
|
||||
CONFIGURE_ARGS: --disable-nettle --enable-gcrypt --enable-fdt=system
|
||||
TARGETS: ppc64-softmmu or1k-softmmu s390x-softmmu
|
||||
x86_64-softmmu rx-softmmu sh4-softmmu nios2-softmmu
|
||||
MAKE_CHECK_ARGS: check-build
|
||||
@ -248,6 +254,7 @@ build-system-opensuse:
|
||||
<<: *native_build_job_definition
|
||||
variables:
|
||||
IMAGE: opensuse-leap
|
||||
CONFIGURE_ARGS: --enable-fdt=system
|
||||
TARGETS: s390x-softmmu x86_64-softmmu aarch64-softmmu
|
||||
MAKE_CHECK_ARGS: check-build
|
||||
artifacts:
|
||||
@ -411,6 +418,13 @@ build-user-plugins:
|
||||
MAKE_CHECK_ARGS: check-tcg
|
||||
timeout: 1h 30m
|
||||
|
||||
build-user-centos7:
|
||||
<<: *native_build_job_definition
|
||||
variables:
|
||||
IMAGE: centos7
|
||||
CONFIGURE_ARGS: --disable-system --disable-tools --disable-docs
|
||||
MAKE_CHECK_ARGS: check-tcg
|
||||
|
||||
build-some-softmmu-plugins:
|
||||
<<: *native_build_job_definition
|
||||
variables:
|
||||
@ -606,6 +620,7 @@ build-without-default-features:
|
||||
variables:
|
||||
IMAGE: debian-amd64
|
||||
CONFIGURE_ARGS: --without-default-features --disable-user
|
||||
--target-list-exclude=arm-softmmu,i386-softmmu,mipsel-softmmu,mips64-softmmu,ppc-softmmu
|
||||
MAKE_CHECK_ARGS: check-unit
|
||||
|
||||
check-patch:
|
||||
|
6
configure
vendored
6
configure
vendored
@ -2319,6 +2319,12 @@ if test -z "$want_tools"; then
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# Disable features only meaningful for system-mode emulation
|
||||
if test "$softmmu" = "no"; then
|
||||
audio_drv_list=""
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# Some versions of Mac OS X incorrectly define SIZE_MAX
|
||||
cat > $TMPC << EOF
|
||||
|
@ -871,6 +871,68 @@ qemu_bin
|
||||
|
||||
The exact QEMU binary to be used on QEMUMachine.
|
||||
|
||||
Skipping tests
|
||||
--------------
|
||||
The Avocado framework provides Python decorators which allow for easily skip
|
||||
tests running under certain conditions. For example, on the lack of a binary
|
||||
on the test system or when the running environment is a CI system. For further
|
||||
information about those decorators, please refer to::
|
||||
|
||||
https://avocado-framework.readthedocs.io/en/latest/guides/writer/chapters/writing.html#skipping-tests
|
||||
|
||||
While the conditions for skipping tests are often specifics of each one, there
|
||||
are recurring scenarios identified by the QEMU developers and the use of
|
||||
environment variables became a kind of standard way to enable/disable tests.
|
||||
|
||||
Here is a list of the most used variables:
|
||||
|
||||
AVOCADO_ALLOW_LARGE_STORAGE
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Tests which are going to fetch or produce assets considered *large* are not
|
||||
going to run unless that `AVOCADO_ALLOW_LARGE_STORAGE=1` is exported on
|
||||
the environment.
|
||||
|
||||
The definition of *large* is a bit arbitrary here, but it usually means an
|
||||
asset which occupies at least 1GB of size on disk when uncompressed.
|
||||
|
||||
AVOCADO_ALLOW_UNTRUSTED_CODE
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
There are tests which will boot a kernel image or firmware that can be
|
||||
considered not safe to run on the developer's workstation, thus they are
|
||||
skipped by default. The definition of *not safe* is also arbitrary but
|
||||
usually it means a blob which either its source or build process aren't
|
||||
public available.
|
||||
|
||||
You should export `AVOCADO_ALLOW_UNTRUSTED_CODE=1` on the environment in
|
||||
order to allow tests which make use of those kind of assets.
|
||||
|
||||
AVOCADO_TIMEOUT_EXPECTED
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
The Avocado framework has a timeout mechanism which interrupts tests to avoid the
|
||||
test suite of getting stuck. The timeout value can be set via test parameter or
|
||||
property defined in the test class, for further details::
|
||||
|
||||
https://avocado-framework.readthedocs.io/en/latest/guides/writer/chapters/writing.html#setting-a-test-timeout
|
||||
|
||||
Even though the timeout can be set by the test developer, there are some tests
|
||||
that may not have a well-defined limit of time to finish under certain
|
||||
conditions. For example, tests that take longer to execute when QEMU is
|
||||
compiled with debug flags. Therefore, the `AVOCADO_TIMEOUT_EXPECTED` variable
|
||||
has been used to determine whether those tests should run or not.
|
||||
|
||||
GITLAB_CI
|
||||
~~~~~~~~~
|
||||
A number of tests are flagged to not run on the GitLab CI. Usually because
|
||||
they proved to the flaky or there are constraints on the CI environment which
|
||||
would make them fail. If you encounter a similar situation then use that
|
||||
variable as shown on the code snippet below to skip the test:
|
||||
|
||||
.. code::
|
||||
|
||||
@skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
|
||||
def test(self):
|
||||
do_something()
|
||||
|
||||
Uninstalling Avocado
|
||||
--------------------
|
||||
|
||||
|
@ -1460,6 +1460,7 @@ if capstone_opt == 'internal'
|
||||
]
|
||||
|
||||
libcapstone = static_library('capstone',
|
||||
build_by_default: false,
|
||||
sources: capstone_files,
|
||||
c_args: capstone_cargs,
|
||||
include_directories: 'capstone/include')
|
||||
@ -1537,6 +1538,7 @@ if have_system
|
||||
|
||||
slirp_inc = include_directories('slirp', 'slirp/src')
|
||||
libslirp = static_library('slirp',
|
||||
build_by_default: false,
|
||||
sources: slirp_files,
|
||||
c_args: slirp_cargs,
|
||||
include_directories: slirp_inc)
|
||||
@ -1582,6 +1584,7 @@ if have_system
|
||||
|
||||
fdt_inc = include_directories('dtc/libfdt')
|
||||
libfdt = static_library('fdt',
|
||||
build_by_default: false,
|
||||
sources: fdt_files,
|
||||
include_directories: fdt_inc)
|
||||
fdt = declare_dependency(link_with: libfdt,
|
||||
|
@ -15,6 +15,7 @@ ENV PACKAGES \
|
||||
gettext \
|
||||
git \
|
||||
glib2-devel \
|
||||
glibc-static \
|
||||
gnutls-devel \
|
||||
libaio-devel \
|
||||
libepoxy-devel \
|
||||
|
@ -15,6 +15,7 @@ ENV PACKAGES \
|
||||
glib2-devel \
|
||||
libaio-devel \
|
||||
libepoxy-devel \
|
||||
libfdt-devel \
|
||||
libgcrypt-devel \
|
||||
lzo-devel \
|
||||
make \
|
||||
|
@ -21,6 +21,7 @@ RUN apt update && \
|
||||
libbz2-dev \
|
||||
liblzo2-dev \
|
||||
libgcrypt20-dev \
|
||||
libfdt-dev \
|
||||
librdmacm-dev \
|
||||
libsasl2-dev \
|
||||
libsnappy-dev \
|
||||
|
@ -6,6 +6,7 @@ ENV PACKAGES \
|
||||
brlapi-devel \
|
||||
bzip2 \
|
||||
bzip2-devel \
|
||||
capstone-devel \
|
||||
ccache \
|
||||
clang \
|
||||
cyrus-sasl-devel \
|
||||
@ -37,6 +38,7 @@ ENV PACKAGES \
|
||||
libpng-devel \
|
||||
librbd-devel \
|
||||
libseccomp-devel \
|
||||
libslirp-devel \
|
||||
libssh-devel \
|
||||
libubsan \
|
||||
libudev-devel \
|
||||
@ -46,6 +48,7 @@ ENV PACKAGES \
|
||||
llvm \
|
||||
lzo-devel \
|
||||
make \
|
||||
meson \
|
||||
mingw32-bzip2 \
|
||||
mingw32-curl \
|
||||
mingw32-glib2 \
|
||||
|
@ -37,6 +37,7 @@ ENV PACKAGES flex bison \
|
||||
libsasl2-dev \
|
||||
libsdl2-dev \
|
||||
libseccomp-dev \
|
||||
libslirp-dev \
|
||||
libsnappy-dev \
|
||||
libspice-protocol-dev \
|
||||
libspice-server-dev \
|
||||
|
@ -503,7 +503,7 @@ static GString *qtest_client_socket_recv_line(QTestState *s)
|
||||
return line;
|
||||
}
|
||||
|
||||
static gchar **qtest_rsp(QTestState *s, int expected_args)
|
||||
static gchar **qtest_rsp_args(QTestState *s, int expected_args)
|
||||
{
|
||||
GString *line;
|
||||
gchar **words;
|
||||
@ -539,25 +539,27 @@ redo:
|
||||
g_assert(words[0] != NULL);
|
||||
g_assert_cmpstr(words[0], ==, "OK");
|
||||
|
||||
if (expected_args) {
|
||||
for (i = 0; i < expected_args; i++) {
|
||||
g_assert(words[i] != NULL);
|
||||
}
|
||||
} else {
|
||||
g_strfreev(words);
|
||||
words = NULL;
|
||||
for (i = 0; i < expected_args; i++) {
|
||||
g_assert(words[i] != NULL);
|
||||
}
|
||||
|
||||
return words;
|
||||
}
|
||||
|
||||
static void qtest_rsp(QTestState *s)
|
||||
{
|
||||
gchar **words = qtest_rsp_args(s, 0);
|
||||
|
||||
g_strfreev(words);
|
||||
}
|
||||
|
||||
static int qtest_query_target_endianness(QTestState *s)
|
||||
{
|
||||
gchar **args;
|
||||
int big_endian;
|
||||
|
||||
qtest_sendf(s, "endianness\n");
|
||||
args = qtest_rsp(s, 1);
|
||||
args = qtest_rsp_args(s, 1);
|
||||
g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0);
|
||||
big_endian = strcmp(args[1], "big") == 0;
|
||||
g_strfreev(args);
|
||||
@ -892,14 +894,14 @@ bool qtest_get_irq(QTestState *s, int num)
|
||||
void qtest_module_load(QTestState *s, const char *prefix, const char *libname)
|
||||
{
|
||||
qtest_sendf(s, "module_load %s %s\n", prefix, libname);
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
}
|
||||
|
||||
static int64_t qtest_clock_rsp(QTestState *s)
|
||||
{
|
||||
gchar **words;
|
||||
int64_t clock;
|
||||
words = qtest_rsp(s, 2);
|
||||
words = qtest_rsp_args(s, 2);
|
||||
clock = g_ascii_strtoll(words[1], NULL, 0);
|
||||
g_strfreev(words);
|
||||
return clock;
|
||||
@ -926,13 +928,13 @@ int64_t qtest_clock_set(QTestState *s, int64_t val)
|
||||
void qtest_irq_intercept_out(QTestState *s, const char *qom_path)
|
||||
{
|
||||
qtest_sendf(s, "irq_intercept_out %s\n", qom_path);
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
}
|
||||
|
||||
void qtest_irq_intercept_in(QTestState *s, const char *qom_path)
|
||||
{
|
||||
qtest_sendf(s, "irq_intercept_in %s\n", qom_path);
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
}
|
||||
|
||||
void qtest_set_irq_in(QTestState *s, const char *qom_path, const char *name,
|
||||
@ -942,13 +944,13 @@ void qtest_set_irq_in(QTestState *s, const char *qom_path, const char *name,
|
||||
name = "unnamed-gpio-in";
|
||||
}
|
||||
qtest_sendf(s, "set_irq_in %s %s %d %d\n", qom_path, name, num, level);
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
}
|
||||
|
||||
static void qtest_out(QTestState *s, const char *cmd, uint16_t addr, uint32_t value)
|
||||
{
|
||||
qtest_sendf(s, "%s 0x%x 0x%x\n", cmd, addr, value);
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
}
|
||||
|
||||
void qtest_outb(QTestState *s, uint16_t addr, uint8_t value)
|
||||
@ -973,7 +975,7 @@ static uint32_t qtest_in(QTestState *s, const char *cmd, uint16_t addr)
|
||||
unsigned long value;
|
||||
|
||||
qtest_sendf(s, "%s 0x%x\n", cmd, addr);
|
||||
args = qtest_rsp(s, 2);
|
||||
args = qtest_rsp_args(s, 2);
|
||||
ret = qemu_strtoul(args[1], NULL, 0, &value);
|
||||
g_assert(!ret && value <= UINT32_MAX);
|
||||
g_strfreev(args);
|
||||
@ -1000,7 +1002,7 @@ static void qtest_write(QTestState *s, const char *cmd, uint64_t addr,
|
||||
uint64_t value)
|
||||
{
|
||||
qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 "\n", cmd, addr, value);
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
}
|
||||
|
||||
void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value)
|
||||
@ -1030,7 +1032,7 @@ static uint64_t qtest_read(QTestState *s, const char *cmd, uint64_t addr)
|
||||
uint64_t value;
|
||||
|
||||
qtest_sendf(s, "%s 0x%" PRIx64 "\n", cmd, addr);
|
||||
args = qtest_rsp(s, 2);
|
||||
args = qtest_rsp_args(s, 2);
|
||||
ret = qemu_strtou64(args[1], NULL, 0, &value);
|
||||
g_assert(!ret);
|
||||
g_strfreev(args);
|
||||
@ -1082,7 +1084,7 @@ void qtest_memread(QTestState *s, uint64_t addr, void *data, size_t size)
|
||||
}
|
||||
|
||||
qtest_sendf(s, "read 0x%" PRIx64 " 0x%zx\n", addr, size);
|
||||
args = qtest_rsp(s, 2);
|
||||
args = qtest_rsp_args(s, 2);
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
ptr[i] = hex2nib(args[1][2 + (i * 2)]) << 4;
|
||||
@ -1098,7 +1100,7 @@ uint64_t qtest_rtas_call(QTestState *s, const char *name,
|
||||
{
|
||||
qtest_sendf(s, "rtas %s %u 0x%"PRIx64" %u 0x%"PRIx64"\n",
|
||||
name, nargs, args, nret, ret);
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1134,7 +1136,7 @@ void qtest_bufwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
|
||||
qtest_sendf(s, "b64write 0x%" PRIx64 " 0x%zx ", addr, size);
|
||||
s->ops.send(s, bdata);
|
||||
s->ops.send(s, "\n");
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
g_free(bdata);
|
||||
}
|
||||
|
||||
@ -1144,7 +1146,7 @@ void qtest_bufread(QTestState *s, uint64_t addr, void *data, size_t size)
|
||||
size_t len;
|
||||
|
||||
qtest_sendf(s, "b64read 0x%" PRIx64 " 0x%zx\n", addr, size);
|
||||
args = qtest_rsp(s, 2);
|
||||
args = qtest_rsp_args(s, 2);
|
||||
|
||||
g_base64_decode_inplace(args[1], &len);
|
||||
if (size != len) {
|
||||
@ -1174,14 +1176,14 @@ void qtest_memwrite(QTestState *s, uint64_t addr, const void *data, size_t size)
|
||||
}
|
||||
|
||||
qtest_sendf(s, "write 0x%" PRIx64 " 0x%zx 0x%s\n", addr, size, enc);
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
g_free(enc);
|
||||
}
|
||||
|
||||
void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
|
||||
{
|
||||
qtest_sendf(s, "memset 0x%" PRIx64 " 0x%zx 0x%02x\n", addr, size, pattern);
|
||||
qtest_rsp(s, 0);
|
||||
qtest_rsp(s);
|
||||
}
|
||||
|
||||
void qtest_qmp_assert_success(QTestState *qts, const char *fmt, ...)
|
||||
|
Loading…
x
Reference in New Issue
Block a user