Merge "docs: Add device_trees.md" into main
diff --git a/README.md b/README.md
index fc4d389..4a10c89 100644
--- a/README.md
+++ b/README.md
@@ -16,8 +16,8 @@
AVF components:
* [pVM firmware](guest/pvmfw/README.md)
* [Android Boot Loader (ABL)](docs/abl.md)
-* [Microdroid](microdroid/README.md)
-* [Microdroid kernel](microdroid/kernel/README.md)
+* [Microdroid](build/microdroid/README.md)
+* [Microdroid kernel](guest/kernel/README.md)
* [Microdroid payload](libs/libmicrodroid_payload_metadata/README.md)
* [vmbase](libs/libvmbase/README.md)
* [Encrypted Storage](guest/encryptedstore/README.md)
diff --git a/android/FerrochromeApp/java/com/android/virtualization/ferrochrome/OpenUrlActivity.java b/android/FerrochromeApp/java/com/android/virtualization/ferrochrome/OpenUrlActivity.java
index c32d017..433e89c 100644
--- a/android/FerrochromeApp/java/com/android/virtualization/ferrochrome/OpenUrlActivity.java
+++ b/android/FerrochromeApp/java/com/android/virtualization/ferrochrome/OpenUrlActivity.java
@@ -30,8 +30,8 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- boolean isRoot = isTaskRoot();
finish();
+
if (!Intent.ACTION_SEND.equals(getIntent().getAction())) {
return;
}
@@ -49,16 +49,6 @@
return;
}
Log.i(TAG, "Sending " + scheme + " URL to VM");
- if (isRoot) {
- Log.w(
- TAG,
- "Cannot open URL without starting "
- + FerrochromeActivity.class.getSimpleName()
- + " first, starting it now");
- startActivity(
- new Intent(this, FerrochromeActivity.class).setAction(Intent.ACTION_MAIN));
- return;
- }
startActivity(
new Intent(ACTION_VM_OPEN_URL)
.setFlags(
diff --git a/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/ClipboardHandler.java b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/ClipboardHandler.java
index 828d923..def464e 100644
--- a/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/ClipboardHandler.java
+++ b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/ClipboardHandler.java
@@ -34,7 +34,7 @@
mVmAgent = vmAgent;
}
- private VmAgent.Connection getConnection() {
+ private VmAgent.Connection getConnection() throws InterruptedException {
return mVmAgent.connect();
}
@@ -53,7 +53,7 @@
try {
getConnection().sendData(VmAgent.WRITE_CLIPBOARD_TYPE_TEXT_PLAIN, data);
- } catch (RuntimeException e) {
+ } catch (InterruptedException | RuntimeException e) {
Log.e(TAG, "Failed to write clipboard data to VM", e);
}
}
@@ -63,7 +63,7 @@
VmAgent.Data data;
try {
data = getConnection().sendAndReceive(VmAgent.READ_CLIPBOARD_FROM_VM, null);
- } catch (RuntimeException e) {
+ } catch (InterruptedException | RuntimeException e) {
Log.e(TAG, "Failed to read clipboard data from VM", e);
return;
}
diff --git a/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/MainActivity.java b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/MainActivity.java
index 54543b0..fb75533 100644
--- a/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/MainActivity.java
+++ b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/MainActivity.java
@@ -52,16 +52,12 @@
private DisplayProvider mDisplayProvider;
private VmAgent mVmAgent;
private ClipboardHandler mClipboardHandler;
+ private OpenUrlHandler mOpenUrlHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- String action = getIntent().getAction();
- if (!ACTION_VM_LAUNCHER.equals(action)) {
- finish();
- Log.e(TAG, "onCreate unsupported intent action: " + action);
- return;
- }
+ Log.d(TAG, "onCreate intent: " + getIntent());
checkAndRequestRecordAudioPermission();
mExecutorService = Executors.newCachedThreadPool();
@@ -98,6 +94,8 @@
mVmAgent = new VmAgent(mVirtualMachine);
mClipboardHandler = new ClipboardHandler(this, mVmAgent);
+ mOpenUrlHandler = new OpenUrlHandler(mVmAgent);
+ handleIntent(getIntent());
}
private void makeFullscreen() {
@@ -146,6 +144,7 @@
super.onDestroy();
mExecutorService.shutdownNow();
mInputForwarder.cleanUp();
+ mOpenUrlHandler.shutdown();
Log.d(TAG, "destroyed");
}
@@ -172,18 +171,16 @@
@Override
protected void onNewIntent(Intent intent) {
- String action = intent.getAction();
- if (!ACTION_VM_OPEN_URL.equals(action)) {
- Log.e(TAG, "onNewIntent unsupported intent action: " + action);
- return;
- }
- Log.d(TAG, "onNewIntent intent action: " + action);
- String text = intent.getStringExtra(Intent.EXTRA_TEXT);
- if (text != null) {
- mExecutorService.execute(
- () -> {
- mVmAgent.connect().sendData(VmAgent.OPEN_URL, text.getBytes());
- });
+ Log.d(TAG, "onNewIntent intent: " + intent);
+ handleIntent(intent);
+ }
+
+ private void handleIntent(Intent intent) {
+ if (ACTION_VM_OPEN_URL.equals(intent.getAction())) {
+ String url = intent.getStringExtra(Intent.EXTRA_TEXT);
+ if (url != null) {
+ mOpenUrlHandler.sendUrlToVm(url);
+ }
}
}
diff --git a/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/OpenUrlHandler.java b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/OpenUrlHandler.java
new file mode 100644
index 0000000..fb0c6bf
--- /dev/null
+++ b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/OpenUrlHandler.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.virtualization.vmlauncher;
+
+import android.util.Log;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+class OpenUrlHandler {
+ private static final String TAG = MainActivity.TAG;
+
+ private final VmAgent mVmAgent;
+ private final ExecutorService mExecutorService;
+
+ OpenUrlHandler(VmAgent vmAgent) {
+ mVmAgent = vmAgent;
+ mExecutorService = Executors.newSingleThreadExecutor();
+ }
+
+ void shutdown() {
+ mExecutorService.shutdownNow();
+ }
+
+ void sendUrlToVm(String url) {
+ mExecutorService.execute(
+ () -> {
+ try {
+ mVmAgent.connect().sendData(VmAgent.OPEN_URL, url.getBytes());
+ Log.d(TAG, "Successfully sent URL to the VM");
+ } catch (InterruptedException | RuntimeException e) {
+ Log.e(TAG, "Failed to send URL to the VM", e);
+ }
+ });
+ }
+}
diff --git a/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/VmAgent.java b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/VmAgent.java
index 78da6c0..af1d298 100644
--- a/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/VmAgent.java
+++ b/android/VmLauncherApp/java/com/android/virtualization/vmlauncher/VmAgent.java
@@ -17,8 +17,10 @@
package com.android.virtualization.vmlauncher;
import android.os.ParcelFileDescriptor;
+import android.os.SystemClock;
import android.system.virtualmachine.VirtualMachine;
import android.system.virtualmachine.VirtualMachineException;
+import android.util.Log;
import libcore.io.Streams;
@@ -39,6 +41,7 @@
private static final int DATA_SHARING_SERVICE_PORT = 3580;
private static final int HEADER_SIZE = 8; // size of the header
private static final int SIZE_OFFSET = 4; // offset of the size field in the header
+ private static final long RETRY_INTERVAL_MS = 1_000;
static final byte READ_CLIPBOARD_FROM_VM = 0;
static final byte WRITE_CLIPBOARD_TYPE_EMPTY = 1;
@@ -51,13 +54,26 @@
mVirtualMachine = vm;
}
- /** Connect to the agent and returns the communication channel established. This can block. */
- Connection connect() {
- try {
- // TODO: wait until the VM is up and the agent is running
- return new Connection(mVirtualMachine.connectVsock(DATA_SHARING_SERVICE_PORT));
- } catch (VirtualMachineException e) {
- throw new RuntimeException("Failed to connect to the VM agent", e);
+ /**
+ * Connects to the agent and returns the established communication channel. This can block.
+ *
+ * @throws InterruptedException If the current thread was interrupted
+ */
+ Connection connect() throws InterruptedException {
+ boolean shouldLog = true;
+ while (true) {
+ if (Thread.interrupted()) {
+ throw new InterruptedException();
+ }
+ try {
+ return new Connection(mVirtualMachine.connectVsock(DATA_SHARING_SERVICE_PORT));
+ } catch (VirtualMachineException e) {
+ if (shouldLog) {
+ shouldLog = false;
+ Log.d(TAG, "Still waiting for VM agent to start", e);
+ }
+ }
+ SystemClock.sleep(RETRY_INTERVAL_MS);
}
}
diff --git a/android/virtmgr/src/aidl.rs b/android/virtmgr/src/aidl.rs
index f1bfd8c..144524f 100644
--- a/android/virtmgr/src/aidl.rs
+++ b/android/virtmgr/src/aidl.rs
@@ -411,9 +411,9 @@
let state = &mut *self.state.lock().unwrap();
let console_out_fd =
- clone_or_prepare_logger_fd(&debug_config, console_out_fd, format!("Console({})", cid))?;
+ clone_or_prepare_logger_fd(console_out_fd, format!("Console({})", cid))?;
let console_in_fd = console_in_fd.map(clone_file).transpose()?;
- let log_fd = clone_or_prepare_logger_fd(&debug_config, log_fd, format!("Log({})", cid))?;
+ let log_fd = clone_or_prepare_logger_fd(log_fd, format!("Log({})", cid))?;
// Counter to generate unique IDs for temporary image files.
let mut next_temporary_image_id = 0;
@@ -1563,7 +1563,6 @@
}
fn clone_or_prepare_logger_fd(
- debug_config: &DebugConfig,
fd: Option<&ParcelFileDescriptor>,
tag: String,
) -> Result<Option<File>, Status> {
@@ -1571,10 +1570,6 @@
return Ok(Some(clone_file(fd)?));
}
- if !debug_config.should_prepare_console_output() {
- return Ok(None);
- };
-
let (read_fd, write_fd) =
pipe().context("Failed to create pipe").or_service_specific_exception(-1)?;
diff --git a/android/virtmgr/src/crosvm.rs b/android/virtmgr/src/crosvm.rs
index f9fbd16..37618c7 100644
--- a/android/virtmgr/src/crosvm.rs
+++ b/android/virtmgr/src/crosvm.rs
@@ -25,6 +25,7 @@
use log::{debug, error, info};
use semver::{Version, VersionReq};
use nix::{fcntl::OFlag, unistd::pipe2, unistd::Uid, unistd::User};
+use nix::unistd::dup;
use regex::{Captures, Regex};
use rustutils::system_properties;
use shared_child::SharedChild;
@@ -35,7 +36,8 @@
use std::io::{self, Read};
use std::mem;
use std::num::{NonZeroU16, NonZeroU32};
-use std::os::unix::io::{AsRawFd, OwnedFd, RawFd};
+use std::os::fd::FromRawFd;
+use std::os::unix::io::{AsRawFd, OwnedFd};
use std::os::unix::process::ExitStatusExt;
use std::path::{Path, PathBuf};
use std::process::{Command, ExitStatus};
@@ -872,26 +874,6 @@
}
}
-fn append_platform_devices(
- command: &mut Command,
- preserved_fds: &mut Vec<RawFd>,
- config: &CrosvmConfig,
-) -> Result<(), Error> {
- if config.vfio_devices.is_empty() {
- return Ok(());
- }
-
- let Some(dtbo) = &config.dtbo else {
- bail!("VFIO devices assigned but no DTBO available");
- };
- command.arg(format!("--device-tree-overlay={},filter", add_preserved_fd(preserved_fds, dtbo)));
-
- for device in &config.vfio_devices {
- command.arg(vfio_argument_for_platform_device(device)?);
- }
- Ok(())
-}
-
/// Starts an instance of `crosvm` to manage a new VM.
fn run_vm(
config: CrosvmConfig,
@@ -986,7 +968,7 @@
}
// Keep track of what file descriptors should be mapped to the crosvm process.
- let mut preserved_fds = config.indirect_files.iter().map(|file| file.as_raw_fd()).collect();
+ let mut preserved_fds = config.indirect_files.into_iter().map(|f| f.into()).collect();
// Setup the serial devices.
// 1. uart device: used as the output device by bootloaders and as early console by linux
@@ -997,15 +979,14 @@
//
// When [console|log]_fd is not specified, the devices are attached to sink, which means what's
// written there is discarded.
- let console_out_arg = format_serial_out_arg(&mut preserved_fds, &config.console_out_fd);
+ let console_out_arg = format_serial_out_arg(&mut preserved_fds, config.console_out_fd);
let console_in_arg = config
.console_in_fd
- .as_ref()
.map(|fd| format!(",input={}", add_preserved_fd(&mut preserved_fds, fd)))
.unwrap_or_default();
- let log_arg = format_serial_out_arg(&mut preserved_fds, &config.log_fd);
- let failure_serial_path = add_preserved_fd(&mut preserved_fds, &failure_pipe_write);
- let ramdump_arg = format_serial_out_arg(&mut preserved_fds, &config.ramdump);
+ let log_arg = format_serial_out_arg(&mut preserved_fds, config.log_fd);
+ let failure_serial_path = add_preserved_fd(&mut preserved_fds, failure_pipe_write);
+ let ramdump_arg = format_serial_out_arg(&mut preserved_fds, config.ramdump);
let console_input_device = config.console_input_device.as_deref().unwrap_or(CONSOLE_HVC0);
match console_input_device {
CONSOLE_HVC0 | CONSOLE_TTYS0 => {}
@@ -1035,11 +1016,11 @@
// /dev/hvc2
command.arg(format!("--serial={},hardware=virtio-console,num=3", &log_arg));
- if let Some(bootloader) = &config.bootloader {
+ if let Some(bootloader) = config.bootloader {
command.arg("--bios").arg(add_preserved_fd(&mut preserved_fds, bootloader));
}
- if let Some(initrd) = &config.initrd {
+ if let Some(initrd) = config.initrd {
command.arg("--initrd").arg(add_preserved_fd(&mut preserved_fds, initrd));
}
@@ -1047,25 +1028,30 @@
command.arg("--params").arg(params);
}
- for disk in &config.disks {
+ for disk in config.disks {
command.arg("--block").arg(format!(
"path={},ro={}",
- add_preserved_fd(&mut preserved_fds, &disk.image),
+ add_preserved_fd(&mut preserved_fds, disk.image),
!disk.writable,
));
}
- if let Some(kernel) = &config.kernel {
+ if let Some(kernel) = config.kernel {
command.arg(add_preserved_fd(&mut preserved_fds, kernel));
}
- let control_server_socket = UnixSeqpacketListener::bind(crosvm_control_socket_path)
+ let control_sock = UnixSeqpacketListener::bind(crosvm_control_socket_path)
.context("failed to create control server")?;
- command
- .arg("--socket")
- .arg(add_preserved_fd(&mut preserved_fds, &control_server_socket.as_raw_descriptor()));
+ command.arg("--socket").arg(add_preserved_fd(&mut preserved_fds, {
+ let dup_fd = dup(control_sock.as_raw_descriptor())?;
+ // SAFETY: UnixSeqpacketListener doesn't provide a way to convert it into a RawFd or
+ // OwnedFd. In order to provide a OwnedFd for add_preserved_fd, dup the control socket
+ // and create a OwnedFd from the duped fd. This is fine as the original fd is still
+ // closed when control_socket is dropped.
+ unsafe { OwnedFd::from_raw_fd(dup_fd) }
+ }));
- if let Some(dt_overlay) = &config.device_tree_overlay {
+ if let Some(dt_overlay) = config.device_tree_overlay {
command.arg("--device-tree-overlay").arg(add_preserved_fd(&mut preserved_fds, dt_overlay));
}
@@ -1116,15 +1102,15 @@
}
if cfg!(network) {
- if let Some(tap) = &config.tap {
- let tap_fd = tap.as_raw_fd();
- preserved_fds.push(tap_fd);
- command.arg("--net").arg(format!("tap-fd={}", tap_fd));
+ if let Some(tap) = config.tap {
+ command
+ .arg("--net")
+ .arg(format!("tap-fd={}", add_preserved_fd(&mut preserved_fds, tap)));
}
}
if cfg!(paravirtualized_devices) {
- for input_device_option in config.input_device_options.iter() {
+ for input_device_option in config.input_device_options.into_iter() {
command.arg("--input");
command.arg(match input_device_option {
InputDeviceOption::EvDev(file) => {
@@ -1172,7 +1158,19 @@
command.arg("--boost-uclamp");
}
- append_platform_devices(&mut command, &mut preserved_fds, &config)?;
+ if !config.vfio_devices.is_empty() {
+ if let Some(dtbo) = config.dtbo {
+ command.arg(format!(
+ "--device-tree-overlay={},filter",
+ add_preserved_fd(&mut preserved_fds, dtbo)
+ ));
+ } else {
+ bail!("VFIO devices assigned but no DTBO available");
+ }
+ };
+ for device in config.vfio_devices {
+ command.arg(vfio_argument_for_platform_device(&device)?);
+ }
debug!("Preserving FDs {:?}", preserved_fds);
command.preserved_fds(preserved_fds);
@@ -1242,15 +1240,16 @@
/// Adds the file descriptor for `file` to `preserved_fds`, and returns a string of the form
/// "/proc/self/fd/N" where N is the file descriptor.
-fn add_preserved_fd(preserved_fds: &mut Vec<RawFd>, file: &dyn AsRawFd) -> String {
- let fd = file.as_raw_fd();
+fn add_preserved_fd<F: Into<OwnedFd>>(preserved_fds: &mut Vec<OwnedFd>, file: F) -> String {
+ let fd = file.into();
+ let raw_fd = fd.as_raw_fd();
preserved_fds.push(fd);
- format!("/proc/self/fd/{}", fd)
+ format!("/proc/self/fd/{}", raw_fd)
}
/// Adds the file descriptor for `file` (if any) to `preserved_fds`, and returns the appropriate
/// string for a crosvm `--serial` flag. If `file` is none, creates a dummy sink device.
-fn format_serial_out_arg(preserved_fds: &mut Vec<RawFd>, file: &Option<File>) -> String {
+fn format_serial_out_arg(preserved_fds: &mut Vec<OwnedFd>, file: Option<File>) -> String {
if let Some(file) = file {
format!("type=file,path={}", add_preserved_fd(preserved_fds, file))
} else {
diff --git a/android/vm/src/run.rs b/android/vm/src/run.rs
index cb15802..b3743ae 100644
--- a/android/vm/src/run.rs
+++ b/android/vm/src/run.rs
@@ -36,7 +36,7 @@
use std::fs::File;
use std::io;
use std::io::{Read, Write};
-use std::os::unix::io::{AsRawFd, FromRawFd};
+use std::os::fd::AsFd;
use std::path::{Path, PathBuf};
use vmclient::{ErrorCode, VmInstance};
use vmconfig::{get_debug_level, open_parcel_file, VmConfig};
@@ -365,16 +365,6 @@
}
/// Safely duplicate the file descriptor.
-fn duplicate_fd<T: AsRawFd>(file: T) -> io::Result<File> {
- let fd = file.as_raw_fd();
- // SAFETY: This just duplicates a file descriptor which we know to be valid, and we check for an
- // an error.
- let dup_fd = unsafe { libc::dup(fd) };
- if dup_fd < 0 {
- Err(io::Error::last_os_error())
- } else {
- // SAFETY: We have just duplicated the file descriptor so we own it, and `from_raw_fd` takes
- // ownership of it.
- Ok(unsafe { File::from_raw_fd(dup_fd) })
- }
+fn duplicate_fd<T: AsFd>(file: T) -> io::Result<File> {
+ Ok(file.as_fd().try_clone_to_owned()?.into())
}
diff --git a/guest/rialto/tests/test.rs b/guest/rialto/tests/test.rs
index a90adea..7c0d9dc 100644
--- a/guest/rialto/tests/test.rs
+++ b/guest/rialto/tests/test.rs
@@ -71,6 +71,7 @@
check_processing_requests(VmType::NonProtectedVm, None)
}
+#[ignore] // TODO(b/360077974): Figure out why this is flaky.
#[test]
fn process_requests_in_non_protected_vm_with_extra_ram() -> Result<()> {
const MEMORY_MB: i32 = 300;
diff --git a/libs/libservice_vm_manager/src/lib.rs b/libs/libservice_vm_manager/src/lib.rs
index 8564c51..d3d86e9 100644
--- a/libs/libservice_vm_manager/src/lib.rs
+++ b/libs/libservice_vm_manager/src/lib.rs
@@ -38,7 +38,7 @@
use vsock::{VsockListener, VsockStream, VMADDR_CID_HOST};
/// Size of virtual memory allocated to the Service VM.
-pub const VM_MEMORY_MB: i32 = 8;
+pub const VM_MEMORY_MB: i32 = 6;
const VIRT_DATA_DIR: &str = "/data/misc/apexdata/com.android.virt";
const RIALTO_PATH: &str = "/apex/com.android.virt/etc/rialto.bin";
diff --git a/libs/libvmclient/src/lib.rs b/libs/libvmclient/src/lib.rs
index 88072a7..fe86504 100644
--- a/libs/libvmclient/src/lib.rs
+++ b/libs/libvmclient/src/lib.rs
@@ -45,6 +45,7 @@
use shared_child::SharedChild;
use std::io::{self, Read};
use std::process::Command;
+use std::process::Stdio;
use std::{
fmt::{self, Debug, Formatter},
fs::File,
@@ -90,16 +91,16 @@
let (client_fd, server_fd) = posix_socketpair()?;
let mut command = Command::new(VIRTMGR_PATH);
+ command.stdin(Stdio::null());
+ command.stdout(Stdio::null());
+ command.stderr(Stdio::null());
+ // Can't use BorrowedFd as it doesn't implement Display
command.arg("--rpc-server-fd").arg(format!("{}", server_fd.as_raw_fd()));
command.arg("--ready-fd").arg(format!("{}", ready_fd.as_raw_fd()));
- command.preserved_fds(vec![server_fd.as_raw_fd(), ready_fd.as_raw_fd()]);
+ command.preserved_fds(vec![server_fd, ready_fd]);
SharedChild::spawn(&mut command)?;
- // Drop FDs that belong to virtmgr.
- drop(server_fd);
- drop(ready_fd);
-
// Wait for the child to signal that the RpcBinder server is ready
// by closing its end of the pipe.
let _ignored = File::from(wait_fd).read(&mut [0]);
diff --git a/tests/authfs/common/src/open_then_run.rs b/tests/authfs/common/src/open_then_run.rs
index e5e33eb..a9004b0 100644
--- a/tests/authfs/common/src/open_then_run.rs
+++ b/tests/authfs/common/src/open_then_run.rs
@@ -24,7 +24,7 @@
use log::{debug, error};
use std::fs::OpenOptions;
use std::os::unix::fs::OpenOptionsExt;
-use std::os::unix::io::{AsRawFd, OwnedFd, RawFd};
+use std::os::unix::io::{OwnedFd, RawFd};
use std::process::Command;
// `PseudoRawFd` is just an integer and not necessarily backed by a real FD. It is used to denote
@@ -38,8 +38,8 @@
}
impl OwnedFdMapping {
- fn as_fd_mapping(&self) -> FdMapping {
- FdMapping { parent_fd: self.owned_fd.as_raw_fd(), child_fd: self.target_fd }
+ fn into_fd_mapping(self) -> FdMapping {
+ FdMapping { parent_fd: self.owned_fd, child_fd: self.target_fd }
}
}
@@ -148,9 +148,9 @@
// Set up FD mappings in the child process.
let mut fd_mappings = Vec::new();
- fd_mappings.extend(args.ro_file_fds.iter().map(OwnedFdMapping::as_fd_mapping));
- fd_mappings.extend(args.rw_file_fds.iter().map(OwnedFdMapping::as_fd_mapping));
- fd_mappings.extend(args.dir_fds.iter().map(OwnedFdMapping::as_fd_mapping));
+ fd_mappings.extend(args.ro_file_fds.into_iter().map(OwnedFdMapping::into_fd_mapping));
+ fd_mappings.extend(args.rw_file_fds.into_iter().map(OwnedFdMapping::into_fd_mapping));
+ fd_mappings.extend(args.dir_fds.into_iter().map(OwnedFdMapping::into_fd_mapping));
command.fd_mappings(fd_mappings)?;
debug!("Spawning {:?}", command);
diff --git a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
index ec1a553..0e59a01 100644
--- a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
+++ b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
@@ -268,6 +268,7 @@
/* fullDebug */ false,
(builder) -> builder.setCpuTopology(CPU_TOPOLOGY_ONE_CPU));
}
+
@Test
public void testMicrodroidHostCpuTopologyBootTime()
throws VirtualMachineException, InterruptedException, IOException {
@@ -280,10 +281,7 @@
@Test
public void testMicrodroidDebugBootTime()
throws VirtualMachineException, InterruptedException, IOException {
- runBootTimeTest(
- "test_vm_boot_time_debug",
- /* fullDebug */ true,
- (builder) -> builder);
+ runBootTimeTest("test_vm_boot_time_debug", /* fullDebug */ true, (builder) -> builder);
}
private void testMicrodroidDebugBootTime_withVendorBase(File vendorDiskImage) throws Exception {
@@ -366,12 +364,12 @@
@Test
public void testVirtioBlkSeqReadRate() throws Exception {
- testVirtioBlkReadRate(/*isRand=*/ false);
+ testVirtioBlkReadRate(/* isRand= */ false);
}
@Test
public void testVirtioBlkRandReadRate() throws Exception {
- testVirtioBlkReadRate(/*isRand=*/ true);
+ testVirtioBlkReadRate(/* isRand= */ true);
}
private void testVirtioBlkReadRate(boolean isRand) throws Exception {
diff --git a/tests/benchmark_hostside/java/android/avf/test/AVFHostTestCase.java b/tests/benchmark_hostside/java/android/avf/test/AVFHostTestCase.java
index 4a61016..e2956f2 100644
--- a/tests/benchmark_hostside/java/android/avf/test/AVFHostTestCase.java
+++ b/tests/benchmark_hostside/java/android/avf/test/AVFHostTestCase.java
@@ -69,6 +69,7 @@
/** Boot time test related variables */
private static final int REINSTALL_APEX_RETRY_INTERVAL_MS = 5 * 1000;
+
private static final int REINSTALL_APEX_TIMEOUT_SEC = 15;
private static final int COMPILE_STAGED_APEX_RETRY_INTERVAL_MS = 10 * 1000;
private static final int COMPILE_STAGED_APEX_TIMEOUT_SEC = 540;
@@ -122,17 +123,18 @@
@Test
public void testNoLongHypSections() throws Exception {
- String[] hypEvents = {
- "hyp_enter", "hyp_exit"
- };
+ String[] hypEvents = {"hyp_enter", "hyp_exit"};
- assumeTrue("Skip without hypervisor tracing",
- KvmHypTracer.isSupported(getDevice(), hypEvents));
+ assumeTrue(
+ "Skip without hypervisor tracing",
+ KvmHypTracer.isSupported(getDevice(), hypEvents));
KvmHypTracer tracer = new KvmHypTracer(getDevice(), hypEvents);
String result = tracer.run(COMPOSD_CMD_BIN + " test-compile");
assertWithMessage("Failed to test compilation VM.")
- .that(result).ignoringCase().contains("all ok");
+ .that(result)
+ .ignoringCase()
+ .contains("all ok");
SimpleStats stats = tracer.getDurationStats();
reportMetric(stats.getData(), "hyp_sections", "s");
@@ -141,32 +143,37 @@
@Test
public void testPsciMemProtect() throws Exception {
- String[] hypEvents = {
- "psci_mem_protect"
- };
+ String[] hypEvents = {"psci_mem_protect"};
- assumeTrue("Skip without hypervisor tracing",
- KvmHypTracer.isSupported(getDevice(), hypEvents));
+ assumeTrue(
+ "Skip without hypervisor tracing",
+ KvmHypTracer.isSupported(getDevice(), hypEvents));
KvmHypTracer tracer = new KvmHypTracer(getDevice(), hypEvents);
/* We need to wait for crosvm to die so all the VM pages are reclaimed */
String result = tracer.run(COMPOSD_CMD_BIN + " test-compile && killall -w crosvm || true");
assertWithMessage("Failed to test compilation VM.")
- .that(result).ignoringCase().contains("all ok");
+ .that(result)
+ .ignoringCase()
+ .contains("all ok");
List<Integer> values = tracer.getPsciMemProtect();
assertWithMessage("PSCI MEM_PROTECT events not recorded")
- .that(values.size()).isGreaterThan(2);
+ .that(values.size())
+ .isGreaterThan(2);
assertWithMessage("PSCI MEM_PROTECT counter not starting from 0")
- .that(values.get(0)).isEqualTo(0);
+ .that(values.get(0))
+ .isEqualTo(0);
assertWithMessage("PSCI MEM_PROTECT counter not ending with 0")
- .that(values.get(values.size() - 1)).isEqualTo(0);
+ .that(values.get(values.size() - 1))
+ .isEqualTo(0);
assertWithMessage("PSCI MEM_PROTECT counter didn't increment")
- .that(Collections.max(values)).isGreaterThan(0);
+ .that(Collections.max(values))
+ .isGreaterThan(0);
}
@Test
@@ -182,9 +189,7 @@
@Test
public void testSettingsAppStartupTime() throws Exception {
- String[] launchIntentPackages = {
- "com.android.settings"
- };
+ String[] launchIntentPackages = {"com.android.settings"};
String launchIntentPackage = findSupportedPackage(launchIntentPackages);
assume().withMessage("No supported settings package").that(launchIntentPackage).isNotNull();
appStartupHelper(launchIntentPackage);
@@ -193,28 +198,34 @@
private void appStartupHelper(String launchIntentPackage) throws Exception {
assumeTrue(
"Skip on non-protected VMs",
- ((TestDevice) getDevice()).supportsMicrodroid(/*protectedVm=*/ true));
+ ((TestDevice) getDevice()).supportsMicrodroid(/* protectedVm= */ true));
StartupTimeMetricCollection mCollection =
new StartupTimeMetricCollection(getPackageName(launchIntentPackage), ROUND_COUNT);
getAppStartupTime(launchIntentPackage, mCollection);
- reportMetric(mCollection.mAppBeforeVmRunTotalTime,
+ reportMetric(
+ mCollection.mAppBeforeVmRunTotalTime,
"app_startup/" + mCollection.getPkgName() + "/total_time/before_vm",
"ms");
- reportMetric(mCollection.mAppBeforeVmRunWaitTime,
+ reportMetric(
+ mCollection.mAppBeforeVmRunWaitTime,
"app_startup/" + mCollection.getPkgName() + "/wait_time/before_vm",
"ms");
- reportMetric(mCollection.mAppDuringVmRunTotalTime,
+ reportMetric(
+ mCollection.mAppDuringVmRunTotalTime,
"app_startup/" + mCollection.getPkgName() + "/total_time/during_vm",
"ms");
- reportMetric(mCollection.mAppDuringVmRunWaitTime,
+ reportMetric(
+ mCollection.mAppDuringVmRunWaitTime,
"app_startup/" + mCollection.getPkgName() + "/wait_time/during_vm",
"ms");
- reportMetric(mCollection.mAppAfterVmRunTotalTime,
+ reportMetric(
+ mCollection.mAppAfterVmRunTotalTime,
"app_startup/" + mCollection.getPkgName() + "/total_time/after_vm",
"ms");
- reportMetric(mCollection.mAppAfterVmRunWaitTime,
+ reportMetric(
+ mCollection.mAppAfterVmRunWaitTime,
"app_startup/" + mCollection.getPkgName() + "/wait_time/after_vm",
"ms");
}
@@ -234,8 +245,9 @@
for (String pkgName : pkgNameList) {
String appPkg = getPackageName(pkgName);
- String hasPackage = android.run("pm list package | grep -w " + appPkg + " 1> /dev/null"
- + "; echo $?");
+ String hasPackage =
+ android.run(
+ "pm list package | grep -w " + appPkg + " 1> /dev/null" + "; echo $?");
assertNotNull(hasPackage);
if (hasPackage.equals("0")) {
@@ -390,8 +402,8 @@
}
}
- private int getFreeMemoryInfoMb(CommandRunner android) throws DeviceNotAvailableException,
- IllegalArgumentException {
+ private int getFreeMemoryInfoMb(CommandRunner android)
+ throws DeviceNotAvailableException, IllegalArgumentException {
int freeMemory = 0;
String content = android.runForResult("cat /proc/meminfo").getStdout().trim();
String[] lines = content.split("[\r\n]+");
@@ -410,8 +422,8 @@
throws DeviceNotAvailableException, InterruptedException {
android.run("input keyevent", "KEYCODE_WAKEUP");
Thread.sleep(500);
- final String ret = android.runForResult("dumpsys nfc | grep 'mScreenState='")
- .getStdout().trim();
+ final String ret =
+ android.runForResult("dumpsys nfc | grep 'mScreenState='").getStdout().trim();
if (ret != null && ret.contains("ON_LOCKED")) {
android.run("input keyevent", "KEYCODE_MENU");
}
@@ -429,8 +441,9 @@
String[] bootKeyVal = bootLoaderPhase.split(":");
String key = String.format("%s%s", BOOTLOADER_PREFIX, bootKeyVal[0]);
- bootloaderTime.computeIfAbsent(key,
- k -> new ArrayList<>()).add(Double.parseDouble(bootKeyVal[1]));
+ bootloaderTime
+ .computeIfAbsent(key, k -> new ArrayList<>())
+ .add(Double.parseDouble(bootKeyVal[1]));
// SW is the time spent on the warning screen. So ignore it in
// final boot time calculation.
if (BOOTLOADER_PHASE_SW.equalsIgnoreCase(bootKeyVal[0])) {
@@ -438,8 +451,9 @@
}
bootLoaderTotalTime += Double.parseDouble(bootKeyVal[1]);
}
- bootloaderTime.computeIfAbsent(BOOTLOADER_TIME,
- k -> new ArrayList<>()).add(bootLoaderTotalTime);
+ bootloaderTime
+ .computeIfAbsent(BOOTLOADER_TIME, k -> new ArrayList<>())
+ .add(bootLoaderTotalTime);
}
}
@@ -518,7 +532,9 @@
android.runWithTimeout(
3 * 60 * 1000, COMPOSD_CMD_BIN + " staged-apex-compile");
assertWithMessage("Failed to compile staged APEX. Reason: " + result)
- .that(result).ignoringCase().contains("all ok");
+ .that(result)
+ .ignoringCase()
+ .contains("all ok");
CLog.i("Success to compile staged APEX. Result: " + result);
@@ -546,22 +562,23 @@
try {
CommandRunner android = new CommandRunner(getDevice());
- String packagesOutput =
- android.run("pm list packages -f --apex-only");
+ String packagesOutput = android.run("pm list packages -f --apex-only");
- Pattern p = Pattern.compile(
- "package:(.*)=(com(?:\\.google)?\\.android\\.art)$", Pattern.MULTILINE);
+ Pattern p =
+ Pattern.compile(
+ "package:(.*)=(com(?:\\.google)?\\.android\\.art)$",
+ Pattern.MULTILINE);
Matcher m = p.matcher(packagesOutput);
assertWithMessage("ART module not found. Packages are:\n" + packagesOutput)
- .that(m.find())
- .isTrue();
+ .that(m.find())
+ .isTrue();
String artApexPath = m.group(1);
- CommandResult result = android.runForResult(
- "pm install --apex " + artApexPath);
+ CommandResult result = android.runForResult("pm install --apex " + artApexPath);
assertWithMessage("Failed to install APEX. Reason: " + result)
- .that(result.getExitCode()).isEqualTo(0);
+ .that(result.getExitCode())
+ .isEqualTo(0);
CLog.i("Success to install APEX. Result: " + result);
diff --git a/tests/helper/src/java/com/android/microdroid/test/common/MetricsProcessor.java b/tests/helper/src/java/com/android/microdroid/test/common/MetricsProcessor.java
index dd68d6a..8f93d1e 100644
--- a/tests/helper/src/java/com/android/microdroid/test/common/MetricsProcessor.java
+++ b/tests/helper/src/java/com/android/microdroid/test/common/MetricsProcessor.java
@@ -28,8 +28,8 @@
public static String getMetricPrefix(String debugTag) {
return "avf_perf"
- + ((debugTag != null && !debugTag.isEmpty()) ? "[" + debugTag + "]" : "")
- + "/";
+ + ((debugTag != null && !debugTag.isEmpty()) ? "[" + debugTag + "]" : "")
+ + "/";
}
public MetricsProcessor(String prefix) {
@@ -41,8 +41,8 @@
* a {@link Map} with the corresponding keys equal to [mPrefix + name +
* _[min|max|average|stdev]_ + unit].
*/
- public Map<String, Double> computeStats(List<? extends Number> metrics, String name,
- String unit) {
+ public Map<String, Double> computeStats(
+ List<? extends Number> metrics, String name, String unit) {
List<Double> values = new ArrayList<>(metrics.size());
for (Number metric : metrics) {
values.add(metric.doubleValue());
diff --git a/tests/helper/src/java/com/android/microdroid/test/common/ProcessUtil.java b/tests/helper/src/java/com/android/microdroid/test/common/ProcessUtil.java
index e058674..c4aba81 100644
--- a/tests/helper/src/java/com/android/microdroid/test/common/ProcessUtil.java
+++ b/tests/helper/src/java/com/android/microdroid/test/common/ProcessUtil.java
@@ -69,13 +69,13 @@
}
/** Gets global memory metrics key and values mapping */
- public static Map<String, Long> getProcessMemoryMap(
- Function<String, String> shellExecutor) throws IOException {
+ public static Map<String, Long> getProcessMemoryMap(Function<String, String> shellExecutor)
+ throws IOException {
// The input file of parseMemoryInfo need a header string as the key of output entries.
// /proc/meminfo doesn't have this line so add one as the key.
String header = "device memory info\n";
- List<SMapEntry> entries = parseMemoryInfo(header
- + shellExecutor.apply("cat /proc/meminfo"));
+ List<SMapEntry> entries =
+ parseMemoryInfo(header + shellExecutor.apply("cat /proc/meminfo"));
if (entries.size() != 1) {
throw new RuntimeException(
"expected one entry in /proc/meminfo, got " + entries.size());
diff --git a/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java b/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java
index 8169376..135d947 100644
--- a/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java
+++ b/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java
@@ -108,15 +108,15 @@
protected final void grantPermission(String permission) {
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
UiAutomation uiAutomation = instrumentation.getUiAutomation();
- uiAutomation.grantRuntimePermission(instrumentation.getContext().getPackageName(),
- permission);
+ uiAutomation.grantRuntimePermission(
+ instrumentation.getContext().getPackageName(), permission);
}
protected final void revokePermission(String permission) {
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
UiAutomation uiAutomation = instrumentation.getUiAutomation();
- uiAutomation.revokeRuntimePermission(instrumentation.getContext().getPackageName(),
- permission);
+ uiAutomation.revokeRuntimePermission(
+ instrumentation.getContext().getPackageName(), permission);
}
protected final void setMaxPerformanceTaskProfile() throws IOException {
@@ -233,12 +233,11 @@
}
protected void assumeVsrCompliant() {
- boolean featureCheck = mCtx.getPackageManager().hasSystemFeature(FEATURE_WATCH) ||
- mCtx.getPackageManager().hasSystemFeature(FEATURE_AUTOMOTIVE) ||
- mCtx.getPackageManager().hasSystemFeature(FEATURE_LEANBACK);
- assume().withMessage("This device is not VSR compliant")
- .that(featureCheck)
- .isFalse();
+ boolean featureCheck =
+ mCtx.getPackageManager().hasSystemFeature(FEATURE_WATCH)
+ || mCtx.getPackageManager().hasSystemFeature(FEATURE_AUTOMOTIVE)
+ || mCtx.getPackageManager().hasSystemFeature(FEATURE_LEANBACK);
+ assume().withMessage("This device is not VSR compliant").that(featureCheck).isFalse();
}
protected boolean isGsi() {
@@ -256,8 +255,9 @@
// Cuttlefish/Goldfish on Arm 64 doesn't and cannot support any form of virtualization,
// so there's no point running any of these tests.
- assume().withMessage("Virtualization not supported on Arm64 Cuttlefish/Goldfish."
- + " b/341889915")
+ assume().withMessage(
+ "Virtualization not supported on Arm64 Cuttlefish/Goldfish."
+ + " b/341889915")
.that(isCuttlefishArm64() || isGoldfishArm64())
.isFalse();
}
@@ -288,7 +288,8 @@
if (log.contains("Run /init as init process") && !mInitStartedNanoTime.isPresent()) {
mInitStartedNanoTime = OptionalLong.of(System.nanoTime());
}
- if (log.contains("microdroid_manager") && log.contains("executing main task")
+ if (log.contains("microdroid_manager")
+ && log.contains("executing main task")
&& !mPayloadStartedNanoTime.isPresent()) {
mPayloadStartedNanoTime = OptionalLong.of(System.nanoTime());
}
diff --git a/tests/hostside/helper/java/com/android/microdroid/test/host/CommandResultSubject.java b/tests/hostside/helper/java/com/android/microdroid/test/host/CommandResultSubject.java
index 2e9d078..1d292eb 100644
--- a/tests/hostside/helper/java/com/android/microdroid/test/host/CommandResultSubject.java
+++ b/tests/hostside/helper/java/com/android/microdroid/test/host/CommandResultSubject.java
@@ -25,9 +25,7 @@
import com.google.common.truth.StringSubject;
import com.google.common.truth.Subject;
-/**
- * A <a href="https://github.com/google/truth">Truth</a> subject for {@link CommandResult}.
- */
+/** A <a href="https://github.com/google/truth">Truth</a> subject for {@link CommandResult}. */
public class CommandResultSubject extends Subject {
private final CommandResult mActual;
diff --git a/tests/hostside/helper/java/com/android/microdroid/test/host/KvmHypTracer.java b/tests/hostside/helper/java/com/android/microdroid/test/host/KvmHypTracer.java
index 5c72358..3814cdd 100644
--- a/tests/hostside/helper/java/com/android/microdroid/test/host/KvmHypTracer.java
+++ b/tests/hostside/helper/java/com/android/microdroid/test/host/KvmHypTracer.java
@@ -17,22 +17,23 @@
package com.android.microdroid.test.host;
import static com.google.common.truth.Truth.assertWithMessage;
+
import static org.junit.Assert.assertNotNull;
-import com.android.microdroid.test.host.CommandRunner;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.util.SimpleStats;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
-import java.io.BufferedReader;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+
import javax.annotation.Nonnull;
class KvmHypEvent {
@@ -42,16 +43,14 @@
public final String args;
public final boolean valid;
- private static final Pattern LOST_EVENT_PATTERN = Pattern.compile(
- "^CPU:[0-9]* \\[LOST ([0-9]*) EVENTS\\]");
+ private static final Pattern LOST_EVENT_PATTERN =
+ Pattern.compile("^CPU:[0-9]* \\[LOST ([0-9]*) EVENTS\\]");
public KvmHypEvent(String str) {
Matcher matcher = LOST_EVENT_PATTERN.matcher(str);
- if (matcher.find())
- throw new OutOfMemoryError("Lost " + matcher.group(1) + " events");
+ if (matcher.find()) throw new OutOfMemoryError("Lost " + matcher.group(1) + " events");
- Pattern pattern = Pattern.compile(
- "^\\[([0-9]*)\\][ \t]*([0-9]*\\.[0-9]*): (\\S+) (.*)");
+ Pattern pattern = Pattern.compile("^\\[([0-9]*)\\][ \t]*([0-9]*\\.[0-9]*): (\\S+) (.*)");
matcher = pattern.matcher(str);
if (!matcher.find()) {
@@ -72,8 +71,7 @@
}
public String toString() {
- return String.format(
- "[%03d]\t%f: %s %s", cpu, timestamp, name, args);
+ return String.format("[%03d]\t%f: %s %s", cpu, timestamp, name, args);
}
}
@@ -99,16 +97,16 @@
}
public static boolean isSupported(ITestDevice device, String[] events) throws Exception {
- for (String event: events) {
- if (!device.doesFileExist(HYP_TRACING_ROOT + eventDir(event) + "/enable"))
- return false;
+ for (String event : events) {
+ if (!device.doesFileExist(HYP_TRACING_ROOT + eventDir(event) + "/enable")) return false;
}
return true;
}
public KvmHypTracer(@Nonnull ITestDevice device, String[] events) throws Exception {
assertWithMessage("Hypervisor events " + String.join(",", events) + " not supported")
- .that(isSupported(device, events)).isTrue();
+ .that(isSupported(device, events))
+ .isTrue();
mDevice = device;
mRunner = new CommandRunner(mDevice);
@@ -123,8 +121,7 @@
setNode("tracing_on", 0);
mRunner.run("echo 0 | tee " + HYP_TRACING_ROOT + "events/*/*/enable");
setNode("buffer_size_kb", DEFAULT_BUF_SIZE_KB);
- for (String event: mHypEvents)
- setNode(eventDir(event) + "/enable", 1);
+ for (String event : mHypEvents) setNode(eventDir(event) + "/enable", 1);
setNode("trace", 0);
/* Cat each per-cpu trace_pipe in its own tmp file in the background */
@@ -147,8 +144,10 @@
/* Wait for cat to finish reading the pipe interface before killing it */
for (int i = 0; i < mNrCpus; i++) {
- cmd += "while $(test '$(ps -o S -p $CPU" + i
- + "_TRACE_PIPE_PID | tail -n 1)' = 'R'); do sleep 1; done;";
+ cmd +=
+ "while $(test '$(ps -o S -p $CPU"
+ + i
+ + "_TRACE_PIPE_PID | tail -n 1)' = 'R'); do sleep 1; done;";
cmd += "kill -9 $CPU" + i + "_TRACE_PIPE_PID;";
}
cmd += "wait";
@@ -164,7 +163,7 @@
mRunner.run("rm -f " + cmd_script);
- for (String t: trace_pipes) {
+ for (String t : trace_pipes) {
File trace = mDevice.pullFile(t);
assertNotNull(trace);
mTraces.add(trace);
@@ -190,12 +189,10 @@
KvmHypEvent event;
String l;
- if ((l = br.readLine()) == null)
- return null;
+ if ((l = br.readLine()) == null) return null;
event = new KvmHypEvent(l);
- if (!event.valid)
- return null;
+ if (!event.valid) return null;
return event;
}
@@ -205,9 +202,10 @@
SimpleStats stats = new SimpleStats();
assertWithMessage("KvmHypTracer() is missing events " + String.join(",", reqEvents))
- .that(hasEvents(reqEvents)).isTrue();
+ .that(hasEvents(reqEvents))
+ .isTrue();
- for (File trace: mTraces) {
+ for (File trace : mTraces) {
BufferedReader br = new BufferedReader(new FileReader(trace));
double last = 0.0, hyp_enter = 0.0;
String prev_event = "";
@@ -219,20 +217,18 @@
throw new ParseException("Incorrect CPU number: " + cpu, 0);
double cur = hypEvent.timestamp;
- if (cur < last)
- throw new ParseException("Time must not go backward: " + cur, 0);
+ if (cur < last) throw new ParseException("Time must not go backward: " + cur, 0);
last = cur;
String event = hypEvent.name;
if (event.equals(prev_event)) {
- throw new ParseException("Hyp event found twice in a row: " +
- trace + " - " + hypEvent, 0);
+ throw new ParseException(
+ "Hyp event found twice in a row: " + trace + " - " + hypEvent, 0);
}
switch (event) {
case "hyp_exit":
- if (prev_event.equals("hyp_enter"))
- stats.add(cur - hyp_enter);
+ if (prev_event.equals("hyp_enter")) stats.add(cur - hyp_enter);
break;
case "hyp_enter":
hyp_enter = cur;
@@ -252,7 +248,8 @@
List<Integer> psciMemProtect = new ArrayList<>();
assertWithMessage("KvmHypTracer() is missing events " + String.join(",", reqEvents))
- .that(hasEvents(reqEvents)).isTrue();
+ .that(hasEvents(reqEvents))
+ .isTrue();
BufferedReader[] brs = new BufferedReader[mTraces.size()];
KvmHypEvent[] next = new KvmHypEvent[mTraces.size()];
@@ -266,22 +263,20 @@
double oldest = Double.MAX_VALUE;
int oldestIdx = -1;
- for (int i = 0; i < mTraces.size(); i ++) {
+ for (int i = 0; i < mTraces.size(); i++) {
if ((next[i] != null) && (next[i].timestamp < oldest)) {
oldest = next[i].timestamp;
oldestIdx = i;
}
}
- if (oldestIdx < 0)
- break;
+ if (oldestIdx < 0) break;
- Pattern pattern = Pattern.compile(
- "count=([0-9]*) was=([0-9]*)");
+ Pattern pattern = Pattern.compile("count=([0-9]*) was=([0-9]*)");
Matcher matcher = pattern.matcher(next[oldestIdx].args);
if (!matcher.find()) {
- throw new ParseException("Unexpected psci_mem_protect event: " +
- next[oldestIdx], 0);
+ throw new ParseException(
+ "Unexpected psci_mem_protect event: " + next[oldestIdx], 0);
}
int count = Integer.parseInt(matcher.group(1));
diff --git a/tests/hostside/helper/java/com/android/microdroid/test/host/LogArchiver.java b/tests/hostside/helper/java/com/android/microdroid/test/host/LogArchiver.java
index 96ab543..ed753d0 100644
--- a/tests/hostside/helper/java/com/android/microdroid/test/host/LogArchiver.java
+++ b/tests/hostside/helper/java/com/android/microdroid/test/host/LogArchiver.java
@@ -27,15 +27,17 @@
/** A helper class for archiving device log files to the host's tradefed output directory. */
public abstract class LogArchiver {
- /** Copy device log (then delete) to a tradefed output directory on the host.
+ /**
+ * Copy device log (then delete) to a tradefed output directory on the host.
*
* @param logs A {@link TestLogData} that needs to be owned by the actual test case.
* @param device The device to pull the log file from.
* @param remotePath The path on the device.
* @param localName Local file name to be copied to.
*/
- public static void archiveLogThenDelete(TestLogData logs, ITestDevice device, String remotePath,
- String localName) throws DeviceNotAvailableException {
+ public static void archiveLogThenDelete(
+ TestLogData logs, ITestDevice device, String remotePath, String localName)
+ throws DeviceNotAvailableException {
File logFile = device.pullFile(remotePath);
if (logFile != null) {
logs.addTestLog(localName, LogDataType.TEXT, new FileInputStreamSource(logFile));
diff --git a/tests/hostside/helper/java/com/android/microdroid/test/host/MicrodroidHostTestCaseBase.java b/tests/hostside/helper/java/com/android/microdroid/test/host/MicrodroidHostTestCaseBase.java
index cd90fbe..974a58c 100644
--- a/tests/hostside/helper/java/com/android/microdroid/test/host/MicrodroidHostTestCaseBase.java
+++ b/tests/hostside/helper/java/com/android/microdroid/test/host/MicrodroidHostTestCaseBase.java
@@ -67,8 +67,11 @@
protected static final long MICRODROID_COMMAND_TIMEOUT_MILLIS = 30000;
private static final long MICRODROID_COMMAND_RETRY_INTERVAL_MILLIS = 500;
protected static final int MICRODROID_ADB_CONNECT_MAX_ATTEMPTS =
- (int) (MICRODROID_ADB_CONNECT_TIMEOUT_MINUTES * 60 * 1000
- / MICRODROID_COMMAND_RETRY_INTERVAL_MILLIS);
+ (int)
+ (MICRODROID_ADB_CONNECT_TIMEOUT_MINUTES
+ * 60
+ * 1000
+ / MICRODROID_COMMAND_RETRY_INTERVAL_MILLIS);
protected static final Set<String> SUPPORTED_GKI_VERSIONS =
Collections.unmodifiableSet(new HashSet(Arrays.asList("android15-6.6")));
@@ -148,8 +151,9 @@
isGsi && vendorApiLevel < 202404);
}
- public static void archiveLogThenDelete(TestLogData logs, ITestDevice device, String remotePath,
- String localName) throws DeviceNotAvailableException {
+ public static void archiveLogThenDelete(
+ TestLogData logs, ITestDevice device, String remotePath, String localName)
+ throws DeviceNotAvailableException {
LogArchiver.archiveLogThenDelete(logs, device, remotePath, localName);
}
@@ -167,6 +171,7 @@
CommandResult result = RunUtil.getDefault().runTimedCmd(timeout, cmd);
return result.getStdout().trim();
}
+
private static String join(String... strs) {
return String.join(" ", Arrays.asList(strs));
}
@@ -197,8 +202,7 @@
throw new AssertionError("Failed to find test file " + name + " for module " + moduleName);
}
- public String getPathForPackage(String packageName)
- throws DeviceNotAvailableException {
+ public String getPathForPackage(String packageName) throws DeviceNotAvailableException {
return getPathForPackage(getDevice(), packageName);
}
@@ -210,7 +214,8 @@
CommandRunner android = new CommandRunner(device);
String pathLine = android.run("pm", "path", packageName);
assertWithMessage("Package " + packageName + " not found")
- .that(pathLine).startsWith("package:");
+ .that(pathLine)
+ .startsWith("package:");
return pathLine.substring("package:".length());
}
diff --git a/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java b/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java
index 80d1fc6..0f7be20 100644
--- a/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java
+++ b/tests/hostside/java/com/android/microdroid/test/MicrodroidHostTests.java
@@ -19,7 +19,6 @@
import static com.android.microdroid.test.host.CommandResultSubject.command_results;
import static com.android.tradefed.device.TestDevice.MicrodroidBuilder;
import static com.android.tradefed.testtype.DeviceJUnit4ClassRunner.TestLogData;
-import com.android.tradefed.device.DeviceRuntimeException;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
@@ -45,6 +44,7 @@
import com.android.os.AtomsProto;
import com.android.os.StatsLog;
import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.DeviceRuntimeException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.device.TestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner.TestMetrics;
@@ -79,13 +79,13 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
-import java.util.Objects;
@RunWith(DeviceJUnit4Parameterized.class)
@UseParametersRunnerFactory(DeviceJUnit4ClassRunnerWithParameters.RunnerFactory.class)
@@ -490,6 +490,7 @@
.cpuTopology("match_host")
.protectedVm(true)
.gki(mGki)
+ .name("protected_vm_runs_pvmfw")
.build(getAndroidDevice());
// Assert
@@ -785,6 +786,7 @@
.cpuTopology("match_host")
.protectedVm(mProtectedVm)
.gki(mGki)
+ .name("test_telemetry_pushed_atoms")
.build(device);
microdroid.waitForBootComplete(BOOT_COMPLETE_TIMEOUT);
device.shutdownMicrodroid(microdroid);
@@ -816,7 +818,8 @@
assertThat(atomVmCreationRequested.getIsProtected()).isEqualTo(mProtectedVm);
assertThat(atomVmCreationRequested.getCreationSucceeded()).isTrue();
assertThat(atomVmCreationRequested.getBinderExceptionCode()).isEqualTo(0);
- assertThat(atomVmCreationRequested.getVmIdentifier()).isEqualTo("VmRunApp");
+ assertThat(atomVmCreationRequested.getVmIdentifier())
+ .isEqualTo("test_telemetry_pushed_atoms");
assertThat(atomVmCreationRequested.getConfigType())
.isEqualTo(AtomsProto.VmCreationRequested.ConfigType.VIRTUAL_MACHINE_APP_CONFIG);
assertThat(atomVmCreationRequested.getNumCpus()).isEqualTo(getDeviceNumCpus(device));
@@ -826,11 +829,11 @@
// Check VmBooted atom
AtomsProto.VmBooted atomVmBooted = data.get(1).getAtom().getVmBooted();
- assertThat(atomVmBooted.getVmIdentifier()).isEqualTo("VmRunApp");
+ assertThat(atomVmBooted.getVmIdentifier()).isEqualTo("test_telemetry_pushed_atoms");
// Check VmExited atom
AtomsProto.VmExited atomVmExited = data.get(2).getAtom().getVmExited();
- assertThat(atomVmExited.getVmIdentifier()).isEqualTo("VmRunApp");
+ assertThat(atomVmExited.getVmIdentifier()).isEqualTo("test_telemetry_pushed_atoms");
assertThat(atomVmExited.getDeathReason()).isEqualTo(AtomsProto.VmExited.DeathReason.KILLED);
assertThat(atomVmExited.getExitSignal()).isEqualTo(9);
// In CPU & memory related fields, check whether positive values are collected or not.
@@ -927,6 +930,7 @@
.memoryMib(minMemorySize())
.cpuTopology("match_host")
.protectedVm(mProtectedVm)
+ .name("test_microdroid_boots")
.gki(mGki));
}
@@ -940,6 +944,7 @@
.cpuTopology("match_host")
.protectedVm(mProtectedVm)
.gki(mGki)
+ .name("test_microdroid_ram_usage")
.build(getAndroidDevice());
mMicrodroidDevice.waitForBootComplete(BOOT_COMPLETE_TIMEOUT);
mMicrodroidDevice.enableAdbRoot();
@@ -1205,6 +1210,7 @@
.protectedVm(mProtectedVm)
.gki(mGki)
.hugePages(true)
+ .name("test_huge_pages")
.build(getAndroidDevice());
mMicrodroidDevice.waitForBootComplete(BOOT_COMPLETE_TIMEOUT);
diff --git a/tests/pvmfw/helper/java/com/android/pvmfw/test/host/Pvmfw.java b/tests/pvmfw/helper/java/com/android/pvmfw/test/host/Pvmfw.java
index a77ba40..5ae5186 100644
--- a/tests/pvmfw/helper/java/com/android/pvmfw/test/host/Pvmfw.java
+++ b/tests/pvmfw/helper/java/com/android/pvmfw/test/host/Pvmfw.java
@@ -27,8 +27,8 @@
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.util.Objects;
import java.nio.ByteBuffer;
+import java.util.Objects;
/** pvmfw.bin with custom config payloads on host. */
public final class Pvmfw {
diff --git a/tests/pvmfw/java/com/android/pvmfw/test/DebugPolicyHostTests.java b/tests/pvmfw/java/com/android/pvmfw/test/DebugPolicyHostTests.java
index 2a6ab2d..7efbbc7 100644
--- a/tests/pvmfw/java/com/android/pvmfw/test/DebugPolicyHostTests.java
+++ b/tests/pvmfw/java/com/android/pvmfw/test/DebugPolicyHostTests.java
@@ -30,8 +30,8 @@
import com.android.tradefed.device.DeviceRuntimeException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
-import com.android.tradefed.util.CommandStatus;
import com.android.tradefed.util.CommandResult;
+import com.android.tradefed.util.CommandStatus;
import org.junit.After;
import org.junit.Before;
diff --git a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
index 1465e73..7089b33 100644
--- a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
+++ b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
@@ -335,6 +335,7 @@
testResults.assertNoException();
assertThat(testResults.mAddInteger).isEqualTo(37 + 73);
}
+
@Test
@CddTest(requirements = {"9.17/C-1-1"})
public void autoCloseVm() throws Exception {
@@ -737,7 +738,6 @@
VirtualMachineConfig.Builder otherOsBuilder =
newBaselineBuilder().setOs("microdroid_gki-android14-6.1");
assertConfigCompatible(microdroidOsConfig, otherOsBuilder).isFalse();
-
}
private VirtualMachineConfig.Builder newBaselineBuilder() {
@@ -870,11 +870,12 @@
}
@Test
- @CddTest(requirements = {
- "9.17/C-1-1",
- "9.17/C-1-2",
- "9.17/C-1-4",
- })
+ @CddTest(
+ requirements = {
+ "9.17/C-1-1",
+ "9.17/C-1-2",
+ "9.17/C-1-4",
+ })
public void createVmWithConfigRequiresPermission() throws Exception {
assumeSupportedDevice();
revokePermission(VirtualMachine.USE_CUSTOM_VIRTUAL_MACHINE_PERMISSION);
@@ -890,14 +891,16 @@
SecurityException e =
assertThrows(
SecurityException.class, () -> runVmTestService(TAG, vm, (ts, tr) -> {}));
- assertThat(e).hasMessageThat()
+ assertThat(e)
+ .hasMessageThat()
.contains("android.permission.USE_CUSTOM_VIRTUAL_MACHINE permission");
}
@Test
- @CddTest(requirements = {
- "9.17/C-1-1",
- })
+ @CddTest(
+ requirements = {
+ "9.17/C-1-1",
+ })
public void deleteVm() throws Exception {
assumeSupportedDevice();
@@ -954,9 +957,10 @@
}
@Test
- @CddTest(requirements = {
- "9.17/C-1-1",
- })
+ @CddTest(
+ requirements = {
+ "9.17/C-1-1",
+ })
public void validApkPathIsAccepted() throws Exception {
assumeSupportedDevice();
@@ -989,10 +993,7 @@
}
@Test
- @CddTest(requirements = {
- "9.17/C-1-1",
- "9.17/C-2-1"
- })
+ @CddTest(requirements = {"9.17/C-1-1", "9.17/C-2-1"})
public void extraApk() throws Exception {
assumeSupportedDevice();
@@ -1044,7 +1045,7 @@
@Test
public void bootFailsWhenLowMem() throws Exception {
- for (int memMib : new int[]{ 10, 20, 40 }) {
+ for (int memMib : new int[] {10, 20, 40}) {
VirtualMachineConfig lowMemConfig =
newVmConfigBuilderWithPayloadBinary("MicrodroidTestNativeLib.so")
.setMemoryBytes(memMib)
@@ -1061,8 +1062,9 @@
onPayloadReadyExecuted.complete(true);
super.onPayloadReady(vm);
}
+
@Override
- public void onStopped(VirtualMachine vm, int reason) {
+ public void onStopped(VirtualMachine vm, int reason) {
onStoppedExecuted.complete(true);
super.onStopped(vm, reason);
}
@@ -1210,10 +1212,7 @@
}
@Test
- @CddTest(requirements = {
- "9.17/C-1-1",
- "9.17/C-2-7"
- })
+ @CddTest(requirements = {"9.17/C-1-1", "9.17/C-2-7"})
public void instancesOfSameVmHaveDifferentCdis() throws Exception {
assumeSupportedDevice();
// TODO(b/325094712): VMs on CF with same payload have the same secret. This is because
@@ -1240,10 +1239,7 @@
}
@Test
- @CddTest(requirements = {
- "9.17/C-1-1",
- "9.17/C-2-7"
- })
+ @CddTest(requirements = {"9.17/C-1-1", "9.17/C-2-7"})
public void sameInstanceKeepsSameCdis() throws Exception {
assumeSupportedDevice();
assume().withMessage("Skip on CF. Too Slow. b/257270529").that(isCuttlefish()).isFalse();
@@ -1298,7 +1294,7 @@
// then pvmfw, vm_entry (Microdroid kernel) and Microdroid payload entries.
// Before Android V we did not require that vendor code contain any DICE entries
// preceding pvmfw, so the minimum is one less.
- int minDiceChainSize = getVendorApiLevel() >= 202404 ? 5 : 4;
+ int minDiceChainSize = getVendorApiLevel() > 202404 ? 5 : 4;
assertThat(diceChainSize).isAtLeast(minDiceChainSize);
} else {
// pvmfw truncates the DICE chain it gets, so we expect exactly entries for
@@ -1339,10 +1335,7 @@
}
@Test
- @CddTest(requirements = {
- "9.17/C-1-1",
- "9.17/C-1-2"
- })
+ @CddTest(requirements = {"9.17/C-1-1", "9.17/C-1-2"})
public void accessToCdisIsRestricted() throws Exception {
assumeSupportedDevice();
@@ -1399,8 +1392,7 @@
private void assertThatPartitionIsMissing(UUID partitionUuid) throws Exception {
RandomAccessFile instanceFile = prepareInstanceImage("test_vm_integrity");
- assertThat(findPartitionDataOffset(instanceFile, partitionUuid).isPresent())
- .isFalse();
+ assertThat(findPartitionDataOffset(instanceFile, partitionUuid).isPresent()).isFalse();
}
// Flips a bit of given partition, and then see if boot fails.
@@ -1420,10 +1412,7 @@
}
@Test
- @CddTest(requirements = {
- "9.17/C-1-1",
- "9.17/C-2-7"
- })
+ @CddTest(requirements = {"9.17/C-1-1", "9.17/C-2-7"})
public void bootFailsWhenMicrodroidDataIsCompromised() throws Exception {
// If Updatable VM is supported => No instance.img required
assumeNoUpdatableVmSupport();
@@ -1431,10 +1420,7 @@
}
@Test
- @CddTest(requirements = {
- "9.17/C-1-1",
- "9.17/C-2-7"
- })
+ @CddTest(requirements = {"9.17/C-1-1", "9.17/C-2-7"})
public void bootFailsWhenPvmFwDataIsCompromised() throws Exception {
// If Updatable VM is supported => No instance.img required
assumeNoUpdatableVmSupport();
@@ -1456,8 +1442,8 @@
BootResult bootResult = tryBootVmWithConfig(config, "test_vm_invalid_config");
assertThat(bootResult.payloadStarted).isFalse();
- assertThat(bootResult.deathReason).isEqualTo(
- VirtualMachineCallback.STOP_REASON_MICRODROID_INVALID_PAYLOAD_CONFIG);
+ assertThat(bootResult.deathReason)
+ .isEqualTo(VirtualMachineCallback.STOP_REASON_MICRODROID_INVALID_PAYLOAD_CONFIG);
}
@Test
@@ -2143,7 +2129,6 @@
IVmShareTestService service = connection.waitForService();
assertWithMessage("Timed out connecting to " + serviceIntent).that(service).isNotNull();
-
try {
ITestService testServiceProxy = transferAndStartVm(service, vmDesc, "vm_to_share");
@@ -2627,16 +2612,15 @@
}
private long minMemoryRequired() {
- assertThat(Build.SUPPORTED_ABIS).isNotEmpty();
- String primaryAbi = Build.SUPPORTED_ABIS[0];
- switch (primaryAbi) {
- case "x86_64":
- return MIN_MEM_X86_64;
- case "arm64-v8a":
- case "arm64-v8a-hwasan":
- return MIN_MEM_ARM64;
- }
- throw new AssertionError("Unsupported ABI: " + primaryAbi);
+ assertThat(Build.SUPPORTED_ABIS).isNotEmpty();
+ String primaryAbi = Build.SUPPORTED_ABIS[0];
+ switch (primaryAbi) {
+ case "x86_64":
+ return MIN_MEM_X86_64;
+ case "arm64-v8a":
+ case "arm64-v8a-hwasan":
+ return MIN_MEM_ARM64;
+ }
+ throw new AssertionError("Unsupported ABI: " + primaryAbi);
}
-
}
diff --git a/tests/testapk_no_perm/src/java/com/android/microdroid/test/MicrodroidTestAppNoPerm.java b/tests/testapk_no_perm/src/java/com/android/microdroid/test/MicrodroidTestAppNoPerm.java
index 1772e6b..27e26e5 100644
--- a/tests/testapk_no_perm/src/java/com/android/microdroid/test/MicrodroidTestAppNoPerm.java
+++ b/tests/testapk_no_perm/src/java/com/android/microdroid/test/MicrodroidTestAppNoPerm.java
@@ -16,18 +16,19 @@
package com.android.microdroid.test;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertThrows;
+
import android.system.virtualmachine.VirtualMachineConfig;
import com.android.compatibility.common.util.CddTest;
import com.android.microdroid.test.device.MicrodroidDeviceTestBase;
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertThrows;
-
import org.junit.Before;
-import org.junit.runners.Parameterized;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
/**
* Test that the android.permission.MANAGE_VIRTUAL_MACHINE is enforced and that an app cannot launch
diff --git a/tests/vmshareapp/src/java/com/android/microdroid/test/sharevm/VmShareServiceImpl.java b/tests/vmshareapp/src/java/com/android/microdroid/test/sharevm/VmShareServiceImpl.java
index 109486c..9f606e5 100644
--- a/tests/vmshareapp/src/java/com/android/microdroid/test/sharevm/VmShareServiceImpl.java
+++ b/tests/vmshareapp/src/java/com/android/microdroid/test/sharevm/VmShareServiceImpl.java
@@ -28,8 +28,8 @@
import android.util.Log;
import com.android.microdroid.test.vmshare.IVmShareTestService;
-import com.android.microdroid.testservice.ITestService;
import com.android.microdroid.testservice.IAppCallback;
+import com.android.microdroid.testservice.ITestService;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;