1 use std::path::PathBuf; 2 3 use test_context::TestContext; 4 5 #[derive(Debug, Clone)] 6 pub struct BaseGlobalTestContext { 7 /// 项目的根目录 8 project_base_path: PathBuf, 9 } 10 11 impl BaseGlobalTestContext { 12 const CONFIG_V1_DIR: &'static str = "tests/data/dadk_config_v1"; 13 const CONFIG_V2_DIR: &'static str = "tests/data/dadk_config_v2"; 14 const FAKE_DRAGONOS_SYSROOT: &'static str = "tests/data/fake_dragonos_sysroot"; 15 const FAKE_DADK_CACHE_ROOT: &'static str = "tests/data/fake_dadk_cache_root"; 16 17 /// 获取项目的根目录 18 pub fn project_base_path(&self) -> &PathBuf { 19 &self.project_base_path 20 } 21 22 /// 获取项目目录下的文件的的绝对路径 23 pub fn abs_path(&self, relative_path: &str) -> PathBuf { 24 self.project_base_path.join(relative_path) 25 } 26 27 /// 获取`xxx.dadk`配置文件的目录 28 pub fn config_v1_dir(&self) -> PathBuf { 29 self.abs_path(Self::CONFIG_V1_DIR) 30 } 31 32 pub fn config_v2_dir(&self) -> PathBuf { 33 self.abs_path(Self::CONFIG_V2_DIR) 34 } 35 36 fn ensure_fake_dragonos_dir_exist(&self) { 37 let fake_dragonos_dir = self.fake_dragonos_sysroot(); 38 if !fake_dragonos_dir.exists() { 39 std::fs::create_dir_all(&fake_dragonos_dir).ok(); 40 } 41 } 42 43 fn ensure_fake_dadk_cache_root_exist(&self) { 44 std::env::set_var( 45 "DADK_CACHE_ROOT", 46 self.fake_dadk_cache_root().to_str().unwrap(), 47 ); 48 let fake_dadk_cache_root = self.fake_dadk_cache_root(); 49 if !fake_dadk_cache_root.exists() { 50 std::fs::create_dir_all(&fake_dadk_cache_root).ok(); 51 } 52 } 53 54 pub fn fake_dadk_cache_root(&self) -> PathBuf { 55 self.abs_path(Self::FAKE_DADK_CACHE_ROOT) 56 } 57 58 /// 获取假的DragonOS sysroot目录 59 pub fn fake_dragonos_sysroot(&self) -> PathBuf { 60 self.abs_path(Self::FAKE_DRAGONOS_SYSROOT) 61 } 62 } 63 64 impl TestContext for BaseGlobalTestContext { 65 fn setup() -> Self { 66 env_logger::try_init_from_env(env_logger::Env::default().default_filter_or("info")).ok(); 67 68 // 获取DADK项目的根目录 69 let mut project_base_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); 70 project_base_path.pop(); 71 project_base_path.pop(); 72 // 设置workdir 73 std::env::set_current_dir(&project_base_path).expect("Failed to setup project_base_path"); 74 75 let r = BaseGlobalTestContext { project_base_path }; 76 r.ensure_fake_dragonos_dir_exist(); 77 r.ensure_fake_dadk_cache_root_exist(); 78 r 79 } 80 } 81 #[cfg(test)] 82 mod tests { 83 use super::*; 84 use std::env; 85 86 #[test] 87 fn test_project_base_path() { 88 let context = BaseGlobalTestContext::setup(); 89 let binding = PathBuf::from(env!("CARGO_MANIFEST_DIR")); 90 let expected_path = binding.parent().unwrap().parent().unwrap(); 91 assert_eq!(context.project_base_path(), &expected_path); 92 } 93 94 #[test] 95 fn test_abs_path() { 96 let context = BaseGlobalTestContext::setup(); 97 let relative_path = "some/relative/path"; 98 let expected_path = context.project_base_path().join(relative_path); 99 assert_eq!(context.abs_path(relative_path), expected_path); 100 } 101 102 #[test] 103 fn test_config_v1_dir() { 104 let context = BaseGlobalTestContext::setup(); 105 let expected_path = context.abs_path(BaseGlobalTestContext::CONFIG_V1_DIR); 106 assert_eq!(context.config_v1_dir(), expected_path); 107 } 108 109 #[test] 110 fn test_fake_dadk_cache_root() { 111 let context = BaseGlobalTestContext::setup(); 112 let expected_path = context.abs_path(BaseGlobalTestContext::FAKE_DADK_CACHE_ROOT); 113 assert_eq!(context.fake_dadk_cache_root(), expected_path); 114 assert!(expected_path.exists()); 115 } 116 117 #[test] 118 fn test_fake_dragonos_sysroot() { 119 let context = BaseGlobalTestContext::setup(); 120 let expected_path = context.abs_path(BaseGlobalTestContext::FAKE_DRAGONOS_SYSROOT); 121 assert_eq!(context.fake_dragonos_sysroot(), expected_path); 122 assert!(expected_path.exists()); 123 } 124 125 #[test] 126 fn test_setup() { 127 let context = BaseGlobalTestContext::setup(); 128 assert!(context.project_base_path().is_dir()); 129 assert_eq!( 130 env::var("DADK_CACHE_ROOT").unwrap(), 131 context.fake_dadk_cache_root().to_str().unwrap() 132 ); 133 } 134 } 135