Skip to content

Commit 4231e0f

Browse files
handle testing of log outputs.
1 parent 0209669 commit 4231e0f

File tree

7 files changed

+59
-22
lines changed

7 files changed

+59
-22
lines changed

mythril/Cargo.lock

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mythril/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ spin = "0.5"
2929
ux = { version = "0.1.3", default-features = false }
3030
managed = { version = "0.8.0", features = ["map", "alloc"], default-features = false }
3131

32+
[dev-dependencies]
33+
testing_logger = "0.1.1"
34+
3235
[dependencies.arrayvec]
3336
version = "0.5.2"
3437
default-features = false

mythril/src/ioapic.rs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,10 @@ impl From<IoRedTblEntry> for u64 {
643643

644644
#[cfg(test)]
645645
mod test {
646+
647+
use log::Level;
648+
extern crate testing_logger;
649+
646650
use super::*;
647651

648652
fn get_ioapic(buf: *mut u8) -> Result<IoApic> {
@@ -674,17 +678,22 @@ mod test {
674678

675679
#[test]
676680
fn ioredtblentry_invalid_trigger_mode() {
681+
testing_logger::setup();
677682
// ExtINT is invalid for level trigger mode.
678683
let invalid_for_level = 0x0f000000_00008700;
679684
let err = Error::InvalidValue;
680-
// (
681-
// "The delivery mode `0b111` is invalid for level trigger mode"
682-
// .to_string(),
683-
// );
684685
assert_eq!(
685686
IoRedTblEntry::try_from(invalid_for_level).unwrap_err(),
686687
err
687688
);
689+
testing_logger::validate(|captured_logs| {
690+
assert_eq!(captured_logs.len(), 1);
691+
assert_eq!(
692+
captured_logs[0].body,
693+
"The delivery mode `0b111` is invalid for level trigger mode"
694+
);
695+
assert_eq!(captured_logs[0].level, Level::Error);
696+
})
688697
}
689698

690699
#[test]
@@ -700,16 +709,23 @@ mod test {
700709
fn ioredtblentry_invalid_dest() {
701710
// Destination is a full byte but a physical destination mode
702711
// is used.
712+
testing_logger::setup();
703713
let invalid_dest = 0xff000000_0000_0000;
704714
let err = Error::InvalidValue;
705-
// (
706-
// "Invalid Physical APIC ID destination: 0xff".to_string(),
707-
// );
708715
assert_eq!(err, IoRedTblEntry::try_from(invalid_dest).unwrap_err());
716+
testing_logger::validate(|captured_logs| {
717+
assert_eq!(captured_logs.len(), 1);
718+
assert_eq!(
719+
captured_logs[0].body,
720+
"Invalid Physical APIC ID destination: 0xff"
721+
);
722+
assert_eq!(captured_logs[0].level, Level::Error);
723+
})
709724
}
710725

711726
#[test]
712727
fn ioredtblentry_write_ro_bit() {
728+
testing_logger::setup();
713729
let mut buf: [u8; 24] = [
714730
0x00,
715731
0x00,
@@ -741,11 +757,16 @@ mod test {
741757
let entry = IoRedTblEntry::try_from(bits).unwrap();
742758

743759
let err = Error::InvalidValue;
744-
// (
745-
// "Read-only IO Redirect Table Entry bits set: 0x1000".to_string(),
746-
// );
747760
// The delivery status is set, which should be read-only.
748761
assert_eq!(err, ioapic.write_ioredtbl(0, entry).unwrap_err());
762+
testing_logger::validate(|captured_logs| {
763+
assert_eq!(captured_logs.len(), 1);
764+
assert_eq!(
765+
captured_logs[0].body,
766+
"Read-only IO Redirect Table Entry bits set: 0x1000"
767+
);
768+
assert_eq!(captured_logs[0].level, Level::Error);
769+
})
749770
}
750771

751772
#[test]

mythril/src/vcpu.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ impl VCpu {
171171
/// Begin execution in the guest context for this core
172172
pub fn launch(&mut self) -> Result<!> {
173173
let rflags = unsafe { vmlaunch_wrapper() };
174-
error::check_vm_instruction(rflags, ||error!("Failed to launch vm"))?;
174+
error::check_vm_instruction(rflags, || error!("Failed to launch vm"))?;
175175

176176
unreachable!()
177177
}

mythril/src/vmcs.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -333,10 +333,9 @@ fn vmcs_write(field: VmcsField, value: u64) -> Result<()> {
333333
rflags
334334
};
335335

336-
error::check_vm_instruction(
337-
rflags,
338-
||error!("Failed to write 0x{:x} to field {:?}", value, field),
339-
)
336+
error::check_vm_instruction(rflags, || {
337+
error!("Failed to write 0x{:x} to field {:?}", value, field)
338+
})
340339
}
341340

342341
fn vmcs_read(field: VmcsField) -> Result<u64> {
@@ -369,7 +368,7 @@ fn vmcs_activate(vmcs: &mut Vmcs, _vmx: &vmx::Vmx) -> Result<()> {
369368
rflags
370369
};
371370

372-
error::check_vm_instruction(rflags, ||error!("Failed to activate VMCS"))
371+
error::check_vm_instruction(rflags, || error!("Failed to activate VMCS"))
373372
}
374373

375374
fn vmcs_clear(vmcs_page: &mut Raw4kPage) -> Result<()> {
@@ -382,7 +381,7 @@ fn vmcs_clear(vmcs_page: &mut Raw4kPage) -> Result<()> {
382381
: "volatile");
383382
rflags
384383
};
385-
error::check_vm_instruction(rflags, ||error!("Failed to clear VMCS"))
384+
error::check_vm_instruction(rflags, || error!("Failed to clear VMCS"))
386385
}
387386

388387
pub struct Vmcs {

mythril/src/vmexit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pub extern "C" fn vmexit_handler(state: *mut GuestCpuState) {
5454

5555
#[no_mangle]
5656
pub extern "C" fn vmresume_failure_handler(rflags: u64) {
57-
error::check_vm_instruction(rflags,|| error!("Failed to vmresume"))
57+
error::check_vm_instruction(rflags, || error!("Failed to vmresume"))
5858
.expect("vmresume failed");
5959
}
6060

mythril/src/vmx.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl Vmx {
5252
rflags
5353
};
5454

55-
error::check_vm_instruction(rflags, ||error!("Failed to enable vmx"))?;
55+
error::check_vm_instruction(rflags, || error!("Failed to enable vmx"))?;
5656
Ok(Vmx {
5757
_vmxon_region: vmxon_region,
5858
})
@@ -70,7 +70,7 @@ impl Vmx {
7070
rflags
7171
};
7272

73-
error::check_vm_instruction(rflags, ||error!("Failed to disable vmx"))
73+
error::check_vm_instruction(rflags, || error!("Failed to disable vmx"))
7474
}
7575

7676
pub fn revision() -> u32 {
@@ -90,7 +90,9 @@ impl Vmx {
9090
: "m"(val), "r"(t));
9191
rflags
9292
};
93-
error::check_vm_instruction(rflags, ||error!("Failed to execute invept"))
93+
error::check_vm_instruction(rflags, || {
94+
error!("Failed to execute invept")
95+
})
9496
}
9597

9698
pub fn invvpid(&self, mode: InvVpidMode) -> Result<()> {
@@ -112,7 +114,9 @@ impl Vmx {
112114
: "m"(val), "r"(t));
113115
rflags
114116
};
115-
error::check_vm_instruction(rflags, ||error!("Failed to execute invvpid"))
117+
error::check_vm_instruction(rflags, || {
118+
error!("Failed to execute invvpid")
119+
})
116120
}
117121
}
118122

0 commit comments

Comments
 (0)