You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
1.9 KiB
Ruby

# frozen_string_literal: true
# SPDX-License-Identifier: MIT OR Apache-2.0
#
# Copyright (c) 2021 Andre Richter <andre.o.richter@gmail.com>
require_relative 'test'
require 'timeout'
# Check for an expected string when booting the kernel in QEMU.
class BootTest < Test
MAX_WAIT_SECS = 5
def initialize(qemu_cmd, expected_print)
super()
@qemu_cmd = qemu_cmd
@expected_print = expected_print
@test_name = 'Boot test'
@test_description = "Checking for the string: '#{@expected_print}'"
@test_output = []
@test_error = nil
end
private
def expected_string_observed?(qemu_output)
qemu_output.join.include?(@expected_print)
end
# Convert the recorded output to an array of lines.
def post_process_and_add_output(qemu_output)
@test_output += qemu_output.join.split("\n")
end
# override
def setup
@qemu_serial = IO.popen(@qemu_cmd, err: '/dev/null')
@qemu_pid = @qemu_serial.pid
end
# override
def cleanup
Timeout.timeout(MAX_WAIT_SECS) do
Process.kill('TERM', @qemu_pid)
Process.wait
end
rescue StandardError => e
puts 'QEMU graceful shutdown didn\'t work. Skipping it.'
puts e
end
def run_concrete_test
qemu_output = []
Timeout.timeout(MAX_WAIT_SECS) do
while IO.select([@qemu_serial])
qemu_output << @qemu_serial.read_nonblock(1024)
if expected_string_observed?(qemu_output)
@test_error = false
break
end
end
end
rescue EOFError
@test_error = 'QEMU quit unexpectedly'
rescue Timeout::Error
@test_error = 'Timed out waiting for magic string'
rescue StandardError => e
@test_error = e.message
ensure
post_process_and_add_output(qemu_output)
end
end