test: prove provider panic containment and isolation

This commit is contained in:
2026-06-05 15:16:37 +02:00
parent 1a33317b6d
commit 0880198b3c
+33
View File
@@ -319,4 +319,37 @@ mod tests {
assert_eq!(results["a.se"], ProviderResult::NoData);
assert!(matches!(results["b.se"], ProviderResult::Ok { .. }));
}
/// Provider whose parse() panics — must be contained by spawn_blocking.
struct PanickingProvider;
impl ProviderHandle for PanickingProvider {
fn name(&self) -> &str {
"panic.se"
}
fn requests(&self, number: &str) -> Result<Vec<String>, HostError> {
Ok(vec![format!("https://example.test/{number}")])
}
fn parse(&self, _number: &str, _responses: &[FetchedResponse]) -> ParseOutcome {
panic!("provider blew up");
}
}
#[tokio::test]
async fn provider_panic_is_contained_and_isolated() {
let panicking = Arc::new(PanickingProvider);
let healthy = Arc::new(FakeProvider {
name: "ok.se",
outcome: || ParseOutcome::Ok(entry()),
});
let fetcher = Arc::new(FakeFetcher::new(false));
let svc = service(vec![panicking, healthy], fetcher);
let results = svc.lookup("0700000000").await;
assert_eq!(results["panic.se"], ProviderResult::ParseFailed);
assert!(matches!(results["ok.se"], ProviderResult::Ok { .. }));
}
}