pharos-plugins 0.1.0

CoreDNS-compatible Plugins for the Pharos DNS server
Documentation
#![recursion_limit = "512"]
#![cfg(all(feature = "plugin-metadata", feature = "plugin-whoami"))]

use pharos_corefile::{configure, parse};
use pharos_plugins::{Chain, directives};

// Derived from CoreDNS v1.15.0 plugin/metadata/setup_test.go.
#[test]
fn coredns_metadata_setup_cases() {
    for directive in [
        "metadata",
        "metadata example.com.",
        "metadata example.com. net.",
        "metadata {}",
    ] {
        let text = format!(".:53 {{\n{directive}\n whoami\n}}");
        let blocks = parse("Corefile", &text).unwrap();
        assert!(
            configure::<Chain>(&blocks, directives()).is_ok(),
            "{directive}"
        );
    }
    for directive in ["metadata example.com. { some_param }", "metadata\nmetadata"] {
        let text = format!(".:53 {{\n{directive}\n whoami\n}}");
        let blocks = parse("Corefile", &text).unwrap();
        assert!(
            configure::<Chain>(&blocks, directives()).is_err(),
            "{directive}"
        );
    }
}

// Derived from CoreDNS v1.15.0 plugin/metadata/setup_test.go TestSetupHealth.
#[test]
fn coredns_metadata_setup_domains() {
    for (directive, expected) in [
        ("metadata", vec!["example.org."]),
        ("metadata example.com.", vec!["example.com."]),
        ("metadata example.com. net.", vec!["example.com.", "net."]),
    ] {
        let text = format!("example.org:53 {{\n{directive}\n}}");
        let blocks = parse("Corefile", &text).unwrap();
        let configured = configure::<Chain>(&blocks, directives()).unwrap();
        let domains = &configured[0].config.metadata.as_ref().unwrap().domains;
        assert_eq!(
            domains.iter().map(ToString::to_string).collect::<Vec<_>>(),
            expected
        );
    }
}