From 9f25c2eae5543b2b5b4be8fa9dc558eb37767554 Mon Sep 17 00:00:00 2001 From: overweight Date: Tue, 16 Jan 2024 09:58:59 +0800 Subject: [PATCH 1/2] feature: add systemd into lookup --- .pre-commit-config.yaml | 9 -- core/sysmaster/src/manager/mod.rs | 5 +- core/sysmaster/src/manager/pre_install.rs | 26 +++-- core/sysmaster/src/unit/bus.rs | 2 +- core/sysmaster/src/unit/entry/uentry.rs | 4 +- core/sysmaster/src/unit/manager.rs | 8 +- core/sysmaster/src/unit/test/mod.rs | 4 +- core/sysmaster/src/unit/uload.rs | 2 +- core/sysmaster/src/unit/util/unit_file.rs | 25 ++-- docs/cicd/build_rpm_with_mock/build_rpm.sh | 8 +- docs/cicd/build_rpm_with_mock/sysmaster.spec | 2 +- exts/getty-generator/src/main.rs | 2 +- libs/basic/src/fs.rs | 89 +-------------- libs/basic/src/path.rs | 113 +++++++++++++------ 14 files changed, 122 insertions(+), 177 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8dd78af2..f41199d8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,7 +22,6 @@ repos: entry: bash -c 'cargo clean;codespell -I ci/codespell_ignore_words -x ci/codespell_ignore_words -S *.rules -S vendor* -S target*' language: system pass_filenames: false - verbose: true - id: cargo-override-set name: cargo-override-set description: unset override. @@ -30,7 +29,6 @@ repos: language: system pass_filenames: false files: \.(rs|toml)$ - verbose: false - id: cargo-build name: cargo build description: build the package for errors. @@ -38,7 +36,6 @@ repos: language: system pass_filenames: false files: \.(rs|toml)$ - verbose: true - id: cargo-clippy name: cargo clippy description: Lint rust sources @@ -46,7 +43,6 @@ repos: language: system pass_filenames: false files: \.rs$ - verbose: true - id: cargo-fix name: cargo fix description: Check the package for errors. @@ -54,7 +50,6 @@ repos: language: system pass_filenames: false files: \.rs$ - verbose: true - id: cargo-fmt name: cargo fmt description: Format files with rustfmt. @@ -62,7 +57,6 @@ repos: language: system pass_filenames: false files: \.rs$ - verbose: true - id: cargo-test-tmpfile-cleanup name: tmpfile cleanup description: tmpfile cleanup. @@ -70,7 +64,6 @@ repos: language: system pass_filenames: false files: \.(rs|toml)$ - verbose: true - id: cargo-test name: cargo test description: test the package for errors. @@ -78,7 +71,6 @@ repos: language: system pass_filenames: false files: \.(rs|toml)$ - verbose: true - id: cargo-override-unset name: cargo-override-unset description: unset override. @@ -86,7 +78,6 @@ repos: language: system pass_filenames: false files: \.(rs|toml)$ - verbose: false # - id: cargo-deny # name: cargo deny check # description: Check cargo depencencies diff --git a/core/sysmaster/src/manager/mod.rs b/core/sysmaster/src/manager/mod.rs index 73199206..79897043 100644 --- a/core/sysmaster/src/manager/mod.rs +++ b/core/sysmaster/src/manager/mod.rs @@ -25,7 +25,7 @@ pub(crate) mod signals; use self::config::ManagerConfig; use crate::unit::UnitManagerX; use alive_timer::AliveTimer; -use basic::fs::LookupPaths; +use basic::path::LookupPaths; use basic::process::{self}; use basic::{CGROUP_SYSMASTER, MULTI_USER_TARGET}; use cgroup::CgController; @@ -236,8 +236,7 @@ impl Manager { .set_map_size(manager_config.borrow().DbSize) .set_max_dbs(rentry::RELI_HISTORY_MAX_DBS), )); - let mut l_path = LookupPaths::new(); - l_path.init_lookup_paths(); + let l_path = LookupPaths::default(); let lookup_path = Rc::new(l_path); let state = Rc::new(RefCell::new(State::Init)); let um = Rc::new(UnitManagerX::new( diff --git a/core/sysmaster/src/manager/pre_install.rs b/core/sysmaster/src/manager/pre_install.rs index 69823478..951b238d 100644 --- a/core/sysmaster/src/manager/pre_install.rs +++ b/core/sysmaster/src/manager/pre_install.rs @@ -13,7 +13,7 @@ #![allow(non_snake_case)] use crate::unit::{unit_name_to_type, UeConfigInstall, UnitType}; use basic::fs::is_symlink; -use basic::fs::LookupPaths; +use basic::path::LookupPaths; use bitflags::bitflags; use core::error::*; use nix::unistd::UnlinkatFlags; @@ -416,7 +416,9 @@ impl Install { } } - self.execute_preset(target_path); + for path in target_path { + self.execute_preset(&path.to_string_lossy()); + } Ok(()) } @@ -426,7 +428,9 @@ impl Install { self.unit_install_discover(file, self.enable_ctx.clone())?; - self.install_symlinks(target_path); + for path in target_path { + self.install_symlinks(&path.to_string_lossy()); + } Ok(()) } @@ -438,7 +442,9 @@ impl Install { self.disable_ctx .collect_disable_install(&mut removal_symlinks); - self.remove_symlinks(&mut removal_symlinks, &self.lookup_path.persistent_path); + for path in &self.lookup_path.persistent_path { + self.remove_symlinks(&mut removal_symlinks, &path.to_string_lossy()); + } Ok(()) } @@ -543,9 +549,7 @@ impl Install { let mut paths: Vec = Vec::new(); for p in &self.lookup_path.search_path { - let mut path = String::new(); - path = path + p + &unit_install.name(); - paths.push(PathBuf::from(path)); + paths.push(p.join(unit_install.name())); } let configer = match UeConfigData::load_config(paths, &unit_install.name()) { @@ -673,7 +677,7 @@ impl Install { let mut files_hash = HashMap::new(); for dir in &self.lookup_path.preset_path { - self.add_preset_file(dir, &mut files_hash) + self.add_preset_file(&dir.to_string_lossy(), &mut files_hash) } let mut preset_files = vec![]; @@ -731,7 +735,7 @@ impl Install { #[cfg(test)] mod test { use super::{Install, PresetAction, PresetMode, PresetRule, Presets}; - use basic::fs::LookupPaths; + use basic::path::LookupPaths; use std::rc::Rc; #[test] @@ -774,7 +778,7 @@ mod test { .join("tests/presets") .to_string_lossy() .to_string(); - l_path.preset_path.push(test_preset_dir); + l_path.preset_path.push(test_preset_dir.into()); let lookup_path = Rc::new(l_path); let install = Install::new(PresetMode::Enable, lookup_path); @@ -798,7 +802,7 @@ mod test { .join("tests/presets") .to_string_lossy() .to_string(); - l_path.preset_path.push(test_preset_dir); + l_path.preset_path.push(test_preset_dir.into()); let lookup_path = Rc::new(l_path); let install = Install::new(PresetMode::Enable, lookup_path); assert!(install.preset_all().is_ok()); diff --git a/core/sysmaster/src/unit/bus.rs b/core/sysmaster/src/unit/bus.rs index b08f180b..1d287397 100644 --- a/core/sysmaster/src/unit/bus.rs +++ b/core/sysmaster/src/unit/bus.rs @@ -15,7 +15,7 @@ use super::entry::UnitX; use super::rentry::{self, UnitLoadState}; use super::submanager::UnitSubManagers; use super::uload::UnitLoad; -use basic::fs::RUN_TRANSIENT_PATH; +use basic::path::RUN_TRANSIENT_PATH; use cmdproto::proto::transient_unit_comm::UnitProperty; use core::error::*; use core::rel::Reliability; diff --git a/core/sysmaster/src/unit/entry/uentry.rs b/core/sysmaster/src/unit/entry/uentry.rs index eff2da55..af887ee0 100644 --- a/core/sysmaster/src/unit/entry/uentry.rs +++ b/core/sysmaster/src/unit/entry/uentry.rs @@ -919,7 +919,7 @@ mod tests { use crate::manager::RELI_HISTORY_MAX_DBS; use crate::unit::rentry::UnitRe; use crate::unit::test::test_utils::UmIfD; - use basic::fs::LookupPaths; + use basic::path::LookupPaths; use core::rel::{ReliConf, Reliability}; use core::unit::UnitType; use std::rc::Rc; @@ -941,7 +941,7 @@ mod tests { .join("tests/test_units/") .to_string_lossy() .to_string(); - l_path.search_path.push(test_units_dir); + l_path.search_path.push(test_units_dir.into()); let lookup_path = Rc::new(l_path); let unit_file = UnitFile::new(&lookup_path); diff --git a/core/sysmaster/src/unit/manager.rs b/core/sysmaster/src/unit/manager.rs index 94c97e43..5bcc8acb 100644 --- a/core/sysmaster/src/unit/manager.rs +++ b/core/sysmaster/src/unit/manager.rs @@ -36,7 +36,7 @@ use crate::manager::pre_install::{Install, PresetMode}; use crate::manager::State; use crate::unit::data::{DataManager, UnitState}; use crate::utils::table::{TableOp, TableSubscribe}; -use basic::fs::LookupPaths; +use basic::path::LookupPaths; use basic::show_table::{CellColor, ShowTable}; use basic::time::UnitTimeStamp; use basic::{machine, process, rlimit, signal}; @@ -210,7 +210,7 @@ impl UnitManagerX { pub(crate) fn mask_unit(&self, unit_file: &str) -> Result<()> { log::info!("Masking unit {}.", unit_file); - let link_name_path = std::path::Path::new(basic::fs::ETC_SYSTEM_PATH).join(unit_file); + let link_name_path = std::path::Path::new(basic::path::ETC_SYSTEM_PATH).join(unit_file); let target_path = std::path::Path::new("/dev/null"); basic::fs::symlink( target_path.to_str().unwrap(), @@ -222,7 +222,7 @@ impl UnitManagerX { pub(crate) fn unmask_unit(&self, unit_file: &str) -> Result<()> { log::info!("Unmasking unit {}.", unit_file); - let link_name_path = std::path::Path::new(basic::fs::ETC_SYSTEM_PATH).join(unit_file); + let link_name_path = std::path::Path::new(basic::path::ETC_SYSTEM_PATH).join(unit_file); if !link_name_path.exists() { return Ok(()); } @@ -1466,7 +1466,7 @@ mod tests { .join("tests/test_units/") .to_string_lossy() .to_string(); - l_path.search_path.push(test_units_dir); + l_path.search_path.push(test_units_dir.into()); let lookup_path = Rc::new(l_path); let event = Rc::new(Events::new().unwrap()); diff --git a/core/sysmaster/src/unit/test/mod.rs b/core/sysmaster/src/unit/test/mod.rs index 0ddf0b25..28b653cd 100644 --- a/core/sysmaster/src/unit/test/mod.rs +++ b/core/sysmaster/src/unit/test/mod.rs @@ -22,7 +22,7 @@ pub(crate) mod test_utils { util::{self, UnitFile}, }, }; - use basic::fs::LookupPaths; + use basic::path::LookupPaths; use core::rel::Reliability; use core::unit::UmIf; pub(crate) struct UmIfD; @@ -40,7 +40,7 @@ pub(crate) mod test_utils { .join("tests/test_units/") .to_string_lossy() .to_string(); - l_path.search_path.push(test_units_dir); + l_path.search_path.push(test_units_dir.into()); let lookup_path = Rc::new(l_path); let file = Rc::new(UnitFile::new(&lookup_path)); diff --git a/core/sysmaster/src/unit/uload.rs b/core/sysmaster/src/unit/uload.rs index eff77c83..d5959e52 100644 --- a/core/sysmaster/src/unit/uload.rs +++ b/core/sysmaster/src/unit/uload.rs @@ -19,7 +19,7 @@ use super::runtime::UnitRT; use super::util::UnitFile; use super::util::{self}; use crate::utils::table::{TableOp, TableSubscribe}; -use basic::fs::LookupPaths; +use basic::path::LookupPaths; use core::unit::{unit_name_is_valid, UnitNameFlags, UnitType}; use std::cell::RefCell; use std::rc::{Rc, Weak}; diff --git a/core/sysmaster/src/unit/util/unit_file.rs b/core/sysmaster/src/unit/util/unit_file.rs index 127cdeda..09dfc3a3 100644 --- a/core/sysmaster/src/unit/util/unit_file.rs +++ b/core/sysmaster/src/unit/util/unit_file.rs @@ -11,7 +11,7 @@ // See the Mulan PSL v2 for more details. use basic::fs::is_symlink; -use basic::fs::LookupPaths; +use basic::path::LookupPaths; use core::unit::unit_name_is_valid; use core::unit::UnitNameFlags; use siphasher::sip::SipHasher24; @@ -221,7 +221,7 @@ impl UnitFileData { let mut pathbuf_fragment = Vec::new(); let search_path_list = self.lookup_path.search_path.clone(); for search_path in &search_path_list { - let mut v = match self.build_id_fragment_by_name(search_path, name) { + let mut v = match self.build_id_fragment_by_name(search_path.to_str().unwrap(), name) { None => continue, Some(v) => v, }; @@ -239,7 +239,7 @@ impl UnitFileData { if !pathbuf_fragment.is_empty() || !name.contains('@') { for search_path in &search_path_list { - let mut v = self.search_dropin_fragment(search_path, name); + let mut v = self.search_dropin_fragment(search_path.to_str().unwrap(), name); if v.is_empty() { continue; } @@ -256,7 +256,9 @@ impl UnitFileData { * load the template configuration file. */ let template_name = name.split_once('@').unwrap().0.to_string() + "@.service"; for search_path in &search_path_list { - let mut v = match self.build_id_fragment_by_name(search_path, &template_name) { + let mut v = match self + .build_id_fragment_by_name(search_path.to_str().unwrap(), &template_name) + { None => continue, Some(v) => v, }; @@ -269,7 +271,7 @@ impl UnitFileData { } for search_path in &search_path_list { - let mut v = self.search_dropin_fragment(search_path, &template_name); + let mut v = self.search_dropin_fragment(search_path.to_str().unwrap(), &template_name); if v.is_empty() { continue; } @@ -283,9 +285,8 @@ impl UnitFileData { fn build_id_dropin(&mut self, name: &str, suffix: String) { let mut pathbuf_dropin = Vec::new(); - for v in &self.lookup_path.search_path { - let path = format!("{}/{}.{}", v, name, suffix); - let dir = Path::new(&path); + for dir in &self.lookup_path.search_path.clone() { + dir.join(name).set_extension(&suffix); if !dir.is_dir() { continue; } @@ -328,14 +329,18 @@ impl UnitFileData { for dir in &self.lookup_path.search_path { let metadata = match fs::metadata(dir) { Err(e) => { - log::debug!("Couldn't find unit config lookup path {}: {}", dir, e); + log::debug!( + "Couldn't find unit config lookup path {}: {}", + dir.to_string_lossy(), + e + ); continue; } Ok(v) => v, }; let time = match metadata.modified() { Err(_) => { - log::error!("Failed to get mtime of {}", dir); + log::error!("Failed to get mtime of {}", dir.to_string_lossy()); continue; } Ok(v) => v, diff --git a/docs/cicd/build_rpm_with_mock/build_rpm.sh b/docs/cicd/build_rpm_with_mock/build_rpm.sh index 5bf07ae2..95a1e3f1 100644 --- a/docs/cicd/build_rpm_with_mock/build_rpm.sh +++ b/docs/cicd/build_rpm_with_mock/build_rpm.sh @@ -47,7 +47,7 @@ while true ; do echo "Options:" echo " -f, --force 强制执行, 跳过源码打包" echo " -m, --mode 设置模式,默认为release,可选值为debug" - echo " --vendor 设置供应商,默认为/etc/os-release中$ID-$VERSION_ID,vendor支持的配置在/etc/mock目录下" + echo " --vendor 设置供应商,默认为/etc/os-release中$ID-$VERSION_ID,vendor支持的配置在/etc/mock目录下, 其中openEuler支持查看本目录" echo " --help 显示帮助" exit 0 ;; @@ -62,12 +62,6 @@ while true ; do esac done -real_vendor= -if [[ "$vendor" != *"openeuler"* ]]; then - configdir="" -fi - - pushd $ROOTDIR version_line=$(grep -Eo '^version = "[0-9]+\.[0-9]+\.[0-9]+"' ./Cargo.toml) version=$(echo "$version_line" | awk -F'"' '{print $2}') diff --git a/docs/cicd/build_rpm_with_mock/sysmaster.spec b/docs/cicd/build_rpm_with_mock/sysmaster.spec index 9c8050d0..ec7da320 100644 --- a/docs/cicd/build_rpm_with_mock/sysmaster.spec +++ b/docs/cicd/build_rpm_with_mock/sysmaster.spec @@ -32,7 +32,7 @@ Summary: %{summary} %package -n devmaster Summary: Infrastructure of device management in userspace. -BuildRequires: util-linux-devel kmod-devel +BuildRequires: libblkid-devel kmod-devel %description -n devmaster This package provides the infrastructure of device management in userspace. diff --git a/exts/getty-generator/src/main.rs b/exts/getty-generator/src/main.rs index e99bf6bf..9733b2ec 100644 --- a/exts/getty-generator/src/main.rs +++ b/exts/getty-generator/src/main.rs @@ -387,7 +387,7 @@ fn create_getty(tty_type: &str, tty: &str) -> io::Result<()> { } fn concat_from_symlink(file_name: &str) -> String { - basic::fs::LIB_SYSTEM_PATH.to_string() + "/" + file_name + basic::path::LIB_SYSTEM_PATH.to_string() + "/" + file_name } fn concat_to_symlink(file_name: &str) -> String { diff --git a/libs/basic/src/fs.rs b/libs/basic/src/fs.rs index 11c4efb0..b30ae98c 100644 --- a/libs/basic/src/fs.rs +++ b/libs/basic/src/fs.rs @@ -679,70 +679,6 @@ pub fn parse_pathbuf(s: &str) -> Result { Ok(PathBuf::from(path)) } -/// unit transient path in /run -pub const RUN_TRANSIENT_PATH: &str = "/run/sysmaster/transient"; -/// unit lookup path in /etc -pub const ETC_SYSTEM_PATH: &str = "/etc/sysmaster/system"; -/// unit lookup path in /run -pub const RUN_SYSTEM_PATH: &str = "/run/sysmaster/system"; -/// unit lookup path in /usr/lib -pub const LIB_SYSTEM_PATH: &str = "/usr/lib/sysmaster/system"; - -/// struct LookupPaths -#[derive(Debug, Clone)] -pub struct LookupPaths { - /// Used to search fragment, dropin, updated - pub search_path: Vec, - /// Used to search preset file - pub preset_path: Vec, - /// generator paths - pub generator: String, - /// generator early paths - pub generator_early: String, - /// generator late paths - pub generator_late: String, - /// transient paths - pub transient: String, - /// transient paths - pub persistent_path: String, -} - -impl LookupPaths { - /// new - pub fn new() -> Self { - LookupPaths { - generator: String::from(""), - generator_early: String::from(""), - generator_late: String::from(""), - transient: String::from(""), - search_path: Vec::new(), - persistent_path: String::from(""), - preset_path: Vec::new(), - } - } - - /// init lookup paths - pub fn init_lookup_paths(&mut self) { - self.search_path.push(RUN_TRANSIENT_PATH.to_string()); - self.search_path.push(ETC_SYSTEM_PATH.to_string()); - self.search_path.push(RUN_SYSTEM_PATH.to_string()); - self.search_path.push(LIB_SYSTEM_PATH.to_string()); - - self.preset_path - .push(format!("{}/{}", ETC_SYSTEM_PATH, "system-preset")); - self.preset_path - .push(format!("{}/{}", LIB_SYSTEM_PATH, "system-preset")); - - self.persistent_path = ETC_SYSTEM_PATH.to_string(); - } -} - -impl Default for LookupPaths { - fn default() -> Self { - Self::new() - } -} - /// Check whether $p belongs to $fstype fs pub fn check_filesystem(p: &Path, fstype: statfs::FsType) -> bool { let fstp = match statfs::statfs(p) { @@ -756,7 +692,7 @@ pub fn check_filesystem(p: &Path, fstype: statfs::FsType) -> bool { #[cfg(test)] mod tests { - use super::LookupPaths; + use super::*; use nix::unistd::{self, unlink}; use std::{ @@ -893,29 +829,6 @@ mod tests { assert!(!path_is_abosolute("a")); } - #[test] - fn test_init_lookup_paths() { - let mut lp = LookupPaths::default(); - lp.init_lookup_paths(); - assert_eq!( - lp.search_path, - vec![ - "/run/sysmaster/transient", - "/etc/sysmaster/system", - "/run/sysmaster/system", - "/usr/lib/sysmaster/system" - ] - ); - assert_eq!( - lp.preset_path, - vec![ - "/etc/sysmaster/system/system-preset", - "/usr/lib/sysmaster/system/system-preset" - ] - ); - assert_eq!(lp.persistent_path, "/etc/sysmaster/system") - } - #[test] fn test_symlink() { // use a complicated long name to make sure we don't have this file diff --git a/libs/basic/src/path.rs b/libs/basic/src/path.rs index 9512b3f9..5da03fdf 100644 --- a/libs/basic/src/path.rs +++ b/libs/basic/src/path.rs @@ -11,48 +11,87 @@ // See the Mulan PSL v2 for more details. //! utilities for parse path string -#![allow(clippy::not_unsafe_ptr_arg_deref)] -use std::ffi::CStr; +use std::path::PathBuf; -/// Check whether a C string is valid and normalized -pub fn path_is_normalized(p: *const ::std::os::raw::c_char) -> bool { - if p.is_null() { - return false; - } - - let p = match unsafe { CStr::from_ptr(p) }.to_str() { - Ok(p) => p, - Err(_) => { - return false; - } - }; +/// unit transient path in /run +pub const RUN_TRANSIENT_PATH: &str = "/run/sysmaster/transient"; +/// unit lookup path in /etc +pub const ETC_SYSTEM_PATH: &str = "/etc/sysmaster/system"; +/// unit lookup path in /run +pub const RUN_SYSTEM_PATH: &str = "/run/sysmaster/system"; +/// unit lookup path in /usr/lib +pub const LIB_SYSTEM_PATH: &str = "/usr/lib/sysmaster/system"; - if p == "." - || p.starts_with("./") - || p.ends_with("/.") - || p.contains("/./") - || p.contains("/../") - || p.contains("//") - { - return false; - } +/// unit transient path in /run +pub const RUN_TRANSIENT_SYSTEMD_PATH: &str = "/run/systemd/transient"; +/// unit lookup path in /etc +pub const ETC_SYSTEM_SYSTEMD_PATH: &str = "/etc/systemd/system"; +/// unit lookup path in /run +pub const RUN_SYSTEM_SYSTEMD_PATH: &str = "/run/systemd/system"; +/// unit lookup path in /usr/lib +pub const LIB_SYSTEM_SYSTEMD_PATH: &str = "/usr/lib/systemd/system"; - true +/// struct LookupPaths +#[derive(Debug, Clone)] +pub struct LookupPaths { + /// Used to search fragment, dropin, updated + pub search_path: Vec, + /// Used to search preset file + pub preset_path: Vec, + /// generator paths + pub generator: Vec, + /// generator early paths + pub generator_early: Vec, + /// generator late paths + pub generator_late: Vec, + /// transient paths + pub transient: Vec, + /// transient paths + pub persistent_path: Vec, } -#[cfg(test)] -mod tests { - use super::*; +impl LookupPaths { + /// new + pub fn new() -> Self { + LookupPaths { + generator: Vec::new(), + generator_early: Vec::new(), + generator_late: Vec::new(), + transient: Vec::new(), + search_path: Vec::new(), + persistent_path: Vec::new(), + preset_path: Vec::new(), + } + } +} - #[test] - fn test_path_is_normalized() { - assert!(path_is_normalized("a\0".as_ptr() as *const _)); - assert!(path_is_normalized("a/b\0".as_ptr() as *const _)); - assert!(path_is_normalized("/a\0".as_ptr() as *const _)); - assert!(!path_is_normalized("./a\0".as_ptr() as *const _)); - assert!(!path_is_normalized("a/.\0".as_ptr() as *const _)); - assert!(!path_is_normalized("a/./a\0".as_ptr() as *const _)); - assert!(!path_is_normalized("a//a\0".as_ptr() as *const _)); - assert!(!path_is_normalized("a/../a\0".as_ptr() as *const _)); +impl Default for LookupPaths { + fn default() -> Self { + Self { + search_path: vec![ + PathBuf::from(RUN_TRANSIENT_PATH), + PathBuf::from(RUN_TRANSIENT_SYSTEMD_PATH), + PathBuf::from(ETC_SYSTEM_PATH), + PathBuf::from(ETC_SYSTEM_SYSTEMD_PATH), + PathBuf::from(RUN_SYSTEM_PATH), + PathBuf::from(RUN_SYSTEM_SYSTEMD_PATH), + PathBuf::from(LIB_SYSTEM_PATH), + PathBuf::from(LIB_SYSTEM_SYSTEMD_PATH), + ], + preset_path: vec![ + PathBuf::from(ETC_SYSTEM_PATH), + PathBuf::from(ETC_SYSTEM_SYSTEMD_PATH), + PathBuf::from(LIB_SYSTEM_PATH), + PathBuf::from(LIB_SYSTEM_SYSTEMD_PATH), + ], + generator: vec![], + generator_early: vec![], + generator_late: vec![], + transient: vec![], + persistent_path: vec![ + PathBuf::from(ETC_SYSTEM_PATH), + PathBuf::from(ETC_SYSTEM_SYSTEMD_PATH), + ], + } } } -- Gitee From c1f6b08f4b0ee11caf5ab397dee82c53ff3eaff9 Mon Sep 17 00:00:00 2001 From: overweight Date: Tue, 16 Jan 2024 16:10:20 +0800 Subject: [PATCH 2/2] test: add tests for lookup path --- libs/basic/src/path.rs | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/libs/basic/src/path.rs b/libs/basic/src/path.rs index 5da03fdf..406ff9ea 100644 --- a/libs/basic/src/path.rs +++ b/libs/basic/src/path.rs @@ -95,3 +95,47 @@ impl Default for LookupPaths { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_lookup_paths() { + let lookup_paths = LookupPaths::default(); + + assert!(lookup_paths.search_path.len() == 8); + assert_eq!( + lookup_paths.search_path, + vec![ + PathBuf::from(RUN_TRANSIENT_PATH), + PathBuf::from(RUN_TRANSIENT_SYSTEMD_PATH), + PathBuf::from(ETC_SYSTEM_PATH), + PathBuf::from(ETC_SYSTEM_SYSTEMD_PATH), + PathBuf::from(RUN_SYSTEM_PATH), + PathBuf::from(RUN_SYSTEM_SYSTEMD_PATH), + PathBuf::from(LIB_SYSTEM_PATH), + PathBuf::from(LIB_SYSTEM_SYSTEMD_PATH), + ], + ); + assert!(lookup_paths.preset_path.len() == 4); + assert!(lookup_paths.generator.is_empty()); + assert!(lookup_paths.generator_early.is_empty()); + assert!(lookup_paths.generator_late.is_empty()); + assert!(lookup_paths.transient.is_empty()); + assert!(lookup_paths.persistent_path.len() == 2); + } + + #[test] + fn test_lookup_paths_new() { + let lookup_paths = LookupPaths::new(); + + assert!(lookup_paths.search_path.is_empty()); + assert!(lookup_paths.preset_path.is_empty()); + assert!(lookup_paths.generator.is_empty()); + assert!(lookup_paths.generator_early.is_empty()); + assert!(lookup_paths.generator_late.is_empty()); + assert!(lookup_paths.transient.is_empty()); + assert!(lookup_paths.persistent_path.is_empty()); + } +} -- Gitee