Skip to content

Commit 1636191

Browse files
handle testing of log outputs.
1 parent 197837f commit 1636191

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
@@ -336,10 +336,9 @@ fn vmcs_write(field: VmcsField, value: u64) -> Result<()> {
336336
rflags
337337
};
338338

339-
error::check_vm_instruction(
340-
rflags,
341-
||error!("Failed to write 0x{:x} to field {:?}", value, field),
342-
)
339+
error::check_vm_instruction(rflags, || {
340+
error!("Failed to write 0x{:x} to field {:?}", value, field)
341+
})
343342
}
344343

345344
fn vmcs_read(field: VmcsField) -> Result<u64> {
@@ -375,7 +374,7 @@ fn vmcs_activate(vmcs: &mut Vmcs, _vmx: &vmx::Vmx) -> Result<()> {
375374
rflags
376375
};
377376

378-
error::check_vm_instruction(rflags, ||error!("Failed to activate VMCS"))
377+
error::check_vm_instruction(rflags, || error!("Failed to activate VMCS"))
379378
}
380379

381380
fn vmcs_clear(vmcs_page: &mut Raw4kPage) -> Result<()> {
@@ -390,7 +389,7 @@ fn vmcs_clear(vmcs_page: &mut Raw4kPage) -> Result<()> {
390389
);
391390
rflags
392391
};
393-
error::check_vm_instruction(rflags, ||error!("Failed to clear VMCS"))
392+
error::check_vm_instruction(rflags, || error!("Failed to clear VMCS"))
394393
}
395394

396395
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
@@ -63,7 +63,7 @@ impl Vmx {
6363
rflags
6464
};
6565

66-
error::check_vm_instruction(rflags, ||error!("Failed to enable vmx"))?;
66+
error::check_vm_instruction(rflags, || error!("Failed to enable vmx"))?;
6767
Ok(Vmx {
6868
_vmxon_region: vmxon_region,
6969
})
@@ -83,7 +83,7 @@ impl Vmx {
8383
rflags
8484
};
8585

86-
error::check_vm_instruction(rflags, ||error!("Failed to disable vmx"))
86+
error::check_vm_instruction(rflags, || error!("Failed to disable vmx"))
8787
}
8888

8989
pub fn revision() -> u32 {
@@ -108,7 +108,9 @@ impl Vmx {
108108
);
109109
rflags
110110
};
111-
error::check_vm_instruction(rflags, ||error!("Failed to execute invept"))
111+
error::check_vm_instruction(rflags, || {
112+
error!("Failed to execute invept")
113+
})
112114
}
113115

114116
pub fn invvpid(&self, mode: InvVpidMode) -> Result<()> {
@@ -135,7 +137,9 @@ impl Vmx {
135137
);
136138
rflags
137139
};
138-
error::check_vm_instruction(rflags, ||error!("Failed to execute invvpid"))
140+
error::check_vm_instruction(rflags, || {
141+
error!("Failed to execute invvpid")
142+
})
139143
}
140144
}
141145

0 commit comments

Comments
 (0)