.test-jobs-common:
  stage: test
  image: registry.gitlab.com/xen-project/xen/${CONTAINER}

.arm64-test-needs: &arm64-test-needs
  - alpine-3.18-arm64-rootfs-export
  - kernel-5.19-arm64-export
  - qemu-system-aarch64-6.0.0-arm64-export

.arm32-test-needs: &arm32-test-needs
  - qemu-system-aarch64-6.0.0-arm32-export

.x86-64-test-needs: &x86-64-test-needs
  - alpine-3.18-rootfs-export
  - kernel-6.1.19-export

.qemu-arm64:
  extends: .test-jobs-common
  variables:
    CONTAINER: debian:bookworm-arm64v8
    LOGFILE: qemu-smoke-arm64.log
  artifacts:
    paths:
      - smoke.serial
      - '*.log'
    when: always
  tags:
    - arm64

.qemu-arm32:
  extends: .test-jobs-common
  variables:
    CONTAINER: debian:bookworm-arm64v8
    LOGFILE: qemu-smoke-arm32.log
  artifacts:
    paths:
      - smoke.serial
      - '*.log'
    when: always
  tags:
    - arm64

.qemu-x86-64:
  extends: .test-jobs-common
  variables:
    CONTAINER: debian:bookworm
    LOGFILE: qemu-smoke-x86-64.log
  artifacts:
    paths:
      - smoke.serial
      - '*.log'
    when: always
  tags:
    - x86_64

.qemu-riscv64:
  extends: .test-jobs-common
  variables:
    CONTAINER: archlinux:current-riscv64
    LOGFILE: qemu-smoke-riscv64.log
  artifacts:
    paths:
      - smoke.serial
      - '*.log'
    when: always
  tags:
    - x86_64

.qemu-ppc64le:
  extends: .test-jobs-common
  variables:
    CONTAINER: debian:bullseye-ppc64le
    LOGFILE: qemu-smoke-ppc64le.log
  artifacts:
    paths:
      - smoke.serial
      - '*.log'
    when: always
  tags:
    - x86_64

.xilinx-arm64:
  extends: .test-jobs-common
  variables:
    CONTAINER: ubuntu:xenial-xilinx
    LOGFILE: qemu-smoke-xilinx.log
  artifacts:
    paths:
      - smoke.serial
      - '*.log'
      - '*.dtb'
    when: always
  only:
    variables:
      - $XILINX_JOBS == "true" && $CI_COMMIT_REF_PROTECTED == "true"
  tags:
    - xilinx

.adl-x86-64:
  extends: .test-jobs-common
  variables:
    # the test controller runs on RPi4
    CONTAINER: alpine:3.18-arm64v8
    LOGFILE: smoke-test.log
    PCIDEV: "03:00.0"
    PCIDEV_INTR: "MSI-X"
    CONSOLE_OPTS: "console=com1 com1=115200,8n1"
  artifacts:
    paths:
      - smoke.serial
      - '*.log'
    when: always
  only:
    variables:
      - $QUBES_JOBS == "true" && $CI_COMMIT_REF_PROTECTED == "true"
  tags:
    - qubes-hw2

.zen3p-x86-64:
  # it's really similar to the above
  extends: .adl-x86-64
  variables:
    PCIDEV: "01:00.0"
    PCIDEV_INTR: "MSI-X"
    CONSOLE_OPTS: "console=com1 com1=115200,8n1,pci,msi"
  tags:
    - qubes-hw11

# Test jobs
build-each-commit-gcc:
  extends: .test-jobs-common
  variables:
    CONTAINER: debian:bookworm
    XEN_TARGET_ARCH: x86_64
    CC: gcc
  script:
    - BASE=${BASE_SHA:-${CI_COMMIT_BEFORE_SHA}} TIP=${TIP_SHA:-${CI_COMMIT_SHA}} ./automation/gitlab-ci/build-each-commit.sh 2>&1 | tee ../build-each-commit-gcc.log
  after_script:
    - mv ../build-each-commit-gcc.log .
  artifacts:
    paths:
      - '*.log'
    when: always
  needs: []
  tags:
    - x86_64

xilinx-smoke-dom0less-arm64-gcc:
  extends: .xilinx-arm64
  script:
    - ./automation/scripts/xilinx-smoke-dom0less-arm64.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-arm64

xilinx-smoke-dom0less-arm64-gcc-gem-passthrough:
  extends: .xilinx-arm64
  script:
    - ./automation/scripts/xilinx-smoke-dom0less-arm64.sh gem-passthrough 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-arm64

