diff --git a/src/agent/src/rpc.rs b/src/agent/src/rpc.rs index 29a3b915f..5f0990694 100644 --- a/src/agent/src/rpc.rs +++ b/src/agent/src/rpc.rs @@ -1759,6 +1759,7 @@ fn load_kernel_module(module: &protocols::agent::KernelModule) -> Result<()> { #[cfg(test)] mod tests { use super::*; + use oci::{Hook, Hooks}; #[test] fn test_load_kernel_module() { @@ -1780,4 +1781,22 @@ mod tests { let result = load_kernel_module(&m); assert!(result.is_ok(), "load module should success"); } + + #[test] + fn test_append_guest_hooks() { + let logger = slog::Logger::root(slog::Discard, o!()); + let mut s = Sandbox::new(&logger).unwrap(); + s.hooks = Some(Hooks { + prestart: vec![Hook { + path: "foo".to_string(), + ..Default::default() + }], + ..Default::default() + }); + let mut oci = Spec { + ..Default::default() + }; + append_guest_hooks(&s, &mut oci); + assert_eq!(s.hooks, oci.hooks); + } } diff --git a/src/agent/src/sandbox.rs b/src/agent/src/sandbox.rs index 7f5000d96..a80b0d919 100644 --- a/src/agent/src/sandbox.rs +++ b/src/agent/src/sandbox.rs @@ -370,6 +370,8 @@ mod tests { use rustjail::container::LinuxContainer; use rustjail::specconv::CreateOpts; use slog::Logger; + use std::fs::{self, File}; + use std::os::unix::fs::PermissionsExt; use tempfile::Builder; fn bind_mount(src: &str, dst: &str, logger: &Logger) -> Result<(), rustjail::errors::Error> { @@ -651,4 +653,26 @@ mod tests { let ns_path = format!("/proc/{}/ns/pid", test_pid); assert_eq!(s.sandbox_pidns.unwrap().path, ns_path); } + #[test] + fn add_guest_hooks() { + let logger = slog::Logger::root(slog::Discard, o!()); + let mut s = Sandbox::new(&logger).unwrap(); + let tmpdir = Builder::new().tempdir().unwrap(); + let tmpdir_path = tmpdir.path().to_str().unwrap(); + + assert!(fs::create_dir_all(tmpdir.path().join("prestart")).is_ok()); + assert!(fs::create_dir_all(tmpdir.path().join("poststop")).is_ok()); + + let file = File::create(tmpdir.path().join("prestart").join("prestart.sh")).unwrap(); + let mut perm = file.metadata().unwrap().permissions(); + perm.set_mode(0o777); + assert!(file.set_permissions(perm).is_ok()); + assert!(File::create(tmpdir.path().join("poststop").join("poststop.sh")).is_ok()); + + assert!(s.add_hooks(tmpdir_path).is_ok()); + assert!(s.hooks.is_some()); + assert!(s.hooks.as_ref().unwrap().prestart.len() == 1); + assert!(s.hooks.as_ref().unwrap().poststart.is_empty()); + assert!(s.hooks.as_ref().unwrap().poststop.is_empty()); + } }