xref: /DADK/dadk-config/src/boot/grub.rs (revision cfb7b78ff5dff2a09cba93336ba222be89cbd3e1)
1 use serde::Deserialize;
2 
3 /// Default time for GRUB to wait for user selection
4 const GRUB_DEFAULT_TIMEOUT: u32 = 10;
5 
6 #[derive(Debug, Clone, Deserialize)]
7 pub struct GrubConfig {
8     /// Time to wait for user selection before booting
9     #[serde(default = "default_timeout")]
10     pub timeout: u32,
11 
12     #[serde(rename = "i386-legacy")]
13     pub i386_legacy: Option<ArchConfig>,
14     #[serde(rename = "i386-efi")]
15     pub i386_efi: Option<ArchConfig>,
16     #[serde(rename = "x86_64-efi")]
17     pub x86_64_efi: Option<ArchConfig>,
18 }
19 
20 const fn default_timeout() -> u32 {
21     GRUB_DEFAULT_TIMEOUT
22 }
23 
24 #[derive(Debug, Clone, Deserialize)]
25 pub struct ArchConfig {
26     /// 指向grub-file的路径
27     #[serde(rename = "grub-file")]
28     pub grub_file: String,
29     /// 指向grub-install的路径
30     #[serde(rename = "grub-install")]
31     pub grub_install: String,
32 }
33 
34 #[cfg(test)]
35 mod tests {
36     use super::*;
37 
38     /// Test if the GRUB configuration parsing is correct for all architectures
39     #[test]
40     fn test_all_architectures() {
41         let toml = r#"
42         timeout = 15
43         [i386-legacy]
44         grub-file = "/opt/dragonos-grub/arch/i386/legacy/grub/bin/grub-file"
45         grub-install = "/opt/dragonos-grub/arch/i386/legacy/grub/sbin/grub-install"
46         [i386-efi]
47         grub-file = "/opt/dragonos-grub/arch/i386/efi/grub/bin/grub-file"
48         grub-install = "/opt/dragonos-grub/arch/i386/efi/grub/sbin/grub-install"
49         [x86_64-efi]
50         grub-file = "/opt/dragonos-grub/arch/x86_64/efi/grub/bin/grub-file"
51         grub-install = "/opt/dragonos-grub/arch/x86_64/efi/grub/sbin/grub-install"
52         "#;
53         let config: GrubConfig = toml::from_str(toml).unwrap();
54         assert_eq!(config.timeout, 15);
55         assert!(config.i386_legacy.is_some());
56         assert!(config.i386_efi.is_some());
57         assert!(config.x86_64_efi.is_some());
58     }
59 
60     #[test]
61     fn test_default_timeout() {
62         let toml = r#"
63         [i386-legacy]
64         grub-file = "grub Legacy"
65         grub-install = "/boot/grub/i386-legacy"
66         "#;
67         let config: GrubConfig = toml::from_str(toml).unwrap();
68         assert_eq!(config.timeout, GRUB_DEFAULT_TIMEOUT);
69     }
70 
71     #[test]
72     fn test_custom_timeout() {
73         let toml = r#"
74         timeout = 5
75         [i386-efi]
76         grub-file = "grub EFI"
77         grub-install = "/boot/grub/i386-efi"
78         "#;
79         let config: GrubConfig = toml::from_str(toml).unwrap();
80         assert_eq!(config.timeout, 5);
81     }
82 
83     #[test]
84     fn test_no_architectures() {
85         let toml = r#"
86         timeout = 20
87         "#;
88         let config: GrubConfig = toml::from_str(toml).unwrap();
89         assert_eq!(config.timeout, 20);
90         assert!(config.i386_legacy.is_none());
91         assert!(config.i386_efi.is_none());
92         assert!(config.x86_64_efi.is_none());
93     }
94 }
95