use oci_spec::runtime::{LinuxDeviceCgroup, LinuxDeviceType};
pub struct Emulator {
pub default_allow: bool,
pub rules: Vec<LinuxDeviceCgroup>,
}
impl Emulator {
pub fn with_default_allow(default_allow: bool) -> Self {
Emulator {
default_allow,
rules: Vec::new(),
}
}
pub fn add_rules(&mut self, rules: &[LinuxDeviceCgroup]) {
for rule in rules {
self.add_rule(rule);
}
}
pub fn add_rule(&mut self, rule: &LinuxDeviceCgroup) {
if rule.typ().unwrap_or_default() == LinuxDeviceType::A {
self.default_allow = rule.allow();
self.rules.clear();
return;
}
if rule.access().is_none() {
return;
}
self.rules.push(rule.clone());
}
}
#[cfg(test)]
mod tests {
use oci_spec::runtime::LinuxDeviceCgroupBuilder;
use super::*;
#[test]
fn test_with_default_allow() {
let emulator = Emulator::with_default_allow(true);
assert_eq!(emulator.rules.len(), 0);
assert!(emulator.default_allow);
}
#[test]
fn test_type_a_rule() {
let mut emulator = Emulator::with_default_allow(false);
let cgroup = LinuxDeviceCgroupBuilder::default()
.typ(LinuxDeviceType::A)
.build()
.unwrap();
emulator.add_rule(&cgroup);
assert_eq!(emulator.rules.len(), 0);
assert!(!emulator.default_allow);
}
#[test]
fn test_add_empty_rule() {
let mut emulator = Emulator::with_default_allow(false);
let cgroup = LinuxDeviceCgroupBuilder::default().build().unwrap();
emulator.add_rule(&cgroup);
assert_eq!(emulator.rules.len(), 0);
assert!(!emulator.default_allow);
}
#[test]
fn test_add_some_rule() {
let mut emulator = Emulator::with_default_allow(false);
let permission: &str = "PERMISSION";
let cgroup = LinuxDeviceCgroupBuilder::default()
.typ(LinuxDeviceType::B)
.access(permission)
.build()
.unwrap();
emulator.add_rule(&cgroup);
let top_rule = emulator.rules.first().unwrap();
assert_eq!(top_rule.access(), &Some(permission.to_string()));
assert!(!emulator.default_allow);
}
}