Skip to main content

a3s_box_runtime/rootfs/
layout.rs

1//! Guest filesystem layout constants.
2//!
3//! Defines the directory structure inside the guest VM.
4
5/// Working directory inside the guest VM.
6pub const GUEST_WORKDIR: &str = "/workspace";
7
8/// Guest filesystem layout.
9#[derive(Debug, Clone)]
10pub struct GuestLayout {
11    /// Workspace mount point (virtio-fs).
12    pub workspace_dir: &'static str,
13
14    /// Temporary directory.
15    pub tmp_dir: &'static str,
16
17    /// Run directory for runtime files.
18    pub run_dir: &'static str,
19}
20
21impl Default for GuestLayout {
22    fn default() -> Self {
23        Self {
24            workspace_dir: "/workspace",
25            tmp_dir: "/tmp",
26            run_dir: "/run",
27        }
28    }
29}
30
31impl GuestLayout {
32    /// Get the standard guest layout.
33    pub fn standard() -> Self {
34        Self::default()
35    }
36
37    /// Get all directories that need to be created in the rootfs.
38    pub fn required_dirs(&self) -> Vec<&str> {
39        vec![
40            self.workspace_dir,
41            self.tmp_dir,
42            self.run_dir,
43            "/dev",
44            "/proc",
45            "/sys",
46            "/etc",
47            "/var",
48            "/var/tmp",
49            "/var/log",
50        ]
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn test_guest_layout_defaults() {
60        let layout = GuestLayout::default();
61        assert_eq!(layout.workspace_dir, "/workspace");
62        assert_eq!(layout.tmp_dir, "/tmp");
63        assert_eq!(layout.run_dir, "/run");
64    }
65
66    #[test]
67    fn test_guest_layout_standard_equals_default() {
68        let standard = GuestLayout::standard();
69        let default = GuestLayout::default();
70        assert_eq!(standard.workspace_dir, default.workspace_dir);
71        assert_eq!(standard.tmp_dir, default.tmp_dir);
72    }
73
74    #[test]
75    fn test_required_dirs_contains_all_layout_dirs() {
76        let layout = GuestLayout::standard();
77        let dirs = layout.required_dirs();
78
79        assert!(dirs.contains(&layout.workspace_dir));
80        assert!(dirs.contains(&layout.tmp_dir));
81        assert!(dirs.contains(&layout.run_dir));
82    }
83
84    #[test]
85    fn test_required_dirs_contains_system_dirs() {
86        let layout = GuestLayout::standard();
87        let dirs = layout.required_dirs();
88
89        assert!(dirs.contains(&"/dev"));
90        assert!(dirs.contains(&"/proc"));
91        assert!(dirs.contains(&"/sys"));
92        assert!(dirs.contains(&"/etc"));
93        assert!(dirs.contains(&"/var"));
94        assert!(dirs.contains(&"/var/tmp"));
95        assert!(dirs.contains(&"/var/log"));
96    }
97
98    #[test]
99    fn test_guest_workdir_constant() {
100        assert_eq!(GUEST_WORKDIR, "/workspace");
101        let layout = GuestLayout::default();
102        assert_eq!(GUEST_WORKDIR, layout.workspace_dir);
103    }
104
105    #[test]
106    fn test_guest_layout_clone() {
107        let layout = GuestLayout::default();
108        let cloned = layout.clone();
109        assert_eq!(layout.workspace_dir, cloned.workspace_dir);
110        assert_eq!(layout.tmp_dir, cloned.tmp_dir);
111    }
112}