postfix-log-parser 0.2.0

高性能模块化Postfix日志解析器,经3.2GB生产数据验证,SMTPD事件100%准确率
Documentation
//! POSTMAP组件解析器测试

use postfix_log_parser::components::postmap::PostmapParser;
use postfix_log_parser::components::ComponentParser;
use postfix_log_parser::events::postmap::{ErrorType, PostmapEventType};
use postfix_log_parser::events::ComponentEvent;

#[test]
fn test_parse_file_not_found_error() {
    let parser = PostmapParser::new();
    let message = "open /etc/config/transport: No such file or directory";

    let result = parser.parse(message).unwrap();

    if let ComponentEvent::Postmap(event) = result {
        assert_eq!(event.event_type, PostmapEventType::FileError);
        assert_eq!(event.details.error_type, ErrorType::FileNotFound);
        assert_eq!(
            event.details.file_path,
            Some("/etc/config/transport".to_string())
        );
        assert_eq!(event.details.error_message, "No such file or directory");
    } else {
        panic!("Expected Postmap event");
    }
}

#[test]
fn test_parse_directory_not_found_error() {
    let parser = PostmapParser::new();
    let message = "open /etc/postfix/: No such file or directory";

    let result = parser.parse(message).unwrap();

    if let ComponentEvent::Postmap(event) = result {
        assert_eq!(event.event_type, PostmapEventType::FileError);
        assert_eq!(event.details.error_type, ErrorType::DirectoryNotFound);
        assert_eq!(event.details.file_path, Some("/etc/postfix/".to_string()));
    } else {
        panic!("Expected Postmap event");
    }
}

#[test]
fn test_parse_command_argument_error() {
    let parser = PostmapParser::new();
    let message = "specify -b -h or -m only with \"-q -\"";

    let result = parser.parse(message).unwrap();

    if let ComponentEvent::Postmap(event) = result {
        assert_eq!(event.event_type, PostmapEventType::CommandError);
        assert_eq!(event.details.error_type, ErrorType::InvalidCommandArgs);
        assert_eq!(event.details.command_args, Some("-b -h -m".to_string()));
        assert!(event
            .details
            .error_message
            .contains("specify -b -h or -m only with"));
    } else {
        panic!("Expected Postmap event");
    }
}

#[test]
fn test_parse_sender_blacklist_error() {
    let parser = PostmapParser::new();
    let message = "open /etc/postfix/sender_blacklist: No such file or directory";

    let result = parser.parse(message).unwrap();

    if let ComponentEvent::Postmap(event) = result {
        assert_eq!(event.event_type, PostmapEventType::FileError);
        assert_eq!(event.details.error_type, ErrorType::FileNotFound);
        assert_eq!(
            event.details.file_path,
            Some("/etc/postfix/sender_blacklist".to_string())
        );
    } else {
        panic!("Expected Postmap event");
    }
}

#[test]
fn test_parse_postmap_file_error() {
    let parser = PostmapParser::new();
    let message = "open postmap: No such file or directory";

    let result = parser.parse(message).unwrap();

    if let ComponentEvent::Postmap(event) = result {
        assert_eq!(event.event_type, PostmapEventType::FileError);
        assert_eq!(event.details.error_type, ErrorType::FileNotFound);
        assert_eq!(event.details.file_path, Some("postmap".to_string()));
    } else {
        panic!("Expected Postmap event");
    }
}

#[test]
fn test_component_name() {
    let parser = PostmapParser::new();
    assert_eq!(parser.component_name(), "postmap");
}

#[test]
fn test_parse_invalid_message() {
    let parser = PostmapParser::new();
    let message = "this is not a valid postmap message";

    let result = parser.parse(message);
    assert!(result.is_err());
}

#[test]
fn test_real_log_samples() {
    let parser = PostmapParser::new();

    // 测试真实日志样本(MasterParser已移除fatal前缀)
    let samples = [
        "open /etc/config/transport: No such file or directory",
        "open /etc/postfix/sender_blacklist: No such file or directory",
        "specify -b -h or -m only with \"-q -\"",
        "open postmap: No such file or directory",
    ];

    for sample in &samples {
        let result = parser.parse(sample);
        assert!(result.is_ok(), "Failed to parse: {}", sample);
    }
}