From 77bce4707757eaeb00e8ac89f9848dc25bd431a7 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 8 Jan 2024 22:10:55 -0600 Subject: [PATCH] add test for virtio_console --- Makefile | 1 + tests/devices/virtio_console.js | 79 +++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100755 tests/devices/virtio_console.js diff --git a/Makefile b/Makefile index 57c7c0b088..d69c68b632 100644 --- a/Makefile +++ b/Makefile @@ -301,6 +301,7 @@ expect-tests: all-debug build/libwabt.js devices-test: all-debug ./tests/devices/virtio_9p.js + ./tests/devices/virti-console.js rust-test: $(RUST_FILES) env RUSTFLAGS="-D warnings" RUST_BACKTRACE=full RUST_TEST_THREADS=1 cargo test -- --nocapture diff --git a/tests/devices/virtio_console.js b/tests/devices/virtio_console.js new file mode 100755 index 0000000000..ee7cbe80c0 --- /dev/null +++ b/tests/devices/virtio_console.js @@ -0,0 +1,79 @@ +#!/usr/bin/env node +"use strict"; + +process.on("unhandledRejection", exn => { throw exn; }); + +const TEST_RELEASE_BUILD = +process.env.TEST_RELEASE_BUILD; +const SHOW_LOGS = false; + +var V86 = require(`../../build/${TEST_RELEASE_BUILD ? "libv86" : "libv86-debug"}.js`).V86; +const fs = require("fs"); + +const emulator = new V86({ + bios: { url: __dirname + "/../../bios/seabios.bin" }, + vga_bios: { url: __dirname + "/../../bios/vgabios.bin" }, + cdrom: { url: __dirname + "/../../images/linux4.iso" }, + autostart: true, + memory_size: 512 * 1024 * 1024, + bzimage_initrd_from_filesystem: true, + cmdline: [ + "console=ttyS0", + "rw apm=off vga=0x344 video=vesafb:ypan,vremap:8", + "root=host9p rootfstype=9p rootflags=trans=virtio,cache=loose mitigations=off", + "audit=0 init=/usr/bin/init-openrc net.ifnames=0 biosdevname=0", + ].join(" "), + filesystem: { + basefs: "images/fs.json", + baseurl: "images/arch-nongz/", + }, + disable_jit: +process.env.DISABLE_JIT, + log_level: SHOW_LOGS ? 0x400000 : 0, + virtio_console: true, +}); + +let line = ""; +let sent_command = false; + +emulator.add_listener("serial0-output-byte", function(byte) +{ + var chr = String.fromCharCode(byte); + + process.stdout.write(chr); + + if(chr === "\n") + { + line = ""; + } + else + { + line += chr; + } + + // TODO: use better prompt detection once it's configured to not print colours + if(!sent_command && line.endsWith("# ") && line.includes("root@localhost")) + { + sent_command = true; + emulator.serial0_send("lspci -vv; /etc/openrc/init.d/udev start; echo ping > /dev/hvc0\n"); + } + + if(line.endsWith("pong")) + { + console.log("\nTest passed"); + emulator.stop(); + } +}); + +let got_output = false; + +emulator.add_listener("virtio-console0-output-bytes", function(bytes) +{ + if(!got_output) + { + got_output = true; + console.log("From virtio console:", String.fromCharCode.apply(String, bytes)); + emulator.serial0_send("cat /dev/hvc0\n"); + setTimeout(() => { + emulator.bus.send("virtio-console0-input-bytes", Uint8Array.from(Buffer.from("pong\n"))); + }, 5000); + } +});