adl-smoke-x86-64-gcc-debug:
  extends: .adl-x86-64
  script:
    - ./automation/scripts/qubes-x86-64.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *x86-64-test-needs
    - alpine-3.18-gcc-debug

adl-smoke-x86-64-dom0pvh-gcc-debug:
  extends: .adl-x86-64
  script:
    - ./automation/scripts/qubes-x86-64.sh dom0pvh 2>&1 | tee ${LOGFILE}
  needs:
    - *x86-64-test-needs
    - alpine-3.18-gcc-debug

adl-suspend-x86-64-gcc-debug:
  extends: .adl-x86-64
  script:
    - ./automation/scripts/qubes-x86-64.sh s3 2>&1 | tee ${LOGFILE}
  needs:
    - *x86-64-test-needs
    - alpine-3.18-gcc-debug

adl-pci-pv-x86-64-gcc-debug:
  extends: .adl-x86-64
  script:
    - ./automation/scripts/qubes-x86-64.sh pci-pv 2>&1 | tee ${LOGFILE}
  needs:
    - *x86-64-test-needs
    - alpine-3.18-gcc-debug

adl-pci-hvm-x86-64-gcc-debug:
  extends: .adl-x86-64
  script:
    - ./automation/scripts/qubes-x86-64.sh pci-hvm 2>&1 | tee ${LOGFILE}
  needs:
    - *x86-64-test-needs
    - alpine-3.18-gcc-debug

zen3p-smoke-x86-64-gcc-debug:
  extends: .zen3p-x86-64
  script:
    - ./automation/scripts/qubes-x86-64.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *x86-64-test-needs
    - alpine-3.18-gcc-debug

zen3p-smoke-x86-64-dom0pvh-gcc-debug:
  extends: .zen3p-x86-64
  script:
    - ./automation/scripts/qubes-x86-64.sh dom0pvh 2>&1 | tee ${LOGFILE}
  needs:
    - *x86-64-test-needs
    - alpine-3.18-gcc-debug

zen3p-pci-hvm-x86-64-gcc-debug:
  extends: .zen3p-x86-64
  script:
    - ./automation/scripts/qubes-x86-64.sh pci-hvm 2>&1 | tee ${LOGFILE}
  needs:
    - *x86-64-test-needs
    - alpine-3.18-gcc-debug

qemu-smoke-dom0-arm64-gcc:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-arm64

qemu-smoke-dom0-arm64-gcc-debug:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0-arm64.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-debug-arm64

qemu-smoke-dom0less-arm64-gcc:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-arm64

qemu-smoke-dom0less-arm64-gcc-debug:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-debug-arm64

qemu-smoke-dom0less-arm64-gcc-staticmem:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-arm64-staticmem

qemu-smoke-dom0less-arm64-gcc-debug-staticmem:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-mem 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-debug-arm64-staticmem

qemu-smoke-dom0less-arm64-gcc-staticheap:
 extends: .qemu-arm64
 script:
   - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-heap 2>&1 | tee ${LOGFILE}
 needs:
   - *arm64-test-needs
   - alpine-3.18-gcc-arm64

qemu-smoke-dom0less-arm64-gcc-debug-staticheap:
 extends: .qemu-arm64
 script:
   - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-heap 2>&1 | tee ${LOGFILE}
 needs:
   - *arm64-test-needs
   - alpine-3.18-gcc-debug-arm64

qemu-smoke-dom0less-arm64-gcc-static-shared-mem:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-shared-mem 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-arm64-static-shared-mem

qemu-smoke-dom0less-arm64-gcc-debug-static-shared-mem:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh static-shared-mem 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-debug-arm64-static-shared-mem

qemu-smoke-dom0less-arm64-gcc-boot-cpupools:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-arm64-boot-cpupools

qemu-smoke-dom0less-arm64-gcc-debug-boot-cpupools:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm64.sh boot-cpupools 2>&1 | tee ${LOGFILE}
  needs:
    - *arm64-test-needs
    - alpine-3.18-gcc-debug-arm64-boot-cpupools

qemu-xtf-dom0less-arm64-gcc-hyp-xen-version:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-xtf-dom0less-arm64.sh hyp-xen-version 2>&1 | tee ${LOGFILE}
  needs:
    - alpine-3.18-gcc-arm64
    - qemu-system-aarch64-6.0.0-arm64-export

