From 778d9e436a3fd4a93b3b7987e0dd5fb7c93f3632 Mon Sep 17 00:00:00 2001 From: Marc Hartmayer Date: Fri, 3 Jul 2026 14:36:17 +0200 Subject: [PATCH] pv: Add more tests for testing the CRL download functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add more tests for testing the CRL download functionality. Signed-off-by: Marc Hartmayer Acked-by: Steffen Eiden Signed-off-by: Jan Höppner --- rust/pv/src/verify/helper.rs | 137 +++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/rust/pv/src/verify/helper.rs b/rust/pv/src/verify/helper.rs index 90105107..fbea5a23 100644 --- a/rust/pv/src/verify/helper.rs +++ b/rust/pv/src/verify/helper.rs @@ -729,4 +729,141 @@ mod tests { download_with_mock(cert, responses) } + + mod distribution_points { + use super::*; + + #[test] + fn extract_single_distribution_point() { + let cert = create_cert_with_crl_dps(&["http://example.com/test.crl"]); + let dps = x509_dist_points(&cert); + assert_eq!(dps.len(), 1); + assert_eq!(dps[0], "http://example.com/test.crl"); + } + + #[test] + fn extract_multiple_distribution_points() { + let cert = create_cert_with_crl_dps(&[ + "http://primary.example.com/test.crl", + "http://backup.example.com/test.crl", + ]); + let dps = x509_dist_points(&cert); + assert_eq!(dps.len(), 2); + assert_eq!(dps[0], "http://primary.example.com/test.crl"); + assert_eq!(dps[1], "http://backup.example.com/test.crl"); + } + + #[test] + fn extract_no_distribution_points() { + let cert = create_cert_with_crl_dps(&[]); + let dps = x509_dist_points(&cert); + assert!(dps.is_empty()); + } + } + + mod download_success { + use super::*; + + #[test] + fn download_success_single_dp() { + let cert = create_cert_with_crl_dps(&["http://example.com/test.crl"]); + let crl_data = std::fs::read(get_cert_asset_path("inter_ca.crl")).unwrap(); + + let mut responses = HashMap::new(); + responses.insert( + "http://example.com/test.crl".to_string(), + mock_response(crl_data), + ); + + let result = download_with_mock(&cert, responses); + assert!(result.is_ok()); + let crls = result.unwrap(); + assert!(crls.is_some()); + assert_eq!(crls.unwrap().len(), 1); + } + + #[test] + fn download_no_crl_available() { + let cert = create_cert_with_crl_dps(&["http://example.com/test.crl"]); + + let mut responses = HashMap::new(); + responses.insert("http://example.com/test.crl".to_string(), mock_failure()); + + let result = download_with_mock(&cert, responses); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + + #[test] + fn download_first_dp_succeeds() { + let cert = create_cert_with_crl_dps(&[ + "http://primary.example.com/test.crl", + "http://backup.example.com/test.crl", + ]); + let crl_data = std::fs::read(get_cert_asset_path("inter_ca.crl")).unwrap(); + + let mut responses = HashMap::new(); + responses.insert( + "http://primary.example.com/test.crl".to_string(), + mock_response(crl_data), + ); + + let result = download_with_mock(&cert, responses); + assert!(result.is_ok()); + assert!(result.unwrap().is_some()); + } + + #[test] + fn download_fallback_to_second_dp() { + let cert = create_cert_with_crl_dps(&[ + "http://primary.example.com/test.crl", + "http://backup.example.com/test.crl", + ]); + let crl_data = std::fs::read(get_cert_asset_path("inter_ca.crl")).unwrap(); + + let mut responses = HashMap::new(); + responses.insert( + "http://primary.example.com/test.crl".to_string(), + mock_failure(), + ); + responses.insert( + "http://backup.example.com/test.crl".to_string(), + mock_response(crl_data), + ); + + let result = download_with_mock(&cert, responses); + assert!(result.is_ok()); + assert!(result.unwrap().is_some()); + } + + #[test] + fn download_invalid_crl_data() { + let cert = create_cert_with_crl_dps(&["http://example.com/test.crl"]); + + let mut responses = HashMap::new(); + responses.insert( + "http://example.com/test.crl".to_string(), + mock_response(vec![0x00, 0x01, 0x02, 0x03]), + ); + + let result = download_with_mock(&cert, responses); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + + #[test] + fn download_empty_response() { + let cert = create_cert_with_crl_dps(&["http://example.com/test.crl"]); + + let mut responses = HashMap::new(); + responses.insert( + "http://example.com/test.crl".to_string(), + mock_response(vec![]), + ); + + let result = download_with_mock(&cert, responses); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + } }