sysmaster/backport-test-devmaster-add-UT-for-rules-applying.patch

948 lines
26 KiB
Diff
Raw Permalink Normal View History

2023-12-07 00:19:38 +08:00
From 9eab33e9cfaa97cac808ba5ebc3c2d2c30157681 Mon Sep 17 00:00:00 2001
From: chenjiayi <chenjiayi22@huawei.com>
Date: Wed, 22 Nov 2023 15:45:16 +0800
Subject: [PATCH 079/103] test(devmaster): add UT for rules applying
---
exts/devmaster/src/lib/rules/exec_mgr.rs | 917 +++++++++++++++++++++++
1 file changed, 917 insertions(+)
diff --git a/exts/devmaster/src/lib/rules/exec_mgr.rs b/exts/devmaster/src/lib/rules/exec_mgr.rs
index 66c1a06c..03da901d 100644
--- a/exts/devmaster/src/lib/rules/exec_mgr.rs
+++ b/exts/devmaster/src/lib/rules/exec_mgr.rs
@@ -2140,8 +2140,13 @@ impl RuleLine {
#[cfg(test)]
mod tests {
+ use std::fs::remove_file;
+
use super::*;
+ use crate::rules::rules_load::tests::create_tmp_file;
use crate::rules::FormatSubstitutionType;
+ use device::utils::LoopDev;
+ use log::{init_log, Level};
#[test]
#[ignore]
@@ -2294,4 +2299,916 @@ mod tests {
assert_eq!(unit.apply_format("$parent", false).unwrap(), "sda");
assert_eq!(unit.apply_format("$devnode", false).unwrap(), "/dev/sda1");
}
+
+ impl ExecuteManager {
+ #[allow(clippy::too_many_arguments)]
+ fn test_apply_one_rule_token(
+ &self,
+ key: &str,
+ attr: &str,
+ op: &str,
+ value: &str,
+ rules: Arc<RwLock<Rules>>,
+ rule_line: Arc<RwLock<Option<RuleLine>>>,
+ device: Rc<RefCell<Device>>,
+ ) -> Result<bool> {
+ let token = RuleToken::parse_token(
+ key.to_string(),
+ if attr.is_empty() {
+ None
+ } else {
+ Some(attr.to_string())
+ },
+ op.to_string(),
+ value.to_string(),
+ rules,
+ rule_line,
+ )
+ .unwrap();
+ *self.current_rule_token.borrow_mut() = Arc::new(RwLock::new(Some(token)));
+ self.apply_rule_token(device)
+ }
+ }
+
+ #[test]
+ fn test_apply_rules() {
+ init_log(
+ "test_apply_rules",
+ Level::Debug,
+ vec!["console"],
+ "",
+ 0,
+ 0,
+ false,
+ );
+
+ let device = Rc::new(RefCell::new(
+ Device::from_subsystem_sysname("net", "lo").unwrap(),
+ ));
+ device.borrow().set_base_path("/tmp/devmaster");
+ let rules = Arc::new(RwLock::new(Rules::new(vec![], ResolveNameTime::Early)));
+ let rule_file = Arc::new(RwLock::new(Some(RuleFile::new("".to_string()))));
+ let rule_line = Arc::new(RwLock::new(Some(RuleLine::new(
+ "".to_string(),
+ 0,
+ rule_file,
+ ))));
+ let unit = ExecuteUnit::new(device.clone());
+ let mgr = ExecuteManager::new(Arc::new(RwLock::new(Cache::new(vec![], vec![]))));
+ *mgr.current_unit.borrow_mut() = Some(unit);
+
+ device.borrow().set_action_from_string("change").unwrap();
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "ACTION",
+ "",
+ "==",
+ "change",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert!(!mgr
+ .test_apply_one_rule_token(
+ "ACTION",
+ "",
+ "==",
+ "add",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "DEVPATH",
+ "",
+ "==",
+ "*lo",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(!mgr
+ .test_apply_one_rule_token(
+ "ENV",
+ "xxx",
+ "==",
+ "xxx",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ device.borrow().add_tag("xxx", true);
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "TAG",
+ "",
+ "==",
+ "xxx",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "SUBSYSTEM",
+ "",
+ "==",
+ "net",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "TEST",
+ "444",
+ "==",
+ "[net/lo]ifindex",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "TEST",
+ "644",
+ "==",
+ "queues/*/rps_cpus",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "TEST",
+ "444",
+ "==",
+ "ifindex",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "TEST",
+ "",
+ "!=",
+ "asfsdfa",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(!mgr
+ .test_apply_one_rule_token(
+ "TEST",
+ "444",
+ "==",
+ "$attr",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ create_tmp_file(
+ "/tmp",
+ "property",
+ "HELLO=WORLD
+GOOD=LUCK",
+ true,
+ );
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "IMPORT",
+ "file",
+ "==",
+ "/tmp/property",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert_eq!(
+ &device.borrow().get_property_value("HELLO").unwrap(),
+ "WORLD"
+ );
+
+ assert_eq!(&device.borrow().get_property_value("GOOD").unwrap(), "LUCK");
+
+ remove_file("/tmp/property").unwrap();
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "IMPORT",
+ "program",
+ "==",
+ "echo WATER=FLOW",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert_eq!(
+ &device.borrow().get_property_value("WATER").unwrap(),
+ "FLOW"
+ );
+
+ create_tmp_file(
+ "/tmp/devmaster/data",
+ &device.borrow().get_device_id().unwrap(),
+ "E:BLACK=PINK",
+ true,
+ );
+ mgr.current_unit
+ .borrow()
+ .as_ref()
+ .unwrap()
+ .clone_device_db()
+ .unwrap();
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "IMPORT",
+ "db",
+ "==",
+ "BLACK",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert_eq!(
+ &device.borrow().get_property_value("BLACK").unwrap(),
+ "PINK"
+ );
+ remove_file(&format!(
+ "/tmp/devmaster/data/{}",
+ device.borrow().get_device_id().unwrap()
+ ))
+ .unwrap();
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "IMPORT",
+ "cmdline",
+ "==",
+ "root",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert!(!device
+ .borrow()
+ .get_property_value("root")
+ .unwrap()
+ .is_empty());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "IMPORT",
+ "cmdline",
+ "!=",
+ "asdfasdf",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(!mgr
+ .test_apply_one_rule_token(
+ "PROGRAM",
+ "",
+ "==",
+ "echo $attr",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(!mgr
+ .test_apply_one_rule_token(
+ "PROGRAM",
+ "",
+ "==",
+ "cat /tmp/test_nonexist",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(!mgr
+ .test_apply_one_rule_token(
+ "PROGRAM",
+ "",
+ "==",
+ "asdfasdf",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "PROGRAM",
+ "",
+ "==",
+ "echo hello",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "RESULT",
+ "",
+ "==",
+ "hello",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OPTIONS",
+ "",
+ "+=",
+ "string_escape=none",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OPTIONS",
+ "",
+ "+=",
+ "string_escape=replace",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OPTIONS",
+ "",
+ "+=",
+ "db_persist",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OPTIONS",
+ "",
+ "+=",
+ "db_persist",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OPTIONS",
+ "",
+ "+=",
+ "link_priority=1",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OWNER",
+ "",
+ "=",
+ "0",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "GROUP",
+ "",
+ "=",
+ "0",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "MODE",
+ "",
+ "=",
+ "777",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ rules.write().unwrap().resolve_name_time = ResolveNameTime::Late;
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OWNER",
+ "",
+ "=",
+ "root",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "GROUP",
+ "",
+ "=",
+ "root",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ mgr.test_apply_one_rule_token(
+ "ENV",
+ "mode",
+ "=",
+ "777",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap();
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "MODE",
+ "",
+ "=",
+ "$env{mode}",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ rules.write().unwrap().resolve_name_time = ResolveNameTime::Early;
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OWNER",
+ "",
+ ":=",
+ "0",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "GROUP",
+ "",
+ ":=",
+ "0",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "MODE",
+ "",
+ ":=",
+ "777",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OWNER",
+ "",
+ "=",
+ "0",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "GROUP",
+ "",
+ "=",
+ "0",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "MODE",
+ "",
+ "=",
+ "777",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "ENV",
+ "BLACK",
+ "=",
+ "YELLOW",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert_eq!(
+ &device.borrow().get_property_value("BLACK").unwrap(),
+ "YELLOW"
+ );
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "TAG",
+ "",
+ "+=",
+ "aaa",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert!(device.borrow().has_tag("aaa").unwrap());
+ assert!(device.borrow().has_current_tag("aaa").unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "TAG",
+ "",
+ "-=",
+ "aaa",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert!(device.borrow().has_tag("aaa").unwrap());
+ assert!(!device.borrow().has_current_tag("aaa").unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "TAG",
+ "",
+ "=",
+ "bbb",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert!(!device.borrow().has_tag("aaa").unwrap());
+ assert!(!device.borrow().has_current_tag("aaa").unwrap());
+ assert!(device.borrow().has_tag("bbb").unwrap());
+ assert!(device.borrow().has_current_tag("bbb").unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "NAME",
+ "",
+ ":=",
+ "test",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "NAME",
+ "",
+ "=",
+ "test",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ if mgr
+ .test_apply_one_rule_token(
+ "ATTR",
+ "ifalias",
+ "=",
+ "test",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .is_ok()
+ {
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "ATTR",
+ "ifalias",
+ "==",
+ "test",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ }
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "RUN",
+ "builtin",
+ "+=",
+ "path_id",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "ENV",
+ "PAPER",
+ "+=",
+ "",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "ENV",
+ "PAPER",
+ "==",
+ "",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "ENV",
+ "PAPER",
+ "=",
+ "",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "ENV",
+ "PAPER",
+ "==",
+ "",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "ENV",
+ "PAPER",
+ "+=",
+ "BOOK",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+ assert_eq!(
+ &device.borrow().get_property_value("PAPER").unwrap(),
+ "BOOK"
+ );
+
+ assert!(!mgr
+ .test_apply_one_rule_token(
+ "IMPORT",
+ "builtin",
+ "==",
+ "path_id $attr",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "TAG",
+ "",
+ "+=",
+ "$env",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "NAME",
+ "",
+ "=",
+ "$env",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "ATTR",
+ "ifalias",
+ "=",
+ "$env",
+ rules.clone(),
+ rule_line.clone(),
+ device.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "RUN",
+ "",
+ "+=",
+ "$env",
+ rules.clone(),
+ rule_line.clone(),
+ device,
+ )
+ .unwrap());
+
+ // /* TODO rules */
+ // let rules_c = rules.clone();
+ // let rule_line_c = rule_line.clone();
+ // let device_c = device.clone();
+ // assert!(catch_unwind(move || {
+ // let _ = mgr.test_apply_one_rule_token(
+ // "CONST",
+ // "virt",
+ // "==",
+ // "xxx",
+ // rules_c,
+ // rule_line_c,
+ // device_c,
+ // );
+ // })
+ // .is_err());
+
+ match LoopDev::new("/tmp/test_apply_rules", 1024 * 1024 * 10) {
+ Ok(lo) => {
+ let devpath = lo.get_device_path().unwrap();
+ let dev = Rc::new(RefCell::new(
+ Device::from_path(devpath.to_str().unwrap()).unwrap(),
+ ));
+ dev.borrow().set_base_path("/tmp/devmaster");
+
+ dev.borrow().add_devlink("/dev/test").unwrap();
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "SYMLINK",
+ "",
+ "==",
+ "/dev/test",
+ rules.clone(),
+ rule_line.clone(),
+ dev.clone(),
+ )
+ .unwrap());
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "SYMLINK",
+ "",
+ "!=",
+ "/dev/xxx",
+ rules.clone(),
+ rule_line.clone(),
+ dev.clone(),
+ )
+ .unwrap());
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "SYMLINK",
+ "",
+ "+=",
+ "xxx",
+ rules.clone(),
+ rule_line.clone(),
+ dev.clone(),
+ )
+ .unwrap());
+ assert!(dev.borrow().has_devlink("/dev/xxx"));
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OPTIONS",
+ "",
+ "+=",
+ "watch",
+ rules.clone(),
+ rule_line.clone(),
+ dev.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token(
+ "OPTIONS",
+ "",
+ ":=",
+ "watch",
+ rules.clone(),
+ rule_line.clone(),
+ dev.clone(),
+ )
+ .unwrap());
+
+ assert!(mgr
+ .test_apply_one_rule_token("OPTIONS", "", "=", "watch", rules, rule_line, dev,)
+ .unwrap());
+ }
+ Err(e) => {
+ assert!(e.is_errno(nix::Error::EACCES) || e.is_errno(nix::Error::EBUSY));
+ }
+ }
+ }
}
--
2.33.0