| # 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)) |