Skip to content

Commit

Permalink
[github-ci] Add uefi_load unittest to github CI
Browse files Browse the repository at this point in the history
  • Loading branch information
Kelvin Zhang committed Jun 24, 2024
1 parent d1f4b4a commit 31448e3
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
12 changes: 12 additions & 0 deletions .github/workflows/github-ci-clang.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,5 +73,17 @@ jobs:
shell: bash
run: |
make -j $(nproc)
# When LK is compiled with DEBUG=0, there's no console and no way for us
# to read test output
- name: qemu
if: ${{ matrix.project == 'qemu-virt-arm64-test' }}
shell: bash
run: |
env -i DEBIAN_FRONTEND=noninteractive sudo apt install -y qemu-system-arm
- name: unittest
if: ${{ matrix.project == 'qemu-virt-arm64-test' }}
shell: bash
run: |
python3 scripts/unittest.py
# vim: ts=2 sw=2 expandtab
85 changes: 85 additions & 0 deletions scripts/unittest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import os
import sys
import signal
import subprocess
from subprocess import PIPE, STDOUT
import io
import time
import select


def wait_for_output(fp: io.TextIOBase, predicate, timeout: float):
start_time = time.time()
end_time = start_time + timeout
poll_obj = select.poll()
poll_obj.register(fp, select.POLLIN)
output = []
cur_line = ""
while time.time() < end_time:
poll_result = poll_obj.poll(max(end_time-time.time(), 0.001))
if poll_result:
data = fp.read()
if "\n" in data:
output.append(cur_line + data[:data.index("\n") + 1])
cur_line = data[data.index("\n") + 1:]
if predicate(output[-1]):
return True, output
else:
cur_line += data

return False, output


def shutdown_little_kernel(p: subprocess.Popen):
try:
p.stdin.write("poweroff\n")
p.stdin.flush()
p.wait(0.3)
p.send_signal(signal.SIGINT)
p.wait(1)
except subprocess.TimeoutExpired:
pass
finally:
p.kill()
p.wait()


def main():
p = subprocess.Popen(['qemu-system-aarch64',
'-cpu',
'max',
'-m',
'512',
'-smp',
'1',
'-machine',
'virt,highmem=off',
'-kernel',
'build-qemu-virt-arm64-test/lk.elf',
'-net',
'none',
'-nographic',
'-drive',
'if=none,file=lib/uefi/helloworld_aa64.efi,id=blk,format=raw',
'-device',
'virtio-blk-device,drive=blk'], stdout=PIPE, stdin=PIPE, stderr=STDOUT, text=True)
try:
os.set_blocking(p.stdout.fileno(), False)
condition_met, output = wait_for_output(
p.stdout, lambda l: "starting app shell" in l, 0.5)
assert condition_met, "Did not see 'starting app shell', stdout: {}".format(
"".join(output))
p.stdin.write("uefi_load virtio0\n")
p.stdin.flush()
condition_met, output = wait_for_output(
p.stdout, lambda l: "Hello World!" in l, 0.5)
print("".join(output))
if condition_met:
return

finally:
shutdown_little_kernel(p)


if __name__ == "__main__":
main()

0 comments on commit 31448e3

Please sign in to comment.