crosvm/e2e_tests/tests/block.rs
Dennis Kempin 009cb53c76 Rename integration_tests to e2e_tests
Cargo already uses the term 'integration test' for tests living
in the tests/ directory of a crate.

To prevent confusion, rename our 'integration_tests' crate to
'e2e_tests'.

BUG=None
TEST=presubmit

Change-Id: Icfa819eaed08be54ab0f36092f1ba367f3f1ce88
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4004977
Commit-Queue: Dennis Kempin <denniskempin@google.com>
Reviewed-by: Zihan Chen <zihanchen@google.com>
2022-11-03 22:49:39 +00:00

93 lines
2.5 KiB
Rust

// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//! Testing virtio-block.
pub mod fixture;
use std::env;
use std::process::Command;
use fixture::Config;
use fixture::TestVm;
use tempfile::NamedTempFile;
const DEFAULT_BLOCK_SIZE: u64 = 1024 * 1024;
fn prepare_disk_img() -> NamedTempFile {
let mut disk = NamedTempFile::new().unwrap();
disk.as_file_mut().set_len(DEFAULT_BLOCK_SIZE).unwrap();
// Add /sbin and /usr/sbin to PATH since some distributions put mkfs.ext4 in one of those
// directories but don't add them to non-root PATH.
let path = env::var("PATH").unwrap();
let path = [&path, "/sbin", "/usr/sbin"].join(":");
// TODO(b/243127910): Use `mkfs.ext4 -d` to include test data.
Command::new("mkfs.ext4")
.arg(disk.path().to_str().unwrap())
.env("PATH", path)
.output()
.expect("failed to execute process");
disk
}
// TODO(b/243127498): Add tests for write and sync operations.
#[test]
fn mount_block() {
let disk = prepare_disk_img();
let disk_path = disk.path().to_str().unwrap();
println!("disk={disk_path}");
let config = Config::new().extra_args(vec!["--block".to_string(), format!("{},ro", disk_path)]);
let mut vm = TestVm::new(config).unwrap();
assert_eq!(
vm.exec_in_guest("mount -t ext4 /dev/vdb /mnt && echo 42")
.unwrap()
.trim(),
"42"
);
}
#[test]
fn resize() {
let disk = prepare_disk_img();
let disk_path = disk.path().to_str().unwrap().to_string();
println!("disk={disk_path}");
let config = Config::new().extra_args(vec!["--block".to_string(), disk_path]);
let mut vm = TestVm::new(config).unwrap();
// Check the initial block device size.
assert_eq!(
vm.exec_in_guest("blockdev --getsize64 /dev/vdb")
.unwrap()
.trim()
.parse::<u64>()
.unwrap(),
DEFAULT_BLOCK_SIZE
);
let new_size = DEFAULT_BLOCK_SIZE * 2;
// The index of the disk to resize.
let disk_index = 1;
vm.disk(vec![
"resize".to_string(),
disk_index.to_string(),
new_size.to_string(),
])
.expect("Disk resizing command failed");
// Check the new block device size.
assert_eq!(
vm.exec_in_guest("blockdev --getsize64 /dev/vdb")
.unwrap()
.trim()
.parse::<u64>()
.unwrap(),
new_size
);
}