test: prove provider panic containment and isolation
This commit is contained in:
@@ -319,4 +319,37 @@ mod tests {
|
|||||||
assert_eq!(results["a.se"], ProviderResult::NoData);
|
assert_eq!(results["a.se"], ProviderResult::NoData);
|
||||||
assert!(matches!(results["b.se"], ProviderResult::Ok { .. }));
|
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 { .. }));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user