xserver/.gitlab-ci.yml
Peter Hutterer bea8d65fc8 test: add pytest-based test suite
This test suite is primarily aimed at reproducing the various CVE issues
we've had over the years that require custom crafted protocol requests.
It may also be useful for other testing.

Wrapped in python because pytest is a powerful test suite runner and
writing custom buffers is easy.

The architecture is so that we fork off an X server (one or more of
Xvfb, Xwayland, Xorg) and then run our test clients against that to
check whether we get the right reply, or crash the server, or whether
valgrind complains about something (valgrind is started automatically
for tests that are marked as such).

Tests can be run manually via pytest or via meson test.

Assisted-by: Claude:claude-claude-opus-4-6
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2187>
2026-05-10 23:42:43 +00:00

380 lines
12 KiB
YAML

# vim: set expandtab shiftwidth=2 tabstop=8 textwidth=0 filetype=yaml:
#
# This CI uses the freedesktop.org ci-templates.
# Please see the ci-templates documentation for details:
# https://freedesktop.pages.freedesktop.org/ci-templates/
.templates_sha: &template_sha baa94a8f673dd1f11f81377106310752936d3672 # see https://docs.gitlab.com/ee/ci/yaml/#includefile
# FDO_DISTRIBUTION_TAG is the tag of the docker image used for the build jobs.
# If the image doesn't exist yet, the docker-image stage generates it.
#
# In order to generate a new image, one should generally change the tag.
# While removing the image from the registry would also work, that's not
# recommended except for ephemeral images during development: Replacing an
# image after a significant amount of time might pull in newer versions of
# gcc/clang or other packages, which might break the build with older commits
# using the same tag.
variables:
FDO_UPSTREAM_REPO: 'xorg/xserver'
MESON_BUILDDIR: 'build'
REPO_URL_XORGPROTO: 'https://gitlab.freedesktop.org/xorg/proto/xorgproto.git'
XORG_DEBIAN_VERSION: 'bookworm-slim'
XORG_DEBIAN_EXEC: 'env FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} bash .gitlab-ci/debian-install.sh'
XORG_DEBIAN_TAG: '2026-04-28-pytest'
XORG_FREEBSD_VERSION: '14.2'
XORG_FREEBSD_EXEC: ''
XORG_FREEBSD_TAG: '2025-02-18-vm-image'
include:
- project: 'freedesktop/ci-templates'
ref: *template_sha
file:
- '/templates/debian.yml'
- '/templates/freebsd.yml'
- '/templates/ci-fairy.yml'
- template: Security/SAST.gitlab-ci.yml
stages:
- docker-image
- build-and-test
- drivers
- test
.ci-run-policy:
# Retry jobs after runner system failures
retry:
max: 2
when:
- runner_system_failure
# Cancel CI run if a newer commit is pushed to the same branch
interruptible: true
# This is everything but the DDXen
.dix_paths: &dix_paths
# Directories
- .gitlab-ci/**/*
- composite/**/*
- config/**/*
- damageext/**/*
- dbe/**/*
- dix/**/*
- doc/**/*
- dri3/**/*
- exa/**/*
- fb/**/*
- glamor/**/*
- glx/**/*
- include/**/*
- m4/**/*
- man/**/*
- mi/**/*
- miext/**/*
- os/**/*
- present/**/*
- pseudoramiX/**/*
- randr/**/*
- record/**/*
- render/**/*
- test/**/*
- Xext/**/*
- xfixes/**/*
- Xi/**/*
- xkb/**/*
# Files
- hw/meson.build
- .gitlab-ci.yml
- meson*
- xorg-server.m4
- xorg-server.pc.in
- xserver.ent.in
.xorg_paths: &xorg_paths
- hw/xfree86/**/*
.xwayland_paths: &xwayland_paths
- hw/xwayland/**/*
.all_ddx_paths:
- hw/**/*
.debian:
variables:
FDO_DISTRIBUTION_VERSION: '$XORG_DEBIAN_VERSION'
FDO_DISTRIBUTION_EXEC: '$XORG_DEBIAN_EXEC'
FDO_DISTRIBUTION_TAG: '$XORG_DEBIAN_TAG'
.freebsd:
tags:
- kvm
variables:
FDO_DISTRIBUTION_TAG: '$XORG_FREEBSD_TAG'
FDO_DISTRIBUTION_VERSION: '$XORG_FREEBSD_VERSION'
FDO_DISTRIBUTION_EXEC: ''
FDO_DISTRIBUTION_PACKAGES: 'git gcc pkgconf autoconf automake libtool xorg-macros xorgproto bash meson ninja pixman xtrans libXau libXdmcp libXfont2 libxkbfile libxcvt libpciaccess font-util libepoll-shim'
FDO_IMAGE_SIZE: '30G'
debian-bookworm:
extends:
- .fdo.container-build@debian
- .ci-run-policy
- .debian
stage: docker-image
variables:
GIT_STRATEGY: none
freebsd-image:
extends:
- .fdo.qemu-build@freebsd@x86_64
- .freebsd
stage: docker-image
variables:
GIT_STRATEGY: none
.xorg-image@debian:
extends:
- .fdo.distribution-image@debian
- .debian
.xorg-image@freebsd:
extends:
- .fdo.distribution-image@freebsd
- .freebsd
variables:
GIT_DEPTH: 1
PKG_CONFIG_PATH: /usr/share/pkgconfig:/usr/lib/pkgconfig:/usr/pkg/share/pkgconfig:/usr/pkg/lib/pkgconfig:/usr/local/libdata/pkgconfig
.common-build-and-test:
extends:
- .xorg-image@debian
- .ci-run-policy
stage: build-and-test
artifacts:
when: always
paths:
- $MESON_BUILDDIR/meson-logs/
- $MESON_BUILDDIR/test/piglit-results/
variables:
MESON_ARGS: -Dc_args="-fno-common" -Dprefix=/usr -Dxephyr=true -Dwerror=true -Dxcsecurity=true
CCACHE_COMPILERCHECK: content
CCACHE_DIR: /cache/xserver/cache
LC_ALL: C.UTF-8
before_script:
- export CCACHE_BASEDIR="$PWD"
- export PATH="/usr/lib/ccache:$PATH"
- ccache --show-stats
after_script:
- ccache --show-stats
meson:
extends: .common-build-and-test
script:
- .gitlab-ci/meson-build.sh --run-test
- .gitlab-ci/check-piglit-results.sh
- .gitlab-ci/manpages-check
- .gitlab-ci/check-ddx-build.sh
variables:
XTEST_DIR: /root/xts
PIGLIT_DIR: /root/piglit
LP_NUM_THREADS: 0
MESON_DDX_BUILD_ARGS: >
-Dxwayland=${BUILD_XWAYLAND} -Dxorg=${BUILD_XORG} -Dxephyr=${BUILD_XEPHYR} -Dxvfb=${BUILD_XVFB} -Dxnest=${BUILD_XNEST}
BUILD_XEPHYR: true
BUILD_XNEST: true
BUILD_XORG: true
BUILD_XVFB: true
BUILD_XWAYLAND: true
MESON_EXTRA_ARGS: ${MESON_DDX_BUILD_ARGS}
meson-enable-options:
extends: meson
variables:
MESON_EXTRA_ARGS: --auto-features=enabled -Dlisten_tcp=true -Dsuid_wrapper=true -Dxf86bigfont=true -Dxcsecurity=true -Dxpbproxy=true -Ddri1=true -Ddri2=true -Ddri3=true -Dlibunwind=true ${MESON_DDX_BUILD_ARGS}
meson-disable-options:
extends: meson
variables:
MESON_EXTRA_ARGS: --auto-features=disabled -Dglamor=false -Dglx=false -Dxdmcp=false -Dxdm-auth-1=false -Dint10=false -Dpciaccess=false -Dudev=false -Dudev_kms=false -Dvgahw=false -Dxace=false -Dxcsecurity=false -Dxinerama=false -Dxv=false -Dxvmc=false -Ddrm=false -Ddri1=false -Ddri2=false -Ddri3=false ${MESON_DDX_BUILD_ARGS}
meson-noglamor:
extends: meson
variables:
MESON_EXTRA_ARGS: -Dglamor=false ${MESON_DDX_BUILD_ARGS}
xwayland-nolibdecor:
extends: meson
variables:
BUILD_XEPHYR: false
BUILD_XNEST: false
BUILD_XORG: false
BUILD_XVFB: false
MESON_EXTRA_ARGS: -Dlibdecor=false ${MESON_DDX_BUILD_ARGS}
meson-asan:
extends: .common-build-and-test
script:
- .gitlab-ci/meson-build.sh --run-test
variables:
MESON_EXTRA_ARGS: >
-Db_sanitize=address
-Db_lundef=false
-Dxwayland=false
-Dxorg=false
-Dxephyr=false
-Dxnest=false
-Dxvfb=true
MESON_TEST_ARGS: --suite pyxtest
mingw-cross-build:
extends: .common-build-and-test
script:
- .gitlab-ci/meson-build.sh --run-install
variables:
MESON_ARGS: --cross-file=.gitlab-ci/cross-i686-w64-mingw32.txt -Dglx=false -Dlisten_tcp=true -Dpciaccess=false
freebsd:
stage: build-and-test
extends:
- .xorg-image@freebsd
variables:
MESON_ARGS: -Dglx=false -Dglamor=false -Dudev=false -Dudev_kms=false
script:
# running of of disk space without this
# needed until https://gitlab.freedesktop.org/freedesktop/ci-templates/-/issues/67 is fixed
- git gc
- git clone --depth=1 $REPO_URL_XORGPROTO dep.xorgproto
- /app/vmctl start
- set +e
- scp -r $PWD "vm:"
# need to install newer xorgproto
- /app/vmctl exec "cd $CI_PROJECT_NAME/dep.xorgproto && ./autogen.sh --prefix=/usr && make && make install"
- /app/vmctl exec "cd $CI_PROJECT_NAME && PKG_CONFIG_PATH=\"$PKG_CONFIG_PATH\" MESON_ARGS=\"$MESON_ARGS\" MESON_BUILDDIR=\"$MESON_BUILDDIR\" .gitlab-ci/meson-build.sh --skip-test" && touch .success
# test not working yet, so skipped
# - scp -r vm:$CI_PROJECT_NAME/test-results.xml .
- /app/vmctl stop
- set -e
- test -e .success || exit 1
meson-dist:
extends: .common-build-and-test
artifacts:
when: always
paths:
- $MESON_BUILDDIR/meson-logs/
- $MESON_BUILDDIR/xserver-*/$MESON_BUILDDIR/meson-logs/
- xserver-tarball/install/
script:
- .gitlab-ci/meson-build.sh --run-dist
- mkdir xserver-tarball
- tar xf $MESON_BUILDDIR/meson-dist/xserver-*.tar.xz -C xserver-tarball --strip-components=1
- .gitlab-ci/meson-build.sh -C xserver-tarball --skip-test --skip-dist --run-install
variables:
MESON_DIST_ARGS: --no-tests
MESON_EXTRA_ARGS: -Dprefix=$CI_PROJECT_DIR/xserver-tarball/install/
xf86-driver-build-test:
extends:
- .xorg-image@debian
- .ci-run-policy
stage: drivers
parallel:
matrix:
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-evdev
SHA: xf86-input-evdev-2.10.6
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-libinput
SHA: xf86-input-libinput-1.4.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-mouse
SHA: xf86-input-mouse-1.9.5
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-input-synaptics
SHA: xf86-input-synaptics-1.9.2
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-amdgpu
SHA: xf86-video-amdgpu-23.0.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-ati
SHA: xf86-video-ati-22.0.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-intel
SHA: e6a4c4740c15ace9dd79dc7c18955f2eb413a6a5 # no release yet
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-qxl
SHA: 989ff620220e8d0555cec38c1508b57dfbcfb0c6 # no release yet
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vesa
SHA: xf86-video-vesa-2.6.0
- REPO: https://gitlab.freedesktop.org/xorg/driver/xf86-video-vmware
SHA: xf86-video-vmware-13.4.0
script:
# built xserver is taken from meson-dist job
- export PKG_CONFIG_PATH=$(pwd)/xserver-tarball/install/lib/x86_64-linux-gnu/pkgconfig
- export ACLOCAL_PATH=$(pwd)/xserver-tarball/install/share/aclocal/
- unset MESON_EXTRA_ARGS
- DRIVER=$(basename $REPO)
- git clone "$REPO" "$DRIVER"
- git -C "$DRIVER" checkout "$SHA"
- |
if [[ -e "$DRIVER/meson.build" ]] && [[ "$DRIVER" != "xf86-video-intel" ]]; then
.gitlab-ci/meson-build.sh -C "$DRIVER" --skip-test
else
pushd "$DRIVER" || exit 1
./autogen.sh && make
fi
needs:
- meson-dist
dependencies:
- meson-dist
variables:
GIT_DEPTH: 1
MESON_ARGS: -Dprefix=/usr/
MESON_EXTRA_ARGS: -Dxwayland=false -Dxnest=false -Dxvfb=false -Dxquartz=false -Ddocs=false
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
changes:
*dix_paths
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
changes:
*xorg_paths
#
# Verify that commit messages are as expected
#
check-commits:
extends:
- .fdo.ci-fairy
needs: []
stage: test
script:
- ci-fairy check-commits --junit-xml=results.xml
except:
- main@xorg/xserver
variables:
GIT_DEPTH: 100
artifacts:
reports:
junit: results.xml
allow_failure: true
check-whitespace:
extends:
- .fdo.ci-fairy
stage: test
script:
- .gitlab-ci/whitespace-check.py $(git ls-files hw/xwayland)
ruff-format-pyxtest:
extends: .fdo.ci-fairy
stage: build-and-test
script:
- uvx ruff format --check --diff test/pyxtest
ruff-check-pyxtest:
extends: .fdo.ci-fairy
stage: build-and-test
script:
- uvx ruff check test/pyxtest
#
# Workflow rules needed due to:
# https://gitlab.freedesktop.org/freedesktop/freedesktop/-/issues/438
#
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- if: $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_PIPELINE_SOURCE == 'push'