use nucleus::security::GVisorRuntime;
#[derive(Debug, Clone, PartialEq)]
enum GVisorState {
NativeKernel,
GVisorKernel,
}
impl GVisorState {
fn is_terminal(&self) -> bool {
matches!(self, GVisorState::GVisorKernel)
}
}
#[test]
fn test_valid_transitions() {
let mut state = GVisorState::NativeKernel;
assert!(!state.is_terminal());
state = GVisorState::GVisorKernel;
assert!(state.is_terminal());
}
#[test]
fn test_terminal_state() {
let state = GVisorState::GVisorKernel;
assert!(state.is_terminal());
}
#[test]
fn test_single_transition() {
let initial = GVisorState::NativeKernel;
assert_eq!(initial, GVisorState::NativeKernel);
let after_enable = GVisorState::GVisorKernel;
assert!(after_enable.is_terminal());
}
#[test]
fn test_liveness() {
let state = GVisorState::GVisorKernel;
assert_eq!(state, GVisorState::GVisorKernel);
assert!(state.is_terminal());
}
#[test]
fn test_type_ok() {
let states = [GVisorState::NativeKernel, GVisorState::GVisorKernel];
for state in states {
match state {
GVisorState::NativeKernel | GVisorState::GVisorKernel => {
}
}
}
}
#[test]
fn test_gvisor_availability() {
let available = GVisorRuntime::is_available();
println!("GVisor available: {}", available);
if available {
let runtime = GVisorRuntime::new();
assert!(runtime.is_ok());
}
}
#[test]
fn test_no_invalid_transitions() {
let state = GVisorState::NativeKernel;
assert!(!state.is_terminal());
let next_state = GVisorState::GVisorKernel;
assert!(next_state.is_terminal());
assert!(next_state.is_terminal());
}