# 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 proc_metrics."""

from unittest import mock

import psutil  # pylint: disable=import-error

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


# pylint: disable=protected-access


def _mock_process(name, cmdline, parent=None, num_threads=10):
    proc = mock.Mock(dir(psutil.Process))
    proc.name.return_value = name
    proc.cmdline.return_value = cmdline
    proc.num_threads.return_value = num_threads
    proc.cpu_percent.return_value = 2

    proc.cpu_times.return_value.system = 10
    proc.cpu_times.return_value.user = 11
    proc.cpu_times.return_value.iowait = 12
    proc.cpu_times.return_value.children_system = 13
    proc.cpu_times.return_value.children_user = 14

    proc.io_counters.return_value.read_count = 20
    proc.io_counters.return_value.read_bytes = 21
    proc.io_counters.return_value.read_chars = 22
    proc.io_counters.return_value.write_count = 23
    proc.io_counters.return_value.write_bytes = 24
    proc.io_counters.return_value.write_chars = 25

    if parent is not None:
        proc.parent.return_value = parent
    return proc


def _mock_forked_process(name, cmdline):
    parent_proc = _mock_process(name, cmdline)
    return _mock_process(name, cmdline, parent=parent_proc)


def _expected_calls_for(name):
    """Return expected calls for a process metric."""
    return [
        mock.call("proc/count", (name,), None, 1, enforce_ge=mock.ANY),
        mock.call("proc/thread_count", (name,), None, 10, enforce_ge=mock.ANY),
        mock.call("proc/cpu_percent", (name,), None, 2, enforce_ge=mock.ANY),
    ]


