blob: db0a966ecc1639b7edf4613b5d721b96dff97583 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use anyhow::{format_err, Result};
use regex::Regex;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::PathBuf;
/// Parses VDL Output to get Emulator PID
pub fn get_emu_pid(vdl_output: &PathBuf) -> Result<u32> {
let reader = BufReader::new(File::open(vdl_output)?);
let emu_process = Regex::new(r#"\s+name:\s+"Emulator"$"#).unwrap();
let pid = Regex::new(r"\s+pid:\s+(?P<id>\d+)$").unwrap();
let mut found_emu = false;
let mut emu_pid = 0;
for line in reader.lines() {
if let Ok(l) = line {
if !found_emu && emu_process.is_match(&l) {
found_emu = true;
continue;
}
if found_emu {
pid.captures(&l).and_then(|cap| {
cap.name("id").map(|id| emu_pid = id.as_str().parse::<u32>().unwrap())
});
if emu_pid == 0 {
break;
}
return Ok(emu_pid);
}
}
}
return Err(format_err!(
"Cannot parse --vdl-output {} to obtain emulator PID",
vdl_output.display()
));
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Write;
use tempfile::Builder;
#[test]
fn test_parse_valid() -> Result<()> {
let data = format!(
r#"device_info: {{
base_dir: "/tmp/launcher274142475"
ports: {{
name: "ssh"
value: 57306
}}
ports: {{
name: "emulatorController"
value: 43143
}}
processes: {{
name: "Emulator"
pid: 1454638
}}
processes: {{
name: "PackageServer"
pid: 1454949
}}
device_type: "workstation_qemu-x64"
}}
network_address: "localhost"
"#,
);
let tmp_dir = Builder::new().prefix("vdl_proto_test_").tempdir()?;
let vdl_out = tmp_dir.path().join("vdl_output");
File::create(&vdl_out)?.write_all(data.as_bytes())?;
let pid = get_emu_pid(&vdl_out)?;
assert_eq!(pid, 1454638);
Ok(())
}
#[test]
fn test_parse_error() -> Result<()> {
let data = format!(
r#"device_info: {{
base_dir: "/tmp/launcher274142475"
ports: {{
name: "ssh"
value:
}}
ports: {{
name: "emulatorController"
value: 43143
}}
processes: {{
name: "Emulator"
pid:
}}
processes: {{
name: "PackageServer"
pid: 1454949
}}
device_type: "workstation_qemu-x64"
}}
network_address: "localhost"
"#,
);
let tmp_dir = Builder::new().prefix("vdl_proto_test_").tempdir()?;
let vdl_out = tmp_dir.path().join("vdl_output");
File::create(&vdl_out)?.write_all(data.as_bytes())?;
let pid = get_emu_pid(&vdl_out);
assert_eq!(pid.is_err(), true);
Ok(())
}
#[test]
fn test_parse_no_emu() -> Result<()> {
let data = format!(
r#"device_info: {{
base_dir: "/tmp/launcher274142475"
ports: {{
name: "emulatorController"
value: 43143
}}
processes: {{
name: "PackageServer"
pid: 1454949
}}
device_type: "workstation_qemu-x64"
}}
network_address: "localhost"
"#,
);
let tmp_dir = Builder::new().prefix("vdl_proto_test_").tempdir()?;
let vdl_out = tmp_dir.path().join("vdl_output");
File::create(&vdl_out)?.write_all(data.as_bytes())?;
let pid = get_emu_pid(&vdl_out);
assert_eq!(pid.is_err(), true);
Ok(())
}
}