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.
79 lines
2.4 KiB
Ruby
79 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# SPDX-License-Identifier: MIT OR Apache-2.0
|
|
#
|
|
# Copyright (c) 2020-2023 Andre Richter <andre.o.richter@gmail.com>
|
|
|
|
require_relative '../../common/serial/minipush'
|
|
require_relative '../../common/tests/boot_test'
|
|
require 'pty'
|
|
|
|
# Match for the last print that 'demo_payload_rpiX.img' produces.
|
|
EXPECTED_PRINT = 'Echoing input now'
|
|
|
|
# Wait for request to power the target.
|
|
class PowerTargetRequestTest < SubtestBase
|
|
MINIPUSH_POWER_TARGET_REQUEST = 'Please power the target now'
|
|
|
|
def initialize(qemu_cmd, pty_main)
|
|
super()
|
|
@qemu_cmd = qemu_cmd
|
|
@pty_main = pty_main
|
|
end
|
|
|
|
def name
|
|
'Waiting for request to power target'
|
|
end
|
|
|
|
def run(qemu_out, _qemu_in)
|
|
expect_or_raise(qemu_out, MINIPUSH_POWER_TARGET_REQUEST)
|
|
|
|
# Now is the time to start QEMU with the chainloader binary. QEMU's virtual tty connects to
|
|
# the MiniPush instance spawned on pty_main, so that the two processes talk to each other.
|
|
Process.spawn(@qemu_cmd, in: @pty_main, out: @pty_main, err: '/dev/null')
|
|
end
|
|
end
|
|
|
|
# Extend BootTest so that it listens on the output of a MiniPush instance, which is itself connected
|
|
# to a QEMU instance instead of a real HW.
|
|
class ChainbootTest < BootTest
|
|
MINIPUSH = '../common/serial/minipush.rb'
|
|
|
|
def initialize(qemu_cmd, payload_path)
|
|
super(qemu_cmd, EXPECTED_PRINT)
|
|
|
|
@test_name = 'Boot test using Minipush'
|
|
|
|
@payload_path = payload_path
|
|
end
|
|
|
|
private
|
|
|
|
# override
|
|
def setup
|
|
pty_main, pty_secondary = PTY.open
|
|
mp_out, _mp_in = PTY.spawn("ruby #{MINIPUSH} #{pty_secondary.path} #{@payload_path}")
|
|
|
|
# The subtests (from this class and the parents) listen on @qemu_out_wrapped. Hence, point
|
|
# it to MiniPush's output.
|
|
@qemu_out_wrapped = PTYLoggerWrapper.new(mp_out, "\r\n")
|
|
|
|
# Important: Run this subtest before the one in the parent class.
|
|
@console_subtests.prepend(PowerTargetRequestTest.new(@qemu_cmd, pty_main))
|
|
end
|
|
|
|
# override
|
|
def finish
|
|
super()
|
|
@test_output.map! { |x| x.gsub(/.*\r/, ' ') }
|
|
end
|
|
end
|
|
|
|
## -------------------------------------------------------------------------------------------------
|
|
## Execution starts here
|
|
## -------------------------------------------------------------------------------------------------
|
|
payload_path = ARGV.pop
|
|
qemu_cmd = ARGV.join(' ')
|
|
|
|
ChainbootTest.new(qemu_cmd, payload_path).run
|