class TestProcMetrics(cros_test_lib.TestCase):
    """Tests for proc_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.process_iter", autospec=True) as process_iter:
            process_iter.return_value = [
                _mock_process(
                    name="autoserv",
                    cmdline=[
                        "/usr/bin/python",
                        "-u",
                        "/usr/local/autotest/server/autoserv",
                        "-p",
                        "-r",
                        (
                            "/usr/local/autotest/results/hosts/"
                            "chromeos4-row3-rack13-host9/646252-provision"
                            "/20171307125911"
                        ),
                        "-m",
                        "chromeos4-row3-rack13-host9",
                        "--verbose",
                        "--lab",
                        "True",
                        "--provision",
                        "--job-labels",
                        "cros-version:winky-release/R61-9741.0.0",
                    ],
                ),
                _mock_forked_process(
                    name="autoserv",
                    cmdline=[
                        "/usr/bin/python",
                        "-u",
                        "/usr/local/autotest/server/autoserv",
                        "-p",
                        "-r",
                        (
                            "/usr/local/autotest/results/hosts/"
                            "chromeos4-row3-rack13-host9/646252-provision"
                            "/20171307125911"
                        ),
                        "-m",
                        "chromeos4-row3-rack13-host9",
                        "--verbose",
                        "--lab",
                        "True",
                        "--provision",
                        "--job-labels",
                        "cros-version:winky-release/R61-9741.0.0",
                    ],
                ),
                _mock_process(
                    name="gs_offloader.py",
                    cmdline=[
                        "/usr/bin/python",
                        "/usr/local/autotest/site_utils/gs_offloader.py",
                        "-s",
                        "--parallelism=30",
                    ],
                ),
                _mock_process(
                    name="python",
                    cmdline=[
                        (
                            "/usr/local/google/home/chromeos-test/.cache/"
                            "cros_venv/venv-2.7.6-"
                            "5addca6cf590166d7b70e22a95bea4a0/bin/python"
                        ),
                        "-m",
                        "chromite.scripts.sysmon",
                        "--interval",
                        "60",
                    ],
                ),
                _mock_process(
                    name="lxc-start",
                    cmdline=[
                        "[lxc monitor] /usr/local/autotest/containers"
                        " test_196499100_1525673902_240543]"
                    ],
                ),
                _mock_process(
                    name="lxc-attach",
                    cmdline=[
                        "lxc-attach",
                        "-P",
                        "/usr/local/autotest/containers",
                        "-n",
                        "test_196499100_1525673902_240543",
                        "--",
                        "bash",
                        "-c",
                        (
                            "/usr/local/autotest/server/autoserv"
                            " -s -P 196499100-chromeos-test/group0 ..."
                        ),
                    ],
                ),
                _mock_process(
                    name="getty",
                    cmdline=[
                        "/sbin/getty",
                        "-8",
                        "38400",
                        "console",
                    ],
                ),
                _mock_process(name="gzip", cmdline=["gzip", "-d"]),
                _mock_process(
                    name="sshd", cmdline=["sshd:", "chromeos-test", "[priv]"]
                ),
                _mock_process(
                    name="python3.8",
                    cmdline=[
                        "/usr/bin/python3.8",
                        (
                            "/home/chromeos-test/skylab_bots/"
                            "c6-r16-r17-h13.2757785382/swarming_bot.1.zip"
                        ),
                        "start_bot",
                    ],
                ),
                _mock_process(
                    name="curl", cmdline=["curl", "server:port/path"]
                ),
                _mock_process(name="java", cmdline=["java", "-Xmx4g", "..."]),
                _mock_process(
                    name="python",
                    cmdline=[
                        "python",
                        (
                            "/tmp/chromeos-cache/common/gsutil_4.57.tar.gz/"
                            "gsutil/gsutil"
                        ),
                        "-o",
                        "Boto:num_retries=10",
                        "cat",
                        "gs://eve-release/R100-14488.0.0/file",
                    ],
                ),
                _mock_process(
                    name="common-tls",
                    cmdline=["/opt/infra-tools/common-tls", "-port", "..."],
                ),
                _mock_process(
                    name="fleet-tlw",
                    cmdline=["/opt/infra-tools/fleet-tlw", "-port", "..."],
                ),
                _mock_process(
                    name="drone-agent", cmdline=["/opt/infra-tools/drone-agent"]
                ),
                _mock_process(name="dnsmasq", cmdline=["dnsmasq", "..."]),
                _mock_process(
                    name="labservice",
                    cmdline=["/opt/infra-tools/labservice", "-addr", "..."],
                ),
                _mock_process(
                    name="cloud_sql_proxy",
                    cmdline=[
                        "/opt/cloud_sql_proxy",
                        "-dir=/var/run/tko_proxy",
                        "-instances=google.com:chromeos-lab:us-central1:tko",
                        "-credential_file=...",
                    ],
                ),
                _mock_process(
                    name="downloader",
                    cmdline=["./downloader", "-credential-file", "..."],
                ),
                _mock_process(
                    name="cipd", cmdline=["cipd", "ensure", "-root", "..."]
                ),
                _mock_process(
                    name="podman", cmdline=["podman", "run", "image:tag"]
                ),
                _mock_process(
                    name="podman", cmdline=["podman", "pull", "image:tag"]
                ),
                _mock_process(name="adb", cmdline=["adb", "..."]),
                _mock_process(name="bbagent", cmdline=["bbagent", "..."]),
                _mock_process(name="cloudtail", cmdline=["cloudtail", "..."]),
                _mock_process(name="kubelet", cmdline=["kubelet", "..."]),
                _mock_process(
                    name="phosphorus", cmdline=["phosphorus", "upload-to-tko"]
                ),
                _mock_process(
                    name="phosphorus", cmdline=["phosphorus", "upload-to-gs"]
                ),
                _mock_process(
                    name="phosphorus", cmdline=["phosphorus", "run-test"]
                ),
                _mock_process(
                    name="phosphorus", cmdline=["phosphorus", "prejob"]
                ),
                _mock_process(
                    name="phosphorus", cmdline=["phosphorus", "fetch-crashes"]
                ),
                _mock_process(
                    name="phosphorus", cmdline=["phosphorus", "new-subcmd"]
                ),
                _mock_process(
                    name="python",
                    cmdline=[
                        "bin/python",
                        "-u",
                        "-s",
                        ".../recipe_engine/main.py",
                    ],
                ),
                _mock_process(
                    name="python3.8",
                    cmdline=[
                        "bin/python3.8",
                        "-u",
                        ".../swarming_bot.3.zip",
                        "run_isolated",
                        "...",
                    ],
                ),
                _mock_process(
                    name="cadvisor",
                    cmdline=["/usr/bin/cadvisor", "-logtostderr", "..."],
                ),
                _mock_process(
                    name="cts-tradefed",
                    cmdline=[
                        "/bin/bash",
                        "/tmp/autotest-tradefed-install/.../cts-tradefed",
                        "...",
                    ],
                ),
                _mock_process(
                    name="gts-tradefed",
                    cmdline=[
                        "/bin/bash",
                        "/tmp/autotest-tradefed-install/.../gts-tradefed",
                        "...",
                    ],
                ),
                _mock_process(name="pause", cmdline=["/puase"]),
                _mock_process(
                    name="node_exporter", cmdline=["/bin/node_exporter", "..."]
                ),
                _mock_process(
                    name="process-exporter",
                    cmdline=["/bin/process-exporter", "..."],
                ),
                _mock_process(
                    name="prometheus", cmdline=["/bin/prometheus", "..."]
                ),
                _mock_process(name="tar", cmdline=["/bin/tar", "..."]),
                _mock_process(
                    name="test_that",
                    cmdline=["/bin/bin/python3", "/usr/bin/test_that", "..."],
                ),
                _mock_process(
                    name="shivas", cmdline=["/opt/infra-tools/shivas", "..."]
                ),
                _mock_process(name="tast", cmdline=["/usr/bin/tast", "..."]),
                _mock_process(name="cros-dut", cmdline=["cros-dut", "..."]),
                _mock_process(
                    name="containerd-shim-runc-v2",
                    cmdline=["/usr/bin/containerd-shim-runc-v2", "..."],
                ),
                _mock_process(
                    name="crosint",
                    cmdline=["/usr/libexec/tast/bundles/remote/crosint", "..."],
                ),
                _mock_process(name="cros-test", cmdline=["cros-test"]),
                _mock_process(
                    name="cros-provision", cmdline=["cros-provision", "..."]
                ),
                _mock_process(
                    name="cros-tool-runner",
                    cmdline=["/home/chromeos-test/.../cros-tool-runner", "..."],
                ),
                _mock_process(
                    name="fluent-bit",
                    cmdline=["/fluent-bit/bin/fluent-bit", "..."],
                ),
                _mock_process(
                    name="drone-prober",
                    cmdline=["/opt/infra-tools/drone-prober", "..."],
                ),
                _mock_process(
                    name="labpack", cmdline=["/home/.../labpack", "..."]
                ),
                _mock_process(
                    name="cros-fw-provision",
                    cmdline=["cros-fw-provision", "..."],
                ),
            ]
            proc_metrics.collect_proc_info()

        setter = self.store.set
        calls = []
        calls.extend(_expected_calls_for("adb"))
        calls.extend(_expected_calls_for("autoserv"))
        calls.extend(_expected_calls_for("bbagent"))
        calls.extend(_expected_calls_for("cache-downloader"))
        calls.extend(_expected_calls_for("cadvisor"))
        calls.extend(_expected_calls_for("cipd"))
        calls.extend(_expected_calls_for("cloudtail"))
        calls.extend(_expected_calls_for("common-tls"))
        calls.extend(_expected_calls_for("containerd-shim-runc-v2"))
        calls.extend(_expected_calls_for("cros-dut"))
        calls.extend(_expected_calls_for("crosint"))
        calls.extend(_expected_calls_for("cros-fw-provision"))
        calls.extend(_expected_calls_for("cros-provision"))
        calls.extend(_expected_calls_for("cros-test"))
        calls.extend(_expected_calls_for("cros-tool-runner"))
        calls.extend(_expected_calls_for("cts-tradefed"))
        calls.extend(_expected_calls_for("curl"))
        calls.extend(_expected_calls_for("dnsmasq"))
        calls.extend(_expected_calls_for("drone-agent"))
        calls.extend(_expected_calls_for("drone-prober"))
        calls.extend(_expected_calls_for("fleet-tlw"))
        calls.extend(_expected_calls_for("fluent-bit"))
        calls.extend(_expected_calls_for("getty"))
        calls.extend(_expected_calls_for("gzip"))
        calls.extend(_expected_calls_for("gs_offloader"))
        calls.extend(_expected_calls_for("gsutil"))
        calls.extend(_expected_calls_for("gts-tradefed"))
        calls.extend(_expected_calls_for("java"))
        calls.extend(_expected_calls_for("k8s_system"))
        calls.extend(_expected_calls_for("labpack"))
        calls.extend(_expected_calls_for("labservice"))
        calls.extend(_expected_calls_for("lxc-attach"))
        calls.extend(_expected_calls_for("lxc-start"))
        calls.extend(_expected_calls_for("node_exporter"))
        calls.extend(_expected_calls_for("pause"))
        calls.extend(_expected_calls_for("podman-pull"))
        calls.extend(_expected_calls_for("podman-run"))
        calls.extend(_expected_calls_for("phosphorus-fetch-crashes"))
        calls.extend(_expected_calls_for("phosphorus-prejob"))
        calls.extend(_expected_calls_for("phosphorus-run-test"))
        calls.extend(_expected_calls_for("phosphorus-upload-to-gs"))
        calls.extend(_expected_calls_for("phosphorus-upload-to-tko"))
        calls.extend(_expected_calls_for("phosphorus-other"))
        calls.extend(_expected_calls_for("prometheus"))
        calls.extend(_expected_calls_for("process-exporter"))
        calls.extend(_expected_calls_for("recipe"))
        calls.extend(_expected_calls_for("shivas"))
        calls.extend(_expected_calls_for("sshd"))
        calls.extend(_expected_calls_for("swarming_bot"))
        calls.extend(_expected_calls_for("swarming_sub_task"))
        calls.extend(_expected_calls_for("sysmon"))
        calls.extend(_expected_calls_for("tast"))
        calls.extend(_expected_calls_for("tar"))
        calls.extend(_expected_calls_for("test_that"))
        calls.extend(_expected_calls_for("tko_proxy"))
        calls.extend(_expected_calls_for("other"))
        setter.assert_has_calls(calls)
        self.assertEqual(len(setter.mock_calls), len(calls))
