# Copyright (c) 2023-2024 Arista Networks, Inc.
# Use of this source code is governed by the Apache License 2.0
# that can be found in the LICENSE file.
"""Tests for anta.tests.path_selection.py."""

from __future__ import annotations

from typing import Any

from anta.tests.path_selection import VerifyPathsHealth, VerifySpecificPath
from tests.lib.anta import test  # noqa: F401; pylint: disable=W0611

DATA: list[dict[str, Any]] = [
    {
        "name": "success",
        "test": VerifyPathsHealth,
        "eos_data": [
            {
                "dpsPeers": {
                    "10.255.0.1": {
                        "dpsGroups": {
                            "internet": {
                                "dpsPaths": {
                                    "path3": {"state": "routeResolved", "dpsSessions": {"0": {"active": True}}},
                                },
                            },
                            "mpls": {
                                "dpsPaths": {
                                    "path4": {"state": "ipsecEstablished", "dpsSessions": {"0": {"active": True}}},
                                },
                            },
                        },
                    },
                    "10.255.0.2": {
                        "dpsGroups": {
                            "internet": {
                                "dpsPaths": {
                                    "path1": {"state": "ipsecEstablished", "dpsSessions": {"0": {"active": True}}},
                                },
                            },
                            "mpls": {
                                "dpsPaths": {
                                    "path2": {"state": "routeResolved", "dpsSessions": {"0": {"active": True}}},
                                },
                            },
                        },
                    },
                }
            },
        ],
        "inputs": {},
        "expected": {"result": "success"},
    },
    {
        "name": "failure-no-peer",
        "test": VerifyPathsHealth,
        "eos_data": [
            {"dpsPeers": {}},
        ],
        "inputs": {},
        "expected": {"result": "failure", "messages": ["No path configured for router path-selection."]},
    },
    {
        "name": "failure-not-established",
        "test": VerifyPathsHealth,
        "eos_data": [
            {
                "dpsPeers": {
                    "10.255.0.1": {
                        "dpsGroups": {
                            "internet": {
                                "dpsPaths": {
                                    "path3": {"state": "ipsecPending", "dpsSessions": {"0": {"active": False}}},
                                },
                            },
                            "mpls": {
                                "dpsPaths": {
                                    "path4": {"state": "ipsecPending", "dpsSessions": {"0": {"active": False}}},
                                },
                            },
                        },
                    },
                    "10.255.0.2": {
                        "dpsGroups": {
                            "internet": {
                                "dpsPaths": {
                                    "path1": {"state": "ipsecEstablished", "dpsSessions": {"0": {"active": True}}},
                                },
                            },
                            "mpls": {
                                "dpsPaths": {
                                    "path2": {"state": "ipsecPending", "dpsSessions": {"0": {"active": False}}},
                                },
                            },
                        },
                    },
                }
            },
        ],
        "inputs": {},
        "expected": {
            "result": "failure",
            "messages": [
                "Path state for peer 10.255.0.1 in path-group internet is `ipsecPending`.",
                "Path state for peer 10.255.0.1 in path-group mpls is `ipsecPending`.",
                "Path state for peer 10.255.0.2 in path-group mpls is `ipsecPending`.",
            ],
        },
    },
    {
        "name": "failure-inactive",
        "test": VerifyPathsHealth,
        "eos_data": [
            {
                "dpsPeers": {
                    "10.255.0.1": {
                        "dpsGroups": {
                            "internet": {
                                "dpsPaths": {
                                    "path3": {"state": "routeResolved", "dpsSessions": {"0": {"active": False}}},
                                },
                            },
                            "mpls": {
                                "dpsPaths": {
                                    "path4": {"state": "routeResolved", "dpsSessions": {"0": {"active": False}}},
                                },
                            },
                        },
                    },
                    "10.255.0.2": {
                        "dpsGroups": {
                            "internet": {
                                "dpsPaths": {
                                    "path1": {"state": "routeResolved", "dpsSessions": {"0": {"active": True}}},
                                },
                            },
                            "mpls": {
                                "dpsPaths": {
                                    "path2": {"state": "routeResolved", "dpsSessions": {"0": {"active": False}}},
                                },
                            },
                        },
                    },
                }
            },
        ],
        "inputs": {},
        "expected": {
            "result": "failure",
            "messages": [
                "Telemetry state for peer 10.255.0.1 in path-group internet is `inactive`.",
                "Telemetry state for peer 10.255.0.1 in path-group mpls is `inactive`.",
                "Telemetry state for peer 10.255.0.2 in path-group mpls is `inactive`.",
            ],
        },
    },
    {
        "name": "success",
        "test": VerifySpecificPath,
        "eos_data": [
            {
                "dpsPeers": {
                    "10.255.0.1": {
                        "dpsGroups": {
                            "internet": {
                                "dpsPaths": {
                                    "path3": {
                                        "state": "ipsecEstablished",
                                        "source": "172.18.13.2",
                                        "destination": "172.18.15.2",
                                        "dpsSessions": {"0": {"active": True}},
                                    }
                                }
                            }
                        }
                    }
                }
            },
            {
                "dpsPeers": {
                    "10.255.0.2": {
                        "dpsGroups": {
                            "mpls": {
                                "dpsPaths": {
                                    "path2": {
                                        "state": "ipsecEstablished",
                                        "source": "172.18.3.2",
                                        "destination": "172.18.5.2",
                                        "dpsSessions": {"0": {"active": True}},
                                    }
                                }
                            }
                        }
                    }
                }
            },
        ],
        "inputs": {
            "paths": [
                {"peer": "10.255.0.1", "path_group": "internet", "source_address": "172.18.3.2", "destination_address": "172.18.5.2"},
                {"peer": "10.255.0.2", "path_group": "mpls", "source_address": "172.18.13.2", "destination_address": "172.18.15.2"},
            ]
        },
        "expected": {"result": "success"},
    },
    {
        "name": "failure-no-peer",
        "test": VerifySpecificPath,
        "eos_data": [
            {"dpsPeers": {}},
            {"dpsPeers": {}},
        ],
        "inputs": {
            "paths": [
                {"peer": "10.255.0.1", "path_group": "internet", "source_address": "172.18.3.2", "destination_address": "172.18.5.2"},
                {"peer": "10.255.0.2", "path_group": "mpls", "source_address": "172.18.13.2", "destination_address": "172.18.15.2"},
            ]
        },
        "expected": {
            "result": "failure",
            "messages": [
                "Path `peer: 10.255.0.1 source: 172.18.3.2 destination: 172.18.5.2` is not configured for path-group `internet`.",
                "Path `peer: 10.255.0.2 source: 172.18.13.2 destination: 172.18.15.2` is not configured for path-group `mpls`.",
            ],
        },
    },
    {
        "name": "failure-not-established",
        "test": VerifySpecificPath,
        "eos_data": [
            {
                "dpsPeers": {
                    "10.255.0.1": {
                        "dpsGroups": {
                            "internet": {
                                "dpsPaths": {
                                    "path3": {"state": "ipsecPending", "source": "172.18.3.2", "destination": "172.18.5.2", "dpsSessions": {"0": {"active": True}}}
                                }
                            }
                        }
                    }
                }
            },
            {
                "dpsPeers": {
                    "10.255.0.2": {
                        "dpsGroups": {
                            "mpls": {
                                "dpsPaths": {
                                    "path4": {
                                        "state": "ipsecPending",
                                        "source": "172.18.13.2",
                                        "destination": "172.18.15.2",
                                        "dpsSessions": {"0": {"active": False}},
                                    }
                                }
                            }
                        }
                    }
                }
            },
        ],
        "inputs": {
            "paths": [
                {"peer": "10.255.0.1", "path_group": "internet", "source_address": "172.18.3.2", "destination_address": "172.18.5.2"},
                {"peer": "10.255.0.2", "path_group": "mpls", "source_address": "172.18.13.2", "destination_address": "172.18.15.2"},
            ]
        },
        "expected": {
            "result": "failure",
            "messages": [
                "Path state for `peer: 10.255.0.1 source: 172.18.3.2 destination: 172.18.5.2` in path-group internet is `ipsecPending`.",
                "Path state for `peer: 10.255.0.2 source: 172.18.13.2 destination: 172.18.15.2` in path-group mpls is `ipsecPending`.",
            ],
        },
    },
    {
        "name": "failure-inactive",
        "test": VerifySpecificPath,
        "eos_data": [
            {
                "dpsPeers": {
                    "10.255.0.1": {
                        "dpsGroups": {
                            "internet": {
                                "dpsPaths": {
                                    "path3": {"state": "routeResolved", "source": "172.18.3.2", "destination": "172.18.5.2", "dpsSessions": {"0": {"active": False}}}
                                }
                            }
                        }
                    }
                }
            },
            {
                "dpsPeers": {
                    "10.255.0.2": {
                        "dpsGroups": {
                            "mpls": {
                                "dpsPaths": {
                                    "path4": {
                                        "state": "routeResolved",
                                        "source": "172.18.13.2",
                                        "destination": "172.18.15.2",
                                        "dpsSessions": {"0": {"active": False}},
                                    }
                                }
                            }
                        }
                    }
                }
            },
        ],
        "inputs": {
            "paths": [
                {"peer": "10.255.0.1", "path_group": "internet", "source_address": "172.18.3.2", "destination_address": "172.18.5.2"},
                {"peer": "10.255.0.2", "path_group": "mpls", "source_address": "172.18.13.2", "destination_address": "172.18.15.2"},
            ]
        },
        "expected": {
            "result": "failure",
            "messages": [
                "Telemetry state for path `peer: 10.255.0.1 source: 172.18.3.2 destination: 172.18.5.2` in path-group internet is `inactive`.",
                "Telemetry state for path `peer: 10.255.0.2 source: 172.18.13.2 destination: 172.18.15.2` in path-group mpls is `inactive`.",
            ],
        },
    },
]
