mod.rs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. pub mod fstype;
  2. mod utils;
  3. use std::{fs, path::PathBuf};
  4. use anyhow::Result;
  5. use fstype::FsType;
  6. use serde::Deserialize;
  7. /// rootfs配置文件
  8. #[derive(Debug, Clone, Copy, Deserialize)]
  9. pub struct RootFSConfigFile {
  10. pub metadata: RootFSMeta,
  11. }
  12. impl RootFSConfigFile {
  13. pub fn load(path: &PathBuf) -> Result<Self> {
  14. // 读取文件内容
  15. let content = fs::read_to_string(path)?;
  16. Self::load_from_str(&content)
  17. }
  18. pub fn load_from_str(content: &str) -> Result<Self> {
  19. let config: RootFSConfigFile = toml::from_str(content)?;
  20. Ok(config)
  21. }
  22. }
  23. #[derive(Debug, Clone, Copy, Deserialize)]
  24. pub struct RootFSMeta {
  25. /// rootfs文件系统类型
  26. pub fs_type: FsType,
  27. /// rootfs磁盘大小(至少要大于这个值)
  28. #[serde(deserialize_with = "utils::size::deserialize_size")]
  29. pub size: usize,
  30. }
  31. #[cfg(test)]
  32. mod tests {
  33. use std::io::Write;
  34. use super::*;
  35. use tempfile::NamedTempFile;
  36. #[test]
  37. fn test_load_from_valid_file() {
  38. let config_content = r#"
  39. [metadata]
  40. fs_type = "fat32"
  41. size = "1024M"
  42. "#;
  43. let mut temp_file = NamedTempFile::new().expect("Failed to create temp file");
  44. temp_file
  45. .write_all(config_content.as_bytes())
  46. .expect("Failed to write to temp file");
  47. let config_path = PathBuf::from(temp_file.path());
  48. let config = RootFSConfigFile::load(&config_path).expect("Failed to load config");
  49. assert_eq!(config.metadata.fs_type, FsType::Fat32);
  50. assert_eq!(config.metadata.size, 1024 * 1024 * 1024); // Assuming `deserialize_size` converts MB to Bytes
  51. }
  52. #[test]
  53. fn test_load_from_valid_str() {
  54. let config_content = r#"
  55. [metadata]
  56. fs_type = "fat32"
  57. size = "512M"
  58. "#;
  59. let config = RootFSConfigFile::load_from_str(config_content)
  60. .expect("Failed to load config from str");
  61. assert_eq!(config.metadata.fs_type, FsType::Fat32);
  62. assert_eq!(config.metadata.size, 512 * 1024 * 1024); // Assuming `deserialize_size` converts MB to Bytes
  63. }
  64. #[test]
  65. fn test_load_from_invalid_fs_type() {
  66. let config_content = r#"
  67. [metadata]
  68. fs_type = "ABCDE"
  69. size = "512M"
  70. "#;
  71. assert!(RootFSConfigFile::load_from_str(config_content).is_err());
  72. }
  73. /// 测试size为int类型的字节大小
  74. #[test]
  75. fn test_load_from_valid_str_size_integer() {
  76. let config_content = r#"
  77. [metadata]
  78. fs_type = "fat32"
  79. size = 1048576
  80. "#;
  81. let config = RootFSConfigFile::load_from_str(config_content)
  82. .expect("Failed to load config from str");
  83. assert_eq!(config.metadata.fs_type, FsType::Fat32);
  84. assert_eq!(config.metadata.size, 1048576); // Assuming `deserialize_size` converts MB to Bytes
  85. }
  86. #[test]
  87. fn test_load_from_valid_str_size_bytes_str() {
  88. let config_content = r#"
  89. [metadata]
  90. fs_type = "fat32"
  91. size = "1048576"
  92. "#;
  93. let config = RootFSConfigFile::load_from_str(config_content)
  94. .expect("Failed to load config from str");
  95. assert_eq!(config.metadata.fs_type, FsType::Fat32);
  96. assert_eq!(config.metadata.size, 1048576); // Assuming `deserialize_size` converts MB to Bytes
  97. }
  98. #[test]
  99. fn test_load_from_invalid_file() {
  100. let temp_file = NamedTempFile::new().expect("Failed to create temp file");
  101. let config_path = PathBuf::from(temp_file.path());
  102. assert!(RootFSConfigFile::load(&config_path).is_err());
  103. }
  104. /// Parse from an incorrect size field (string)
  105. #[test]
  106. fn test_load_from_invalid_size_str() {
  107. let invalid_config_content = r#"
  108. [metadata]
  109. fs_type = "fat32"
  110. size = "not_a_size"
  111. "#;
  112. assert!(RootFSConfigFile::load_from_str(invalid_config_content).is_err());
  113. }
  114. /// Parse from an incorrect size field (array)
  115. #[test]
  116. fn test_load_from_invalid_size_array() {
  117. // The 'size' field should not be an array
  118. let invalid_config_content = r#"
  119. [metadata]
  120. fs_type = "fat32"
  121. size = ["not_a_size"]
  122. "#;
  123. assert!(RootFSConfigFile::load_from_str(invalid_config_content).is_err());
  124. }
  125. }