mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2024-11-24 20:48:55 +00:00
0797a55462
This CL expands the existing boot.rs test to not just boot a kernel but also provide a debian-based rootfs and a special init binary that is used to communicate between test code and the guest VM. The delegate binary listens for commands on /dev/ttyS1 and returns the stdout of the executed command. This allows the test code to setup pipes for the serial device to issue commands in the client and receive the command output, which provides a good foundation for tests of basic functionality without the need to pass test binary code into the guest. The integration tests will pull a prebuilt kernel and rootfs image from cloud storage unless local files are specified via ENV variables. The integration_tests/guest_under_test directory contains the files needed to build and upload those prebuilts. BUG=b:172926609 TEST=This is a test. Cq-Depend: chromium:2551073 Change-Id: Iffb88a146a13d1b6ed7250df1b487bd87a5599d0 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2536831 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org> Commit-Queue: Dennis Kempin <denniskempin@google.com> Auto-Submit: Dennis Kempin <denniskempin@google.com>
55 lines
1.7 KiB
Rust
55 lines
1.7 KiB
Rust
// Copyright 2020 The Chromium OS Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
/// Very crude interactive console to allow the test host to run shell commands
|
|
/// in the guest and receive the output.
|
|
use std::fs::File;
|
|
use std::io;
|
|
use std::io::prelude::*;
|
|
use std::path::Path;
|
|
use std::process::{Command, Stdio};
|
|
use std::str;
|
|
|
|
/// Device file to read from and write to.
|
|
const CONSOLE_FILE: &str = "/dev/ttyS1";
|
|
|
|
/// Magic line sent when we are ready to receive a command.
|
|
/// \x05 is the ENQ (enquiry) character, which is rarely used and 'should'
|
|
/// not appear in command output.
|
|
const MAGIC_LINE: &str = "\x05Ready";
|
|
|
|
/// When ready to receive a command, the `MAGIC_LINE` is written to `input`.
|
|
/// The received command is executed via /bin/sh/ and it's stdout is written
|
|
/// back to `output`, terminated by `MAGIC_LINE`.
|
|
fn listen(input: Box<dyn io::Read>, mut output: Box<dyn io::Write>) -> io::Result<()> {
|
|
let mut reader = io::BufReader::new(input);
|
|
loop {
|
|
writeln!(&mut output, "{}", MAGIC_LINE).unwrap();
|
|
|
|
let mut command = String::new();
|
|
reader.read_line(&mut command)?;
|
|
if command.trim() == "exit" {
|
|
break;
|
|
}
|
|
|
|
println!("-> {:?}", command);
|
|
let result = Command::new("/bin/sh")
|
|
.args(&["-c", &command])
|
|
.stderr(Stdio::inherit())
|
|
.output()
|
|
.unwrap();
|
|
|
|
output.write(&result.stdout)?;
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
fn main() {
|
|
let path = Path::new(CONSOLE_FILE);
|
|
listen(
|
|
Box::new(File::open(path).unwrap()),
|
|
Box::new(File::create(path).unwrap()),
|
|
)
|
|
.unwrap();
|
|
}
|