# Copyright 2017 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for net_metrics."""

import socket
from unittest import mock

import psutil  # pylint: disable=import-error

from chromite.lib import cros_test_lib
from chromite.scripts.sysmon import net_metrics


# pylint: disable=protected-access

snetio = psutil._common.snetio
snicstats = psutil._common.snicstats
snic = getattr(psutil._common, "snic", None)

pytestmark = cros_test_lib.pytestmark_skipif(
    snic is None, reason="Wrong version of psutil"
)


class TestNetMetrics(cros_test_lib.TestCase):
    """Tests for net_metrics."""

    def setUp(self) -> None:
        patcher = mock.patch(
            "chromite.third_party.infra_libs.ts_mon.common.interface.state."
            "store",
            autospec=True,
        )
        self.store = patcher.start()
        self.addCleanup(patcher.stop)

    def test_collect(self) -> None:
        with mock.patch(
            "psutil.net_io_counters", autospec=True
        ) as net_io_counters, mock.patch(
            "psutil.net_if_stats", autospec=True
        ) as net_if_stats, mock.patch(
            "socket.getfqdn", autospec=True
        ) as getfqdn, mock.patch(
            "psutil.net_if_addrs", autospec=True
        ) as net_if_addrs:
            net_io_counters.return_value = {
                "lo": snetio(
                    bytes_sent=17247495681,
                    bytes_recv=172474956,
                    packets_sent=109564455,
                    packets_recv=1095644,
                    errin=10,
                    errout=1,
                    dropin=20,
                    dropout=2,
                ),
            }
            net_if_stats.return_value = {
                "lo": snicstats(isup=True, duplex=0, speed=0, mtu=65536),
            }
            getfqdn.return_value = "foo.example.com"
            net_if_addrs.return_value = {
                "lo": [
                    # pylint: disable=not-callable
                    snic(
                        family=psutil.AF_LINK,
                        address="11:22:33:44:55:66",
                        netmask=None,
                        broadcast=None,
                        ptp=None,
                    ),
                    snic(
                        family=socket.AF_INET,
                        address="10.1.1.1",
                        netmask=None,
                        broadcast=None,
                        ptp=None,
                    ),
                    snic(
                        family=socket.AF_INET6,
                        address="fc00:0000:0000:0000:0000:0000:0000:0001",
                        netmask=None,
                        broadcast=None,
                        ptp=None,
                    ),
                ],
            }
            net_metrics.collect_net_info()

        setter = self.store.set
        calls = [
            mock.call(
                "dev/net/bytes",
                ("up", "lo"),
                None,
                17247495681,
                enforce_ge=mock.ANY,
            ),
            mock.call(
                "dev/net/bytes",
                ("down", "lo"),
                None,
                172474956,
                enforce_ge=mock.ANY,
            ),
            mock.call(
                "dev/net/packets",
                ("up", "lo"),
                None,
                109564455,
                enforce_ge=mock.ANY,
            ),
            mock.call(
                "dev/net/packets",
                ("down", "lo"),
                None,
                1095644,
                enforce_ge=mock.ANY,
            ),
            mock.call(
                "dev/net/errors", ("up", "lo"), None, 1, enforce_ge=mock.ANY
            ),
            mock.call(
                "dev/net/errors", ("down", "lo"), None, 10, enforce_ge=mock.ANY
            ),
            mock.call(
                "dev/net/dropped", ("up", "lo"), None, 2, enforce_ge=mock.ANY
            ),
            mock.call(
                "dev/net/dropped", ("down", "lo"), None, 20, enforce_ge=mock.ANY
            ),
            mock.call("dev/net/isup", ("lo",), None, True, enforce_ge=mock.ANY),
            mock.call("dev/net/duplex", ("lo",), None, 0, enforce_ge=mock.ANY),
            mock.call("dev/net/speed", ("lo",), None, 0, enforce_ge=mock.ANY),
            mock.call("dev/net/mtu", ("lo",), None, 65536, enforce_ge=mock.ANY),
            mock.call(
                "net/fqdn", (), None, "foo.example.com", enforce_ge=mock.ANY
            ),
            mock.call(
                "dev/net/address",
                ("AF_LINK", "lo"),
                None,
                "11:22:33:44:55:66",
                enforce_ge=mock.ANY,
            ),
            mock.call(
                "dev/net/address",
                (
                    "AF_INET",
                    "lo",
                ),
                None,
                "10.1.1.1",
                enforce_ge=mock.ANY,
            ),
            mock.call(
                "dev/net/address",
                ("AF_INET6", "lo"),
                None,
                "fc00:0000:0000:0000:0000:0000:0000:0001",
                enforce_ge=mock.ANY,
            ),
        ]
        setter.assert_has_calls(calls)
        self.assertEqual(len(setter.mock_calls), len(calls))
