blob: b7c5964c82bcf5a76a364b955329c8454205023a [file] [log] [blame]
# 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="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="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("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("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))