route_verification_graph 0.1.1

Parse RPSL in the IRR to verify observed BGP routes
Documentation
use super::*;

#[test]
fn insertions() {
    let mut graph = ASSetGraph::default();
    let node0 = graph.get_or_insert(ASNumOrSet::set("AS-BC"));
    let node1 = graph.get_or_insert(ASNumOrSet::set("AS-DE"));
    let node2 = graph.get_or_insert(ASNumOrSet::Num(113));

    let graph_str = format!("{graph}");
    print!("{graph_str}");
    let expected_str = r#"digraph {
    0 [ label = "AS-BC" ]
    1 [ label = "AS-DE" ]
    2 [ label = "AS113" ]
}
"#;
    assert_eq!(&graph_str, expected_str);

    assert_eq!(node0.index(), 0);
    assert_eq!(node1.index(), 1);
    assert_eq!(node2.index(), 2);
}

#[test]
fn add_members() {
    let mut graph = ASSetGraph::default();
    let (members0, set0) = graph.add_members(
        vec![
            ASNumOrSet::Num(113),
            ASNumOrSet::Num(114),
            ASNumOrSet::Num(115),
            ASNumOrSet::set("AS-DE"),
            ASNumOrSet::set("m#AS-BC"),
        ],
        ASNumOrSet::set("AS-BC"),
    );
    let (members1, set1) = graph.add_members(vec![ASNumOrSet::Num(113)], ASNumOrSet::set("AS-DE"));

    let graph_str = format!("{graph}");
    print!("{graph_str}");
    let expected_str = r#"digraph {
    0 [ label = "AS-BC" ]
    1 [ label = "AS113" ]
    2 [ label = "AS114" ]
    3 [ label = "AS115" ]
    4 [ label = "AS-DE" ]
    5 [ label = "m#AS-BC" ]
    0 -> 1 [ label = "1" ]
    0 -> 2 [ label = "1" ]
    0 -> 3 [ label = "1" ]
    0 -> 4 [ label = "1" ]
    0 -> 5 [ label = "0" ]
    4 -> 1 [ label = "1" ]
}
"#;
    assert_eq!(&graph_str, expected_str);

    assert_eq!(set0.index(), 0);
    let members0_indexes: Vec<_> = members0.into_iter().map(|n| n.index()).collect();
    assert_eq!(members0_indexes, vec![1, 2, 3, 4, 5]);

    assert_eq!(set1.index(), 4);
    let members1_indexes: Vec<_> = members1.into_iter().map(|n| n.index()).collect();
    assert_eq!(members1_indexes, vec![1]);
}

#[test]
fn stats() {
    let mut graph = ASSetGraph::default();
    let (_, set_index) = graph.add_members(
        vec![
            ASNumOrSet::Num(113),
            ASNumOrSet::Num(114),
            ASNumOrSet::Num(115),
            ASNumOrSet::set("AS-DE"),
            ASNumOrSet::set("AS-FG"),
            ASNumOrSet::set("AS-HI"),
            ASNumOrSet::set("m#AS-BC"),
        ],
        ASNumOrSet::set("AS-BC"),
    );
    graph.add_members(
        vec![
            ASNumOrSet::Num(113),
            ASNumOrSet::set("AS-BC"),
            ASNumOrSet::set("AS-FG"),
        ],
        ASNumOrSet::set("AS-DE"),
    );
    graph.add_members(
        vec![
            ASNumOrSet::Num(579),
            ASNumOrSet::set("AS-DE"),
            ASNumOrSet::set("AS-HI"),
            ASNumOrSet::set("AS-JK"),
        ],
        ASNumOrSet::set("AS-FG"),
    );
    graph.add_members(
        vec![
            ASNumOrSet::Num(579),
            ASNumOrSet::Num(24),
            ASNumOrSet::Num(108),
        ],
        ASNumOrSet::set("AS-HI"),
    );
    graph.add_members(vec![ASNumOrSet::Num(40)], ASNumOrSet::set("AS-JK"));

    let graph_str = format!("{graph}");
    print!("{graph_str}");
    let expected_str = r#"digraph {
    0 [ label = "AS-BC" ]
    1 [ label = "AS113" ]
    2 [ label = "AS114" ]
    3 [ label = "AS115" ]
    4 [ label = "AS-DE" ]
    5 [ label = "AS-FG" ]
    6 [ label = "AS-HI" ]
    7 [ label = "m#AS-BC" ]
    8 [ label = "AS579" ]
    9 [ label = "AS-JK" ]
    10 [ label = "AS24" ]
    11 [ label = "AS108" ]
    12 [ label = "AS40" ]
    0 -> 1 [ label = "1" ]
    0 -> 2 [ label = "1" ]
    0 -> 3 [ label = "1" ]
    0 -> 4 [ label = "1" ]
    0 -> 5 [ label = "1" ]
    0 -> 6 [ label = "1" ]
    0 -> 7 [ label = "0" ]
    4 -> 1 [ label = "1" ]
    4 -> 0 [ label = "1" ]
    4 -> 5 [ label = "1" ]
    5 -> 8 [ label = "1" ]
    5 -> 4 [ label = "1" ]
    5 -> 6 [ label = "1" ]
    5 -> 9 [ label = "1" ]
    6 -> 8 [ label = "1" ]
    6 -> 10 [ label = "1" ]
    6 -> 11 [ label = "1" ]
    9 -> 12 [ label = "1" ]
}
"#;
    assert_eq!(graph_str, expected_str);

    let stats = graph.count_stats(set_index);
    let expected_stats = ASSetGraphStats {
        n_sets: 4,
        n_nums: 7,
        depth: 3,
    };
    assert_eq!(stats, expected_stats);

    let has_cycle = graph.has_cycle();
    assert!(has_cycle);
}