def test_neg_disagg_fib_unreachable_recover():
    rib = Rib()
    rib.add_route(default_prefix, default_next_hops)
    rib.add_route(unreachable_prefix, unreachable_next_hops, disagg_type=False)
    recovered_nodes = {"S3"}
    rib.delete_route(unreachable_prefix, recovered_nodes, disagg_type=False)
    assert rib.destinations.get(
        unreachable_prefix)._positive_next_hops == set()
    assert rib.destinations.get(unreachable_prefix)._negative_next_hops == \
           unreachable_next_hops - recovered_nodes
    assert rib.destinations.get(
        unreachable_prefix).get_next_hops == recovered_nodes
    assert rib.fib.routes[unreachable_prefix] == recovered_nodes
def test_remove_default_next_hop_with_subnet_disagg():
    rib = Rib()
    rib.add_route(default_prefix, default_next_hops)
    rib.add_route(first_negative_disagg_prefix,
                  first_negative_disagg_next_hops,
                  disagg_type=False)
    rib.add_route(subnet_disagg_prefix,
                  subnet_disagg_next_hops,
                  disagg_type=False)
    failed_next_hop = {"S3"}
    rib.delete_route(default_prefix, failed_next_hop)
    # test for default
    assert rib.destinations.get(
        default_prefix
    )._positive_next_hops == default_next_hops - failed_next_hop
    assert rib.destinations.get(default_prefix)._negative_next_hops == set()
    assert rib.destinations.get(
        default_prefix).get_next_hops == default_next_hops - failed_next_hop
    assert rib.fib.routes[
        default_prefix] == default_next_hops - failed_next_hop
    # test for 10.0.0.0/16
    assert rib.destinations.get(
        first_negative_disagg_prefix)._positive_next_hops == set()
    assert rib.destinations.get(first_negative_disagg_prefix)._negative_next_hops == \
           first_negative_disagg_next_hops
    assert rib.destinations.get(first_negative_disagg_prefix).get_next_hops == \
           default_next_hops - first_negative_disagg_next_hops - failed_next_hop
    assert rib.fib.routes[first_negative_disagg_prefix] == \
           default_next_hops - first_negative_disagg_next_hops - failed_next_hop
    # test for 10.0.10.0/24
    assert rib.destinations.get(
        subnet_disagg_prefix)._positive_next_hops == set()
    assert rib.destinations.get(subnet_disagg_prefix)._negative_next_hops == \
           subnet_disagg_next_hops
    assert rib.destinations.get(subnet_disagg_prefix).get_next_hops == \
           default_next_hops - first_negative_disagg_next_hops - subnet_disagg_next_hops - \
           failed_next_hop
    assert rib.fib.routes[subnet_disagg_prefix] == \
           default_next_hops - first_negative_disagg_next_hops - subnet_disagg_next_hops - \
           failed_next_hop