@@ -77,18 +77,16 @@ EOF
# Run the test
rm -f smoke.serial
set +e
-timeout -k 1 720 \
-qemu-system-x86_64 \
+export QEMU_CMD="qemu-system-x86_64 \
-cpu qemu64,+svm \
-m 2G -smp 2 \
-monitor none -serial stdio \
-nographic \
-device virtio-net-pci,netdev=n0 \
- -netdev user,id=n0,tftp=binaries,bootfile=/pxelinux.0 |& \
- # Remove carriage returns from the stdout output, as gitlab
- # interface chokes on them
- tee smoke.serial | sed 's/\r//'
+ -netdev user,id=n0,tftp=binaries,bootfile=/pxelinux.0"
-set -e
-(grep -q "Domain-0" smoke.serial && grep -q "BusyBox" smoke.serial) || exit 1
-exit 0
+export QEMU_LOG="smoke.serial"
+export LOG_MSG="Domain-0"
+export PASSED="BusyBox"
+
+./automation/scripts/qemu-key.exp
new file mode 100755
@@ -0,0 +1,51 @@
+#!/usr/bin/expect -f
+
+set timeout $env(QEMU_TIMEOUT)
+
+log_file -a $env(QEMU_LOG)
+
+match_max 10000
+
+eval spawn $env(QEMU_CMD)
+
+expect_after {
+ -re "(.*)\r" {
+ exp_continue
+ }
+ timeout {send_user "ERROR-Timeout!\n"; exit 1}
+ eof {send_user "ERROR-EOF!\n"; exit 1}
+}
+
+if {[info exists env(UBOOT_CMD)]} {
+ expect "=>"
+
+ send "$env(UBOOT_CMD)\r"
+}
+
+if {[info exists env(LOG_MSG)] && [info exists env(PASSED)]} {
+ expect {
+ "$env(PASSED)" {
+ expect "$env(LOG_MSG)"
+ exit 0
+ }
+ "$env(LOG_MSG)" {
+ expect "$env(PASSED)"
+ exit 0
+ }
+ }
+}
+
+if {[info exists env(LOG_MSG)]} {
+ expect "$env(LOG_MSG)"
+}
+
+if {[info exists env(PASSED)]} {
+ expect {
+ "$env(PASSED)" {
+ exit 0
+ }
+ }
+}
+
+expect eof
+
@@ -78,9 +78,7 @@ bash imagebuilder/scripts/uboot-script-gen -t tftp -d . -c config
rm -f ${serial_log}
set +e
-echo " virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"| \
-timeout -k 1 720 \
-./qemu-system-arm \
+export QEMU_CMD="./qemu-system-arm \
-machine virt \
-machine virtualization=true \
-smp 4 \
@@ -91,9 +89,10 @@ timeout -k 1 720 \
-no-reboot \
-device virtio-net-pci,netdev=n0 \
-netdev user,id=n0,tftp=./ \
- -bios /usr/lib/u-boot/qemu_arm/u-boot.bin |& \
- tee ${serial_log} | sed 's/\r//'
+ -bios /usr/lib/u-boot/qemu_arm/u-boot.bin"
-set -e
-(grep -q "Domain-0" ${serial_log} && grep -q "^/ #" ${serial_log}) || exit 1
-exit 0
+export UBOOT_CMD="virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"
+export QEMU_LOG="${serial_log}"
+export LOG_MSG="Domain-0"
+export PASSED="/ #"
+../automation/scripts/qemu-key.exp
@@ -94,9 +94,7 @@ bash imagebuilder/scripts/uboot-script-gen -t tftp -d binaries/ -c binaries/conf
# Run the test
rm -f smoke.serial
set +e
-echo " virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"| \
-timeout -k 1 720 \
-./binaries/qemu-system-aarch64 \
+export QEMU_CMD="./binaries/qemu-system-aarch64 \
-machine virtualization=true \
-cpu cortex-a57 -machine type=virt \
-m 2048 -monitor none -serial stdio \
@@ -104,9 +102,10 @@ timeout -k 1 720 \
-no-reboot \
-device virtio-net-pci,netdev=n0 \
-netdev user,id=n0,tftp=binaries \
- -bios /usr/lib/u-boot/qemu_arm64/u-boot.bin |& \
- tee smoke.serial | sed 's/\r//'
+ -bios /usr/lib/u-boot/qemu_arm64/u-boot.bin"
-set -e
-(grep -q "Domain-0" smoke.serial && grep -q "BusyBox" smoke.serial) || exit 1
-exit 0
+export UBOOT_CMD="virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"
+export QEMU_LOG="smoke.serial"
+export LOG_MSG="Domain-0"
+export PASSED="BusyBox"
+./automation/scripts/qemu-key.exp
@@ -5,7 +5,7 @@ set -ex
test_variant=$1
# Prompt to grep for to check if dom0 booted successfully
-dom0_prompt="^/ #"
+dom0_prompt="/ #"
serial_log="$(pwd)/smoke.serial"
@@ -131,9 +131,7 @@ bash imagebuilder/scripts/uboot-script-gen -t tftp -d . -c config
# Run the test
rm -f ${serial_log}
set +e
-echo " virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"| \
-timeout -k 1 240 \
-./qemu-system-arm \
+export QEMU_CMD="./qemu-system-arm \
-machine virt \
-machine virtualization=true \
-smp 4 \
@@ -144,9 +142,10 @@ timeout -k 1 240 \
-no-reboot \
-device virtio-net-pci,netdev=n0 \
-netdev user,id=n0,tftp=./ \
- -bios /usr/lib/u-boot/qemu_arm/u-boot.bin |& \
- tee ${serial_log} | sed 's/\r//'
+ -bios /usr/lib/u-boot/qemu_arm/u-boot.bin"
-set -e
-(grep -q "${dom0_prompt}" ${serial_log} && grep -q "${passed}" ${serial_log}) || exit 1
-exit 0
+export UBOOT_CMD="virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"
+export QEMU_LOG="${serial_log}"
+export LOG_MSG="${dom0_prompt}"
+export PASSED="${passed}"
+../automation/scripts/qemu-key.exp
@@ -205,9 +205,7 @@ bash imagebuilder/scripts/uboot-script-gen -t tftp -d binaries/ -c binaries/conf
# Run the test
rm -f smoke.serial
set +e
-echo " virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"| \
-timeout -k 1 240 \
-./binaries/qemu-system-aarch64 \
+export QEMU_CMD="./binaries/qemu-system-aarch64 \
-machine virtualization=true \
-cpu cortex-a57 -machine type=virt,gic-version=$gic_version \
-m 2048 -monitor none -serial stdio \
@@ -215,9 +213,10 @@ timeout -k 1 240 \
-no-reboot \
-device virtio-net-pci,netdev=n0 \
-netdev user,id=n0,tftp=binaries \
- -bios /usr/lib/u-boot/qemu_arm64/u-boot.bin |& \
- tee smoke.serial | sed 's/\r//'
+ -bios /usr/lib/u-boot/qemu_arm64/u-boot.bin"
-set -e
-(grep -q "^Welcome to Alpine Linux" smoke.serial && grep -q "${passed}" smoke.serial) || exit 1
-exit 0
+export UBOOT_CMD="virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"
+export QEMU_LOG="smoke.serial"
+export LOG_MSG="Welcome to Alpine Linux"
+export PASSED="${passed}"
+./automation/scripts/qemu-key.exp
@@ -11,8 +11,7 @@ machine=$1
rm -f ${serial_log}
set +e
-timeout -k 1 20 \
-qemu-system-ppc64 \
+export QEMU_CMD="qemu-system-ppc64 \
-bios skiboot.lid \
-M $machine \
-m 2g \
@@ -21,9 +20,8 @@ qemu-system-ppc64 \
-monitor none \
-nographic \
-serial stdio \
- -kernel binaries/xen \
- |& tee ${serial_log} | sed 's/\r//'
+ -kernel binaries/xen"
-set -e
-(grep -q "Hello, ppc64le!" ${serial_log}) || exit 1
-exit 0
+export QEMU_LOG="${serial_log}"
+export PASSED="Hello, ppc64le!"
+./automation/scripts/qemu-key.exp
@@ -6,15 +6,13 @@ set -ex
rm -f smoke.serial
set +e
-timeout -k 1 2 \
-qemu-system-riscv64 \
+export QEMU_CMD="qemu-system-riscv64 \
-M virt \
-smp 1 \
-nographic \
-m 2g \
- -kernel binaries/xen \
- |& tee smoke.serial | sed 's/\r//'
+ -kernel binaries/xen"
-set -e
-(grep -q "All set up" smoke.serial) || exit 1
-exit 0
+export QEMU_LOG="smoke.serial"
+export PASSED="All set up"
+./automation/scripts/qemu-key.exp
@@ -16,11 +16,11 @@ esac
rm -f smoke.serial
set +e
-timeout -k 1 30 \
-qemu-system-x86_64 -nographic -kernel binaries/xen \
+export QEMU_CMD="qemu-system-x86_64 -nographic -kernel binaries/xen \
-initrd xtf/tests/example/$k \
- -append "loglvl=all console=com1 noreboot console_timestamps=boot $extra" \
- -m 512 -monitor none -serial file:smoke.serial
-set -e
-grep -q 'Test result: SUCCESS' smoke.serial || exit 1
-exit 0
+ -append \"loglvl=all console=com1 noreboot console_timestamps=boot $extra\" \
+ -m 512 -monitor none -serial stdio"
+
+export QEMU_LOG="smoke.serial"
+export PASSED="Test result: SUCCESS"
+./automation/scripts/qemu-key.exp
@@ -51,9 +51,7 @@ bash imagebuilder/scripts/uboot-script-gen -t tftp -d binaries/ -c binaries/conf
# Run the test
rm -f smoke.serial
set +e
-echo " virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"| \
-timeout -k 1 120 \
-./binaries/qemu-system-aarch64 \
+export QEMU_CMD="./binaries/qemu-system-aarch64 \
-machine virtualization=true \
-cpu cortex-a57 -machine type=virt \
-m 2048 -monitor none -serial stdio \
@@ -61,9 +59,9 @@ timeout -k 1 120 \
-no-reboot \
-device virtio-net-pci,netdev=n0 \
-netdev user,id=n0,tftp=binaries \
- -bios /usr/lib/u-boot/qemu_arm64/u-boot.bin |& \
- tee smoke.serial | sed 's/\r//'
+ -bios /usr/lib/u-boot/qemu_arm64/u-boot.bin"
-set -e
-(grep -q "${passed}" smoke.serial) || exit 1
-exit 0
+export UBOOT_CMD="virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"
+export QEMU_LOG="smoke.serial"
+export PASSED="${passed}"
+./automation/scripts/qemu-key.exp
Use expect to invoke QEMU so that we can terminate the test as soon as we get the right string in the output instead of waiting until the final timeout. For timeout, instead of an hardcoding the value, use a Gitlab CI variable "QEMU_TIMEOUT" that can be changed depending on the latest status of the Gitlab CI runners. Note that for simplicity in the case of dom0less test, the script only checks for the $PASSED string. That is because the dom0 prompt and the $PASSED string could happen in any order making it difficult to check with expect which checks for strings in a specific order. Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com> --- Changes in v2: - add empty lines for readability - changes qemu-key file extension to exp - drop xen_msg that is unused - use capital letters for exported variables - check for both dom0 and domU message on dom0less tests https://gitlab.com/xen-project/people/sstabellini/xen/-/pipelines/1410820286 --- automation/scripts/qemu-alpine-x86_64.sh | 16 +++--- automation/scripts/qemu-key.exp | 51 +++++++++++++++++++ automation/scripts/qemu-smoke-dom0-arm32.sh | 15 +++--- automation/scripts/qemu-smoke-dom0-arm64.sh | 15 +++--- .../scripts/qemu-smoke-dom0less-arm32.sh | 17 +++---- .../scripts/qemu-smoke-dom0less-arm64.sh | 15 +++--- automation/scripts/qemu-smoke-ppc64le.sh | 12 ++--- automation/scripts/qemu-smoke-riscv64.sh | 12 ++--- automation/scripts/qemu-smoke-x86-64.sh | 14 ++--- automation/scripts/qemu-xtf-dom0less-arm64.sh | 14 +++-- 10 files changed, 110 insertions(+), 71 deletions(-) create mode 100755 automation/scripts/qemu-key.exp