From 86657ec6ac7da23ac927c55eb163465837744e29 Mon Sep 17 00:00:00 2001 From: DastInDark <2350416+hitenkoku@users.noreply.github.com> Date: Sun, 24 Jul 2022 19:38:27 +0900 Subject: [PATCH] fixed test --- src/afterfact.rs | 60 +++++++++++++++++++++++------------------- src/options/profile.rs | 58 +++++++++++++++++++++++++++++++++++----- 2 files changed, 84 insertions(+), 34 deletions(-) diff --git a/src/afterfact.rs b/src/afterfact.rs index 6af13ced..cb209ea0 100644 --- a/src/afterfact.rs +++ b/src/afterfact.rs @@ -609,6 +609,7 @@ mod tests { let test_attack = "execution/txxxx.yyy"; let test_recinfo = "record_infoinfo11"; let test_record_id = "11111"; + let output_profile: LinkedHashMap = load_profile("test_files/config/default_profile.txt", "test_files/config/profiles.txt").unwrap(); { let messages = &message::MESSAGES; messages.clear(); @@ -645,6 +646,7 @@ mod tests { tag_info: test_attack.to_string(), record_information: Option::Some(test_recinfo.to_string()), record_id: Option::Some(test_record_id.to_string()), + ext_field: output_profile, }, ); } @@ -653,7 +655,7 @@ mod tests { .unwrap(); let expect_tz = expect_time.with_timezone(&Local); let expect = - "Timestamp,Computer,Channel,EventID,Level,MitreAttack,RecordID,RuleTitle,Details,RecordInformation,RuleFile,EvtxFile\n" + "Timestamp,Computer,Channel,Level,EventID,MitreAttack,RecordID,RuleTitle,Details,RecordInformation,RuleFile,EvtxFile,Tags\n" .to_string() + &expect_tz .clone() @@ -664,10 +666,10 @@ mod tests { + "," + test_channel + "," - + test_eventid - + "," + test_level + "," + + test_eventid + + "," + test_attack + "," + test_record_id @@ -681,9 +683,11 @@ mod tests { + test_rulepath + "," + test_filepath + + "," + + test_attack + "\n"; let mut file: Box = Box::new(File::create("./test_emit_csv.csv").unwrap()); - assert!(emit_csv(&mut file, false, HashMap::default(), 1).is_ok()); + assert!(emit_csv(&mut file, false, HashMap::new(), 1).is_ok()); match read_to_string("./test_emit_csv.csv") { Err(_) => panic!("Failed to open file."), Ok(s) => { @@ -691,10 +695,11 @@ mod tests { } }; assert!(remove_file("./test_emit_csv.csv").is_ok()); - check_emit_csv_display(); + } - fn check_emit_csv_display() { + #[test] + fn test_emit_csv_display() { let test_title = "test_title2"; let test_level = "medium"; let test_computername = "testcomputer2"; @@ -707,43 +712,44 @@ mod tests { let test_timestamp = Utc .datetime_from_str("1996-02-27T01:05:01Z", "%Y-%m-%dT%H:%M:%SZ") .unwrap(); - let expect_header = "Timestamp|Computer|Channel|EventID|Level|RecordID|RuleTitle|Details"; + let expect_header = "Timestamp|Computer|Channel|EventID|Level|RecordID|RuleTitle|Details|RecordInformation\n"; let expect_tz = test_timestamp.with_timezone(&Local); let expect_no_header = expect_tz .clone() .format("%Y-%m-%d %H:%M:%S%.3f %:z") .to_string() - + "|" + + " | " + test_computername - + "|" + + " | " + test_channel - + "|" + + " | " + test_eventid - + "|" + + " | " + test_level - + "|" + + " | " + test_recid - + "|" + + " | " + test_title - + "|" + + " | " + output - + "|" + + " | " + test_recinfo + "\n"; - assert_eq!(_get_serialized_disp_output(None), expect_header); + let mut data:LinkedHashMap = LinkedHashMap::new(); + data.insert("Timestamp".to_owned(), format_time(&test_timestamp, false)); + data.insert("Computer".to_owned(), test_computername.to_owned()); + data.insert("Channel".to_owned(), test_channel.to_owned()); + data.insert("EventID".to_owned(), test_eventid.to_owned()); + data.insert("Level".to_owned(), test_level.to_owned()); + data.insert("RecordID".to_owned(), test_recid.to_owned()); + data.insert("RuleTitle".to_owned(), test_title.to_owned()); + data.insert("Details".to_owned(), output.to_owned()); + data.insert("RecordInformation".to_owned(), test_recinfo.to_owned()); + + assert_eq!(_get_serialized_disp_output(data.clone(), true), expect_header); assert_eq!( - _get_serialized_disp_output(Some(DisplayFormat { - timestamp: &format_time(&test_timestamp, false), - level: test_level, - computer: test_computername, - event_i_d: test_eventid, - channel: test_channel, - rule_title: test_title, - details: output, - record_information: Some(test_recinfo), - record_i_d: Some(test_recid), - })), + _get_serialized_disp_output(data.clone(), false), expect_no_header ); } diff --git a/src/options/profile.rs b/src/options/profile.rs index 8c5f8e78..a11f2466 100644 --- a/src/options/profile.rs +++ b/src/options/profile.rs @@ -139,22 +139,66 @@ pub fn set_default_profile(default_profile_path: &str, profile_path: &str) -> Re #[cfg(test)] mod tests { + use linked_hash_map::LinkedHashMap; + use crate::options::profile::load_profile; use crate::detections::configs; #[test] + ///オプションの設定が入ると値の冪等性が担保できないためテストを逐次的に処理する + fn test_load_profile() { + test_load_profile_without_profile_option(); + test_load_profile_no_exist_profile_files(); + test_load_profile_with_profile_option(); + } + /// プロファイルオプションが設定されていないときにロードをした場合のテスト fn test_load_profile_without_profile_option() { configs::CONFIG.write().unwrap().args.profile = None; - assert_eq!(None, load_profile("test_files/config/profile/default_profile.txt", "test_files/config/profile/target.txt")); + let mut expect: LinkedHashMap = LinkedHashMap::new(); + expect.insert("Timestamp".to_owned(), "%Timestamp%".to_owned()); + expect.insert("Computer".to_owned(), "%Computer%".to_owned()); + expect.insert("Channel".to_owned(), "%Channel%".to_owned()); + expect.insert("Level".to_owned(), "%Level%".to_owned()); + expect.insert("EventID".to_owned(), "%EventID%".to_owned()); + expect.insert("MitreAttack".to_owned(), "%MitreAttack%".to_owned()); + expect.insert("RecordID".to_owned(), "%RecordID%".to_owned()); + expect.insert("RuleTitle".to_owned(), "%RuleTitle%".to_owned()); + expect.insert("Details".to_owned(), "%Details%".to_owned()); + expect.insert("RecordInformation".to_owned(), "%RecordInformation%".to_owned()); + expect.insert("RuleFile".to_owned(), "%RuleFile%".to_owned()); + expect.insert("EvtxFile".to_owned(), "%EvtxFile%".to_owned()); + expect.insert("Tags".to_owned(), "%MitreAttack%".to_owned()); + + assert_eq!(Some(expect), load_profile("test_files/config/default_profile.txt", "test_files/config/profiles.txt")); } - #[test] - /// プロファイルオプションが設定されていないときにロードをした場合のテスト - fn test_load_profile_no_exist_profile_files() { + /// プロファイルオプションが設定されて`おり、そのオプションに該当するプロファイルが存在する場合のテスト + fn test_load_profile_with_profile_option() { configs::CONFIG.write().unwrap().args.profile = Some("minimal".to_string()); - assert_eq!(None, load_profile("test_files/config/profile/no_exist_default_profile.txt", "test_files/config/profile/no_exist_target.txt")); - assert_eq!(None, load_profile("test_files/config/profile/default_profile.txt", "test_files/config/profile/no_exist_target.txt")); - assert_eq!(None, load_profile("test_files/config/profile/no_exist_default_profile.txt", "test_files/config/profile/target.txt")); + let mut expect: LinkedHashMap = LinkedHashMap::new(); + expect.insert("Timestamp".to_owned(), "%Timestamp%".to_owned()); + expect.insert("Computer".to_owned(), "%Computer%".to_owned()); + expect.insert("Channel".to_owned(), "%Channel%".to_owned()); + expect.insert("EventID".to_owned(), "%EventID%".to_owned()); + expect.insert("Level".to_owned(), "%Level%".to_owned()); + expect.insert("RuleTitle".to_owned(), "%RuleTitle%".to_owned()); + expect.insert("Details".to_owned(), "%Details%".to_owned()); + + assert_eq!(Some(expect), load_profile("test_files/config/default_profile.txt", "test_files/config/profiles.txt")); + } + + /// プロファイルオプションが設定されているが、対象のオプションが存在しない場合のテスト + fn test_load_profile_no_exist_profile_files() { + configs::CONFIG.write().unwrap().args.profile = Some("not_exist".to_string()); + + //両方のファイルが存在しない場合 + assert_eq!(None, load_profile("test_files/config/no_exist_default_profile.txt", "test_files/config/no_exist_profiles.txt")); + + //デフォルトプロファイルは存在しているがprofileオプションが指定されているため読み込み失敗の場合 + assert_eq!(None, load_profile("test_files/config/profile/default_profile.txt", "test_files/config/profile/no_exist_profiles.txt")); + + //オプション先のターゲットのプロファイルファイルが存在しているが、profileオプションで指定されたオプションが存在しない場合 + assert_eq!(None, load_profile("test_files/config/no_exist_default_profile.txt", "test_files/config/profiles.txt")); } }