dns.rsannotateddns.rssource48 lines · 1.8 KB · raw
1//! Host names in `jev.endpoint` resolve through hickory on the backend's
2//! own executor (contract §2), against `jev.dns_servers` when set.
3
4use std::net::Ipv4Addr;
5
6use hickory_proto::rr::RecordType;
7use support::dns::MockDns;
8use support::mock_jev::{MockJev, Reply};
9use support::{jev_instance_with, noul};
10
11const SELECT: &str = "SELECT jev_prob(t, 'Urgent?') FROM tickets t";
12
13#[tokio::test(flavor = "multi_thread")]
14async fn the_endpoint_host_is_resolved() {
15    let mock = MockJev::start_for(&["jev.test"], |_| Reply::json(200, noul(0.95))).await;
16    let dns = MockDns::start(&[("jev.test", Ipv4Addr::LOCALHOST)]).await;
17    let (_pg, client) = jev_instance_with(
18        &mock,
19        &[("jev.endpoint", &mock.endpoint_via("jev.test")), ("jev.dns_servers", &dns.addr.to_string())],
20    )
21    .await;
22
23    let row = client.query_one(SELECT, &[]).await.expect("resolved and answered");
24    assert_eq!(row.get::<_, f64>(0), 0.95);
25    assert!(
26        dns.queries().contains(&("jev.test.".to_string(), RecordType::A)),
27        "asked: {:?}",
28        dns.queries()
29    );
30    assert_eq!(mock.requests().len(), 1);
31}
32
33#[tokio::test(flavor = "multi_thread")]
34async fn an_unknown_host_fails_naming_it() {
35    let mock = MockJev::start(|_| Reply::json(200, noul(0.95))).await;
36    let dns = MockDns::start(&[]).await;
37    let (_pg, client) = jev_instance_with(
38        &mock,
39        &[("jev.endpoint", &mock.endpoint_via("nowhere.test")), ("jev.dns_servers", &dns.addr.to_string())],
40    )
41    .await;
42
43    let err = client.query_one(SELECT, &[]).await.expect_err("no address");
44    let db = err.as_db_error().expect("an ERROR");
45    assert_eq!(db.code(), &tokio_postgres::error::SqlState::SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION);
46    assert!(db.message().contains("nowhere.test"), "{}", db.message());
47    assert!(mock.requests().is_empty());
48}