use crate::protocol::{RequestContext, StatusCode};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MetricsAction {
Error4xx,
Error5xx,
Article,
None,
}
pub fn determine_metrics_action_for_request(
request: &RequestContext,
status_code: StatusCode,
) -> MetricsAction {
let response_code = status_code.as_u16();
if (400..500).contains(&response_code) && response_code != 423 && response_code != 430 {
MetricsAction::Error4xx
} else if response_code >= 500 {
MetricsAction::Error5xx
} else if request.has_response_body(status_code) && matches!(response_code, 220..=222) {
MetricsAction::Article
} else {
MetricsAction::None
}
}
#[cfg(test)]
mod tests {
use super::*;
fn determine_metrics_action(command: &str, response_code: u16) -> MetricsAction {
let request = RequestContext::parse(command.as_bytes()).expect("valid request line");
determine_metrics_action_for_request(&request, StatusCode::new(response_code))
}
#[test]
fn test_determine_metrics_action_4xx_errors() {
assert_eq!(
determine_metrics_action("ARTICLE <test@example.com>", 400),
MetricsAction::Error4xx
);
assert_eq!(
determine_metrics_action("ARTICLE <test@example.com>", 401),
MetricsAction::Error4xx
);
assert_eq!(
determine_metrics_action("ARTICLE <test@example.com>", 480),
MetricsAction::Error4xx
);
}
#[test]
fn test_determine_metrics_action_4xx_exclusions() {
assert_eq!(
determine_metrics_action("ARTICLE <test@example.com>", 423),
MetricsAction::None
);
assert_eq!(
determine_metrics_action("ARTICLE <test@example.com>", 430),
MetricsAction::None
);
}
#[test]
fn test_determine_metrics_action_5xx_errors() {
assert_eq!(
determine_metrics_action("ARTICLE <test@example.com>", 500),
MetricsAction::Error5xx
);
assert_eq!(
determine_metrics_action("ARTICLE <test@example.com>", 502),
MetricsAction::Error5xx
);
assert_eq!(
determine_metrics_action("ARTICLE <test@example.com>", 503),
MetricsAction::Error5xx
);
}
#[test]
fn test_determine_metrics_action_article_success() {
assert_eq!(
determine_metrics_action("ARTICLE <test@example.com>", 220),
MetricsAction::Article
);
assert_eq!(
determine_metrics_action("HEAD <test@example.com>", 221),
MetricsAction::Article
);
assert_eq!(
determine_metrics_action("BODY <test@example.com>", 222),
MetricsAction::Article
);
}
#[test]
fn test_determine_metrics_action_article_status_not_for_other_request() {
assert_eq!(
determine_metrics_action("GROUP alt.test", 220),
MetricsAction::None
);
}
#[test]
fn test_determine_metrics_action_stat_not_article() {
assert_eq!(
determine_metrics_action("STAT <test@example.com>", 223),
MetricsAction::None
);
}
#[test]
fn test_determine_metrics_action_success_codes() {
assert_eq!(
determine_metrics_action("MODE READER", 200),
MetricsAction::None
);
assert_eq!(
determine_metrics_action("GROUP alt.test", 211),
MetricsAction::None
);
assert_eq!(determine_metrics_action("LIST", 215), MetricsAction::None);
assert_eq!(
determine_metrics_action("LISTGROUP alt.test", 211),
MetricsAction::None
);
}
#[test]
fn test_determine_metrics_action_3xx_codes() {
assert_eq!(
determine_metrics_action("IHAVE <test@example.com>", 335),
MetricsAction::None
);
assert_eq!(
determine_metrics_action("AUTHINFO USER user", 381),
MetricsAction::None
);
}
}