blob: 5c9bde10e46055b4de72238bfa429d5e0f8312ee [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2017 The ChromiumOS Authors
Allen Lica61e062017-07-13 13:15:21 -07002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Unit tests for proc_metrics."""
6
7# pylint: disable=protected-access
8
9from __future__ import absolute_import
Allen Lica61e062017-07-13 13:15:21 -070010
Mike Frysinger166fea02021-02-12 05:30:33 -050011from unittest import mock
12
Mike Frysingercb56b642019-08-25 15:33:08 -040013import psutil # pylint: disable=import-error
Allen Lica61e062017-07-13 13:15:21 -070014
15from chromite.lib import cros_test_lib
16from chromite.scripts.sysmon import proc_metrics
17
18
Congbin Guo16b64d52023-02-10 17:50:30 -080019def _mock_process(name, cmdline, parent=None, num_threads=10):
Alex Klein1699fab2022-09-08 08:46:06 -060020 proc = mock.Mock(dir(psutil.Process))
21 proc.name.return_value = name
22 proc.cmdline.return_value = cmdline
Congbin Guo16b64d52023-02-10 17:50:30 -080023 proc.num_threads.return_value = num_threads
Alex Klein1699fab2022-09-08 08:46:06 -060024 proc.cpu_percent.return_value = 2
25 if parent is not None:
26 proc.parent.return_value = parent
27 return proc
Allen Lica61e062017-07-13 13:15:21 -070028
29
30def _mock_forked_process(name, cmdline):
Alex Klein1699fab2022-09-08 08:46:06 -060031 parent_proc = _mock_process(name, cmdline)
32 return _mock_process(name, cmdline, parent=parent_proc)
Allen Lica61e062017-07-13 13:15:21 -070033
34
Allen Li3992c662018-01-05 15:26:36 -080035def _expected_calls_for(name):
Alex Klein1699fab2022-09-08 08:46:06 -060036 """Return expected calls for a process metric."""
37 return [
38 mock.call("proc/count", (name,), None, 1, enforce_ge=mock.ANY),
Congbin Guo16b64d52023-02-10 17:50:30 -080039 mock.call("proc/thread_count", (name,), None, 10, enforce_ge=mock.ANY),
Alex Klein1699fab2022-09-08 08:46:06 -060040 mock.call("proc/cpu_percent", (name,), None, 2, enforce_ge=mock.ANY),
41 ]
Allen Li3992c662018-01-05 15:26:36 -080042
43
Allen Lica61e062017-07-13 13:15:21 -070044class TestProcMetrics(cros_test_lib.TestCase):
Alex Klein1699fab2022-09-08 08:46:06 -060045 """Tests for proc_metrics."""
Allen Lica61e062017-07-13 13:15:21 -070046
Alex Klein1699fab2022-09-08 08:46:06 -060047 def setUp(self):
48 patcher = mock.patch(
49 "chromite.third_party.infra_libs.ts_mon.common.interface.state.store",
50 autospec=True,
51 )
52 self.store = patcher.start()
53 self.addCleanup(patcher.stop)
Allen Lica61e062017-07-13 13:15:21 -070054
Alex Klein1699fab2022-09-08 08:46:06 -060055 def test_collect(self):
56 with mock.patch("psutil.process_iter", autospec=True) as process_iter:
57 process_iter.return_value = [
58 _mock_process(
59 name="autoserv",
60 cmdline=[
61 "/usr/bin/python",
62 "-u",
63 "/usr/local/autotest/server/autoserv",
64 "-p",
65 "-r",
66 (
67 "/usr/local/autotest/results/hosts/"
68 "chromeos4-row3-rack13-host9/646252-provision"
69 "/20171307125911"
70 ),
71 "-m",
72 "chromeos4-row3-rack13-host9",
73 "--verbose",
74 "--lab",
75 "True",
76 "--provision",
77 "--job-labels",
78 "cros-version:winky-release/R61-9741.0.0",
79 ],
80 ),
81 _mock_forked_process(
82 name="autoserv",
83 cmdline=[
84 "/usr/bin/python",
85 "-u",
86 "/usr/local/autotest/server/autoserv",
87 "-p",
88 "-r",
89 (
90 "/usr/local/autotest/results/hosts/"
91 "chromeos4-row3-rack13-host9/646252-provision"
92 "/20171307125911"
93 ),
94 "-m",
95 "chromeos4-row3-rack13-host9",
96 "--verbose",
97 "--lab",
98 "True",
99 "--provision",
100 "--job-labels",
101 "cros-version:winky-release/R61-9741.0.0",
102 ],
103 ),
104 _mock_process(
105 name="gs_offloader.py",
106 cmdline=[
107 "/usr/bin/python",
108 "/usr/local/autotest/site_utils/gs_offloader.py",
109 "-s",
110 "--parallelism=30",
111 ],
112 ),
113 _mock_process(
114 name="python",
115 cmdline=[
116 (
117 "/usr/local/google/home/chromeos-test/.cache/cros_venv"
118 "/venv-2.7.6-5addca6cf590166d7b70e22a95bea4a0"
119 "/bin/python"
120 ),
121 "-m",
122 "chromite.scripts.sysmon",
123 "--interval",
124 "60",
125 ],
126 ),
127 _mock_process(
128 name="lxc-start",
129 cmdline=[
130 "[lxc monitor] /usr/local/autotest/containers"
131 " test_196499100_1525673902_240543]"
132 ],
133 ),
134 _mock_process(
135 name="lxc-attach",
136 cmdline=[
137 "lxc-attach",
138 "-P",
139 "/usr/local/autotest/containers",
140 "-n",
141 "test_196499100_1525673902_240543",
142 "--",
143 "bash",
144 "-c",
145 (
146 "/usr/local/autotest/server/autoserv"
147 " -s -P 196499100-chromeos-test/group0 ..."
148 ),
149 ],
150 ),
151 _mock_process(
152 name="getty",
153 cmdline=[
154 "/sbin/getty",
155 "-8",
156 "38400",
157 "console",
158 ],
159 ),
160 _mock_process(
161 name="sshd", cmdline=["sshd:", "chromeos-test", "[priv]"]
162 ),
163 _mock_process(
164 name="python3.8",
165 cmdline=[
166 "/usr/bin/python3.8",
167 "/home/chromeos-test/skylab_bots/"
168 "c6-r16-r17-h13.2757785382/swarming_bot.1.zip",
169 "start_bot",
170 ],
171 ),
172 _mock_process(
173 name="curl", cmdline=["curl", "server:port/path"]
174 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600175 _mock_process(name="java", cmdline=["java", "-Xmx4g", "..."]),
176 _mock_process(
177 name="python",
178 cmdline=[
179 "python",
180 "/tmp/chromeos-cache/common/gsutil_4.57.tar.gz/"
181 "gsutil/gsutil",
182 "-o",
183 "Boto:num_retries=10",
184 "cat",
185 "gs://eve-release/R100-14488.0.0/file",
186 ],
187 ),
Congbin Guo522cd982022-10-06 11:47:28 -0700188 _mock_process(
189 name="common-tls",
Congbin Guofcb436b2023-01-23 20:36:01 -0800190 cmdline=["/opt/infra-tools/common-tls", "-port", "..."],
Congbin Guo522cd982022-10-06 11:47:28 -0700191 ),
192 _mock_process(
193 name="fleet-tlw",
Congbin Guofcb436b2023-01-23 20:36:01 -0800194 cmdline=["/opt/infra-tools/fleet-tlw", "-port", "..."],
Congbin Guo522cd982022-10-06 11:47:28 -0700195 ),
196 _mock_process(
Congbin Guofcb436b2023-01-23 20:36:01 -0800197 name="drone-agent", cmdline=["/opt/infra-tools/drone-agent"]
Congbin Guo522cd982022-10-06 11:47:28 -0700198 ),
Congbin Guofcb436b2023-01-23 20:36:01 -0800199 _mock_process(name="dnsmasq", cmdline=["dnsmasq", "..."]),
Congbin Guo522cd982022-10-06 11:47:28 -0700200 _mock_process(
201 name="labservice",
Congbin Guofcb436b2023-01-23 20:36:01 -0800202 cmdline=["/opt/infra-tools/labservice", "-addr", "..."],
Congbin Guo522cd982022-10-06 11:47:28 -0700203 ),
204 _mock_process(
205 name="cloud_sql_proxy",
206 cmdline=[
Congbin Guofcb436b2023-01-23 20:36:01 -0800207 "/opt/cloud_sql_proxy",
208 "-dir=/var/run/tko_proxy",
Congbin Guo522cd982022-10-06 11:47:28 -0700209 "-instances=google.com:chromeos-lab:us-central1:tko",
Congbin Guofcb436b2023-01-23 20:36:01 -0800210 "-credential_file=...",
Congbin Guo522cd982022-10-06 11:47:28 -0700211 ],
212 ),
Congbin Guo3cdc11e2022-10-11 16:02:32 -0700213 _mock_process(
214 name="downloader",
Congbin Guofcb436b2023-01-23 20:36:01 -0800215 cmdline=["./downloader", "-credential-file", "..."],
Congbin Guo3cdc11e2022-10-11 16:02:32 -0700216 ),
Congbin Guoa8432502023-01-23 20:31:01 -0800217 _mock_process(
218 name="cipd", cmdline=["cipd", "ensure", "-root", "..."]
219 ),
220 _mock_process(
221 name="podman", cmdline=["podman", "run", "image:tag"]
222 ),
223 _mock_process(
224 name="podman", cmdline=["podman", "pull", "image:tag"]
225 ),
Congbin Guo4ccf0632023-02-12 00:01:14 -0800226 _mock_process(name="adb", cmdline=["adb", "..."]),
227 _mock_process(name="bbagent", cmdline=["bbagent", "..."]),
228 _mock_process(name="cloudtail", cmdline=["cloudtail", "..."]),
229 _mock_process(name="kubelet", cmdline=["kubelet", "..."]),
230 _mock_process(
231 name="phosphorus", cmdline=["phosphorus", "upload-to-tko"]
232 ),
233 _mock_process(
234 name="python",
235 cmdline=[
236 "bin/python",
237 "-u",
238 "-s",
239 ".../recipe_engine/main.py",
240 ],
241 ),
242 _mock_process(
243 name="python3.8",
244 cmdline=[
245 "bin/python3.8",
246 "-u",
247 ".../swarming_bot.3.zip",
248 "run_isolated",
249 "...",
250 ],
251 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600252 ]
253 proc_metrics.collect_proc_info()
Allen Lica61e062017-07-13 13:15:21 -0700254
Alex Klein1699fab2022-09-08 08:46:06 -0600255 setter = self.store.set
256 calls = []
Congbin Guo4ccf0632023-02-12 00:01:14 -0800257 calls.extend(_expected_calls_for("adb"))
Alex Klein1699fab2022-09-08 08:46:06 -0600258 calls.extend(_expected_calls_for("autoserv"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800259 calls.extend(_expected_calls_for("bbagent"))
Congbin Guo3cdc11e2022-10-11 16:02:32 -0700260 calls.extend(_expected_calls_for("cache-downloader"))
Congbin Guoa8432502023-01-23 20:31:01 -0800261 calls.extend(_expected_calls_for("cipd"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800262 calls.extend(_expected_calls_for("cloudtail"))
Congbin Guo522cd982022-10-06 11:47:28 -0700263 calls.extend(_expected_calls_for("common-tls"))
Alex Klein1699fab2022-09-08 08:46:06 -0600264 calls.extend(_expected_calls_for("curl"))
Congbin Guo522cd982022-10-06 11:47:28 -0700265 calls.extend(_expected_calls_for("dnsmasq"))
266 calls.extend(_expected_calls_for("drone-agent"))
267 calls.extend(_expected_calls_for("fleet-tlw"))
Alex Klein1699fab2022-09-08 08:46:06 -0600268 calls.extend(_expected_calls_for("getty"))
Alex Klein1699fab2022-09-08 08:46:06 -0600269 calls.extend(_expected_calls_for("gs_offloader"))
270 calls.extend(_expected_calls_for("gsutil"))
271 calls.extend(_expected_calls_for("java"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800272 calls.extend(_expected_calls_for("k8s_system"))
Congbin Guo522cd982022-10-06 11:47:28 -0700273 calls.extend(_expected_calls_for("labservice"))
Alex Klein1699fab2022-09-08 08:46:06 -0600274 calls.extend(_expected_calls_for("lxc-attach"))
275 calls.extend(_expected_calls_for("lxc-start"))
Congbin Guoa8432502023-01-23 20:31:01 -0800276 calls.extend(_expected_calls_for("podman-pull"))
277 calls.extend(_expected_calls_for("podman-run"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800278 calls.extend(_expected_calls_for("phosphorus"))
279 calls.extend(_expected_calls_for("recipe"))
Alex Klein1699fab2022-09-08 08:46:06 -0600280 calls.extend(_expected_calls_for("sshd"))
281 calls.extend(_expected_calls_for("swarming_bot"))
Congbin Guo4ccf0632023-02-12 00:01:14 -0800282 calls.extend(_expected_calls_for("swarming_sub_task"))
Alex Klein1699fab2022-09-08 08:46:06 -0600283 calls.extend(_expected_calls_for("sysmon"))
Congbin Guo522cd982022-10-06 11:47:28 -0700284 calls.extend(_expected_calls_for("tko_proxy"))
Alex Klein1699fab2022-09-08 08:46:06 -0600285 calls.extend(_expected_calls_for("other"))
286 setter.assert_has_calls(calls)
287 self.assertEqual(len(setter.mock_calls), len(calls))