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.
[This backport skips the PPC and RISC scripts as well as the XTF
scripts on x86]
Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
Reviewed-by: Michal Orzel <michal.orzel@amd.com>
master commit:
c36efb7fcea6ef9f31a20e60ec79ed3ae293feee
master date: 2024-08-09 23:59:20 -0700
# 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 \
-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
+ -bios /usr/lib/u-boot/qemu_arm64/u-boot.bin"
+
+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"
-set -e
-(grep -q "Domain-0" smoke.serial && grep -q "BusyBox" smoke.serial) || exit 1
-exit 0
+./automation/scripts/qemu-key.exp
# 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 |& tee smoke.serial
+ -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
--- /dev/null
+#!/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_error "ERROR-Timeout!\n"; exit 1}
+ eof {send_error "ERROR-EOF!\n"; exit 1}
+}
+
+if {[info exists env(UBOOT_CMD)]} {
+ expect "=>"
+
+ send "$env(UBOOT_CMD)\r"
+}
+
+if {[info exists env(LOG_MSG)]} {
+ expect {
+ "$env(PASSED)" {
+ expect "$env(LOG_MSG)"
+ exit 0
+ }
+ "$env(LOG_MSG)" {
+ expect "$env(PASSED)"
+ exit 0
+ }
+ }
+}
+
+expect {
+ "$env(PASSED)" {
+ exit 0
+ }
+}
+
+expect eof
+
rm -f smoke.serial
set +e
-timeout -k 1 240 \
-./qemu-system-arm \
+export QEMU_CMD="./qemu-system-arm \
-machine virt \
-machine virtualization=true \
-smp 4 \
-no-reboot \
-kernel ./xen \
-device loader,file=./vmlinuz,addr=0x1000000 \
- -device loader,file=./initrd.gz,addr=0x3200000 |& tee smoke.serial
+ -device loader,file=./initrd.gz,addr=0x3200000"
+
+export QEMU_LOG="smoke.serial"
+export PASSED="/ #"
-set -e
-(grep -q "^/ #" smoke.serial) || exit 1
-exit 0
+../automation/scripts/qemu-key.exp
# 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 \
-m 2048 -monitor none -serial stdio \
-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
+ -bios /usr/lib/u-boot/qemu_arm64/u-boot.bin"
+
+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}"
-set -e
-(grep -q "^Welcome to Alpine Linux" smoke.serial && grep -q "${passed}" smoke.serial) || exit 1
-exit 0
+./automation/scripts/qemu-key.exp