use std::{fs::File, io::Write};
use efivar::{
efi::{Variable, VariableFlags},
store::MemoryStore,
test_utils::assert_var_not_found,
VarReader, VarWriter,
};
use crate::{cli::Command, exit_code::ExitCode};
use super::*;
#[test]
fn list() {
let manager = &mut MemoryStore::new();
manager
.write(
&Variable::new("MyVariable"),
VariableFlags::default(),
&[0x01, 0x02],
)
.unwrap();
assert_eq!(
ExitCode::SUCCESS,
crate::run(Command::parse_from(["efivarcli", "list"]), manager,)
);
assert_eq!(
ExitCode::SUCCESS,
crate::run(
Command::parse_from([
"efivarcli",
"list",
"-n",
"f2aab986-4175-47bb-890a-3cba5f6d2547"
]),
manager,
)
);
assert_eq!(
ExitCode::SUCCESS,
crate::run(
Command::parse_from(["efivarcli", "list", "--all",]),
manager,
)
);
}
#[test]
fn import() {
let mut manager = MemoryStore::new();
let tmpdir = tempfile::tempdir().unwrap();
let file_path = tmpdir.path().join("in.bin");
{
let mut file = File::create(&file_path).unwrap();
file.write_all(&[0x07, 0x00, 0x00, 0x00]).unwrap(); file.write_all(&[0x01, 0x02, 0x03, 0x04]).unwrap(); }
assert_eq!(
ExitCode::SUCCESS,
crate::run(
Command::parse_from([
"efivarcli",
"import",
file_path.to_str().unwrap(),
"MyVariable",
]),
&mut manager
)
);
let (output_data, flags) = manager.read(&Variable::new("MyVariable")).unwrap();
assert_eq!(vec![0x01, 0x02, 0x03, 0x04], output_data);
assert_eq!(flags, VariableFlags::default());
}
#[test]
fn import_non_existent() {
let mut manager = MemoryStore::new();
let tmpdir = tempfile::tempdir().unwrap();
let file_path = tmpdir.path().join("non_existent_file.bin");
assert_eq!(
ExitCode::FAILURE,
crate::run(
Command::parse_from([
"efivarcli",
"import",
file_path.to_str().unwrap(),
"MyVariable",
]),
&mut manager
)
);
assert_var_not_found(&mut manager, &Variable::new("MyVariable"));
}
#[test]
fn export() {
let mut manager = MemoryStore::new();
manager
.write(
&Variable::new("MyVariable"),
VariableFlags::default(),
&[0x01, 0x02, 0x03, 0x04],
)
.unwrap();
let tmpdir = tempfile::tempdir().unwrap();
let file_path = tmpdir.path().join("in.bin");
assert_eq!(
ExitCode::SUCCESS,
crate::run(
Command::parse_from([
"efivarcli",
"export",
"MyVariable",
file_path.to_str().unwrap(),
]),
&mut manager
)
);
let output_data = std::fs::read(file_path).unwrap();
assert_eq!(
vec![0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04],
output_data
);
}
#[test]
fn export_no_var() {
let mut manager = MemoryStore::new();
let tmpdir = tempfile::tempdir().unwrap();
let file_path = tmpdir.path().join("in.bin");
assert_eq!(
ExitCode::FAILURE,
crate::run(
Command::parse_from([
"efivarcli",
"export",
"MyVariable",
file_path.to_str().unwrap(),
]),
&mut manager
)
);
assert_var_not_found(&mut manager, &Variable::new("MyVariable"));
}
#[test]
fn delete() {
let mut manager = MemoryStore::new();
manager
.write(
&Variable::new("MyVariable"),
VariableFlags::default(),
&[0x01, 0x02, 0x03, 0x04],
)
.unwrap();
assert_eq!(
ExitCode::SUCCESS,
crate::run(
Command::parse_from(["efivarcli", "delete", "MyVariable",]),
&mut manager
)
);
assert_var_not_found(&mut manager, &Variable::new("MyVariable"));
}
#[test]
fn delete_non_existent() {
let mut manager = MemoryStore::new();
assert_eq!(
ExitCode::FAILURE,
crate::run(
Command::parse_from(["efivarcli", "delete", "MyVariable",]),
&mut manager
)
);
}
#[test]
fn read() {
let mut manager = MemoryStore::new();
manager
.write(
&Variable::new("MyVariable"),
VariableFlags::default(),
&[0x01, 0x02, 0x03, 0x04],
)
.unwrap();
assert_eq!(
ExitCode::SUCCESS,
crate::run(
Command::parse_from(["efivarcli", "read", "MyVariable"]),
&mut manager
)
);
assert_eq!(
ExitCode::SUCCESS,
crate::run(
Command::parse_from(["efivarcli", "read", "MyVariable", "--string"]),
&mut manager
)
);
assert_eq!(
ExitCode::SUCCESS,
crate::run(
Command::parse_from(["efivarcli", "read", "MyVariable", "--raw"]),
&mut manager
)
);
assert_eq!(
ExitCode::SUCCESS,
crate::run(
Command::parse_from(["efivarcli", "read", "MyVariable", "--raw", "--string"]),
&mut manager
)
);
}
#[test]
fn read_non_existent() {
assert_eq!(
ExitCode::FAILURE,
crate::run(
Command::parse_from(["efivarcli", "read", "MyVariable"]),
&mut MemoryStore::new()
)
);
}