qemu-xtf-dom0less-arm64-gcc-debug-hyp-xen-version:
  extends: .qemu-arm64
  script:
    - ./automation/scripts/qemu-xtf-dom0less-arm64.sh hyp-xen-version 2>&1 | tee ${LOGFILE}
  needs:
    - alpine-3.18-gcc-debug-arm64
    - qemu-system-aarch64-6.0.0-arm64-export

qemu-smoke-dom0-arm32-gcc:
  extends: .qemu-arm32
  script:
    - ./automation/scripts/qemu-smoke-dom0-arm32.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *arm32-test-needs
    - yocto-qemuarm

qemu-smoke-dom0less-arm32-gcc:
  extends: .qemu-arm32
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm32.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *arm32-test-needs
    - debian-bookworm-gcc-arm32

qemu-smoke-dom0less-arm32-gcc-debug:
  extends: .qemu-arm32
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm32.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *arm32-test-needs
    - debian-bookworm-gcc-arm32-debug

qemu-smoke-dom0less-arm32-gcc-staticmem:
  extends: .qemu-arm32
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm32.sh static-mem 2>&1 | tee ${LOGFILE}
  needs:
    - *arm32-test-needs
    - debian-bookworm-gcc-arm32-staticmem

qemu-smoke-dom0less-arm32-gcc-debug-staticmem:
  extends: .qemu-arm32
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm32.sh static-mem 2>&1 | tee ${LOGFILE}
  needs:
    - *arm32-test-needs
    - debian-bookworm-gcc-arm32-debug-staticmem

qemu-smoke-dom0less-arm32-gcc-gzip:
  extends: .qemu-arm32
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm32.sh gzip 2>&1 | tee ${LOGFILE}
  needs:
    - *arm32-test-needs
    - debian-bookworm-gcc-arm32

qemu-smoke-dom0less-arm32-gcc-debug-gzip:
  extends: .qemu-arm32
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm32.sh gzip 2>&1 | tee ${LOGFILE}
  needs:
    - *arm32-test-needs
    - debian-bookworm-gcc-arm32-debug

qemu-smoke-dom0less-arm32-gcc-without-dom0:
  extends: .qemu-arm32
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm32.sh without-dom0 2>&1 | tee ${LOGFILE}
  needs:
    - *arm32-test-needs
    - debian-bookworm-gcc-arm32

qemu-smoke-dom0less-arm32-gcc-debug-without-dom0:
  extends: .qemu-arm32
  script:
    - ./automation/scripts/qemu-smoke-dom0less-arm32.sh without-dom0 2>&1 | tee ${LOGFILE}
  needs:
    - *arm32-test-needs
    - debian-bookworm-gcc-arm32-debug

qemu-alpine-x86_64-gcc:
  extends: .qemu-x86-64
  script:
    - ./automation/scripts/qemu-alpine-x86_64.sh 2>&1 | tee ${LOGFILE}
  needs:
    - *x86-64-test-needs
    - alpine-3.18-gcc

qemu-smoke-x86-64-gcc:
  extends: .qemu-x86-64
  variables:
    CONTAINER: debian:stretch
  script:
    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee ${LOGFILE}
  needs:
    - debian-stretch-gcc-debug

qemu-smoke-x86-64-clang:
  extends: .qemu-x86-64
  variables:
    CONTAINER: debian:stretch
  script:
    - ./automation/scripts/qemu-smoke-x86-64.sh pv 2>&1 | tee ${LOGFILE}
  needs:
    - debian-bookworm-clang-debug

qemu-smoke-x86-64-gcc-pvh:
  extends: .qemu-x86-64
  variables:
    CONTAINER: debian:stretch
  script:
    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee ${LOGFILE}
  needs:
    - debian-stretch-gcc-debug

qemu-smoke-x86-64-clang-pvh:
  extends: .qemu-x86-64
  variables:
    CONTAINER: debian:stretch
  script:
    - ./automation/scripts/qemu-smoke-x86-64.sh pvh 2>&1 | tee ${LOGFILE}
  needs:
    - debian-bookworm-clang-debug

qemu-smoke-riscv64-gcc:
  extends: .qemu-riscv64
  script:
    - ./automation/scripts/qemu-smoke-riscv64.sh 2>&1 | tee ${LOGFILE}
  needs:
    - archlinux-current-gcc-riscv64-debug

qemu-smoke-ppc64le-powernv9-gcc:
  extends: .qemu-ppc64le
  script:
    - ./automation/scripts/qemu-smoke-ppc64le.sh powernv9 2>&1 | tee ${LOGFILE}
  needs:
    - qemu-system-ppc64-8.1.0-ppc64-export
    - debian-bullseye-gcc-ppc64le-debug
